From 74d7f15563ec2a7e3f6db2b6be7c73ac1b40c97c Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Wed, 17 Apr 2024 17:40:38 +0300 Subject: [PATCH 01/17] exclude dist/ --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a338e5c..d43a13c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ # Dependency directories -node_modules/ \ No newline at end of file +node_modules/ +dist/ \ No newline at end of file -- 2.34.1 From 16cdb32b49203b766de6174d0995fb36e7a1720e Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Wed, 17 Apr 2024 18:05:01 +0300 Subject: [PATCH 02/17] Revert "exclude dist/" This reverts commit 74d7f15563ec2a7e3f6db2b6be7c73ac1b40c97c. --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index d43a13c..a338e5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ # Dependency directories -node_modules/ -dist/ \ No newline at end of file +node_modules/ \ No newline at end of file -- 2.34.1 From 1cf6a1fc36cc70b0f36fff5f7f3af68b38725792 Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Wed, 17 Apr 2024 18:06:37 +0300 Subject: [PATCH 03/17] =?UTF-8?q?Revert=20"=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D1=91=D0=BD=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit ae7121ac98cee8822cd7c49b1f98617caa5d893f. --- db/PKG_P8PANELS_EQUIPSRV.pck | 685 +++++++++++++---------------------- 1 file changed, 256 insertions(+), 429 deletions(-) diff --git a/db/PKG_P8PANELS_EQUIPSRV.pck b/db/PKG_P8PANELS_EQUIPSRV.pck index 7593cb7..05183ee 100644 --- a/db/PKG_P8PANELS_EQUIPSRV.pck +++ b/db/PKG_P8PANELS_EQUIPSRV.pck @@ -1,80 +1,48 @@ create or replace package PKG_P8PANELS_EQUIPSRV as - /* Получение параметров фильтра по умолчанию */ - procedure GET_DEFAULT_FP + /* Получение значения системного параметра "JuridicalPerson" */ + procedure GET_JUR_PERS_PRM ( - COUT out clob -- XML с параметрами фильтра по умолчанию + CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли) ); - /* Формирование строки с кол-вом часов */ function HOURS_STR ( - NHOURS in number -- Кол-во часов - ) return varchar2; -- Результат работы - - /* Отбор документов (ТОиР или Графики ремонтов) по дате */ - procedure SELECT_EQUIPSRV - ( - SBELONG in varchar2, -- Принадлежность к Юр. лицу - SPRODOBJ in varchar2, -- Производственный объект - STECHSERV in varchar2 := null, -- Техническая служба - SRESPDEP in varchar2 := null, -- Ответственное подразделение - STECHNAME in varchar2, -- Наименование объекта ремонта - SSRVKIND in varchar2, -- Код вида ремонта - NYEAR in number, -- Год - NMONTH in number, -- Месяц - NDAY in number := null, -- День - NWORKTYPE in number, -- Тип работы (0 - план, 1 - факт) - NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) - ); + NHOURS in number -- Кол-во часов + ) return varchar2; /* Выполнение работ по ТОиР */ procedure EQUIPSRV_GRID ( - SBELONG in varchar2, -- Принадлежность к Юр. лицу - SPRODOBJ in varchar2, -- Производственный объект - STECHSERV in varchar2 := null, -- Техническая служба - SRESPDEP in varchar2 := null, -- Ответственное подразделение - NFROMMONTH in number, -- Месяц начала периода - NFROMYEAR in number, -- Год начала периода - NTOMONTH in number, -- Месяц окончания периода - NTOYEAR in number, -- Год окончания периода - COUT out clob -- График проектов + SBELONG in varchar2, -- Принадлежность к Юр. лицу + SPRODOBJ in varchar2, -- Производственный объект + STECHSERV in varchar2, -- Техническая служба + SRESPDEP in varchar2, -- Ответственное подразделение + NFROMMONTH in number, -- Месяц начала периода + NFROMYEAR in number, -- Год начала периода + NTOMONTH in number, -- Месяц окончания периода + NTOYEAR in number, -- Год окончания периода + COUT out clob -- График проектов ); - end PKG_P8PANELS_EQUIPSRV; / create or replace package body PKG_P8PANELS_EQUIPSRV as - /* Получение параметров фильтра по умолчанию */ - procedure GET_DEFAULT_FP + /* Получение значения системного параметра "JuridicalPerson" */ + procedure GET_JUR_PERS_PRM ( - COUT out clob -- XML с параметрами фильтра по умолчанию + CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли) ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации - SJUR_PERS PKG_STD.TSTRING := null; -- Юр. лицо (наименование) - NJUR_PERS PKG_STD.TREF := null; -- Юр. лицо (идентификатор) + SPARAMCODE PKG_STD.TSTRING := 'JuridicalPerson'; -- Код параметра begin - /* Находим юр. лицо */ - FIND_JURPERSONS_MAIN(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SJUR_PERS => SJUR_PERS, NJUR_PERS => NJUR_PERS); - /* Формируем XML */ - PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); - PKG_XFAST.DOWN_NODE(SNAME => 'DATA'); - PKG_XFAST.DOWN_NODE(SNAME => 'JURPERS'); - PKG_XFAST.VALUE(SVALUE => SJUR_PERS); - PKG_XFAST.UP(); - PKG_XFAST.DOWN_NODE(SNAME => 'MONTH'); - PKG_XFAST.VALUE(NVALUE => EXTRACT(month from sysdate)); - PKG_XFAST.UP(); - PKG_XFAST.DOWN_NODE(SNAME => 'YEAR'); - PKG_XFAST.VALUE(NVALUE => EXTRACT(year from sysdate)); - PKG_XFAST.UP(); - PKG_XFAST.UP(); - /* Сериализуем в clob */ - COUT := PKG_XFAST.SERIALIZE_TO_CLOB(); - PKG_XFAST.EPILOGUE(); - end GET_DEFAULT_FP; + CRES := GET_OPTIONS_STR(SCODE => SPARAMCODE, + NCOMP_VERS => NCOMPANY); + if (CRES is null) then + P_EXCEPTION(0, 'Пользовательский параметр не указан.'); + end if; + end GET_JUR_PERS_PRM; /* Формирование строки с кол-вом часов */ function HOURS_STR @@ -82,136 +50,28 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as NHOURS in number -- Кол-во часов ) return varchar2 -- Строка с кол-вом часов is - SRESULT PKG_STD.TSTRING; -- Строка результат + SRESULT PKG_STD.tSTRING; -- Строка результат begin - if ((mod(NHOURS, 10) = 1) and (mod(NHOURS, 100) != 11)) then + if (MOD(NHOURS, 10) = 1 and MOD(NHOURS, 100) != 11) then SRESULT := NHOURS || ' час'; - elsif (((mod(NHOURS, 10) = 2) and (mod(NHOURS, 100) != 12)) or ((mod(NHOURS, 10) = 3) and (mod(NHOURS, 100) != 13)) or - ((mod(NHOURS, 10) = 4) and (mod(NHOURS, 100) != 14))) then + elsif ((MOD(NHOURS, 10) = 2 and MOD(NHOURS, 100) != 12) + or (MOD(NHOURS, 10) = 3 and MOD(NHOURS, 100) != 13) + or (MOD(NHOURS, 10) = 4 and MOD(NHOURS, 100) != 14)) then SRESULT := NHOURS || ' часа'; else SRESULT := NHOURS || ' часов'; end if; + /* Возвращаем результат */ return SRESULT; end HOURS_STR; - - /* Отбор документов (ТОиР или Графики ремонтов) по дате */ - procedure SELECT_EQUIPSRV - ( - SBELONG in varchar2, -- Принадлежность к Юр. лицу - SPRODOBJ in varchar2, -- Производственный объект - STECHSERV in varchar2 := null, -- Техническая служба - SRESPDEP in varchar2 := null, -- Ответственное подразделение - STECHNAME in varchar2, -- Наименование объекта ремонта - SSRVKIND in varchar2, -- Код вида ремонта - NYEAR in number, -- Год - NMONTH in number, -- Месяц - NDAY in number := null, -- День - NWORKTYPE in number, -- Тип работы (0 - план, 1 - факт) - NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) - ) - is - NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации - NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных - SDATE PKG_STD.TSTRING; -- Строка даты - begin - /* Проверка на дату с днём */ - if (NDAY is not null) then - SDATE := LPAD(TO_CHAR(NDAY), 2, '0') || '.' || LPAD(TO_CHAR(NMONTH), 2, '0') || '.' || NYEAR; - else - SDATE := LPAD(TO_CHAR(NMONTH), 2, '0') || '.' || NYEAR; - end if; - /* Если графики ТОиР */ - if (NWORKTYPE = 0) then - for C in (select T.RN, - T.COMPANY - from EQTCHSRV T, - JURPERSONS J, - EQTECSRVKIND SK, - EQCONFIG C1, - EQCONFIG C2, - INS_DEPARTMENT DS, - INS_DEPARTMENT DR - where T.STATE in (1, 2) - and T.COMPANY = NCOMPANY - and T.JUR_PERS = J.RN - and J.CODE = SBELONG - and T.EQCONFIG = C1.RN - and C1.CODE = SPRODOBJ - and T.DEPTTCSRV = DS.RN - and (DS.CODE = STECHSERV or STECHSERV is null) - and T.DEPTRESP = DR.RN - and (DR.CODE = SRESPDEP or SRESPDEP is null) - and T.EQCONFIG_TECH = C2.RN - and C2.NAME = STECHNAME - and T.EQTECSRVKIND = SK.RN - and SK.CODE = SSRVKIND - and ((NDAY is not null and TO_DATE(SDATE, 'dd.mm.yyyy') between TRUNC(T.DATEPRD_BEG) and - TRUNC(T.DATEPRD_END)) or (NDAY is null and (SDATE = TO_CHAR(T.DATEPRD_BEG, 'mm.yyyy') or - SDATE = TO_CHAR(T.DATEPRD_END, 'mm.yyyy'))))) - loop - /* Сформируем идентификатор буфера */ - if (NIDENT is null) then - NIDENT := GEN_IDENT(); - end if; - /* Добавим подобранное в список отмеченных записей */ - P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT, - NCOMPANY => C.COMPANY, - NDOCUMENT => C.RN, - SUNITCODE => 'EquipTechServices', - SACTIONCODE => null, - NCRN => null, - NDOCUMENT1 => null, - SUNITCODE1 => null, - SACTIONCODE1 => null, - NRN => NSELECTLIST); - end loop; - /* Иначе ремонтные ведомости */ - else - for C in (select T.RN, - T.COMPANY - from EQRPSHEETS T, - JURPERSONS J, - EQTECSRVKIND SK, - EQCONFIG C - where T.STATE in (0, 2, 3) - and T.COMPANY = NCOMPANY - and T.JURPERSONS = J.RN - and J.CODE = SBELONG - and T.EQCONFIG = C.RN - and C.NAME = STECHNAME - and T.TECSRVKIND = SK.RN - and SK.CODE = SSRVKIND - and ((NDAY is not null and TO_DATE(SDATE, 'dd.mm.yyyy') between TRUNC(T.DATEFACT_BEG) and - TRUNC(T.DATEFACT_END)) or (NDAY is null and (SDATE = TO_CHAR(T.DATEFACT_BEG, 'mm.yyyy') or - SDATE = TO_CHAR(T.DATEFACT_END, 'mm.yyyy'))))) - loop - /* Сформируем идентификатор буфера */ - if (NIDENT is null) then - NIDENT := GEN_IDENT(); - end if; - /* Добавим подобранное в список отмеченных записей */ - P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT, - NCOMPANY => C.COMPANY, - NDOCUMENT => C.RN, - SUNITCODE => 'EquipRepairSheets', - SACTIONCODE => null, - NCRN => null, - NDOCUMENT1 => null, - SUNITCODE1 => null, - SACTIONCODE1 => null, - NRN => NSELECTLIST); - end loop; - end if; - end SELECT_EQUIPSRV; /* Выполнение работ по ТОиР */ procedure EQUIPSRV_GRID ( SBELONG in varchar2, -- Принадлежность к Юр. лицу SPRODOBJ in varchar2, -- Производственный объект - STECHSERV in varchar2 := null, -- Техническая служба - SRESPDEP in varchar2 := null, -- Ответственное подразделение + STECHSERV in varchar2, -- Техническая служба + SRESPDEP in varchar2, -- Ответственное подразделение NFROMMONTH in number, -- Месяц начала периода NFROMYEAR in number, -- Год начала периода NTOMONTH in number, -- Месяц окончания периода @@ -226,36 +86,41 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as RDG_ROW0 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы0 RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы RDG_ROW2 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы2 - NCURYEAR PKG_STD.TNUMBER; -- Текущий год - NCURMONTH PKG_STD.TNUMBER; -- Текущий месяц - NTOTALDAYS PKG_STD.TNUMBER; -- Дней в текущем месяце + NCURYEAR PKG_STD.tNUMBER; -- Текущий год + NCURMONTH PKG_STD.tNUMBER; -- Текущий месяц + NTOTALDAYS PKG_STD.tNUMBER; -- Дней в текущем месяце SCURTECHOBJ PKG_STD.TSTRING := null; -- Текущий технический объект SCURTSKCODE PKG_STD.TSTRING := null; -- Текущий вид ремонта - NFROMDATE PKG_STD.TLDATE; -- Дата начала периода - NTODATE PKG_STD.TLDATE; -- Дата конца периода - NMS PKG_STD.TNUMBER; -- Месяц начала в цикле года - NME PKG_STD.TNUMBER; -- Месяц окончания в цикле года - NYEAR_PLAN PKG_STD.TNUMBER; -- Год план - NMONTH_PLAN PKG_STD.TNUMBER; -- Месяц план - NDAY_PLAN PKG_STD.TNUMBER; -- День план - NYEAR_FACT PKG_STD.TNUMBER; -- Год факт - NMONTH_FACT PKG_STD.TNUMBER; -- Месяц факт - NDAY_FACT PKG_STD.TNUMBER; -- День факт + NFROMDATE date := TO_DATE('01.' + || LPAD(TO_CHAR(NFROMMONTH), 2, '0') + || '.' || TO_CHAR(NFROMYEAR), + 'dd.mm.yyyy'); -- Дата начала периода + NTODATE date := LAST_DAY(TO_DATE('01.' + || LPAD(TO_CHAR(NTOMONTH), 2, '0') + || '.' || TO_CHAR(NTOYEAR), + 'dd.mm.yyyy')); -- Дата конца периода + NMS PKG_STD.tNUMBER; -- Месяц начала в цикле года + NME PKG_STD.tNUMBER; -- Месяц окончания в цикле года + NYEAR_PLAN PKG_STD.tNUMBER; -- Год план + NMONTH_PLAN PKG_STD.tNUMBER; -- Месяц план + NDAY_PLAN PKG_STD.tNUMBER; -- День план + NYEAR_FACT PKG_STD.tNUMBER; -- Год факт + NMONTH_FACT PKG_STD.tNUMBER; -- Месяц факт + NDAY_FACT PKG_STD.tNUMBER; -- День факт SPERIODNAME PKG_STD.TSTRING; -- Имя периода SFACT_CLR PKG_STD.TSTRING; -- Цвет закрашивания фактических дат - NROWS PKG_STD.TNUMBER := 0; -- Кол-во строк в курсоре - NWORKPERDAY PKG_STD.TNUMBER(17,2) := null; -- Работы в день - SGROUP_FILLED PKG_STD.TLSTRING; -- Группы, заполненные строками план/факт - SCOLS PKG_STD.TLSTRING; -- Заполнение периодов работ - YM PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для подсчёта работ за месяц - MCLR PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для закрашивания месяцев - CR PKG_STD.TSTRING; -- Текущий ключ коллекции MCLR + NROWS PKG_STD.tNUMBER := 0; -- Кол-во строк в курсоре + NWORKPERDAY PKG_STD.tNUMBER(17,2) := null; -- Работы в день + CR PKG_STD.TSTRING; + SGROUP_FILLED PKG_STD.tLSTRING; -- Группы, заполненные строками план/факт + SCOLS PKG_STD.tLSTRING; -- Заполнение периодов работ + YM PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для подсчёта работ за месяц + MCLR PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для закрашивания месяцев - /* Курсор с работами ТОиР */ cursor C1 is - select TT.NEQV_RN, - TT.NEQS_RN, - TT.NWRK_RN NRN, + select TT.NEQV_RN, + TT.NEQS_RN, + TT.NWRK_RN NRN, TT.COMPANY NCOMPANY, TT.NAME_WORK SWORKNAME, EC2.CODE STECHOBJCODE, @@ -270,60 +135,63 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as EQJ.DATEFACT_END DDATEFACTEND, EK.CODE STECSRVKINDCODE, EK.NAME STECSRVKINDNAME, - COALESCE(EW.NSUM, (TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN, - COALESCE(EWJ.NSUMF, (EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT - from (select B.*, - C.RN NWRK_RN, - C.PRN NWRK_PRN, - C.NAME_WORK, - C.DATEPLAN_BEG, - C.DATEPLAN_END, - C.TECSRVKIND, - C.EQCONFIG, - C.DEPTPERF, - C.DEPTTCSRV, - C.RESP_AGN - from (select EQV.RN NEQV_RN, - EQV.COMPANY, - EQV.JUR_PERS, - EQV.STATE, - EQV.DATEPRD_BEG, - EQV.DATEPRD_END, - EQS.RN NEQS_RN - from EQTCHSRV EQV, - DOCLINKS DL, - EQRPSHEETS EQS - where EQV.RN = DL.IN_DOCUMENT(+) - and DL.OUT_UNITCODE(+) = 'EquipRepairSheets' - and DL.OUT_DOCUMENT = EQS.RN(+)) B, + coalesce(EW.NSUM, + (TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN, + coalesce(EWJ.NSUMF, + (EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT + from + (select B.*, + C.RN nWRK_RN, + C.PRN nWRK_PRN, + C.NAME_WORK, + C.DATEPLAN_BEG, + C.DATEPLAN_END, + C.TECSRVKIND, + C.EQCONFIG, + C.DEPTPERF, + C.DEPTTCSRV, + C.RESP_AGN + from (select EQV.RN nEQV_RN, + EQV.COMPANY, + EQV.JUR_PERS, + EQV.STATE, + EQV.DATEPRD_BEG, + EQV.DATEPRD_END, + EQS.RN nEQS_RN + from EQTCHSRV EQV, -- Графики ТОиР + DOCLINKS DL, + EQRPSHEETS EQS -- Ремонтные ведомости + where EQV.RN = DL.IN_DOCUMENT (+) + and DL.OUT_UNITCODE (+) = 'EquipRepairSheets' + and DL.OUT_DOCUMENT = EQS.RN (+)) B, EQTCHSRWRK C - where B.NEQV_RN = C.PRN(+) - union all - select B.*, - C.RN NWRK_RN, - C.PRN NWRK_PRN, - C.NAME_WORK, - C.DATEPLAN_BEG, - C.DATEPLAN_END, - C.TECSRVKIND, - C.EQCONFIG, - C.DEPTPERF, - null DEPTTCSRV, - C.RESP_AGN - from (select null NEQV_RN, - EQS.COMPANY, - EQS.JURPERSONS JUR_PERS, - EQS.STATE, - EQS.DATEPLAN_BEG, - EQS.DATEPLAN_END, - EQS.RN NEQS_RN - from EQRPSHEETS EQS - where not exists (select 1 - from DOCLINKS DL - where DL.OUT_DOCUMENT = EQS.RN - and DL.IN_UNITCODE = 'EquipTechServices')) B, + where B.nEQV_RN = C.PRN (+) + union all + select B.*, + C.RN nWRK_RN, + C.PRN nWRK_PRN, + C.NAME_WORK, + C.DATEPLAN_BEG, + C.DATEPLAN_END, + C.TECSRVKIND, + C.EQCONFIG, + C.DEPTPERF, + null DEPTTCSRV, + C.RESP_AGN + from (select null nEQV_RN, + EQS.COMPANY, + EQS.JURPERSONS JUR_PERS, + EQS.STATE, + EQS.DATEPLAN_BEG, + EQS.DATEPLAN_END, + EQS.RN nEQS_RN + from EQRPSHEETS EQS -- Ремонтные ведомости + where not exists (select 1 + from DOCLINKS DL + where DL.OUT_DOCUMENT = EQS.RN + and DL.IN_UNITCODE = 'EquipTechServices')) B, EQRPSHWRK C - where B.NEQS_RN = C.PRN(+)) TT, + where B.nEQS_RN = C.PRN (+)) TT, EQTECSRVKIND EK, JURPERSONS JP, EQCONFIG EC1, @@ -332,55 +200,49 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as INS_DEPARTMENT DR, DOCLINKS DL, EQTECSRVJRNL EQJ, - (select T.PRN, - sum(T.WORKTIMEPLAN * T.PERFORM_QUANT) NSUM - from EQTCHSRWRC T - group by T.PRN) EW, - (select T.PRN, - sum(T.WORKTIMEFACT * T.QUANTFACT) NSUMF - from EQTCHSRJRNLWRC T - group by T.PRN) EWJ + (select t.prn, + sum(t.Worktimeplan * t.perform_quant) NSUM + from EQTCHSRWRC t + group by t.prn) EW, + (select t.prn, + sum(t.worktimefact * t.quantfact) NSUMF + from EQTCHSRJRNLWRC t + group by t.prn) EWJ where TT.COMPANY = NCOMPANY - and ((TT.STATE in (1, 2) and NEQV_RN is not null) or (TT.STATE in (0, 2, 3) and NEQV_RN is null)) + and ((TT.state in (1,2) and nEQV_RN is not null) or (TT.state in (0,2,3) and nEQV_RN is null)) and TT.DATEPRD_BEG >= NFROMDATE and TT.DATEPRD_END <= NTODATE and JP.CODE = SBELONG and EC1.CODE = SPRODOBJ and (DS.CODE = STECHSERV or STECHSERV is null) and (DR.CODE = SRESPDEP or SRESPDEP is null) - and TT.EQCONFIG = EC2.RN(+) - and TT.DEPTPERF = DR.RN(+) - and TT.DEPTTCSRV = DS.RN(+) - and TT.NWRK_RN = EW.PRN(+) - and EQJ.RN = EWJ.PRN(+) - and TT.TECSRVKIND = EK.RN(+) - and TT.NWRK_RN = DL.IN_DOCUMENT(+) - and ((DL.OUT_UNITCODE = 'EquipTechServiceJournal' and DL.RN is not null) or - (DL.OUT_UNITCODE is null and DL.RN is null)) - and DL.OUT_DOCUMENT = EQJ.RN(+) - order by EC2.NAME, - EK.CODE; + and TT.EQCONFIG = EC2.RN (+) + and TT.DEPTPERF = DR.RN (+) + and TT.DEPTTCSRV = DS.RN (+) + and TT.NWRK_RN = EW.PRN (+) + and EQJ.RN = EWJ.PRN (+) + and TT.TECSRVKIND = EK.RN (+) + and TT.NWRK_RN = DL.IN_DOCUMENT (+) + and ((DL.OUT_UNITCODE = 'EquipTechServiceJournal' and DL.RN is not null) or (DL.OUT_UNITCODE is null and DL.RN is null)) + and DL.OUT_DOCUMENT = EQJ.RN (+) + order by EC2.NAME, EK.CODE; begin - /* Определим дату начала периода */ - NFROMDATE := TO_DATE('01.' || LPAD(TO_CHAR(NFROMMONTH), 2, '0') || '.' || TO_CHAR(NFROMYEAR), 'dd.mm.yyyy'); - /* Определим дату конца периода */ - NTODATE := LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(NTOMONTH), 2, '0') || '.' || TO_CHAR(NTOYEAR), 'dd.mm.yyyy')); /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); /* Формируем структуру заголовка */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STEST', - SCAPTION => 'ТЕСТ', + SCAPTION => 'ТЕСТ', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SINFO', - SCAPTION => 'Объект ремонта', + SCAPTION => 'Информация', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SINFO2', SCAPTION => 'Объект ремонта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SPARENT => 'SINFO'); + SPARENT => 'SINFO'); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', SCAPTION => 'Рег. номер', @@ -455,15 +317,15 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as SNAME => 'STECSRVKINDNAME', SCAPTION => 'Наименование типа работы', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - /* Очистка коллекций */ - PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM); - PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); - /* Текущий год */ + BVISIBLE => false); + /* Очистка коллекций */ + PKG_CONTVALLOC1S.PURGE(YM); + PKG_CONTVALLOC1S.PURGE(MCLR); + NCURYEAR := EXTRACT(year from sysdate); - /* Текущий месяц */ - NCURMONTH := EXTRACT(month from sysdate); - /* Цикл по годам периода */ + NCURMONTH := EXTRACT(month from sysdate); + + /* Цикл по годам периода */ for Y in NFROMYEAR .. NTOYEAR loop if (NFROMYEAR = NTOYEAR) then @@ -473,249 +335,220 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as if (Y = NFROMYEAR) then NMS := NFROMMONTH; NME := 12; - elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then + elsif (NFROMYEAR < Y and Y < NTOYEAR) then NMS := 1; NME := 12; elsif (Y = NTOYEAR) then NMS := 1; - NME := NTOMONTH; + NME := NTOMONTH; end if; end if; + /* Цикл по месяцам года */ for M in NMS .. NME loop - PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', NVALUE => 0); - PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', NVALUE => 0); - /* Находим текущий месяц и делаем его развёрнутым по дням */ - if ((Y = NCURYEAR) and (M = NCURMONTH)) then + + PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', 0); + PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', 0); + + if (Y = NCURYEAR and M = NCURMONTH) then BEXPANDED := true; else BEXPANDED := false; end if; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M), - SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M), + SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BEXPANDABLE => true, - BEXPANDED => BEXPANDED); - /* Подсчёт кол-ва дней в месяце */ - NTOTALDAYS := TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(M), 2, '0') || '.' || TO_CHAR(Y), - 'dd.mm.yyyy')), - 'dd'), - '99'); + BEXPANDED => BEXPANDED); + NTOTALDAYS := to_number(to_char(LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(M), 2, '0') || '.' || TO_CHAR(Y), 'dd.mm.yyyy')),'dd'), '99'); /* Цикл по дням месяца */ for D in 1 .. NTOTALDAYS loop PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' || - TO_CHAR(D), + SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' || TO_CHAR(D), SCAPTION => TO_CHAR(D, '99'), SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SPARENT => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M)); end loop; - end loop; + end loop; end loop; - /* Подсчёт кол-ва записей в курсоре */ + + /* Подсчёт кол-ва записей в курсоре */ for Q1 in C1 loop NROWS := NROWS + 1; end loop; + /* Цикл по курсору */ for QQ in C1 loop NROWS := NROWS - 1; - /* Если новый объект ремонта */ - if ((SCURTECHOBJ != QQ.STECHOBJNAME) or (SCURTECHOBJ is null)) then - /* Если строка с трудоёмкостью по объекту ремонта сформирована */ + if (SCURTECHOBJ != QQ.STECHOBJNAME or SCURTECHOBJ is null) then if (RDG_ROW0.RCOLS is not null) then - /* Цикл по годам периода */ + /* Цикл по годам периода */ for Y in NFROMYEAR .. NTOYEAR loop - /* Если отчёт в пределах года */ if (NFROMYEAR = NTOYEAR) then NMS := NFROMMONTH; NME := NTOMONTH; - /* Иначе вычисляем кол-во месяцев в каждом году периода отчёта*/ else if (Y = NFROMYEAR) then NMS := NFROMMONTH; NME := 12; - elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then + elsif (NFROMYEAR < Y and Y < NTOYEAR) then NMS := 1; NME := 12; elsif (Y = NTOYEAR) then NMS := 1; - NME := NTOMONTH; + NME := NTOMONTH; end if; end if; - /* Цикл по месяцам года, заполнение трудоёмкости с привязкой к месяцу */ + + /* Цикл по месяцам года */ for M in NMS .. NME loop SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, - SNAME => SPERIODNAME, - SVALUE => 'план: ' || - HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || - ' факт: ' || - HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); - /* Добавление в коллекцию трудоёмкость план */ - PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P', NVALUE => 0); - /* Добавление в коллекцию трудоёмкость факт */ - PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F', NVALUE => 0); - end loop; + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, + SNAME => SPERIODNAME, + SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); + PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', 0); + PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', 0); + end loop; end loop; - /* Добавление строки с трудоёмкостью */ + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); end if; - /* Добавление группы с объектом ремонта */ - SCURTECHOBJ := QQ.STECHOBJNAME; + SCURTECHOBJ := QQ.STECHOBJNAME; SPRJ_GROUP_NAME := SCURTECHOBJ; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, SNAME => SPRJ_GROUP_NAME, SCAPTION => QQ.STECHOBJNAME, - BEXPANDABLE => false); + BEXPANDABLE => false); RDG_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ); end if; /* Формируем имя группы для вида ремонта */ SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE; /* Если по данной группе еще нет строк плана и факта */ - if (STRIN(SSUBSTR => SCURTSKCODE, SSOURCE => SGROUP_FILLED, SDELIM => ';') = 0) then + if (STRIN(sSUBSTR => SCURTSKCODE, sSOURCE => SGROUP_FILLED, sDELIM => ';') = 0) then /* Добавляем строку плана */ if (RDG_ROW.RCOLS is not null) then PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; /* Добавляем строку факта */ if (RDG_ROW2.RCOLS is not null) then - CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR); + CR := PKG_CONTVALLOC1S.FIRST_(MCLR); /* Цикл по коллекции для закрашивания месяцев */ - for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR) + for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR) loop - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, - SNAME => CR, - SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR)); - CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR)); + CR := PKG_CONTVALLOC1S.NEXT_(MCLR, CR); end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2); end if; - PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); + PKG_CONTVALLOC1S.PURGE(MCLR); /* Добвим группу для вида ремонта */ SPRJ_GROUP_NAME := SCURTSKCODE; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, SNAME => SPRJ_GROUP_NAME, SCAPTION => QQ.STECSRVKINDCODE, BEXPANDABLE => false); - /* Строка плана */ - RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); + RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STEST', SVALUE => QQ.STECSRVKINDCODE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SINFO2', SVALUE => 'План'); - /* Строка факта */ - RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SINFO2', SVALUE => 'План'); + RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SINFO2', SVALUE => 'Факт'); /* Добавляем в заполненные группы */ SGROUP_FILLED := SGROUP_FILLED || SPRJ_GROUP_NAME || ';'; + end if; /* Плановые работы */ if (QQ.NEQV_RN is not null) then - /* Цикл по периоду */ - for X in 0 .. TRUNC(QQ.DDATEPLANEND) - TRUNC(QQ.DDATEPLANBEG) + for x in 0 .. trunc(QQ.DDATEPLANEND) - trunc(QQ.DDATEPLANBEG) loop - NYEAR_PLAN := EXTRACT(year from QQ.DDATEPLANBEG + X); - NMONTH_PLAN := EXTRACT(month from QQ.DDATEPLANBEG + X); - NDAY_PLAN := EXTRACT(day from QQ.DDATEPLANBEG + X); - /* Если первый день периода */ - if (X = 0) then + NYEAR_PLAN := EXTRACT(year from QQ.DDATEPLANBEG + x); + NMONTH_PLAN := EXTRACT(month from QQ.DDATEPLANBEG + x); + NDAY_PLAN := EXTRACT(day from QQ.DDATEPLANBEG + x); + + if (x = 0) then SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || NMONTH_PLAN; - /* Подсчёт трудоёмкости за месяц */ + if (QQ.NSUMWORKPLAN is not null) then - PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_P', - NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P') + - QQ.NSUMWORKPLAN); + PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P') + QQ.NSUMWORKPLAN); end if; - /* Закрашивание месяца плана синим */ - if (STRIN(SSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SSOURCE => SCOLS, SDELIM => ';') = 0) then + + if (STRIN(sSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', sSOURCE => SCOLS, sDELIM => ';') = 0) then PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); - SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; + SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; end if; end if; SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || TO_CHAR(NMONTH_PLAN) || '_' || TO_CHAR(NDAY_PLAN); - /* Закрашивание дня плана синим */ - if (STRIN(SSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SSOURCE => SCOLS, SDELIM => ';') = 0) then + if (STRIN(sSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', sSOURCE => SCOLS, sDELIM => ';') = 0) then PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); - SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; - end if; + SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; + end if; end loop; end if; + /* Фактические и внеплановые работы */ - if ((QQ.DDATEFACTEND is not null) and (QQ.DDATEFACTBEG is not null)) then - /* Фактические - зелёный, внеплановые - красный */ - if (QQ.NEQV_RN is not null) then + if (QQ.DDATEFACTEND is not null and QQ.DDATEFACTBEG is not null) then + if (QQ.nEQV_RN is not null) then SFACT_CLR := 'green'; else SFACT_CLR := 'red'; - end if; + end if; + NWORKPERDAY := null; - /* Если период не в одном месяце, то считаем трудоёмкость в день */ if (EXTRACT(month from QQ.DDATEFACTBEG) != EXTRACT(month from QQ.DDATEFACTEND)) then - NWORKPERDAY := QQ.NSUMWORKFACT / (ROUND(QQ.DDATEFACTEND - QQ.DDATEFACTBEG) + 1); - NCURMONTH := EXTRACT(month from QQ.DDATEFACTBEG); - end if; - /* Цикл по периоду */ - for X in 0 .. TRUNC(QQ.DDATEFACTEND) - TRUNC(QQ.DDATEFACTBEG) + NWORKPERDAY := QQ.NSUMWORKFACT/(round(QQ.DDATEFACTEND - QQ.DDATEFACTBEG) + 1); + NCURMONTH := EXTRACT(month from QQ.DDATEFACTBEG); + end if; + + for x in 0 .. trunc(QQ.DDATEFACTEND) - trunc(QQ.DDATEFACTBEG) loop - NYEAR_FACT := EXTRACT(year from QQ.DDATEFACTBEG + X); - NMONTH_FACT := EXTRACT(month from QQ.DDATEFACTBEG + X); - NDAY_FACT := EXTRACT(day from QQ.DDATEFACTBEG + X); - /* Если первый день периода или следующий месяц периода */ - if ((X = 0) or (NCURMONTH != NMONTH_FACT)) then - /* Обновляется текущий месяц */ + NYEAR_FACT := EXTRACT(year from QQ.DDATEFACTBEG + x); + NMONTH_FACT := EXTRACT(month from QQ.DDATEFACTBEG + x); + NDAY_FACT := EXTRACT(day from QQ.DDATEFACTBEG + x); + + if (x = 0 or NCURMONTH != NMONTH_FACT) then if (NCURMONTH != NMONTH_FACT) then NCURMONTH := NMONTH_FACT; end if; SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || NMONTH_FACT; - /* Подсчёт трудоёмкости за месяц если период в одном месяце */ - if ((QQ.NSUMWORKFACT is not null) and (NWORKPERDAY is null)) then - PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_F', - NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F') + - QQ.NSUMWORKFACT); + + if (QQ.NSUMWORKFACT is not null and NWORKPERDAY is null) then + PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + QQ.NSUMWORKFACT); end if; + /* Добавление в коллекцию окрашивания месяца */ - if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => MCLR, SROWID => SPERIODNAME) = false) then - PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR); + if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then + PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); else - /* Если второй цвет для месяца */ if (STRIN(trim(SFACT_CLR), trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME))) = 0) then - PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, - SROWID => SPERIODNAME, - SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => SPERIODNAME) || ' ' || - SFACT_CLR); + PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME) || ' ' || SFACT_CLR); end if; end if; end if; - /* Подсчёт трудоёмкости за месяц если период не в одном месяце */ if (NWORKPERDAY is not null) then - PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_F', - NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F') + - NWORKPERDAY); + PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + NWORKPERDAY); end if; SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || TO_CHAR(NMONTH_FACT) || '_' || TO_CHAR(NDAY_FACT); - /* Добавление в коллекцию окрашивания дней факта */ - if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => MCLR, SROWID => SPERIODNAME) = false) then - PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR); + /* Добавление окрашивания дней факта */ + if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then + PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); else - /* Если второй цвет для месяца */ - if ((trim(PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => SPERIODNAME)) = 'green') and - (trim(SFACT_CLR) = 'red')) then - PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR); + if (trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME)) = 'green' and trim(SFACT_CLR) = 'red') then + PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); end if; - end if; + end if; end loop; - end if; - if ((RDG_ROW0.RCOLS is not null) and (NROWS = 0)) then - /* Цикл по годам периода */ + end if; + + if (RDG_ROW0.RCOLS is not null and NROWS = 0) then + /* Цикл по годам периода */ for Y in NFROMYEAR .. NTOYEAR loop if (NFROMYEAR = NTOYEAR) then @@ -725,51 +558,45 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as if (Y = NFROMYEAR) then NMS := NFROMMONTH; NME := 12; - elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then + elsif (NFROMYEAR < Y and Y < NTOYEAR) then NMS := 1; NME := 12; elsif (Y = NTOYEAR) then NMS := 1; - NME := NTOMONTH; + NME := NTOMONTH; end if; end if; + /* Цикл по месяцам года */ for M in NMS .. NME loop SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, - SNAME => SPERIODNAME, - SVALUE => 'план: ' || - HOURS_STR(NHOURS => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_P')) || - ' факт: ' || - HOURS_STR(NHOURS => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_F'))); - end loop; + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, + SNAME => SPERIODNAME, + SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); + end loop; end loop; + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); end if; - /* План для последней записи */ - if ((RDG_ROW.RCOLS is not null) and (NROWS = 0)) then + /* План для последней записи */ + if (RDG_ROW.RCOLS is not null and NROWS = 0) then PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; /* Факт для последней записи */ - if ((RDG_ROW2.RCOLS is not null) and (NROWS = 0)) then - CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR); - for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR) + if (RDG_ROW2.RCOLS is not null and NROWS = 0) then + CR := PKG_CONTVALLOC1S.FIRST_(MCLR); + for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR) loop - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, - SNAME => CR, - SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR)); - CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR)); + CR := PKG_CONTVALLOC1S.NEXT_(MCLR, cr); end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2); - end if; + end if; end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); - PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM); + PKG_CONTVALLOC1S.PURGE(YM); end EQUIPSRV_GRID; - end PKG_P8PANELS_EQUIPSRV; / -- 2.34.1 From 238ce245b3e71e922fe11c0ca148e312a16f539b Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Wed, 17 Apr 2024 18:10:54 +0300 Subject: [PATCH 04/17] Revert "exclude dist/" This reverts commit 74d7f15563ec2a7e3f6db2b6be7c73ac1b40c97c. --- db/PKG_P8PANELS_EQUIPSRV.pck | 685 ++++++++++++++++++++++------------- 1 file changed, 429 insertions(+), 256 deletions(-) diff --git a/db/PKG_P8PANELS_EQUIPSRV.pck b/db/PKG_P8PANELS_EQUIPSRV.pck index 05183ee..7593cb7 100644 --- a/db/PKG_P8PANELS_EQUIPSRV.pck +++ b/db/PKG_P8PANELS_EQUIPSRV.pck @@ -1,48 +1,80 @@ create or replace package PKG_P8PANELS_EQUIPSRV as - /* Получение значения системного параметра "JuridicalPerson" */ - procedure GET_JUR_PERS_PRM + /* Получение параметров фильтра по умолчанию */ + procedure GET_DEFAULT_FP ( - CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли) + COUT out clob -- XML с параметрами фильтра по умолчанию ); + /* Формирование строки с кол-вом часов */ function HOURS_STR ( - NHOURS in number -- Кол-во часов - ) return varchar2; + NHOURS in number -- Кол-во часов + ) return varchar2; -- Результат работы + + /* Отбор документов (ТОиР или Графики ремонтов) по дате */ + procedure SELECT_EQUIPSRV + ( + SBELONG in varchar2, -- Принадлежность к Юр. лицу + SPRODOBJ in varchar2, -- Производственный объект + STECHSERV in varchar2 := null, -- Техническая служба + SRESPDEP in varchar2 := null, -- Ответственное подразделение + STECHNAME in varchar2, -- Наименование объекта ремонта + SSRVKIND in varchar2, -- Код вида ремонта + NYEAR in number, -- Год + NMONTH in number, -- Месяц + NDAY in number := null, -- День + NWORKTYPE in number, -- Тип работы (0 - план, 1 - факт) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) + ); /* Выполнение работ по ТОиР */ procedure EQUIPSRV_GRID ( - SBELONG in varchar2, -- Принадлежность к Юр. лицу - SPRODOBJ in varchar2, -- Производственный объект - STECHSERV in varchar2, -- Техническая служба - SRESPDEP in varchar2, -- Ответственное подразделение - NFROMMONTH in number, -- Месяц начала периода - NFROMYEAR in number, -- Год начала периода - NTOMONTH in number, -- Месяц окончания периода - NTOYEAR in number, -- Год окончания периода - COUT out clob -- График проектов + SBELONG in varchar2, -- Принадлежность к Юр. лицу + SPRODOBJ in varchar2, -- Производственный объект + STECHSERV in varchar2 := null, -- Техническая служба + SRESPDEP in varchar2 := null, -- Ответственное подразделение + NFROMMONTH in number, -- Месяц начала периода + NFROMYEAR in number, -- Год начала периода + NTOMONTH in number, -- Месяц окончания периода + NTOYEAR in number, -- Год окончания периода + COUT out clob -- График проектов ); + end PKG_P8PANELS_EQUIPSRV; / create or replace package body PKG_P8PANELS_EQUIPSRV as - /* Получение значения системного параметра "JuridicalPerson" */ - procedure GET_JUR_PERS_PRM + /* Получение параметров фильтра по умолчанию */ + procedure GET_DEFAULT_FP ( - CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли) + COUT out clob -- XML с параметрами фильтра по умолчанию ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации - SPARAMCODE PKG_STD.TSTRING := 'JuridicalPerson'; -- Код параметра + SJUR_PERS PKG_STD.TSTRING := null; -- Юр. лицо (наименование) + NJUR_PERS PKG_STD.TREF := null; -- Юр. лицо (идентификатор) begin - CRES := GET_OPTIONS_STR(SCODE => SPARAMCODE, - NCOMP_VERS => NCOMPANY); - if (CRES is null) then - P_EXCEPTION(0, 'Пользовательский параметр не указан.'); - end if; - end GET_JUR_PERS_PRM; + /* Находим юр. лицо */ + FIND_JURPERSONS_MAIN(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SJUR_PERS => SJUR_PERS, NJUR_PERS => NJUR_PERS); + /* Формируем XML */ + PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); + PKG_XFAST.DOWN_NODE(SNAME => 'DATA'); + PKG_XFAST.DOWN_NODE(SNAME => 'JURPERS'); + PKG_XFAST.VALUE(SVALUE => SJUR_PERS); + PKG_XFAST.UP(); + PKG_XFAST.DOWN_NODE(SNAME => 'MONTH'); + PKG_XFAST.VALUE(NVALUE => EXTRACT(month from sysdate)); + PKG_XFAST.UP(); + PKG_XFAST.DOWN_NODE(SNAME => 'YEAR'); + PKG_XFAST.VALUE(NVALUE => EXTRACT(year from sysdate)); + PKG_XFAST.UP(); + PKG_XFAST.UP(); + /* Сериализуем в clob */ + COUT := PKG_XFAST.SERIALIZE_TO_CLOB(); + PKG_XFAST.EPILOGUE(); + end GET_DEFAULT_FP; /* Формирование строки с кол-вом часов */ function HOURS_STR @@ -50,28 +82,136 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as NHOURS in number -- Кол-во часов ) return varchar2 -- Строка с кол-вом часов is - SRESULT PKG_STD.tSTRING; -- Строка результат + SRESULT PKG_STD.TSTRING; -- Строка результат begin - if (MOD(NHOURS, 10) = 1 and MOD(NHOURS, 100) != 11) then + if ((mod(NHOURS, 10) = 1) and (mod(NHOURS, 100) != 11)) then SRESULT := NHOURS || ' час'; - elsif ((MOD(NHOURS, 10) = 2 and MOD(NHOURS, 100) != 12) - or (MOD(NHOURS, 10) = 3 and MOD(NHOURS, 100) != 13) - or (MOD(NHOURS, 10) = 4 and MOD(NHOURS, 100) != 14)) then + elsif (((mod(NHOURS, 10) = 2) and (mod(NHOURS, 100) != 12)) or ((mod(NHOURS, 10) = 3) and (mod(NHOURS, 100) != 13)) or + ((mod(NHOURS, 10) = 4) and (mod(NHOURS, 100) != 14))) then SRESULT := NHOURS || ' часа'; else SRESULT := NHOURS || ' часов'; end if; - /* Возвращаем результат */ return SRESULT; end HOURS_STR; + + /* Отбор документов (ТОиР или Графики ремонтов) по дате */ + procedure SELECT_EQUIPSRV + ( + SBELONG in varchar2, -- Принадлежность к Юр. лицу + SPRODOBJ in varchar2, -- Производственный объект + STECHSERV in varchar2 := null, -- Техническая служба + SRESPDEP in varchar2 := null, -- Ответственное подразделение + STECHNAME in varchar2, -- Наименование объекта ремонта + SSRVKIND in varchar2, -- Код вида ремонта + NYEAR in number, -- Год + NMONTH in number, -- Месяц + NDAY in number := null, -- День + NWORKTYPE in number, -- Тип работы (0 - план, 1 - факт) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) + ) + is + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации + NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных + SDATE PKG_STD.TSTRING; -- Строка даты + begin + /* Проверка на дату с днём */ + if (NDAY is not null) then + SDATE := LPAD(TO_CHAR(NDAY), 2, '0') || '.' || LPAD(TO_CHAR(NMONTH), 2, '0') || '.' || NYEAR; + else + SDATE := LPAD(TO_CHAR(NMONTH), 2, '0') || '.' || NYEAR; + end if; + /* Если графики ТОиР */ + if (NWORKTYPE = 0) then + for C in (select T.RN, + T.COMPANY + from EQTCHSRV T, + JURPERSONS J, + EQTECSRVKIND SK, + EQCONFIG C1, + EQCONFIG C2, + INS_DEPARTMENT DS, + INS_DEPARTMENT DR + where T.STATE in (1, 2) + and T.COMPANY = NCOMPANY + and T.JUR_PERS = J.RN + and J.CODE = SBELONG + and T.EQCONFIG = C1.RN + and C1.CODE = SPRODOBJ + and T.DEPTTCSRV = DS.RN + and (DS.CODE = STECHSERV or STECHSERV is null) + and T.DEPTRESP = DR.RN + and (DR.CODE = SRESPDEP or SRESPDEP is null) + and T.EQCONFIG_TECH = C2.RN + and C2.NAME = STECHNAME + and T.EQTECSRVKIND = SK.RN + and SK.CODE = SSRVKIND + and ((NDAY is not null and TO_DATE(SDATE, 'dd.mm.yyyy') between TRUNC(T.DATEPRD_BEG) and + TRUNC(T.DATEPRD_END)) or (NDAY is null and (SDATE = TO_CHAR(T.DATEPRD_BEG, 'mm.yyyy') or + SDATE = TO_CHAR(T.DATEPRD_END, 'mm.yyyy'))))) + loop + /* Сформируем идентификатор буфера */ + if (NIDENT is null) then + NIDENT := GEN_IDENT(); + end if; + /* Добавим подобранное в список отмеченных записей */ + P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT, + NCOMPANY => C.COMPANY, + NDOCUMENT => C.RN, + SUNITCODE => 'EquipTechServices', + SACTIONCODE => null, + NCRN => null, + NDOCUMENT1 => null, + SUNITCODE1 => null, + SACTIONCODE1 => null, + NRN => NSELECTLIST); + end loop; + /* Иначе ремонтные ведомости */ + else + for C in (select T.RN, + T.COMPANY + from EQRPSHEETS T, + JURPERSONS J, + EQTECSRVKIND SK, + EQCONFIG C + where T.STATE in (0, 2, 3) + and T.COMPANY = NCOMPANY + and T.JURPERSONS = J.RN + and J.CODE = SBELONG + and T.EQCONFIG = C.RN + and C.NAME = STECHNAME + and T.TECSRVKIND = SK.RN + and SK.CODE = SSRVKIND + and ((NDAY is not null and TO_DATE(SDATE, 'dd.mm.yyyy') between TRUNC(T.DATEFACT_BEG) and + TRUNC(T.DATEFACT_END)) or (NDAY is null and (SDATE = TO_CHAR(T.DATEFACT_BEG, 'mm.yyyy') or + SDATE = TO_CHAR(T.DATEFACT_END, 'mm.yyyy'))))) + loop + /* Сформируем идентификатор буфера */ + if (NIDENT is null) then + NIDENT := GEN_IDENT(); + end if; + /* Добавим подобранное в список отмеченных записей */ + P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT, + NCOMPANY => C.COMPANY, + NDOCUMENT => C.RN, + SUNITCODE => 'EquipRepairSheets', + SACTIONCODE => null, + NCRN => null, + NDOCUMENT1 => null, + SUNITCODE1 => null, + SACTIONCODE1 => null, + NRN => NSELECTLIST); + end loop; + end if; + end SELECT_EQUIPSRV; /* Выполнение работ по ТОиР */ procedure EQUIPSRV_GRID ( SBELONG in varchar2, -- Принадлежность к Юр. лицу SPRODOBJ in varchar2, -- Производственный объект - STECHSERV in varchar2, -- Техническая служба - SRESPDEP in varchar2, -- Ответственное подразделение + STECHSERV in varchar2 := null, -- Техническая служба + SRESPDEP in varchar2 := null, -- Ответственное подразделение NFROMMONTH in number, -- Месяц начала периода NFROMYEAR in number, -- Год начала периода NTOMONTH in number, -- Месяц окончания периода @@ -86,41 +226,36 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as RDG_ROW0 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы0 RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы RDG_ROW2 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы2 - NCURYEAR PKG_STD.tNUMBER; -- Текущий год - NCURMONTH PKG_STD.tNUMBER; -- Текущий месяц - NTOTALDAYS PKG_STD.tNUMBER; -- Дней в текущем месяце + NCURYEAR PKG_STD.TNUMBER; -- Текущий год + NCURMONTH PKG_STD.TNUMBER; -- Текущий месяц + NTOTALDAYS PKG_STD.TNUMBER; -- Дней в текущем месяце SCURTECHOBJ PKG_STD.TSTRING := null; -- Текущий технический объект SCURTSKCODE PKG_STD.TSTRING := null; -- Текущий вид ремонта - NFROMDATE date := TO_DATE('01.' - || LPAD(TO_CHAR(NFROMMONTH), 2, '0') - || '.' || TO_CHAR(NFROMYEAR), - 'dd.mm.yyyy'); -- Дата начала периода - NTODATE date := LAST_DAY(TO_DATE('01.' - || LPAD(TO_CHAR(NTOMONTH), 2, '0') - || '.' || TO_CHAR(NTOYEAR), - 'dd.mm.yyyy')); -- Дата конца периода - NMS PKG_STD.tNUMBER; -- Месяц начала в цикле года - NME PKG_STD.tNUMBER; -- Месяц окончания в цикле года - NYEAR_PLAN PKG_STD.tNUMBER; -- Год план - NMONTH_PLAN PKG_STD.tNUMBER; -- Месяц план - NDAY_PLAN PKG_STD.tNUMBER; -- День план - NYEAR_FACT PKG_STD.tNUMBER; -- Год факт - NMONTH_FACT PKG_STD.tNUMBER; -- Месяц факт - NDAY_FACT PKG_STD.tNUMBER; -- День факт + NFROMDATE PKG_STD.TLDATE; -- Дата начала периода + NTODATE PKG_STD.TLDATE; -- Дата конца периода + NMS PKG_STD.TNUMBER; -- Месяц начала в цикле года + NME PKG_STD.TNUMBER; -- Месяц окончания в цикле года + NYEAR_PLAN PKG_STD.TNUMBER; -- Год план + NMONTH_PLAN PKG_STD.TNUMBER; -- Месяц план + NDAY_PLAN PKG_STD.TNUMBER; -- День план + NYEAR_FACT PKG_STD.TNUMBER; -- Год факт + NMONTH_FACT PKG_STD.TNUMBER; -- Месяц факт + NDAY_FACT PKG_STD.TNUMBER; -- День факт SPERIODNAME PKG_STD.TSTRING; -- Имя периода SFACT_CLR PKG_STD.TSTRING; -- Цвет закрашивания фактических дат - NROWS PKG_STD.tNUMBER := 0; -- Кол-во строк в курсоре - NWORKPERDAY PKG_STD.tNUMBER(17,2) := null; -- Работы в день - CR PKG_STD.TSTRING; - SGROUP_FILLED PKG_STD.tLSTRING; -- Группы, заполненные строками план/факт - SCOLS PKG_STD.tLSTRING; -- Заполнение периодов работ - YM PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для подсчёта работ за месяц - MCLR PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для закрашивания месяцев + NROWS PKG_STD.TNUMBER := 0; -- Кол-во строк в курсоре + NWORKPERDAY PKG_STD.TNUMBER(17,2) := null; -- Работы в день + SGROUP_FILLED PKG_STD.TLSTRING; -- Группы, заполненные строками план/факт + SCOLS PKG_STD.TLSTRING; -- Заполнение периодов работ + YM PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для подсчёта работ за месяц + MCLR PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для закрашивания месяцев + CR PKG_STD.TSTRING; -- Текущий ключ коллекции MCLR + /* Курсор с работами ТОиР */ cursor C1 is - select TT.NEQV_RN, - TT.NEQS_RN, - TT.NWRK_RN NRN, + select TT.NEQV_RN, + TT.NEQS_RN, + TT.NWRK_RN NRN, TT.COMPANY NCOMPANY, TT.NAME_WORK SWORKNAME, EC2.CODE STECHOBJCODE, @@ -135,63 +270,60 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as EQJ.DATEFACT_END DDATEFACTEND, EK.CODE STECSRVKINDCODE, EK.NAME STECSRVKINDNAME, - coalesce(EW.NSUM, - (TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN, - coalesce(EWJ.NSUMF, - (EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT - from - (select B.*, - C.RN nWRK_RN, - C.PRN nWRK_PRN, - C.NAME_WORK, - C.DATEPLAN_BEG, - C.DATEPLAN_END, - C.TECSRVKIND, - C.EQCONFIG, - C.DEPTPERF, - C.DEPTTCSRV, - C.RESP_AGN - from (select EQV.RN nEQV_RN, - EQV.COMPANY, - EQV.JUR_PERS, - EQV.STATE, - EQV.DATEPRD_BEG, - EQV.DATEPRD_END, - EQS.RN nEQS_RN - from EQTCHSRV EQV, -- Графики ТОиР - DOCLINKS DL, - EQRPSHEETS EQS -- Ремонтные ведомости - where EQV.RN = DL.IN_DOCUMENT (+) - and DL.OUT_UNITCODE (+) = 'EquipRepairSheets' - and DL.OUT_DOCUMENT = EQS.RN (+)) B, + COALESCE(EW.NSUM, (TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN, + COALESCE(EWJ.NSUMF, (EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT + from (select B.*, + C.RN NWRK_RN, + C.PRN NWRK_PRN, + C.NAME_WORK, + C.DATEPLAN_BEG, + C.DATEPLAN_END, + C.TECSRVKIND, + C.EQCONFIG, + C.DEPTPERF, + C.DEPTTCSRV, + C.RESP_AGN + from (select EQV.RN NEQV_RN, + EQV.COMPANY, + EQV.JUR_PERS, + EQV.STATE, + EQV.DATEPRD_BEG, + EQV.DATEPRD_END, + EQS.RN NEQS_RN + from EQTCHSRV EQV, + DOCLINKS DL, + EQRPSHEETS EQS + where EQV.RN = DL.IN_DOCUMENT(+) + and DL.OUT_UNITCODE(+) = 'EquipRepairSheets' + and DL.OUT_DOCUMENT = EQS.RN(+)) B, EQTCHSRWRK C - where B.nEQV_RN = C.PRN (+) - union all - select B.*, - C.RN nWRK_RN, - C.PRN nWRK_PRN, - C.NAME_WORK, - C.DATEPLAN_BEG, - C.DATEPLAN_END, - C.TECSRVKIND, - C.EQCONFIG, - C.DEPTPERF, - null DEPTTCSRV, - C.RESP_AGN - from (select null nEQV_RN, - EQS.COMPANY, - EQS.JURPERSONS JUR_PERS, - EQS.STATE, - EQS.DATEPLAN_BEG, - EQS.DATEPLAN_END, - EQS.RN nEQS_RN - from EQRPSHEETS EQS -- Ремонтные ведомости - where not exists (select 1 - from DOCLINKS DL - where DL.OUT_DOCUMENT = EQS.RN - and DL.IN_UNITCODE = 'EquipTechServices')) B, + where B.NEQV_RN = C.PRN(+) + union all + select B.*, + C.RN NWRK_RN, + C.PRN NWRK_PRN, + C.NAME_WORK, + C.DATEPLAN_BEG, + C.DATEPLAN_END, + C.TECSRVKIND, + C.EQCONFIG, + C.DEPTPERF, + null DEPTTCSRV, + C.RESP_AGN + from (select null NEQV_RN, + EQS.COMPANY, + EQS.JURPERSONS JUR_PERS, + EQS.STATE, + EQS.DATEPLAN_BEG, + EQS.DATEPLAN_END, + EQS.RN NEQS_RN + from EQRPSHEETS EQS + where not exists (select 1 + from DOCLINKS DL + where DL.OUT_DOCUMENT = EQS.RN + and DL.IN_UNITCODE = 'EquipTechServices')) B, EQRPSHWRK C - where B.nEQS_RN = C.PRN (+)) TT, + where B.NEQS_RN = C.PRN(+)) TT, EQTECSRVKIND EK, JURPERSONS JP, EQCONFIG EC1, @@ -200,49 +332,55 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as INS_DEPARTMENT DR, DOCLINKS DL, EQTECSRVJRNL EQJ, - (select t.prn, - sum(t.Worktimeplan * t.perform_quant) NSUM - from EQTCHSRWRC t - group by t.prn) EW, - (select t.prn, - sum(t.worktimefact * t.quantfact) NSUMF - from EQTCHSRJRNLWRC t - group by t.prn) EWJ + (select T.PRN, + sum(T.WORKTIMEPLAN * T.PERFORM_QUANT) NSUM + from EQTCHSRWRC T + group by T.PRN) EW, + (select T.PRN, + sum(T.WORKTIMEFACT * T.QUANTFACT) NSUMF + from EQTCHSRJRNLWRC T + group by T.PRN) EWJ where TT.COMPANY = NCOMPANY - and ((TT.state in (1,2) and nEQV_RN is not null) or (TT.state in (0,2,3) and nEQV_RN is null)) + and ((TT.STATE in (1, 2) and NEQV_RN is not null) or (TT.STATE in (0, 2, 3) and NEQV_RN is null)) and TT.DATEPRD_BEG >= NFROMDATE and TT.DATEPRD_END <= NTODATE and JP.CODE = SBELONG and EC1.CODE = SPRODOBJ and (DS.CODE = STECHSERV or STECHSERV is null) and (DR.CODE = SRESPDEP or SRESPDEP is null) - and TT.EQCONFIG = EC2.RN (+) - and TT.DEPTPERF = DR.RN (+) - and TT.DEPTTCSRV = DS.RN (+) - and TT.NWRK_RN = EW.PRN (+) - and EQJ.RN = EWJ.PRN (+) - and TT.TECSRVKIND = EK.RN (+) - and TT.NWRK_RN = DL.IN_DOCUMENT (+) - and ((DL.OUT_UNITCODE = 'EquipTechServiceJournal' and DL.RN is not null) or (DL.OUT_UNITCODE is null and DL.RN is null)) - and DL.OUT_DOCUMENT = EQJ.RN (+) - order by EC2.NAME, EK.CODE; + and TT.EQCONFIG = EC2.RN(+) + and TT.DEPTPERF = DR.RN(+) + and TT.DEPTTCSRV = DS.RN(+) + and TT.NWRK_RN = EW.PRN(+) + and EQJ.RN = EWJ.PRN(+) + and TT.TECSRVKIND = EK.RN(+) + and TT.NWRK_RN = DL.IN_DOCUMENT(+) + and ((DL.OUT_UNITCODE = 'EquipTechServiceJournal' and DL.RN is not null) or + (DL.OUT_UNITCODE is null and DL.RN is null)) + and DL.OUT_DOCUMENT = EQJ.RN(+) + order by EC2.NAME, + EK.CODE; begin + /* Определим дату начала периода */ + NFROMDATE := TO_DATE('01.' || LPAD(TO_CHAR(NFROMMONTH), 2, '0') || '.' || TO_CHAR(NFROMYEAR), 'dd.mm.yyyy'); + /* Определим дату конца периода */ + NTODATE := LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(NTOMONTH), 2, '0') || '.' || TO_CHAR(NTOYEAR), 'dd.mm.yyyy')); /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); /* Формируем структуру заголовка */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STEST', - SCAPTION => 'ТЕСТ', + SCAPTION => 'ТЕСТ', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SINFO', - SCAPTION => 'Информация', + SCAPTION => 'Объект ремонта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SINFO2', SCAPTION => 'Объект ремонта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SPARENT => 'SINFO'); + SPARENT => 'SINFO'); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', SCAPTION => 'Рег. номер', @@ -317,15 +455,15 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as SNAME => 'STECSRVKINDNAME', SCAPTION => 'Наименование типа работы', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - /* Очистка коллекций */ - PKG_CONTVALLOC1S.PURGE(YM); - PKG_CONTVALLOC1S.PURGE(MCLR); - + BVISIBLE => false); + /* Очистка коллекций */ + PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM); + PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); + /* Текущий год */ NCURYEAR := EXTRACT(year from sysdate); - NCURMONTH := EXTRACT(month from sysdate); - - /* Цикл по годам периода */ + /* Текущий месяц */ + NCURMONTH := EXTRACT(month from sysdate); + /* Цикл по годам периода */ for Y in NFROMYEAR .. NTOYEAR loop if (NFROMYEAR = NTOYEAR) then @@ -335,220 +473,249 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as if (Y = NFROMYEAR) then NMS := NFROMMONTH; NME := 12; - elsif (NFROMYEAR < Y and Y < NTOYEAR) then + elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then NMS := 1; NME := 12; elsif (Y = NTOYEAR) then NMS := 1; - NME := NTOMONTH; + NME := NTOMONTH; end if; end if; - /* Цикл по месяцам года */ for M in NMS .. NME loop - - PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', 0); - PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', 0); - - if (Y = NCURYEAR and M = NCURMONTH) then + PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', NVALUE => 0); + PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', NVALUE => 0); + /* Находим текущий месяц и делаем его развёрнутым по дням */ + if ((Y = NCURYEAR) and (M = NCURMONTH)) then BEXPANDED := true; else BEXPANDED := false; end if; - - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M), - SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M), + SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BEXPANDABLE => true, - BEXPANDED => BEXPANDED); - NTOTALDAYS := to_number(to_char(LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(M), 2, '0') || '.' || TO_CHAR(Y), 'dd.mm.yyyy')),'dd'), '99'); + BEXPANDED => BEXPANDED); + /* Подсчёт кол-ва дней в месяце */ + NTOTALDAYS := TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(M), 2, '0') || '.' || TO_CHAR(Y), + 'dd.mm.yyyy')), + 'dd'), + '99'); /* Цикл по дням месяца */ for D in 1 .. NTOTALDAYS loop PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' || TO_CHAR(D), + SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' || + TO_CHAR(D), SCAPTION => TO_CHAR(D, '99'), SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SPARENT => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M)); end loop; - end loop; + end loop; end loop; - - /* Подсчёт кол-ва записей в курсоре */ + /* Подсчёт кол-ва записей в курсоре */ for Q1 in C1 loop NROWS := NROWS + 1; end loop; - /* Цикл по курсору */ for QQ in C1 loop NROWS := NROWS - 1; - if (SCURTECHOBJ != QQ.STECHOBJNAME or SCURTECHOBJ is null) then + /* Если новый объект ремонта */ + if ((SCURTECHOBJ != QQ.STECHOBJNAME) or (SCURTECHOBJ is null)) then + /* Если строка с трудоёмкостью по объекту ремонта сформирована */ if (RDG_ROW0.RCOLS is not null) then - /* Цикл по годам периода */ + /* Цикл по годам периода */ for Y in NFROMYEAR .. NTOYEAR loop + /* Если отчёт в пределах года */ if (NFROMYEAR = NTOYEAR) then NMS := NFROMMONTH; NME := NTOMONTH; + /* Иначе вычисляем кол-во месяцев в каждом году периода отчёта*/ else if (Y = NFROMYEAR) then NMS := NFROMMONTH; NME := 12; - elsif (NFROMYEAR < Y and Y < NTOYEAR) then + elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then NMS := 1; NME := 12; elsif (Y = NTOYEAR) then NMS := 1; - NME := NTOMONTH; + NME := NTOMONTH; end if; end if; - - /* Цикл по месяцам года */ + /* Цикл по месяцам года, заполнение трудоёмкости с привязкой к месяцу */ for M in NMS .. NME loop SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, - SNAME => SPERIODNAME, - SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); - PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', 0); - PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', 0); - end loop; + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, + SNAME => SPERIODNAME, + SVALUE => 'план: ' || + HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || + ' факт: ' || + HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); + /* Добавление в коллекцию трудоёмкость план */ + PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P', NVALUE => 0); + /* Добавление в коллекцию трудоёмкость факт */ + PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F', NVALUE => 0); + end loop; end loop; - + /* Добавление строки с трудоёмкостью */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); end if; - SCURTECHOBJ := QQ.STECHOBJNAME; + /* Добавление группы с объектом ремонта */ + SCURTECHOBJ := QQ.STECHOBJNAME; SPRJ_GROUP_NAME := SCURTECHOBJ; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, SNAME => SPRJ_GROUP_NAME, SCAPTION => QQ.STECHOBJNAME, - BEXPANDABLE => false); + BEXPANDABLE => false); RDG_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ); end if; /* Формируем имя группы для вида ремонта */ SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE; /* Если по данной группе еще нет строк плана и факта */ - if (STRIN(sSUBSTR => SCURTSKCODE, sSOURCE => SGROUP_FILLED, sDELIM => ';') = 0) then + if (STRIN(SSUBSTR => SCURTSKCODE, SSOURCE => SGROUP_FILLED, SDELIM => ';') = 0) then /* Добавляем строку плана */ if (RDG_ROW.RCOLS is not null) then PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; /* Добавляем строку факта */ if (RDG_ROW2.RCOLS is not null) then - CR := PKG_CONTVALLOC1S.FIRST_(MCLR); + CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR); /* Цикл по коллекции для закрашивания месяцев */ - for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR) + for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR) loop - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR)); - CR := PKG_CONTVALLOC1S.NEXT_(MCLR, CR); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, + SNAME => CR, + SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR)); + CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR); end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2); end if; - PKG_CONTVALLOC1S.PURGE(MCLR); + PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); /* Добвим группу для вида ремонта */ SPRJ_GROUP_NAME := SCURTSKCODE; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, SNAME => SPRJ_GROUP_NAME, SCAPTION => QQ.STECSRVKINDCODE, BEXPANDABLE => false); - RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); + /* Строка плана */ + RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STEST', SVALUE => QQ.STECSRVKINDCODE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SINFO2', SVALUE => 'План'); - RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SINFO2', SVALUE => 'План'); + /* Строка факта */ + RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SINFO2', SVALUE => 'Факт'); /* Добавляем в заполненные группы */ SGROUP_FILLED := SGROUP_FILLED || SPRJ_GROUP_NAME || ';'; - end if; /* Плановые работы */ if (QQ.NEQV_RN is not null) then - for x in 0 .. trunc(QQ.DDATEPLANEND) - trunc(QQ.DDATEPLANBEG) + /* Цикл по периоду */ + for X in 0 .. TRUNC(QQ.DDATEPLANEND) - TRUNC(QQ.DDATEPLANBEG) loop - NYEAR_PLAN := EXTRACT(year from QQ.DDATEPLANBEG + x); - NMONTH_PLAN := EXTRACT(month from QQ.DDATEPLANBEG + x); - NDAY_PLAN := EXTRACT(day from QQ.DDATEPLANBEG + x); - - if (x = 0) then + NYEAR_PLAN := EXTRACT(year from QQ.DDATEPLANBEG + X); + NMONTH_PLAN := EXTRACT(month from QQ.DDATEPLANBEG + X); + NDAY_PLAN := EXTRACT(day from QQ.DDATEPLANBEG + X); + /* Если первый день периода */ + if (X = 0) then SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || NMONTH_PLAN; - + /* Подсчёт трудоёмкости за месяц */ if (QQ.NSUMWORKPLAN is not null) then - PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P') + QQ.NSUMWORKPLAN); + PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_P', + NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P') + + QQ.NSUMWORKPLAN); end if; - - if (STRIN(sSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', sSOURCE => SCOLS, sDELIM => ';') = 0) then + /* Закрашивание месяца плана синим */ + if (STRIN(SSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SSOURCE => SCOLS, SDELIM => ';') = 0) then PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); - SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; + SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; end if; end if; SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || TO_CHAR(NMONTH_PLAN) || '_' || TO_CHAR(NDAY_PLAN); - if (STRIN(sSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', sSOURCE => SCOLS, sDELIM => ';') = 0) then + /* Закрашивание дня плана синим */ + if (STRIN(SSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SSOURCE => SCOLS, SDELIM => ';') = 0) then PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); - SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; - end if; + SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; + end if; end loop; end if; - /* Фактические и внеплановые работы */ - if (QQ.DDATEFACTEND is not null and QQ.DDATEFACTBEG is not null) then - if (QQ.nEQV_RN is not null) then + if ((QQ.DDATEFACTEND is not null) and (QQ.DDATEFACTBEG is not null)) then + /* Фактические - зелёный, внеплановые - красный */ + if (QQ.NEQV_RN is not null) then SFACT_CLR := 'green'; else SFACT_CLR := 'red'; - end if; - + end if; NWORKPERDAY := null; + /* Если период не в одном месяце, то считаем трудоёмкость в день */ if (EXTRACT(month from QQ.DDATEFACTBEG) != EXTRACT(month from QQ.DDATEFACTEND)) then - NWORKPERDAY := QQ.NSUMWORKFACT/(round(QQ.DDATEFACTEND - QQ.DDATEFACTBEG) + 1); - NCURMONTH := EXTRACT(month from QQ.DDATEFACTBEG); - end if; - - for x in 0 .. trunc(QQ.DDATEFACTEND) - trunc(QQ.DDATEFACTBEG) + NWORKPERDAY := QQ.NSUMWORKFACT / (ROUND(QQ.DDATEFACTEND - QQ.DDATEFACTBEG) + 1); + NCURMONTH := EXTRACT(month from QQ.DDATEFACTBEG); + end if; + /* Цикл по периоду */ + for X in 0 .. TRUNC(QQ.DDATEFACTEND) - TRUNC(QQ.DDATEFACTBEG) loop - NYEAR_FACT := EXTRACT(year from QQ.DDATEFACTBEG + x); - NMONTH_FACT := EXTRACT(month from QQ.DDATEFACTBEG + x); - NDAY_FACT := EXTRACT(day from QQ.DDATEFACTBEG + x); - - if (x = 0 or NCURMONTH != NMONTH_FACT) then + NYEAR_FACT := EXTRACT(year from QQ.DDATEFACTBEG + X); + NMONTH_FACT := EXTRACT(month from QQ.DDATEFACTBEG + X); + NDAY_FACT := EXTRACT(day from QQ.DDATEFACTBEG + X); + /* Если первый день периода или следующий месяц периода */ + if ((X = 0) or (NCURMONTH != NMONTH_FACT)) then + /* Обновляется текущий месяц */ if (NCURMONTH != NMONTH_FACT) then NCURMONTH := NMONTH_FACT; end if; SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || NMONTH_FACT; - - if (QQ.NSUMWORKFACT is not null and NWORKPERDAY is null) then - PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + QQ.NSUMWORKFACT); + /* Подсчёт трудоёмкости за месяц если период в одном месяце */ + if ((QQ.NSUMWORKFACT is not null) and (NWORKPERDAY is null)) then + PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_F', + NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F') + + QQ.NSUMWORKFACT); end if; - /* Добавление в коллекцию окрашивания месяца */ - if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then - PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); + if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => MCLR, SROWID => SPERIODNAME) = false) then + PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR); else + /* Если второй цвет для месяца */ if (STRIN(trim(SFACT_CLR), trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME))) = 0) then - PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME) || ' ' || SFACT_CLR); + PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, + SROWID => SPERIODNAME, + SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => SPERIODNAME) || ' ' || + SFACT_CLR); end if; end if; end if; + /* Подсчёт трудоёмкости за месяц если период не в одном месяце */ if (NWORKPERDAY is not null) then - PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + NWORKPERDAY); + PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_F', + NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F') + + NWORKPERDAY); end if; SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || TO_CHAR(NMONTH_FACT) || '_' || TO_CHAR(NDAY_FACT); - /* Добавление окрашивания дней факта */ - if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then - PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); + /* Добавление в коллекцию окрашивания дней факта */ + if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => MCLR, SROWID => SPERIODNAME) = false) then + PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR); else - if (trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME)) = 'green' and trim(SFACT_CLR) = 'red') then - PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); + /* Если второй цвет для месяца */ + if ((trim(PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => SPERIODNAME)) = 'green') and + (trim(SFACT_CLR) = 'red')) then + PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR); end if; - end if; + end if; end loop; - end if; - - if (RDG_ROW0.RCOLS is not null and NROWS = 0) then - /* Цикл по годам периода */ + end if; + if ((RDG_ROW0.RCOLS is not null) and (NROWS = 0)) then + /* Цикл по годам периода */ for Y in NFROMYEAR .. NTOYEAR loop if (NFROMYEAR = NTOYEAR) then @@ -558,45 +725,51 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as if (Y = NFROMYEAR) then NMS := NFROMMONTH; NME := 12; - elsif (NFROMYEAR < Y and Y < NTOYEAR) then + elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then NMS := 1; NME := 12; elsif (Y = NTOYEAR) then NMS := 1; - NME := NTOMONTH; + NME := NTOMONTH; end if; end if; - /* Цикл по месяцам года */ for M in NMS .. NME loop SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, - SNAME => SPERIODNAME, - SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); - end loop; + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, + SNAME => SPERIODNAME, + SVALUE => 'план: ' || + HOURS_STR(NHOURS => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_P')) || + ' факт: ' || + HOURS_STR(NHOURS => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_F'))); + end loop; end loop; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); end if; - /* План для последней записи */ - if (RDG_ROW.RCOLS is not null and NROWS = 0) then + /* План для последней записи */ + if ((RDG_ROW.RCOLS is not null) and (NROWS = 0)) then PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; /* Факт для последней записи */ - if (RDG_ROW2.RCOLS is not null and NROWS = 0) then - CR := PKG_CONTVALLOC1S.FIRST_(MCLR); - for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR) + if ((RDG_ROW2.RCOLS is not null) and (NROWS = 0)) then + CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR); + for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR) loop - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR)); - CR := PKG_CONTVALLOC1S.NEXT_(MCLR, cr); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, + SNAME => CR, + SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR)); + CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR); end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2); - end if; + end if; end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); - PKG_CONTVALLOC1S.PURGE(YM); + PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM); end EQUIPSRV_GRID; + end PKG_P8PANELS_EQUIPSRV; / -- 2.34.1 From 70ec04db2619e4cd2b40dc031fc1882541277b97 Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Wed, 17 Apr 2024 18:20:32 +0300 Subject: [PATCH 05/17] =?UTF-8?q?Revert=20"WEB=20APP:=20=D0=A1=D0=B2=D0=B5?= =?UTF-8?q?=D0=B6=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit e6d78ee8febbdfd093eb848ab416ab9807bd1403. --- dist/p8-panels.js | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index d7cd438..3934950 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -15,7 +15,7 @@ \***********************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/layouts\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./eqs_prfrm/layouts.js\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl.js\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/layouts\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/layouts.js\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); +eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/layouts\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./eqs_prfrm/layouts.js\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); /***/ }), @@ -3759,17 +3759,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./app/panels/prj_jobs/lab_fact_rpt_dtl.js": -/*!*************************************************!*\ - !*** ./app/panels/prj_jobs/lab_fact_rpt_dtl.js ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabFactRptDtl: () => (/* binding */ LabFactRptDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nconst LabFactRptDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [factRptDtl, setFactRptDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации фактической трудоёмкости по отчетам для ресурса\n const loadFactRptDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (factRptDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_FACT_RPT\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(factRptDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: factRptDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: factRptDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setFactRptDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, factRptDtl.reload, factRptDtl.orders, factRptDtl.dataLoaded, factRptDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setFactRptDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGPagesCountChanged = () => setFactRptDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadFactRptDtl();\n }, [factRptDtl.reload, loadFactRptDtl]);\n\n //Генерация содержимого\n return factRptDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: factRptDtl.columnsDef,\n rows: factRptDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: factRptDtl.morePages,\n reloading: factRptDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlHeadCellRender,\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nLabFactRptDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_fact_rpt_dtl.js?"); - -/***/ }), - /***/ "./app/panels/prj_jobs/lab_plan_fot_dtl.js": /*!*************************************************!*\ !*** ./app/panels/prj_jobs/lab_plan_fot_dtl.js ***! @@ -3788,18 +3777,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по графику\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по графику для ресурса\n const loadPlanJobsDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_JOBS\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализаци\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanJobsDtl();\n }, [planJobsDtl.reload, loadPlanJobsDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlHeadCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlDataCellRender)({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?"); - -/***/ }), - -/***/ "./app/panels/prj_jobs/layouts.js": -/*!****************************************!*\ - !*** ./app/panels/prj_jobs/layouts.js ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ factRptDtlHeadCellRender: () => (/* binding */ factRptDtlHeadCellRender),\n/* harmony export */ factRptDtlValueFormatter: () => (/* binding */ factRptDtlValueFormatter),\n/* harmony export */ periodsDataCellRender: () => (/* binding */ periodsDataCellRender),\n/* harmony export */ planJobsDtlDataCellRender: () => (/* binding */ planJobsDtlDataCellRender),\n/* harmony export */ planJobsDtlHeadCellRender: () => (/* binding */ planJobsDtlHeadCellRender),\n/* harmony export */ planJobsDtlValueFormatter: () => (/* binding */ planJobsDtlValueFormatter),\n/* harmony export */ taskAttributeRenderer: () => (/* binding */ taskAttributeRenderer)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные функции\n\n//-----------\n//Тело модуля\n//-----------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = (value, addText = false, justifyContent = null) => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _extends({\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, justifyContent ? {\n justifyContent\n } : {}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Генерация кастомных представлений атрибутов задачи в редакторе\nconst taskAttributeRenderer = ({\n task,\n attribute\n}) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name], true);\n default:\n return null;\n }\n};\n\n//Форматирование значений колонок в таблице детализации трудоёмкости по графику\nconst planJobsDtlValueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return formatJobStatusValue(value, false, \"center\");\n case \"DJOB_BEG\":\n case \"DJOB_END\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(value);\n }\n return value;\n};\n\n//Генерация представления ячейки заголовка в таблице детализации трудоёмкости по графику\nconst planJobsDtlHeadCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки c данными в таблице детализации трудоёмкости по графику\nconst planJobsDtlDataCellRender = ({\n row,\n columnDef,\n onProjectClick\n}) => {\n switch (columnDef.name) {\n case \"SPRJ\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => onProjectClick ? onProjectClick({\n sender: row\n }) : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n }\n};\n\n//Форматирование значений колонок в таблице детализации трудоёмкости по отчетам\nconst factRptDtlValueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return formatJobStatusValue(value, false, \"center\");\n case \"DJOB_BEG\":\n case \"DJOB_END\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(value);\n }\n return value;\n};\n\n//Генерация представления ячейки заголовка в таблице детализации трудоёмкости по отчетам\nconst factRptDtlHeadCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки c данными в таблице периодов балансировки\nconst periodsDataCellRender = ({\n row,\n columnDef,\n onLabPlanFOTClick,\n onLabFactRptClick,\n onLabPlanJobsClick\n}) => {\n switch (columnDef.name) {\n case \"NLAB_PLAN_FOT\":\n case \"NLAB_FACT_RPT\":\n case \"NLAB_PLAN_JOBS\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => columnDef.name === \"NLAB_PLAN_FOT\" ? onLabPlanFOTClick ? onLabPlanFOTClick({\n sender: row\n }) : null : columnDef.name === \"NLAB_FACT_RPT\" ? onLabFactRptClick ? onLabFactRptClick({\n sender: row\n }) : null : columnDef.name === \"NLAB_PLAN_JOBS\" ? onLabPlanJobsClick ? onLabPlanJobsClick({\n sender: row\n }) : null : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n case \"NLAB_DIFF_RPT_FOT\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name])\n };\n case \"NLAB_DIFF_JOBS_FOT\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"right\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name] <= 0 ? \"done\" : \"error\"))\n };\n }\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/layouts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по графику\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n title: text\n }, icon));\n};\n\n//Форматирование значений колонок в таблице детализации трудоёмкости по графику\nconst planJobsDtlValueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return formatJobStatusValue(value);\n case \"DJOB_BEG\":\n case \"DJOB_END\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.formatDateRF)(value);\n }\n return value;\n};\n\n//Генерация представления ячейки заголовка в таблице детализации трудоёмкости по графику\nconst planJobsDtlHeadCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки c данными в таблице детализации трудоёмкости по графику\nconst planJobsDtlDataCellRender = ({\n row,\n columnDef,\n onProjectClick\n}) => {\n switch (columnDef.name) {\n case \"SPRJ\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => onProjectClick ? onProjectClick({\n sender: row\n }) : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n case \"NSTATE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatJobStatusValue(row[columnDef.name])\n };\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по ФОТ для ресурса\n const loadPlanFOTDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_JOBS\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плана ФОТ по строке ресурса\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в в детализации плана ФОТ по строке ресурса\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализацц\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanFOTDtl();\n }, [planJobsDtl.reload, loadPlanFOTDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: planJobsDtlValueFormatter,\n headCellRender: planJobsDtlHeadCellRender,\n dataCellRender: prms => planJobsDtlDataCellRender({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?"); /***/ }), @@ -3810,7 +3788,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_8__.taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }), @@ -3821,7 +3799,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ResMon: () => (/* binding */ ResMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lab_plan_fot_dtl */ \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\");\n/* harmony import */ var _lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lab_fact_rpt_dtl */ \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\");\n/* harmony import */ var _lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lab_plan_jobs_dtl */ \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Монитор ресурсов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Детализация плановой трудоёмкости по ФОТ\n //Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\n //Детализация плановой трудоёмкости по графику\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Монитор ресурсов\nconst ResMon = ({\n ident,\n onPlanJobsDtlProjectClick\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n });\n\n //Состояние таблицы периодов монитора ресурсов\n const [peridos, setPeriods] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных монитора балансировки периодов с сервера\n const loadPeriods = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (peridos.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST\",\n args: {\n NIDENT: ident,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(peridos.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: peridos.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: peridos.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SPERIOD\" ? undefined : val,\n respArg: \"COUT\"\n });\n setPeriods(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При сокрытии детализации\n const handleHideDtl = () => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n }));\n\n //При нажатии на плановую трудоёмкость по ФОТ\n const handleLabPlanFOTClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: sender.NRN,\n titlePlanFOTDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_FOT}`\n }));\n\n //При нажатии на фактическую трудоёмкость по отчетам\n const handleLabFactRptClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayFactRptDtl: sender.NRN,\n titleFactRptDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_FACT_RPT}`\n }));\n\n //При нажатии на проект в списке детализации плановой трудоёмкости по графику\n const handleLabPlanJobsClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanJobsDtl: sender.NRN,\n titlePlanJobsDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_JOBS}`\n }));\n\n //При изменении состояния сортировки в таблице периодов балансировки\n const handlePeriodsOrderChanged = ({\n orders\n }) => setPeriods(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в таблице периодов балансировки\n const handlePeriodsPagesCountChanged = () => setPeriods(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализации трудоёмкости по плану-графику\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => onPlanJobsDtlProjectClick ? onPlanJobsDtlProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPeriods();\n }, [peridos.reload, loadPeriods]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, peridos.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: peridos.columnsDef,\n rows: peridos.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: peridos.morePages,\n reloading: peridos.reload,\n onOrderChanged: handlePeriodsOrderChanged,\n onPagesCountChanged: handlePeriodsPagesCountChanged,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_9__.periodsDataCellRender)({\n ...prms,\n onLabPlanFOTClick: handleLabPlanFOTClick,\n onLabFactRptClick: handleLabFactRptClick,\n onLabPlanJobsClick: handleLabPlanJobsClick\n })\n })) : null, state.displayPlanFOTDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__.LabPlanFOTDtl, {\n periodId: state.displayPlanFOTDtl,\n title: state.titlePlanFOTDtl,\n onHide: handleHideDtl\n }) : null, state.displayFactRptDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_7__.LabFactRptDtl, {\n periodId: state.displayFactRptDtl,\n title: state.titleFactRptDtl,\n onHide: handleHideDtl\n }) : null, state.displayPlanJobsDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_8__.LabPlanJobsDtl, {\n periodId: state.displayPlanJobsDtl,\n title: state.titlePlanJobsDtl,\n onHide: handleHideDtl,\n onProjectClick: handlePlanJobsDtlProjectClick\n }) : null);\n};\n\n//Контроль свойств - Монитор ресурсов\nResMon.propTypes = {\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n onPlanJobsDtlProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/res_mon.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ResMon: () => (/* binding */ ResMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lab_plan_fot_dtl */ \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\");\n/* harmony import */ var _lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lab_plan_jobs_dtl */ \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Монитор ресурсов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Детализация плановой трудоёмкости по ФОТ\n //Детализация плановой трудоёмкости по графику\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Генерация представления ячейки c данными в таблице периодов балансировки\nconst periodsDataCellRender = ({\n row,\n columnDef,\n onLabPlanFOTClick,\n onLabPlanJobsClick\n}) => {\n switch (columnDef.name) {\n case \"NLAB_PLAN_FOT\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => onLabPlanFOTClick ? onLabPlanFOTClick({\n sender: row\n }) : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n case \"NLAB_DIFF_RPT_FOT\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name])\n };\n case \"NLAB_PLAN_JOBS\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => onLabPlanJobsClick ? onLabPlanJobsClick({\n sender: row\n }) : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n case \"NLAB_DIFF_JOBS_FOT\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"right\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name] <= 0 ? \"done\" : \"error\"))\n };\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Монитор ресурсов\nconst ResMon = ({\n ident,\n onPlanJobsDtlProjectClick\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n });\n\n //Состояние таблицы периодов монитора ресурсов\n const [peridos, setPeriods] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных монитора балансировки периодов с сервера\n const loadPeriods = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (peridos.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST\",\n args: {\n NIDENT: ident,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(peridos.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: peridos.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: peridos.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SPERIOD\" ? undefined : val,\n respArg: \"COUT\"\n });\n setPeriods(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При сокрытии детализации\n const handleHideDtl = () => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n }));\n\n //При нажатии на плановую трудоёмкость по ФОТ\n const handleLabPlanFOTClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: sender.NRN,\n titlePlanFOTDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_FOT}`\n }));\n\n //При нажатии на проект в списке детализации плановой трудоёмкости по графику\n const handleLabPlanJobsClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanJobsDtl: sender.NRN,\n titlePlanJobsDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_JOBS}`\n }));\n\n //При изменении состояния сортировки в таблице периодов балансировки\n const handlePeriodsOrderChanged = ({\n orders\n }) => setPeriods(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в таблице периодов балансировки\n const handlePeriodsPagesCountChanged = () => setPeriods(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализации трудоёмкости по плану-графику\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => onPlanJobsDtlProjectClick ? onPlanJobsDtlProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPeriods();\n }, [peridos.reload, loadPeriods]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, peridos.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: peridos.columnsDef,\n rows: peridos.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: peridos.morePages,\n reloading: peridos.reload,\n onOrderChanged: handlePeriodsOrderChanged,\n onPagesCountChanged: handlePeriodsPagesCountChanged,\n dataCellRender: prms => periodsDataCellRender({\n ...prms,\n onLabPlanFOTClick: handleLabPlanFOTClick,\n onLabPlanJobsClick: handleLabPlanJobsClick\n })\n })) : null, state.displayPlanFOTDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__.LabPlanFOTDtl, {\n periodId: state.displayPlanFOTDtl,\n title: state.titlePlanFOTDtl,\n onHide: handleHideDtl\n }) : null, state.displayPlanJobsDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_7__.LabPlanJobsDtl, {\n periodId: state.displayPlanJobsDtl,\n title: state.titlePlanJobsDtl,\n onHide: handleHideDtl,\n onProjectClick: handlePlanJobsDtlProjectClick\n }) : null);\n};\n\n//Контроль свойств - Монитор ресурсов\nResMon.propTypes = {\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().number).isRequired,\n onPlanJobsDtlProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/res_mon.js?"); /***/ }), -- 2.34.1 From afbfb45475bcf5a812743a4cc80001822462aeb9 Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Wed, 17 Apr 2024 19:04:03 +0300 Subject: [PATCH 06/17] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-791=20+=20=D0=A6?= =?UTF-8?q?=D0=98=D0=A2=D0=9A-834?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 3934950..88fb56f 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -15,7 +15,7 @@ \***********************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/layouts\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./eqs_prfrm/layouts.js\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); +eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/layouts\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./eqs_prfrm/layouts.js\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl.js\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/layouts\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/layouts.js\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); /***/ }), @@ -3502,7 +3502,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControl/FormControl.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/OutlinedInput/OutlinedInput.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputAdornment/InputAdornment.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormHelperText/FormHelperText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Корневая панель выполнения работ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Дополнительная разметка и вёрстка клиентских элементов\n //Тектовые ресурсы и константы\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: false\n });\n\n // Состояние информации о трудоёмкости\n const [info, setInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n cntP: 0,\n sumP: 0,\n cntF: 0,\n sumF: 0\n });\n\n // Состояние фильтра (для отладки)\n // const [filter, setFilter] = useState({\n // belong: \"Демопример\",\n // prodObj: \"Карьер\",\n // techServ: \"\",\n // respDep: \"\",\n // fromMonth: 1,\n // fromYear: 2024,\n // toMonth: 12,\n // toYear: 2024\n // });\n\n // Состояние фильтра\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 1990,\n toMonth: 1,\n toYear: 1990\n });\n // Состояние открытия фильтра\n const [filterOpen, setFilterOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n // Состояние данных по умолчанию для фильтра (true - для отладки)\n const [defaultLoaded, setDefaultLoaded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n // Состояние хранения копии фильтра\n const [filterCopy, setFilterCopy] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ...filter\n });\n // Состояние ограничения редактирования фильтра\n const [filterLock, setFilterLock] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n // Состояние ячейки заголовка даты (по раскрытию/скрытию)\n const [activeRef, setActiveRef] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n // Состояние актуальности ссылки на ячейку\n const [refIsDeprecated, setRidFlag] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary,\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_5__[\"MessagingСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ,\n SRESPDEP: filter.respDep,\n NFROMMONTH: filter.fromMonth,\n NFROMYEAR: filter.fromYear,\n NTOMONTH: filter.toMonth,\n NTOYEAR: filter.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n let info2 = properties.find(element => {\n return element.name === \"SINFO2\";\n });\n if (info2 != undefined) {\n if (info2.data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (info2.data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_6__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setInfo({\n cntP: cP,\n sumP: sP,\n cntF: cF,\n sumF: sF\n });\n setDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, filter, executeStored]);\n\n //Загрузка значений фильра по умолчанию\n const loadDefaultFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP\",\n respArg: \"COUT\"\n });\n setFilter(pv => ({\n ...pv,\n belong: data.JURPERS,\n fromMonth: data.MONTH,\n fromYear: data.YEAR,\n toMonth: data.MONTH,\n toYear: data.YEAR\n }));\n setDefaultLoaded(true);\n }, [executeStored]);\n\n //пользовательский параметр JuridicalPerson системы\n // const getJurPers = useCallback(async () => {\n // const data = await executeStored({\n // stored: \"PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM\",\n // respArg: \"CRES\"\n // });\n // setFilter(pv => ({ ...pv, belong: data }));\n // }, [executeStored]);\n\n // Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты\n const showEquipSrv = async ({\n date,\n workType,\n info\n }) => {\n const [techName, servKind] = info.split(\"_\");\n let type;\n if (workType == \"План\") type = 0;else type = 1;\n let [year, month, day] = date.substring(1).split(\"_\");\n\n //if (day == undefined) day = null;\n\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ ? filter.techServ : null,\n SRESPDEP: filter.respDep ? filter.respDep : null,\n STECHNAME: techName,\n SSRVKIND: servKind,\n NYEAR: Number(year),\n NMONTH: Number(month),\n NDAY: day ? Number(day) : null,\n NWORKTYPE: type\n }\n });\n if (data.NIDENT) {\n if (type == 0) pOnlineShowUnit({\n unitCode: \"EquipTechServices\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else pOnlineShowUnit({\n unitCode: \"EquipRepairSheets\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_7__.TEXTS.NO_DATA_FOUND);\n };\n\n // Открыть фильтр\n const openFilter = () => {\n setFilterOpen(true);\n };\n\n // Закрыть фильтр\n const closeFilter = e => {\n if (filterLock && e != undefined) setFilter(filterCopy);\n setFilterOpen(false);\n };\n\n // Очистить фильтр\n const clearFilter = () => {\n setFilter({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: \"\",\n fromYear: \"\",\n toMonth: \"\",\n toYear: \"\"\n });\n };\n\n // Отработка события скрытия/раскрытия ячейки даты\n const handleClick = (e, ref) => {\n const curCell = ref.current;\n if (e.target.type == \"button\" || e.target.offsetParent.type == \"button\") {\n setActiveRef(curCell);\n setRidFlag(false);\n }\n };\n\n // При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n // При открытом фильтре\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filterOpen) {\n {\n setFilterCopy({\n ...filter\n });\n if (!defaultLoaded) loadDefaultFilter();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterOpen]);\n\n // При нажатии скрытии/раскрытии ячейки даты, фокус на неё\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!refIsDeprecated) {\n if (activeRef) {\n var cellRect = activeRef.getBoundingClientRect();\n //console.log(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2);\n window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0);\n setRidFlag(true);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refIsDeprecated]);\n let yearArray = [];\n const monthArray = [\"Январь\", \"Февраль\", \"Март\", \"Апрель\", \"Май\", \"Июнь\", \"Июль\", \"Август\", \"Сентябрь\", \"Октябрь\", \"Ноябрь\", \"Декабрь\"];\n let today = new Date();\n\n // Получение списка лет\n const getYearArray = () => {\n for (let i = 1990; i <= today.getFullYear(); i++) {\n yearArray.push(i);\n }\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, getYearArray(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: filterOpen,\n onClose: closeFilter\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"close\",\n onClick: closeFilter,\n sx: {\n position: \"absolute\",\n right: 8,\n top: 8,\n color: theme => theme.palette.grey[500]\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true,\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"belong-outlined\"\n }, \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n error: filter.belong ? false : true,\n id: \"belong-outlined\",\n value: filter.belong,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"belong select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"JuridicalPersons\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n belong: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"belong-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"\n }), filter.belong ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"belong-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"prodObj-outlined\"\n }, \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n error: filter.prodObj ? false : true,\n id: \"prodObj-outlined\",\n value: filter.prodObj,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"prodObj select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"EquipConfiguration\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n prodObj: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"prodObj-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"\n }), filter.prodObj ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"prodObj-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"techServ-outlined\"\n }, \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"techServ-outlined\",\n value: filter.techServ,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"techServ select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n techServ: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n label: \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"respDep-outlined\"\n }, \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"respDep-outlined\",\n value: filter.respDep,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"respDep select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n respDep: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n label: \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"from-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.fromMonth ? false : true,\n labelId: \"from-month-select-label\",\n id: \"from-month-select\",\n value: filter.fromMonth,\n \"aria-describedby\": \"from-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.fromMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"from-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"from-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.fromYear ? false : true,\n labelId: \"from-year-select-label\",\n id: \"from-year-select\",\n value: filter.fromYear,\n \"aria-describedby\": \"from-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.fromYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"from-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043D\\u0435\\u0446 \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"to-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.toMonth ? false : true,\n labelId: \"to-month-select-label\",\n id: \"to-month-select\",\n value: filter.toMonth,\n \"aria-describedby\": \"to-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.toMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"to-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"to-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.toYear ? false : true,\n labelId: \"to-year-select-label\",\n id: \"to-year-select\",\n value: filter.toYear,\n \"aria-describedby\": \"to-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.toYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"to-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n disabled: filter.belong && filter.prodObj && filter.fromMonth && filter.fromYear && filter.toMonth && filter.toYear ? false : true,\n onClick: () => {\n setFilterLock(true);\n setDataGrid({\n reload: true\n });\n closeFilter();\n }\n }, \"\\u0421\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n onClick: clearFilter\n }, \"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n onClick: () => {\n setFilter(filterCopy);\n }\n }, \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n textAlign: \"left\",\n onClick: openFilter\n }, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430: \", filter.belong ? `Принадлежность: ${filter.belong}` : \"\", \" \", filter.prodObj ? `Производственный объект: ${filter.prodObj}` : \"\", \" \", filter.techServ ? `Техническая служба: ${filter.techServ}` : \"\", \" \", filter.respDep ? `Ответственное подразделение: ${filter.respDep}` : \"\", \" \", filter.fromMonth && filter.fromYear ? `Начало периода: ${filter.fromMonth < 10 ? \"0\" + filter.fromMonth : filter.fromMonth}.${filter.fromYear}` : \"\", \" \", filter.toMonth && filter.toYear ? `Конец периода: ${filter.toMonth < 10 ? \"0\" + filter.toMonth : filter.toMonth}.${filter.toYear}` : \"\"), dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.headCellRender)({\n ...prms\n }, handleClick, filter.techServ, info.cntP, info.sumP, info.cntF, info.sumF),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.dataCellRender)({\n ...prms\n }, showEquipSrv),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n })))))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControl/FormControl.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/OutlinedInput/OutlinedInput.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputAdornment/InputAdornment.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormHelperText/FormHelperText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Корневая панель выполнения работ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: false\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n belong: \"Демопример\",\n prodObj: \"К2\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 2024,\n toMonth: 12,\n toYear: 2024\n });\n\n // const [filter, setFilter] = useState({\n // belong: \"\",\n // prodObj: \"\",\n // techServ: \"\",\n // respDep: \"\",\n // fromMonth: \"\",\n // fromYear: \"\",\n // toMonth: \"\",\n // toYear: \"\"});\n\n const [info, setInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n cntP: 0,\n sumP: 0,\n cntF: 0,\n sumF: 0\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n const [filterOpen, setFilterOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [filterCopy, setFilterCopy] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ...filter\n });\n const [filterLock, setFilterLock] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const openFilter = () => {\n setFilterOpen(true);\n };\n const closeFilter = e => {\n if (filterLock && e != undefined) setFilter(filterCopy);\n setFilterOpen(false);\n };\n const clearFilter = () => {\n setFilter({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: \"\",\n fromYear: \"\",\n toMonth: \"\",\n toYear: \"\"\n });\n };\n let yearArray = [];\n let today = new Date();\n const getYearArray = () => {\n for (let i = 1990; i <= today.getFullYear(); i++) {\n yearArray.push(i);\n }\n };\n const monthArray = [\"Январь\", \"Февраль\", \"Март\", \"Апрель\", \"Май\", \"Июнь\", \"Июль\", \"Август\", \"Сентябрь\", \"Октябрь\", \"Ноябрь\", \"Декабрь\"];\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ,\n SRESPDEP: filter.respDep,\n NFROMMONTH: filter.fromMonth,\n NFROMYEAR: filter.fromYear,\n NTOMONTH: filter.toMonth,\n NTOYEAR: filter.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n if (properties[1].data == \"Факт\" || properties[2].data == \"План\") {\n if (properties[2].data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_5__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (properties[1].data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_5__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_5__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_5__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setInfo({\n cntP: cP,\n sumP: sP,\n cntF: cF,\n sumF: sF\n });\n setDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, filter, executeStored]);\n\n //пользовательский параметр JuridicalPerson системы\n const getJurPers = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM\",\n respArg: \"CRES\"\n });\n setFilter(pv => ({\n ...pv,\n belong: data\n }));\n }, [executeStored]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filterOpen) {\n setFilterCopy({\n ...filter\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterOpen]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, getYearArray(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n open: filterOpen,\n onClose: closeFilter\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"close\",\n onClick: closeFilter,\n sx: {\n position: \"absolute\",\n right: 8,\n top: 8,\n color: theme => theme.palette.grey[500]\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n readOnly: true,\n fullWidth: true,\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n htmlFor: \"belong-outlined\"\n }, \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n error: filter.belong ? false : true,\n id: \"belong-outlined\",\n value: filter.belong,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"belong select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"JuridicalPersons\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n belong: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"belong-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 6\n }, filter.belong ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"belong-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n textAlign: \"end\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n id: \"belong-outlined-link-btn\",\n sx: {\n fontSize: \"0.75rem\",\n marginRight: \"35px\"\n },\n onClick: getJurPers\n }, \"\\u0417\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n htmlFor: \"prodObj-outlined\"\n }, \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n error: filter.prodObj ? false : true,\n id: \"prodObj-outlined\",\n value: filter.prodObj,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"prodObj select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"EquipConfiguration\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n prodObj: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"prodObj-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"\n }), filter.prodObj ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"prodObj-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n htmlFor: \"techServ-outlined\"\n }, \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n id: \"techServ-outlined\",\n value: filter.techServ,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"techServ select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n techServ: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"list\"))),\n label: \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n htmlFor: \"respDep-outlined\"\n }, \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n id: \"respDep-outlined\",\n value: filter.respDep,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"respDep select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n respDep: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"list\"))),\n label: \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n id: \"from-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n error: filter.fromMonth ? false : true,\n labelId: \"from-month-select-label\",\n id: \"from-month-select\",\n value: filter.fromMonth,\n \"aria-describedby\": \"from-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.fromMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"from-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n id: \"from-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n error: filter.fromYear ? false : true,\n labelId: \"from-year-select-label\",\n id: \"from-year-select\",\n value: filter.fromYear,\n \"aria-describedby\": \"from-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.fromYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"from-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043D\\u0435\\u0446 \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n id: \"to-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n error: filter.toMonth ? false : true,\n labelId: \"to-month-select-label\",\n id: \"to-month-select\",\n value: filter.toMonth,\n \"aria-describedby\": \"to-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.toMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"to-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n id: \"to-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n error: filter.toYear ? false : true,\n labelId: \"to-year-select-label\",\n id: \"to-year-select\",\n value: filter.toYear,\n \"aria-describedby\": \"to-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.toYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"to-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n variant: \"contained\",\n disabled: filter.belong && filter.prodObj && filter.fromMonth && filter.fromYear && filter.toMonth && filter.toYear ? false : true,\n onClick: () => {\n setFilterLock(true);\n setDataGrid({\n reload: true\n });\n closeFilter();\n }\n }, \"\\u0421\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u043E\\u0442\\u0447\\u0451\\u0442\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n variant: \"contained\",\n onClick: clearFilter\n }, \"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044C \\u0444\\u0438\\u043B\\u044C\\u0442\\u0440\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n variant: \"contained\",\n onClick: () => {\n setFilter(filterCopy);\n }\n }, \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n textAlign: \"left\",\n onClick: openFilter\n }, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430: \", filter.belong ? `Принадлежность: ${filter.belong}` : \"\", \" \", filter.prodObj ? `Производственный объект: ${filter.prodObj}` : \"\", \" \", filter.techServ ? `Техническая служба: ${filter.techServ}` : \"\", \" \", filter.respDep ? `Ответственное подразделение: ${filter.respDep}` : \"\", \" \", filter.fromMonth && filter.fromYear ? `Начало периода: ${filter.fromMonth < 10 ? \"0\" + filter.fromMonth : filter.fromMonth}.${filter.fromYear}` : \"\", \" \", filter.toMonth && filter.toYear ? `Конец периода: ${filter.toMonth < 10 ? \"0\" + filter.toMonth : filter.toMonth}.${filter.toYear}` : \"\"), dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.headCellRender)({\n ...prms\n }, filter.techServ, info.cntP, info.sumP, info.cntF, info.sumF),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.dataCellRender)({\n ...prms\n }),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n })))))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); /***/ }), @@ -3524,7 +3524,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DAY_NAME_REG_EXP: () => (/* binding */ DAY_NAME_REG_EXP),\n/* harmony export */ DIGITS_REG_EXP: () => (/* binding */ DIGITS_REG_EXP),\n/* harmony export */ MONTH_NAME_REG_EXP: () => (/* binding */ MONTH_NAME_REG_EXP),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/*\r\n Парус 8 - \r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n\n//---------\n//Константы\n//---------\n\n//Шаблон чисел и имён ячеек дат\nconst DIGITS_REG_EXP = /\\d+,?\\d*/g;\nconst MONTH_NAME_REG_EXP = /_\\d{4}_\\d{1,2}/;\nconst DAY_NAME_REG_EXP = /_\\d{4}_\\d{1,2}_\\d{1,2}/;\nlet curParent = \"\";\nlet x = 0;\n\n//-----------\n//Тело модуля\n//-----------\n\nconst formatDate = date => {\n const [year, month, day] = date.substring(1).split(\"_\");\n let nd;\n if (day == null) nd = `${month < 10 ? \"0\" + month : month}.${year}`;else nd = `${day < 10 ? \"0\" + day : day}.${month < 10 ? \"0\" + month : month}.${year}`;\n return nd;\n};\n\n// eslint-disable-next-line no-unused-vars\nconst headCellRender = ({\n columnDef\n}, hClick, podr, cntP, sumP, cntF, sumF) => {\n let cellStyle = {\n border: \"1px solid rgba(0, 0, 0)\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let stackStyle = {};\n let data = columnDef.caption;\n if (columnDef.expandable) {\n const ref = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createRef)();\n cellStyle = {\n ...cellStyle,\n padding: \"5px\"\n };\n cellProps = {\n ...cellProps,\n ref: ref,\n onClick: e => {\n hClick(e, ref);\n }\n };\n stackStyle = {\n flexDirection: \"column\"\n };\n }\n if (columnDef.name == \"STEST\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.name == \"SINFO\" || columnDef.name == \"SINFO2\") {\n cellProps = {\n colSpan: 2\n };\n if (columnDef.name == \"SINFO\") cellProps = {\n ...cellProps,\n rowSpan: 2\n };\n //if (columnDef.name == \"SINFO\") {\n //cellStyle = { display: \"none\" };\n // cellStyle = { ...cellStyle, padding: \"unset\" };\n // data = (\n // \n // \n // \n // Подразделение:\n // \n // \n // {podr}\n // \n // \n // Кол-во ремонтов, план:\n // \n // \n // {cntP}\n // \n // \n // Трудоемкость, час. план:\n // \n // \n // {sumP}\n // \n // \n // Кол-во ремонтов, факт:\n // \n // \n // {cntF}\n // \n // \n // Трудоемкость, час. факт:\n // \n // \n // {sumF}\n // \n // \n // \n // );\n //}\n }\n\n if (columnDef.name == \"SINFO2\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) {\n cellStyle = {\n ...cellStyle,\n padding: \"5px\",\n minWidth: \"25px\",\n maxWidth: \"25px\"\n };\n stackStyle = {\n justifyContent: \"center\"\n };\n }\n return {\n cellStyle,\n cellProps,\n stackStyle,\n data\n };\n};\nconst dataCellRender = ({\n row,\n columnDef\n}, showEquipSrv) => {\n let cellStyle = {\n padding: \"2px\",\n border: \"1px solid rgba(0, 0, 0) !important\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let data = \" \";\n if (row[\"SINFO2\"] == undefined) {\n if (columnDef.name == \"STEST\") {\n cellProps = {\n colSpan: 2\n };\n cellStyle = {\n ...cellStyle,\n textAlign: \"right\",\n fontWeight: \"bold\"\n };\n }\n if (columnDef.name == \"SINFO2\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.parent == \"\" && columnDef.expandable == true && columnDef.expanded == false) {\n curParent = columnDef.name;\n return {\n cellStyle: {\n ...cellStyle,\n height: \"25px\"\n },\n data\n };\n } else if (columnDef.name != \"SINFO2\" && columnDef.parent != \"\" && columnDef.expandable == false && columnDef.expanded == true) {\n if (columnDef.name.endsWith(\"_1\")) {\n curParent = columnDef.parent;\n const [year, month] = curParent.substring(1).split(\"_\");\n x = new Date(year, month, 0).getDate();\n cellProps = {\n colSpan: x\n };\n data = row[curParent];\n return {\n cellStyle,\n cellProps,\n data\n };\n } else {\n cellStyle = {\n display: \"none\"\n };\n }\n }\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"План\") {\n cellStyle = {\n ...cellStyle\n };\n cellProps = {\n rowSpan: 2\n };\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"Факт\") {\n cellStyle = {\n display: \"none\"\n };\n }\n switch (row[columnDef.name]) {\n case \"blue\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"lightblue\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"green\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"red\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"crimson\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green red\":\n case \"red green\":\n cellStyle = {\n ...cellStyle,\n padding: \"unset\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: {\n justifyContent: \"center\"\n },\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n maxHeight: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"green\"\n },\n onClick: () => showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"g\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"crimson\"\n },\n onClick: () => showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"r\"))));\n }\n return {\n cellStyle,\n cellProps\n };\n};\nconst groupCellRender = () => {\n let cellStyle = {\n display: \"none\"\n };\n return {\n cellStyle\n };\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/layouts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DAY_NAME_REG_EXP: () => (/* binding */ DAY_NAME_REG_EXP),\n/* harmony export */ DIGITS_REG_EXP: () => (/* binding */ DIGITS_REG_EXP),\n/* harmony export */ MONTH_NAME_REG_EXP: () => (/* binding */ MONTH_NAME_REG_EXP),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender)\n/* harmony export */ });\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - \r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n\n //Классы React\n\n//---------\n//Константы\n//---------\n\n//Шаблон чисел и имён ячеек дат\nconst DIGITS_REG_EXP = /\\d+,?\\d*/g;\nconst MONTH_NAME_REG_EXP = /_\\d{4}_\\d{1,2}/;\nconst DAY_NAME_REG_EXP = /_\\d{4}_\\d{1,2}_\\d{1,2}/;\nlet curParent = \"\";\nlet x = 0;\n\n//-----------\n//Тело модуля\n//-----------\nconst formatDate = date => {\n const [year, month, day] = date.substring(1).split(\"_\");\n let nd;\n if (day == null) nd = `${month < 10 ? \"0\" + month : month}.${year}`;else nd = `${day < 10 ? \"0\" + day : day}.${month < 10 ? \"0\" + month : month}.${year}`;\n return nd;\n};\nconst headCellRender = ({\n columnDef\n}, podr, cntP, sumP, cntF, sumF) => {\n let cellStyle = {\n border: \"1px solid rgba(0, 0, 0)\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let data = columnDef.caption;\n if (columnDef.expandable) {\n // поменять расположение + для развёртывания\n }\n if (columnDef.name == \"STEST\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.name == \"SINFO\" || columnDef.name == \"SINFO2\") {\n cellProps = {\n colSpan: 2\n };\n if (columnDef.name == \"SINFO\") {\n cellStyle = {\n ...cellStyle,\n padding: \"unset\"\n };\n data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: {\n justifyContent: \"center\"\n },\n direction: \"row\",\n width: 300\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u041F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 8\n }, podr), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043B-\\u0432\\u043E \\u0440\\u0435\\u043C\\u043E\\u043D\\u0442\\u043E\\u0432, \\u043F\\u043B\\u0430\\u043D:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 2\n }, cntP), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0435\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C, \\u0447\\u0430\\u0441. \\u043F\\u043B\\u0430\\u043D:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 2\n }, sumP), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043B-\\u0432\\u043E \\u0440\\u0435\\u043C\\u043E\\u043D\\u0442\\u043E\\u0432, \\u0444\\u0430\\u043A\\u0442:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 2\n }, cntF), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0435\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C, \\u0447\\u0430\\u0441. \\u0444\\u0430\\u043A\\u0442:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 2\n }, sumF)));\n }\n }\n if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) {\n cellStyle = {\n ...cellStyle,\n paddingLeft: \"5px\",\n paddingRight: \"5px\",\n minWidth: \"25px\",\n maxWidth: \"25px\"\n };\n }\n return {\n cellStyle,\n cellProps,\n data\n };\n};\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n let cellStyle = {\n padding: \"2px\",\n border: \"1px solid rgba(0, 0, 0)\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let data = \" \";\n if (row[\"SINFO2\"] == undefined) {\n if (columnDef.name == \"STEST\") cellProps = {\n colSpan: 2\n };\n if (columnDef.name == \"SINFO2\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.parent == \"\" && columnDef.expandable == true && columnDef.expanded == false) {\n curParent = columnDef.name;\n return {\n cellStyle: {\n ...cellStyle,\n height: \"25px\"\n },\n data\n };\n } else if (columnDef.name != \"SINFO2\" && columnDef.parent != \"\" && columnDef.expandable == false && columnDef.expanded == true) {\n if (columnDef.name.endsWith(\"_1\")) {\n curParent = columnDef.parent;\n const [year, month] = curParent.substring(1).split(\"_\");\n x = new Date(year, month, 0).getDate();\n cellProps = {\n colSpan: x\n };\n data = row[curParent];\n return {\n cellStyle,\n cellProps,\n data\n };\n } else {\n cellStyle = {\n display: \"none\"\n };\n }\n }\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"План\") {\n cellStyle = {\n ...cellStyle\n };\n cellProps = {\n rowSpan: 2\n };\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"Факт\") {\n cellStyle = {\n display: \"none\"\n };\n }\n switch (row[columnDef.name]) {\n case \"blue\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"royalblue\",\n border: \"1px solid rgba(0, 0, 0)\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"lawngreen\",\n border: \"1px solid rgba(0, 0, 0)\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"red\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"crimson\",\n border: \"1px solid rgba(0, 0, 0)\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green red\":\n case \"red green\":\n cellStyle = {\n ...cellStyle,\n padding: \"unset\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: {\n justifyContent: \"center\"\n },\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n maxHeight: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"lawngreen\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"g\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"crimson\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"r\"))));\n }\n return {\n cellStyle,\n cellProps\n };\n};\nconst groupCellRender = () => {\n let cellStyle = {\n display: \"none\"\n };\n return {\n cellStyle\n };\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/layouts.js?"); /***/ }), @@ -3759,6 +3759,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./app/panels/prj_jobs/lab_fact_rpt_dtl.js": +/*!*************************************************!*\ + !*** ./app/panels/prj_jobs/lab_fact_rpt_dtl.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabFactRptDtl: () => (/* binding */ LabFactRptDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nconst LabFactRptDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [factRptDtl, setFactRptDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации фактической трудоёмкости по отчетам для ресурса\n const loadFactRptDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (factRptDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_FACT_RPT\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(factRptDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: factRptDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: factRptDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setFactRptDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, factRptDtl.reload, factRptDtl.orders, factRptDtl.dataLoaded, factRptDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setFactRptDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGPagesCountChanged = () => setFactRptDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadFactRptDtl();\n }, [factRptDtl.reload, loadFactRptDtl]);\n\n //Генерация содержимого\n return factRptDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: factRptDtl.columnsDef,\n rows: factRptDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: factRptDtl.morePages,\n reloading: factRptDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlHeadCellRender,\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nLabFactRptDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_fact_rpt_dtl.js?"); + +/***/ }), + /***/ "./app/panels/prj_jobs/lab_plan_fot_dtl.js": /*!*************************************************!*\ !*** ./app/panels/prj_jobs/lab_plan_fot_dtl.js ***! @@ -3777,7 +3788,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по графику\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n title: text\n }, icon));\n};\n\n//Форматирование значений колонок в таблице детализации трудоёмкости по графику\nconst planJobsDtlValueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return formatJobStatusValue(value);\n case \"DJOB_BEG\":\n case \"DJOB_END\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.formatDateRF)(value);\n }\n return value;\n};\n\n//Генерация представления ячейки заголовка в таблице детализации трудоёмкости по графику\nconst planJobsDtlHeadCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки c данными в таблице детализации трудоёмкости по графику\nconst planJobsDtlDataCellRender = ({\n row,\n columnDef,\n onProjectClick\n}) => {\n switch (columnDef.name) {\n case \"SPRJ\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => onProjectClick ? onProjectClick({\n sender: row\n }) : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n case \"NSTATE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatJobStatusValue(row[columnDef.name])\n };\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по ФОТ для ресурса\n const loadPlanFOTDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_JOBS\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плана ФОТ по строке ресурса\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в в детализации плана ФОТ по строке ресурса\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализацц\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanFOTDtl();\n }, [planJobsDtl.reload, loadPlanFOTDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: planJobsDtlValueFormatter,\n headCellRender: planJobsDtlHeadCellRender,\n dataCellRender: prms => planJobsDtlDataCellRender({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по графику\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по графику для ресурса\n const loadPlanJobsDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_JOBS\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализаци\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanJobsDtl();\n }, [planJobsDtl.reload, loadPlanJobsDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlHeadCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlDataCellRender)({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?"); + +/***/ }), + +/***/ "./app/panels/prj_jobs/layouts.js": +/*!****************************************!*\ + !*** ./app/panels/prj_jobs/layouts.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ factRptDtlHeadCellRender: () => (/* binding */ factRptDtlHeadCellRender),\n/* harmony export */ factRptDtlValueFormatter: () => (/* binding */ factRptDtlValueFormatter),\n/* harmony export */ periodsDataCellRender: () => (/* binding */ periodsDataCellRender),\n/* harmony export */ planJobsDtlDataCellRender: () => (/* binding */ planJobsDtlDataCellRender),\n/* harmony export */ planJobsDtlHeadCellRender: () => (/* binding */ planJobsDtlHeadCellRender),\n/* harmony export */ planJobsDtlValueFormatter: () => (/* binding */ planJobsDtlValueFormatter),\n/* harmony export */ taskAttributeRenderer: () => (/* binding */ taskAttributeRenderer)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные функции\n\n//-----------\n//Тело модуля\n//-----------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = (value, addText = false, justifyContent = null) => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _extends({\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, justifyContent ? {\n justifyContent\n } : {}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Генерация кастомных представлений атрибутов задачи в редакторе\nconst taskAttributeRenderer = ({\n task,\n attribute\n}) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name], true);\n default:\n return null;\n }\n};\n\n//Форматирование значений колонок в таблице детализации трудоёмкости по графику\nconst planJobsDtlValueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return formatJobStatusValue(value, false, \"center\");\n case \"DJOB_BEG\":\n case \"DJOB_END\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(value);\n }\n return value;\n};\n\n//Генерация представления ячейки заголовка в таблице детализации трудоёмкости по графику\nconst planJobsDtlHeadCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки c данными в таблице детализации трудоёмкости по графику\nconst planJobsDtlDataCellRender = ({\n row,\n columnDef,\n onProjectClick\n}) => {\n switch (columnDef.name) {\n case \"SPRJ\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => onProjectClick ? onProjectClick({\n sender: row\n }) : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n }\n};\n\n//Форматирование значений колонок в таблице детализации трудоёмкости по отчетам\nconst factRptDtlValueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return formatJobStatusValue(value, false, \"center\");\n case \"DJOB_BEG\":\n case \"DJOB_END\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(value);\n }\n return value;\n};\n\n//Генерация представления ячейки заголовка в таблице детализации трудоёмкости по отчетам\nconst factRptDtlHeadCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NJOB_STATE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки c данными в таблице периодов балансировки\nconst periodsDataCellRender = ({\n row,\n columnDef,\n onLabPlanFOTClick,\n onLabFactRptClick,\n onLabPlanJobsClick\n}) => {\n switch (columnDef.name) {\n case \"NLAB_PLAN_FOT\":\n case \"NLAB_FACT_RPT\":\n case \"NLAB_PLAN_JOBS\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => columnDef.name === \"NLAB_PLAN_FOT\" ? onLabPlanFOTClick ? onLabPlanFOTClick({\n sender: row\n }) : null : columnDef.name === \"NLAB_FACT_RPT\" ? onLabFactRptClick ? onLabFactRptClick({\n sender: row\n }) : null : columnDef.name === \"NLAB_PLAN_JOBS\" ? onLabPlanJobsClick ? onLabPlanJobsClick({\n sender: row\n }) : null : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n case \"NLAB_DIFF_RPT_FOT\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name])\n };\n case \"NLAB_DIFF_JOBS_FOT\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"right\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name] <= 0 ? \"done\" : \"error\"))\n };\n }\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/layouts.js?"); /***/ }), @@ -3788,7 +3810,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_8__.taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }), @@ -3799,7 +3821,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ResMon: () => (/* binding */ ResMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lab_plan_fot_dtl */ \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\");\n/* harmony import */ var _lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lab_plan_jobs_dtl */ \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Монитор ресурсов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Детализация плановой трудоёмкости по ФОТ\n //Детализация плановой трудоёмкости по графику\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Генерация представления ячейки c данными в таблице периодов балансировки\nconst periodsDataCellRender = ({\n row,\n columnDef,\n onLabPlanFOTClick,\n onLabPlanJobsClick\n}) => {\n switch (columnDef.name) {\n case \"NLAB_PLAN_FOT\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => onLabPlanFOTClick ? onLabPlanFOTClick({\n sender: row\n }) : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n case \"NLAB_DIFF_RPT_FOT\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name])\n };\n case \"NLAB_PLAN_JOBS\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => onLabPlanJobsClick ? onLabPlanJobsClick({\n sender: row\n }) : null\n }, row[columnDef.name]) : row[columnDef.name]\n };\n case \"NLAB_DIFF_JOBS_FOT\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"right\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: {\n color: row[columnDef.name] <= 0 ? \"green\" : \"red\"\n }\n }, row[columnDef.name] <= 0 ? \"done\" : \"error\"))\n };\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Монитор ресурсов\nconst ResMon = ({\n ident,\n onPlanJobsDtlProjectClick\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n });\n\n //Состояние таблицы периодов монитора ресурсов\n const [peridos, setPeriods] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных монитора балансировки периодов с сервера\n const loadPeriods = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (peridos.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST\",\n args: {\n NIDENT: ident,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(peridos.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: peridos.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: peridos.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SPERIOD\" ? undefined : val,\n respArg: \"COUT\"\n });\n setPeriods(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При сокрытии детализации\n const handleHideDtl = () => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n }));\n\n //При нажатии на плановую трудоёмкость по ФОТ\n const handleLabPlanFOTClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: sender.NRN,\n titlePlanFOTDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_FOT}`\n }));\n\n //При нажатии на проект в списке детализации плановой трудоёмкости по графику\n const handleLabPlanJobsClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanJobsDtl: sender.NRN,\n titlePlanJobsDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_JOBS}`\n }));\n\n //При изменении состояния сортировки в таблице периодов балансировки\n const handlePeriodsOrderChanged = ({\n orders\n }) => setPeriods(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в таблице периодов балансировки\n const handlePeriodsPagesCountChanged = () => setPeriods(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализации трудоёмкости по плану-графику\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => onPlanJobsDtlProjectClick ? onPlanJobsDtlProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPeriods();\n }, [peridos.reload, loadPeriods]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, peridos.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: peridos.columnsDef,\n rows: peridos.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: peridos.morePages,\n reloading: peridos.reload,\n onOrderChanged: handlePeriodsOrderChanged,\n onPagesCountChanged: handlePeriodsPagesCountChanged,\n dataCellRender: prms => periodsDataCellRender({\n ...prms,\n onLabPlanFOTClick: handleLabPlanFOTClick,\n onLabPlanJobsClick: handleLabPlanJobsClick\n })\n })) : null, state.displayPlanFOTDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__.LabPlanFOTDtl, {\n periodId: state.displayPlanFOTDtl,\n title: state.titlePlanFOTDtl,\n onHide: handleHideDtl\n }) : null, state.displayPlanJobsDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_7__.LabPlanJobsDtl, {\n periodId: state.displayPlanJobsDtl,\n title: state.titlePlanJobsDtl,\n onHide: handleHideDtl,\n onProjectClick: handlePlanJobsDtlProjectClick\n }) : null);\n};\n\n//Контроль свойств - Монитор ресурсов\nResMon.propTypes = {\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().number).isRequired,\n onPlanJobsDtlProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/res_mon.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ResMon: () => (/* binding */ ResMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lab_plan_fot_dtl */ \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\");\n/* harmony import */ var _lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lab_fact_rpt_dtl */ \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\");\n/* harmony import */ var _lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lab_plan_jobs_dtl */ \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Монитор ресурсов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Детализация плановой трудоёмкости по ФОТ\n //Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\n //Детализация плановой трудоёмкости по графику\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Монитор ресурсов\nconst ResMon = ({\n ident,\n onPlanJobsDtlProjectClick\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n });\n\n //Состояние таблицы периодов монитора ресурсов\n const [peridos, setPeriods] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных монитора балансировки периодов с сервера\n const loadPeriods = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (peridos.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST\",\n args: {\n NIDENT: ident,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(peridos.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: peridos.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: peridos.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SPERIOD\" ? undefined : val,\n respArg: \"COUT\"\n });\n setPeriods(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При сокрытии детализации\n const handleHideDtl = () => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n }));\n\n //При нажатии на плановую трудоёмкость по ФОТ\n const handleLabPlanFOTClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: sender.NRN,\n titlePlanFOTDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_FOT}`\n }));\n\n //При нажатии на фактическую трудоёмкость по отчетам\n const handleLabFactRptClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayFactRptDtl: sender.NRN,\n titleFactRptDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_FACT_RPT}`\n }));\n\n //При нажатии на проект в списке детализации плановой трудоёмкости по графику\n const handleLabPlanJobsClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanJobsDtl: sender.NRN,\n titlePlanJobsDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_JOBS}`\n }));\n\n //При изменении состояния сортировки в таблице периодов балансировки\n const handlePeriodsOrderChanged = ({\n orders\n }) => setPeriods(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в таблице периодов балансировки\n const handlePeriodsPagesCountChanged = () => setPeriods(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализации трудоёмкости по плану-графику\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => onPlanJobsDtlProjectClick ? onPlanJobsDtlProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPeriods();\n }, [peridos.reload, loadPeriods]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, peridos.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: peridos.columnsDef,\n rows: peridos.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: peridos.morePages,\n reloading: peridos.reload,\n onOrderChanged: handlePeriodsOrderChanged,\n onPagesCountChanged: handlePeriodsPagesCountChanged,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_9__.periodsDataCellRender)({\n ...prms,\n onLabPlanFOTClick: handleLabPlanFOTClick,\n onLabFactRptClick: handleLabFactRptClick,\n onLabPlanJobsClick: handleLabPlanJobsClick\n })\n })) : null, state.displayPlanFOTDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__.LabPlanFOTDtl, {\n periodId: state.displayPlanFOTDtl,\n title: state.titlePlanFOTDtl,\n onHide: handleHideDtl\n }) : null, state.displayFactRptDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_7__.LabFactRptDtl, {\n periodId: state.displayFactRptDtl,\n title: state.titleFactRptDtl,\n onHide: handleHideDtl\n }) : null, state.displayPlanJobsDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_8__.LabPlanJobsDtl, {\n periodId: state.displayPlanJobsDtl,\n title: state.titlePlanJobsDtl,\n onHide: handleHideDtl,\n onProjectClick: handlePlanJobsDtlProjectClick\n }) : null);\n};\n\n//Контроль свойств - Монитор ресурсов\nResMon.propTypes = {\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n onPlanJobsDtlProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/res_mon.js?"); /***/ }), -- 2.34.1 From 761237c110700fbbd0abb880cc313ba6830dd26a Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 18 Apr 2024 12:48:07 +0300 Subject: [PATCH 07/17] =?UTF-8?q?WEB=20APP:=20=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2"=20-=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/prj_jobs/prj_jobs.js | 177 ++++++++++++++++++++++++++++---- 1 file changed, 159 insertions(+), 18 deletions(-) diff --git a/app/panels/prj_jobs/prj_jobs.js b/app/panels/prj_jobs/prj_jobs.js index 696d436..f414caa 100644 --- a/app/panels/prj_jobs/prj_jobs.js +++ b/app/panels/prj_jobs/prj_jobs.js @@ -9,13 +9,34 @@ import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента -import { Drawer, Fab, Box, Grid, List, ListItemButton, ListItemText, ListItemIcon, Icon, Typography } from "@mui/material"; //Интерфейсные элементы +import { + Drawer, + Fab, + Box, + Grid, + List, + ListItemButton, + ListItemText, + ListItemIcon, + Icon, + Typography, + Divider, + ListItem, + Button, + Dialog, + DialogContent, + DialogActions, + TextField, + DialogTitle +} from "@mui/material"; //Интерфейсные элементы import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { P8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта +import { formatDateRF } from "../../core/utils"; //Вспомогательные функции +import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы и константы import { ResMon } from "./res_mon"; //Монитор ресурсов import { taskAttributeRenderer } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов @@ -31,7 +52,6 @@ const GANTT_WIDTH = "98vw"; //Стили const STYLES = { - PROJECTS_LIST_SAVE_BUTTON: { backgroundColor: "orange" }, PROJECTS_LIST_ITEM_NOJOBS: { backgroundColor: "#ff000045" }, PROJECTS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" }, PROJECTS_LIST_ITEM_SECONDARY: { wordWrap: "break-word", fontSize: "0.5rem", textTransform: "uppercase" }, @@ -46,10 +66,77 @@ const STYLES = { PERIODS_DRAWER: { width: "1200px", flexShrink: 0, [`& .MuiDrawer-paper`]: { width: "1200px", boxSizing: "border-box" } } }; +//Единицы измерения длительности +const DURATION_MEAS = { + 0: "День", + 1: "Неделя", + 2: "Декада", + 3: "Месяц", + 4: "Квартал", + 5: "Год" +}; + //------------------------------------ //Вспомогательные функции и компоненты //------------------------------------ +//Диалог параметров инициализации панели +const InitDialog = ({ dateBegin, dateFact, onOk, onCancel }) => { + //Собственное состояние - значения с-по + const [values, setValues] = useState({ dateBegin: formatDateJSONDateOnly(dateBegin), dateFact: formatDateJSONDateOnly(dateFact) }); + + //Отработка воода значения в фильтр + const handleValueTextFieldChanged = e => setValues(prev => ({ ...prev, [e.target.name]: e.target.value })); + + //Генерация содержимого + return ( + (onCancel ? onCancel() : null)} + > + Параметры инициализации + + + + + + + + + + ); +}; + +//Контроль свойств - Диалог параметров инициализации панели +InitDialog.propTypes = { + dateBegin: PropTypes.instanceOf(Date).isRequired, + dateFact: PropTypes.instanceOf(Date).isRequired, + onOk: PropTypes.func, + onCancel: PropTypes.func +}; + //Список проектов const ProjectsList = ({ projects = [], selectedProject, onClick } = {}) => { //Подключение к контексту сообщений @@ -132,7 +219,8 @@ const PrjJobs = () => { selectedProject: null, selectedProjectDocRn: null, selectedProjectGanttDef: {}, - selectedProjectTasks: [] + selectedProjectTasks: [], + showInitDialog: false }); //Подключение к контексту приложения @@ -216,8 +304,8 @@ const PrjJobs = () => { const data = await executeStored({ stored: "PKG_P8PANELS_PROJECTS.JB_INIT", args: { - DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null, - DFACT: state.dateFact ? new Date(state.dateFact) : null, + DBEGIN: state.dateBegin ? state.dateBegin : null, + DFACT: state.dateFact ? state.dateFact : null, NDURATION_MEAS: state.durationMeas, SLAB_MEAS: state.labMeas, NIDENT: state.ident @@ -226,8 +314,9 @@ const PrjJobs = () => { setState(pv => ({ ...pv, init: true, - dateBegin: data.DBEGIN, - dateFact: data.DFACT, + reInit: false, + dateBegin: new Date(data.DBEGIN), + dateFact: new Date(data.DFACT), durationMeas: data.NDURATION_MEAS, labMeas: data.SLAB_MEAS, resourceStatus: data.NRESOURCE_STATUS, @@ -246,11 +335,10 @@ const PrjJobs = () => { if (state.selectedProject) loadProjectJobs(false); }, [state.selectedProject, loadProjectJobs]); - //При подключении компонента к странице + //При изменении флага инициализации useEffect(() => { initJobs(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + }, [state.init, initJobs]); //Выбор проекта const selectPoject = (project, projectDocRn) => { @@ -292,6 +380,16 @@ const PrjJobs = () => { if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas); }; + //Отработка нажатия на отображения диалога параметров инициализации панели + const handleShowInitDialogClick = () => setState(pv => ({ ...pv, showInitDialog: true })); + + //Отработка нажатия на "ОК" в диалоге параметров инициализации панели + const handleOKInitDialogClick = values => + setState(pv => ({ ...pv, dateBegin: values.dateBegin, dateFact: values.dateFact, showInitDialog: false, init: false })); + + //Отработка нажатия на "Отмена" в диалоге параметров инициализации панели + const handleCancelInitDialogClick = () => setState(pv => ({ ...pv, showInitDialog: false })); + //Обработка нажатия на сохранение данных в проект const handleSaveToProjectsClick = () => saveProjects(); @@ -304,6 +402,14 @@ const PrjJobs = () => { //Генерация содержимого return ( + {state.showInitDialog ? ( + + ) : null} setState(pv => ({ ...pv, showProjectsList: !pv.showProjectsList }))}> Проекты {state.needSave ? ( @@ -321,15 +427,50 @@ const PrjJobs = () => { > {state.projectsLoaded ? ( <> + + + + Начало: + {formatDateRF(state.dateBegin)} +
+ Факт на: + {formatDateRF(state.dateFact)} +
+ Длительность: + {DURATION_MEAS[state.durationMeas]} +
+ Трудоёмкость: + {state.labMeas} + + } + /> +
+ + + +
+ {state.needSave ? ( - - - - save - - - - + <> + + + + + + + ) : null} -- 2.34.1 From 4b01736bdd179c1b364f05d12c95f8b3aa338733 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 18 Apr 2024 12:48:45 +0300 Subject: [PATCH 08/17] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 88fb56f..b7133de 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -3502,7 +3502,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControl/FormControl.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/OutlinedInput/OutlinedInput.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputAdornment/InputAdornment.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormHelperText/FormHelperText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Корневая панель выполнения работ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: false\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n belong: \"Демопример\",\n prodObj: \"К2\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 2024,\n toMonth: 12,\n toYear: 2024\n });\n\n // const [filter, setFilter] = useState({\n // belong: \"\",\n // prodObj: \"\",\n // techServ: \"\",\n // respDep: \"\",\n // fromMonth: \"\",\n // fromYear: \"\",\n // toMonth: \"\",\n // toYear: \"\"});\n\n const [info, setInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n cntP: 0,\n sumP: 0,\n cntF: 0,\n sumF: 0\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n const [filterOpen, setFilterOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [filterCopy, setFilterCopy] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ...filter\n });\n const [filterLock, setFilterLock] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const openFilter = () => {\n setFilterOpen(true);\n };\n const closeFilter = e => {\n if (filterLock && e != undefined) setFilter(filterCopy);\n setFilterOpen(false);\n };\n const clearFilter = () => {\n setFilter({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: \"\",\n fromYear: \"\",\n toMonth: \"\",\n toYear: \"\"\n });\n };\n let yearArray = [];\n let today = new Date();\n const getYearArray = () => {\n for (let i = 1990; i <= today.getFullYear(); i++) {\n yearArray.push(i);\n }\n };\n const monthArray = [\"Январь\", \"Февраль\", \"Март\", \"Апрель\", \"Май\", \"Июнь\", \"Июль\", \"Август\", \"Сентябрь\", \"Октябрь\", \"Ноябрь\", \"Декабрь\"];\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ,\n SRESPDEP: filter.respDep,\n NFROMMONTH: filter.fromMonth,\n NFROMYEAR: filter.fromYear,\n NTOMONTH: filter.toMonth,\n NTOYEAR: filter.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n if (properties[1].data == \"Факт\" || properties[2].data == \"План\") {\n if (properties[2].data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_5__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (properties[1].data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_5__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_5__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_5__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setInfo({\n cntP: cP,\n sumP: sP,\n cntF: cF,\n sumF: sF\n });\n setDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, filter, executeStored]);\n\n //пользовательский параметр JuridicalPerson системы\n const getJurPers = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM\",\n respArg: \"CRES\"\n });\n setFilter(pv => ({\n ...pv,\n belong: data\n }));\n }, [executeStored]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filterOpen) {\n setFilterCopy({\n ...filter\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterOpen]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, getYearArray(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n open: filterOpen,\n onClose: closeFilter\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"close\",\n onClick: closeFilter,\n sx: {\n position: \"absolute\",\n right: 8,\n top: 8,\n color: theme => theme.palette.grey[500]\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n readOnly: true,\n fullWidth: true,\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n htmlFor: \"belong-outlined\"\n }, \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n error: filter.belong ? false : true,\n id: \"belong-outlined\",\n value: filter.belong,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"belong select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"JuridicalPersons\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n belong: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"belong-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 6\n }, filter.belong ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"belong-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n textAlign: \"end\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n id: \"belong-outlined-link-btn\",\n sx: {\n fontSize: \"0.75rem\",\n marginRight: \"35px\"\n },\n onClick: getJurPers\n }, \"\\u0417\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n htmlFor: \"prodObj-outlined\"\n }, \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n error: filter.prodObj ? false : true,\n id: \"prodObj-outlined\",\n value: filter.prodObj,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"prodObj select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"EquipConfiguration\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n prodObj: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"prodObj-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"\n }), filter.prodObj ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"prodObj-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n htmlFor: \"techServ-outlined\"\n }, \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n id: \"techServ-outlined\",\n value: filter.techServ,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"techServ select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n techServ: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"list\"))),\n label: \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n htmlFor: \"respDep-outlined\"\n }, \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n id: \"respDep-outlined\",\n value: filter.respDep,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n \"aria-label\": \"respDep select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n respDep: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"list\"))),\n label: \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n id: \"from-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n error: filter.fromMonth ? false : true,\n labelId: \"from-month-select-label\",\n id: \"from-month-select\",\n value: filter.fromMonth,\n \"aria-describedby\": \"from-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.fromMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"from-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n id: \"from-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n error: filter.fromYear ? false : true,\n labelId: \"from-year-select-label\",\n id: \"from-year-select\",\n value: filter.fromYear,\n \"aria-describedby\": \"from-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.fromYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"from-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043D\\u0435\\u0446 \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n id: \"to-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n error: filter.toMonth ? false : true,\n labelId: \"to-month-select-label\",\n id: \"to-month-select\",\n value: filter.toMonth,\n \"aria-describedby\": \"to-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.toMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"to-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n id: \"to-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n error: filter.toYear ? false : true,\n labelId: \"to-year-select-label\",\n id: \"to-year-select\",\n value: filter.toYear,\n \"aria-describedby\": \"to-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.toYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"to-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n variant: \"contained\",\n disabled: filter.belong && filter.prodObj && filter.fromMonth && filter.fromYear && filter.toMonth && filter.toYear ? false : true,\n onClick: () => {\n setFilterLock(true);\n setDataGrid({\n reload: true\n });\n closeFilter();\n }\n }, \"\\u0421\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u043E\\u0442\\u0447\\u0451\\u0442\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n variant: \"contained\",\n onClick: clearFilter\n }, \"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044C \\u0444\\u0438\\u043B\\u044C\\u0442\\u0440\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n variant: \"contained\",\n onClick: () => {\n setFilter(filterCopy);\n }\n }, \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n textAlign: \"left\",\n onClick: openFilter\n }, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430: \", filter.belong ? `Принадлежность: ${filter.belong}` : \"\", \" \", filter.prodObj ? `Производственный объект: ${filter.prodObj}` : \"\", \" \", filter.techServ ? `Техническая служба: ${filter.techServ}` : \"\", \" \", filter.respDep ? `Ответственное подразделение: ${filter.respDep}` : \"\", \" \", filter.fromMonth && filter.fromYear ? `Начало периода: ${filter.fromMonth < 10 ? \"0\" + filter.fromMonth : filter.fromMonth}.${filter.fromYear}` : \"\", \" \", filter.toMonth && filter.toYear ? `Конец периода: ${filter.toMonth < 10 ? \"0\" + filter.toMonth : filter.toMonth}.${filter.toYear}` : \"\"), dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.headCellRender)({\n ...prms\n }, filter.techServ, info.cntP, info.sumP, info.cntF, info.sumF),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.dataCellRender)({\n ...prms\n }),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n })))))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControl/FormControl.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/OutlinedInput/OutlinedInput.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputAdornment/InputAdornment.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormHelperText/FormHelperText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Корневая панель выполнения работ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Дополнительная разметка и вёрстка клиентских элементов\n //Тектовые ресурсы и константы\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: false\n });\n\n // Состояние информации о трудоёмкости\n const [info, setInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n cntP: 0,\n sumP: 0,\n cntF: 0,\n sumF: 0\n });\n\n // Состояние фильтра (для отладки)\n // const [filter, setFilter] = useState({\n // belong: \"Демопример\",\n // prodObj: \"Карьер\",\n // techServ: \"\",\n // respDep: \"\",\n // fromMonth: 1,\n // fromYear: 2024,\n // toMonth: 12,\n // toYear: 2024\n // });\n\n // Состояние фильтра\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 1990,\n toMonth: 1,\n toYear: 1990\n });\n // Состояние открытия фильтра\n const [filterOpen, setFilterOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n // Состояние данных по умолчанию для фильтра (true - для отладки)\n const [defaultLoaded, setDefaultLoaded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n // Состояние хранения копии фильтра\n const [filterCopy, setFilterCopy] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ...filter\n });\n // Состояние ограничения редактирования фильтра\n const [filterLock, setFilterLock] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n // Состояние ячейки заголовка даты (по раскрытию/скрытию)\n const [activeRef, setActiveRef] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n // Состояние актуальности ссылки на ячейку\n const [refIsDeprecated, setRidFlag] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary,\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_5__[\"MessagingСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ,\n SRESPDEP: filter.respDep,\n NFROMMONTH: filter.fromMonth,\n NFROMYEAR: filter.fromYear,\n NTOMONTH: filter.toMonth,\n NTOYEAR: filter.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n let info2 = properties.find(element => {\n return element.name === \"SINFO2\";\n });\n if (info2 != undefined) {\n if (info2.data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (info2.data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_6__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setInfo({\n cntP: cP,\n sumP: sP,\n cntF: cF,\n sumF: sF\n });\n setDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, filter, executeStored]);\n\n //Загрузка значений фильра по умолчанию\n const loadDefaultFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP\",\n respArg: \"COUT\"\n });\n setFilter(pv => ({\n ...pv,\n belong: data.JURPERS,\n fromMonth: data.MONTH,\n fromYear: data.YEAR,\n toMonth: data.MONTH,\n toYear: data.YEAR\n }));\n setDefaultLoaded(true);\n }, [executeStored]);\n\n //пользовательский параметр JuridicalPerson системы\n // const getJurPers = useCallback(async () => {\n // const data = await executeStored({\n // stored: \"PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM\",\n // respArg: \"CRES\"\n // });\n // setFilter(pv => ({ ...pv, belong: data }));\n // }, [executeStored]);\n\n // Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты\n const showEquipSrv = async ({\n date,\n workType,\n info\n }) => {\n const [techName, servKind] = info.split(\"_\");\n let type;\n if (workType == \"План\") type = 0;else type = 1;\n let [year, month, day] = date.substring(1).split(\"_\");\n\n //if (day == undefined) day = null;\n\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ ? filter.techServ : null,\n SRESPDEP: filter.respDep ? filter.respDep : null,\n STECHNAME: techName,\n SSRVKIND: servKind,\n NYEAR: Number(year),\n NMONTH: Number(month),\n NDAY: day ? Number(day) : null,\n NWORKTYPE: type\n }\n });\n if (data.NIDENT) {\n if (type == 0) pOnlineShowUnit({\n unitCode: \"EquipTechServices\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else pOnlineShowUnit({\n unitCode: \"EquipRepairSheets\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_7__.TEXTS.NO_DATA_FOUND);\n };\n\n // Открыть фильтр\n const openFilter = () => {\n setFilterOpen(true);\n };\n\n // Закрыть фильтр\n const closeFilter = e => {\n if (filterLock && e != undefined) setFilter(filterCopy);\n setFilterOpen(false);\n };\n\n // Очистить фильтр\n const clearFilter = () => {\n setFilter({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: \"\",\n fromYear: \"\",\n toMonth: \"\",\n toYear: \"\"\n });\n };\n\n // Отработка события скрытия/раскрытия ячейки даты\n const handleClick = (e, ref) => {\n const curCell = ref.current;\n if (e.target.type == \"button\" || e.target.offsetParent.type == \"button\") {\n setActiveRef(curCell);\n setRidFlag(false);\n }\n };\n\n // При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n // При открытом фильтре\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filterOpen) {\n {\n setFilterCopy({\n ...filter\n });\n if (!defaultLoaded) loadDefaultFilter();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterOpen]);\n\n // При нажатии скрытии/раскрытии ячейки даты, фокус на неё\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!refIsDeprecated) {\n if (activeRef) {\n var cellRect = activeRef.getBoundingClientRect();\n //console.log(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2);\n window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0);\n setRidFlag(true);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refIsDeprecated]);\n let yearArray = [];\n const monthArray = [\"Январь\", \"Февраль\", \"Март\", \"Апрель\", \"Май\", \"Июнь\", \"Июль\", \"Август\", \"Сентябрь\", \"Октябрь\", \"Ноябрь\", \"Декабрь\"];\n let today = new Date();\n\n // Получение списка лет\n const getYearArray = () => {\n for (let i = 1990; i <= today.getFullYear(); i++) {\n yearArray.push(i);\n }\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, getYearArray(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: filterOpen,\n onClose: closeFilter\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"close\",\n onClick: closeFilter,\n sx: {\n position: \"absolute\",\n right: 8,\n top: 8,\n color: theme => theme.palette.grey[500]\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true,\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"belong-outlined\"\n }, \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n error: filter.belong ? false : true,\n id: \"belong-outlined\",\n value: filter.belong,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"belong select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"JuridicalPersons\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n belong: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"belong-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"\n }), filter.belong ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"belong-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"prodObj-outlined\"\n }, \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n error: filter.prodObj ? false : true,\n id: \"prodObj-outlined\",\n value: filter.prodObj,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"prodObj select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"EquipConfiguration\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n prodObj: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"prodObj-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"\n }), filter.prodObj ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"prodObj-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"techServ-outlined\"\n }, \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"techServ-outlined\",\n value: filter.techServ,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"techServ select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n techServ: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n label: \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"respDep-outlined\"\n }, \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"respDep-outlined\",\n value: filter.respDep,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"respDep select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n respDep: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n label: \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"from-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.fromMonth ? false : true,\n labelId: \"from-month-select-label\",\n id: \"from-month-select\",\n value: filter.fromMonth,\n \"aria-describedby\": \"from-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.fromMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"from-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"from-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.fromYear ? false : true,\n labelId: \"from-year-select-label\",\n id: \"from-year-select\",\n value: filter.fromYear,\n \"aria-describedby\": \"from-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.fromYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"from-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043D\\u0435\\u0446 \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"to-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.toMonth ? false : true,\n labelId: \"to-month-select-label\",\n id: \"to-month-select\",\n value: filter.toMonth,\n \"aria-describedby\": \"to-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.toMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"to-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"to-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.toYear ? false : true,\n labelId: \"to-year-select-label\",\n id: \"to-year-select\",\n value: filter.toYear,\n \"aria-describedby\": \"to-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.toYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"to-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n disabled: filter.belong && filter.prodObj && filter.fromMonth && filter.fromYear && filter.toMonth && filter.toYear ? false : true,\n onClick: () => {\n setFilterLock(true);\n setDataGrid({\n reload: true\n });\n closeFilter();\n }\n }, \"\\u0421\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n onClick: clearFilter\n }, \"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n onClick: () => {\n setFilter(filterCopy);\n }\n }, \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n textAlign: \"left\",\n onClick: openFilter\n }, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430: \", filter.belong ? `Принадлежность: ${filter.belong}` : \"\", \" \", filter.prodObj ? `Производственный объект: ${filter.prodObj}` : \"\", \" \", filter.techServ ? `Техническая служба: ${filter.techServ}` : \"\", \" \", filter.respDep ? `Ответственное подразделение: ${filter.respDep}` : \"\", \" \", filter.fromMonth && filter.fromYear ? `Начало периода: ${filter.fromMonth < 10 ? \"0\" + filter.fromMonth : filter.fromMonth}.${filter.fromYear}` : \"\", \" \", filter.toMonth && filter.toYear ? `Конец периода: ${filter.toMonth < 10 ? \"0\" + filter.toMonth : filter.toMonth}.${filter.toYear}` : \"\"), dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.headCellRender)({\n ...prms\n }, handleClick, filter.techServ, info.cntP, info.sumP, info.cntF, info.sumF),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.dataCellRender)({\n ...prms\n }, showEquipSrv),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n })))))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); /***/ }), @@ -3524,7 +3524,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DAY_NAME_REG_EXP: () => (/* binding */ DAY_NAME_REG_EXP),\n/* harmony export */ DIGITS_REG_EXP: () => (/* binding */ DIGITS_REG_EXP),\n/* harmony export */ MONTH_NAME_REG_EXP: () => (/* binding */ MONTH_NAME_REG_EXP),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender)\n/* harmony export */ });\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - \r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n\n //Классы React\n\n//---------\n//Константы\n//---------\n\n//Шаблон чисел и имён ячеек дат\nconst DIGITS_REG_EXP = /\\d+,?\\d*/g;\nconst MONTH_NAME_REG_EXP = /_\\d{4}_\\d{1,2}/;\nconst DAY_NAME_REG_EXP = /_\\d{4}_\\d{1,2}_\\d{1,2}/;\nlet curParent = \"\";\nlet x = 0;\n\n//-----------\n//Тело модуля\n//-----------\nconst formatDate = date => {\n const [year, month, day] = date.substring(1).split(\"_\");\n let nd;\n if (day == null) nd = `${month < 10 ? \"0\" + month : month}.${year}`;else nd = `${day < 10 ? \"0\" + day : day}.${month < 10 ? \"0\" + month : month}.${year}`;\n return nd;\n};\nconst headCellRender = ({\n columnDef\n}, podr, cntP, sumP, cntF, sumF) => {\n let cellStyle = {\n border: \"1px solid rgba(0, 0, 0)\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let data = columnDef.caption;\n if (columnDef.expandable) {\n // поменять расположение + для развёртывания\n }\n if (columnDef.name == \"STEST\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.name == \"SINFO\" || columnDef.name == \"SINFO2\") {\n cellProps = {\n colSpan: 2\n };\n if (columnDef.name == \"SINFO\") {\n cellStyle = {\n ...cellStyle,\n padding: \"unset\"\n };\n data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: {\n justifyContent: \"center\"\n },\n direction: \"row\",\n width: 300\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u041F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 8\n }, podr), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043B-\\u0432\\u043E \\u0440\\u0435\\u043C\\u043E\\u043D\\u0442\\u043E\\u0432, \\u043F\\u043B\\u0430\\u043D:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 2\n }, cntP), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0435\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C, \\u0447\\u0430\\u0441. \\u043F\\u043B\\u0430\\u043D:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 2\n }, sumP), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043B-\\u0432\\u043E \\u0440\\u0435\\u043C\\u043E\\u043D\\u0442\\u043E\\u0432, \\u0444\\u0430\\u043A\\u0442:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 2\n }, cntF), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 4\n }, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0435\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C, \\u0447\\u0430\\u0441. \\u0444\\u0430\\u043A\\u0442:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 2\n }, sumF)));\n }\n }\n if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) {\n cellStyle = {\n ...cellStyle,\n paddingLeft: \"5px\",\n paddingRight: \"5px\",\n minWidth: \"25px\",\n maxWidth: \"25px\"\n };\n }\n return {\n cellStyle,\n cellProps,\n data\n };\n};\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n let cellStyle = {\n padding: \"2px\",\n border: \"1px solid rgba(0, 0, 0)\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let data = \" \";\n if (row[\"SINFO2\"] == undefined) {\n if (columnDef.name == \"STEST\") cellProps = {\n colSpan: 2\n };\n if (columnDef.name == \"SINFO2\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.parent == \"\" && columnDef.expandable == true && columnDef.expanded == false) {\n curParent = columnDef.name;\n return {\n cellStyle: {\n ...cellStyle,\n height: \"25px\"\n },\n data\n };\n } else if (columnDef.name != \"SINFO2\" && columnDef.parent != \"\" && columnDef.expandable == false && columnDef.expanded == true) {\n if (columnDef.name.endsWith(\"_1\")) {\n curParent = columnDef.parent;\n const [year, month] = curParent.substring(1).split(\"_\");\n x = new Date(year, month, 0).getDate();\n cellProps = {\n colSpan: x\n };\n data = row[curParent];\n return {\n cellStyle,\n cellProps,\n data\n };\n } else {\n cellStyle = {\n display: \"none\"\n };\n }\n }\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"План\") {\n cellStyle = {\n ...cellStyle\n };\n cellProps = {\n rowSpan: 2\n };\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"Факт\") {\n cellStyle = {\n display: \"none\"\n };\n }\n switch (row[columnDef.name]) {\n case \"blue\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"royalblue\",\n border: \"1px solid rgba(0, 0, 0)\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"lawngreen\",\n border: \"1px solid rgba(0, 0, 0)\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"red\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"crimson\",\n border: \"1px solid rgba(0, 0, 0)\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green red\":\n case \"red green\":\n cellStyle = {\n ...cellStyle,\n padding: \"unset\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: {\n justifyContent: \"center\"\n },\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n maxHeight: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"lawngreen\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"g\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"crimson\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"r\"))));\n }\n return {\n cellStyle,\n cellProps\n };\n};\nconst groupCellRender = () => {\n let cellStyle = {\n display: \"none\"\n };\n return {\n cellStyle\n };\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/layouts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DAY_NAME_REG_EXP: () => (/* binding */ DAY_NAME_REG_EXP),\n/* harmony export */ DIGITS_REG_EXP: () => (/* binding */ DIGITS_REG_EXP),\n/* harmony export */ MONTH_NAME_REG_EXP: () => (/* binding */ MONTH_NAME_REG_EXP),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/*\r\n Парус 8 - \r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n\n//---------\n//Константы\n//---------\n\n//Шаблон чисел и имён ячеек дат\nconst DIGITS_REG_EXP = /\\d+,?\\d*/g;\nconst MONTH_NAME_REG_EXP = /_\\d{4}_\\d{1,2}/;\nconst DAY_NAME_REG_EXP = /_\\d{4}_\\d{1,2}_\\d{1,2}/;\nlet curParent = \"\";\nlet x = 0;\n\n//-----------\n//Тело модуля\n//-----------\n\nconst formatDate = date => {\n const [year, month, day] = date.substring(1).split(\"_\");\n let nd;\n if (day == null) nd = `${month < 10 ? \"0\" + month : month}.${year}`;else nd = `${day < 10 ? \"0\" + day : day}.${month < 10 ? \"0\" + month : month}.${year}`;\n return nd;\n};\n\n// eslint-disable-next-line no-unused-vars\nconst headCellRender = ({\n columnDef\n}, hClick, podr, cntP, sumP, cntF, sumF) => {\n let cellStyle = {\n border: \"1px solid rgba(0, 0, 0)\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let stackStyle = {};\n let data = columnDef.caption;\n if (columnDef.expandable) {\n const ref = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createRef)();\n cellStyle = {\n ...cellStyle,\n padding: \"5px\"\n };\n cellProps = {\n ...cellProps,\n ref: ref,\n onClick: e => {\n hClick(e, ref);\n }\n };\n stackStyle = {\n flexDirection: \"column\"\n };\n }\n if (columnDef.name == \"STEST\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.name == \"SINFO\" || columnDef.name == \"SINFO2\") {\n cellProps = {\n colSpan: 2\n };\n if (columnDef.name == \"SINFO\") cellProps = {\n ...cellProps,\n rowSpan: 2\n };\n //if (columnDef.name == \"SINFO\") {\n //cellStyle = { display: \"none\" };\n // cellStyle = { ...cellStyle, padding: \"unset\" };\n // data = (\n // \n // \n // \n // Подразделение:\n // \n // \n // {podr}\n // \n // \n // Кол-во ремонтов, план:\n // \n // \n // {cntP}\n // \n // \n // Трудоемкость, час. план:\n // \n // \n // {sumP}\n // \n // \n // Кол-во ремонтов, факт:\n // \n // \n // {cntF}\n // \n // \n // Трудоемкость, час. факт:\n // \n // \n // {sumF}\n // \n // \n // \n // );\n //}\n }\n\n if (columnDef.name == \"SINFO2\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) {\n cellStyle = {\n ...cellStyle,\n padding: \"5px\",\n minWidth: \"25px\",\n maxWidth: \"25px\"\n };\n stackStyle = {\n justifyContent: \"center\"\n };\n }\n return {\n cellStyle,\n cellProps,\n stackStyle,\n data\n };\n};\nconst dataCellRender = ({\n row,\n columnDef\n}, showEquipSrv) => {\n let cellStyle = {\n padding: \"2px\",\n border: \"1px solid rgba(0, 0, 0) !important\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let data = \" \";\n if (row[\"SINFO2\"] == undefined) {\n if (columnDef.name == \"STEST\") {\n cellProps = {\n colSpan: 2\n };\n cellStyle = {\n ...cellStyle,\n textAlign: \"right\",\n fontWeight: \"bold\"\n };\n }\n if (columnDef.name == \"SINFO2\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.parent == \"\" && columnDef.expandable == true && columnDef.expanded == false) {\n curParent = columnDef.name;\n return {\n cellStyle: {\n ...cellStyle,\n height: \"25px\"\n },\n data\n };\n } else if (columnDef.name != \"SINFO2\" && columnDef.parent != \"\" && columnDef.expandable == false && columnDef.expanded == true) {\n if (columnDef.name.endsWith(\"_1\")) {\n curParent = columnDef.parent;\n const [year, month] = curParent.substring(1).split(\"_\");\n x = new Date(year, month, 0).getDate();\n cellProps = {\n colSpan: x\n };\n data = row[curParent];\n return {\n cellStyle,\n cellProps,\n data\n };\n } else {\n cellStyle = {\n display: \"none\"\n };\n }\n }\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"План\") {\n cellStyle = {\n ...cellStyle\n };\n cellProps = {\n rowSpan: 2\n };\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"Факт\") {\n cellStyle = {\n display: \"none\"\n };\n }\n switch (row[columnDef.name]) {\n case \"blue\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"lightblue\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"green\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"red\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"crimson\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green red\":\n case \"red green\":\n cellStyle = {\n ...cellStyle,\n padding: \"unset\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: {\n justifyContent: \"center\"\n },\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n maxHeight: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"green\"\n },\n onClick: () => showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"g\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"crimson\"\n },\n onClick: () => showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"r\"))));\n }\n return {\n cellStyle,\n cellProps\n };\n};\nconst groupCellRender = () => {\n let cellStyle = {\n display: \"none\"\n };\n return {\n cellStyle\n };\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/layouts.js?"); /***/ }), @@ -3810,7 +3810,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_8__.taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Текстовые ресурсы и константы\n //Монитор ресурсов\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//Единицы измерения длительности\nconst DURATION_MEAS = {\n 0: \"День\",\n 1: \"Неделя\",\n 2: \"Декада\",\n 3: \"Месяц\",\n 4: \"Квартал\",\n 5: \"Год\"\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Диалог параметров инициализации панели\nconst InitDialog = ({\n dateBegin,\n dateFact,\n onOk,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [values, setValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dateBegin: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateBegin),\n dateFact: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateFact)\n });\n\n //Отработка воода значения в фильтр\n const handleValueTextFieldChanged = e => setValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"init-dialog-title\",\n \"aria-describedby\": \"init-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"\\u041F\\u0430\\u0440\\u0430\\u043C\\u0435\\u0442\\u0440\\u044B \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u0438\\u0437\\u0430\\u0446\\u0438\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateBegin\",\n type: \"date\",\n value: values.dateBegin,\n onChange: handleValueTextFieldChanged,\n label: \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u0435\\u0440\\u0432\\u044B\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateFact\",\n type: \"date\",\n value: values.dateFact,\n onChange: handleValueTextFieldChanged,\n label: \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430 (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0438\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onOk ? onOk({\n dateBegin: new Date(values.dateBegin),\n dateFact: new Date(values.dateFact)\n }) : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_7__.BUTTONS.OK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_7__.BUTTONS.CANCEL)));\n};\n\n//Контроль свойств - Диалог параметров инициализации панели\nInitDialog.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date).isRequired,\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: [],\n showInitDialog: false\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? state.dateBegin : null,\n DFACT: state.dateFact ? state.dateFact : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n reInit: false,\n dateBegin: new Date(data.DBEGIN),\n dateFact: new Date(data.DFACT),\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При изменении флага инициализации\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n }, [state.init, initJobs]);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Отработка нажатия на отображения диалога параметров инициализации панели\n const handleShowInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: true\n }));\n\n //Отработка нажатия на \"ОК\" в диалоге параметров инициализации панели\n const handleOKInitDialogClick = values => setState(pv => ({\n ...pv,\n dateBegin: values.dateBegin,\n dateFact: values.dateFact,\n showInitDialog: false,\n init: false\n }));\n\n //Отработка нажатия на \"Отмена\" в диалоге параметров инициализации панели\n const handleCancelInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: false\n }));\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n p: 2\n }, state.showInitDialog ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitDialog, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n onOk: handleOKInitDialogClick,\n onCancel: handleCancelInitDialogClick\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(state.dateBegin), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(state.dateFact), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C: \"), DURATION_MEAS[state.durationMeas], /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0451\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C: \"), state.labMeas)\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"refresh\"),\n onClick: handleShowInitDialogClick\n }, \"\\u041F\\u0435\\u0440\\u0435\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C...\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], null), state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true,\n color: \"warning\",\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"save\"),\n onClick: handleSaveToProjectsClick\n }, \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], null)) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_8__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_9__.taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }), -- 2.34.1 From 08c9459f40101adaef522182e01bbae0ff812c0b Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 18 Apr 2024 18:21:44 +0300 Subject: [PATCH 09/17] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2"=20-=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=B0=D1=8F=20=D0=B8=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B0=D1=82=D1=8B=20=D0=BD=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BC=D0=BE=D0=BD=D0=B8=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=D0=B0=20(=D0=BF=D0=BE=20=D1=82=D0=B5=D0=BA=D1=83?= =?UTF-8?q?=D1=89=D0=B5=D0=B9=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9)=20=D0=B8=20=D0=B4=D0=B0=D1=82=D1=8B=20=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=B0=20(=D0=BF=D0=BE=20"=D0=9F=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=D0=BC=20=D0=B8=20=D0=BE=D1=82=D1=87=D0=B5=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=20=D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9")?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_PROJECTS.pck | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck index 0e70042..4be75bf 100644 --- a/db/PKG_P8PANELS_PROJECTS.pck +++ b/db/PKG_P8PANELS_PROJECTS.pck @@ -6123,10 +6123,20 @@ text="Проверить, что для расчётных полей дата- if (DBEGIN is null) then DBEGIN := TRUNC(sysdate, 'yyyy'); else - DBEGIN := TRUNC(DBEGIN, 'yyyy'); + DBEGIN := TRUNC(DBEGIN, 'mm'); end if; /* Обработаем дату факта */ - DFACT := TO_DATE('01.01.2022', 'DD.MM.YYYY'); + if (DFACT is null) then + select LAST_DAY(TRUNC(COALESCE(max(ENP.ENDDATE), DBEGIN), 'mm')) + into DFACT + from PRJDEPLAN T, + ENPERIOD ENP + where T.COMPANY = NCOMPANY + and T.STATE = 2 + and T.PERIOD = ENP.RN; + else + DFACT := LAST_DAY(TRUNC(DFACT, 'mm')); + end if; /* Обработаем единицу измерения длительности (пока - она всегда должна быть "день", по умолчанию) */ NDURATION_MEAS := NJB_DURATION_MEAS; /* Обработаем единицу измерения трудоёмкости (пока - она всегда должна быть "ч/ч", по умолчанию) */ -- 2.34.1 From d51f8b5e09dfc2c3b564348b81db761dd39b3a85 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 19 Apr 2024 21:41:21 +0300 Subject: [PATCH 10/17] =?UTF-8?q?WEB=20APP:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2"=20-=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D1=8B?= =?UTF-8?q?=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B,=20=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BD=D1=8B=D1=85=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B7=D0=BE=D0=B2=D0=BE=D0=B2=20=D0=B4=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/prj_jobs/lab_fact_rpt_dtl.js | 2 +- app/panels/prj_jobs/lab_plan_fot_dtl.js | 2 +- app/panels/prj_jobs/lab_plan_jobs_dtl.js | 2 +- app/panels/prj_jobs/prj_jobs.js | 138 +++++++++++++---------- 4 files changed, 82 insertions(+), 62 deletions(-) diff --git a/app/panels/prj_jobs/lab_fact_rpt_dtl.js b/app/panels/prj_jobs/lab_fact_rpt_dtl.js index 7716c3c..f443384 100644 --- a/app/panels/prj_jobs/lab_fact_rpt_dtl.js +++ b/app/panels/prj_jobs/lab_fact_rpt_dtl.js @@ -45,7 +45,7 @@ const LabFactRptDtl = ({ periodId, title, onHide }) => { const loadFactRptDtl = useCallback(async () => { if (factRptDtl.reload) { const data = await executeStored({ - stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_FACT_RPT", + stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_FACT_RPT_LIST", args: { NJB_PERIODS: periodId, CORDERS: { VALUE: object2Base64XML(factRptDtl.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, diff --git a/app/panels/prj_jobs/lab_plan_fot_dtl.js b/app/panels/prj_jobs/lab_plan_fot_dtl.js index 37027eb..520360b 100644 --- a/app/panels/prj_jobs/lab_plan_fot_dtl.js +++ b/app/panels/prj_jobs/lab_plan_fot_dtl.js @@ -44,7 +44,7 @@ const LabPlanFOTDtl = ({ periodId, title, onHide }) => { const loadPlanFOTDtl = useCallback(async () => { if (planFOTDtl.reload) { const data = await executeStored({ - stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_FOT", + stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_FOT_LIST", args: { NJB_PERIODS: periodId, CORDERS: { VALUE: object2Base64XML(planFOTDtl.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, diff --git a/app/panels/prj_jobs/lab_plan_jobs_dtl.js b/app/panels/prj_jobs/lab_plan_jobs_dtl.js index 1c77aa7..251dd68 100644 --- a/app/panels/prj_jobs/lab_plan_jobs_dtl.js +++ b/app/panels/prj_jobs/lab_plan_jobs_dtl.js @@ -49,7 +49,7 @@ const LabPlanJobsDtl = ({ periodId, title, onHide, onProjectClick }) => { const loadPlanJobsDtl = useCallback(async () => { if (planJobsDtl.reload) { const data = await executeStored({ - stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_JOBS", + stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_JOBS_LIST", args: { NJB_PERIODS: periodId, CORDERS: { VALUE: object2Base64XML(planJobsDtl.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, diff --git a/app/panels/prj_jobs/prj_jobs.js b/app/panels/prj_jobs/prj_jobs.js index f414caa..307e578 100644 --- a/app/panels/prj_jobs/prj_jobs.js +++ b/app/panels/prj_jobs/prj_jobs.js @@ -66,22 +66,12 @@ const STYLES = { PERIODS_DRAWER: { width: "1200px", flexShrink: 0, [`& .MuiDrawer-paper`]: { width: "1200px", boxSizing: "border-box" } } }; -//Единицы измерения длительности -const DURATION_MEAS = { - 0: "День", - 1: "Неделя", - 2: "Декада", - 3: "Месяц", - 4: "Квартал", - 5: "Год" -}; - //------------------------------------ //Вспомогательные функции и компоненты //------------------------------------ //Диалог параметров инициализации панели -const InitDialog = ({ dateBegin, dateFact, onOk, onCancel }) => { +const InitPrmsDialog = ({ dateBegin, dateFact, onOk, onCancel }) => { //Собственное состояние - значения с-по const [values, setValues] = useState({ dateBegin: formatDateJSONDateOnly(dateBegin), dateFact: formatDateJSONDateOnly(dateFact) }); @@ -130,13 +120,72 @@ const InitDialog = ({ dateBegin, dateFact, onOk, onCancel }) => { }; //Контроль свойств - Диалог параметров инициализации панели -InitDialog.propTypes = { +InitPrmsDialog.propTypes = { dateBegin: PropTypes.instanceOf(Date).isRequired, dateFact: PropTypes.instanceOf(Date).isRequired, onOk: PropTypes.func, onCancel: PropTypes.func }; +//Область параметров инициализации панели +const InitPrmsArea = ({ dateBegin, dateFact, durationMeasCode, labMeasCode, onClick }) => { + return ( + + + + Начало: + {formatDateRF(dateBegin)} +
+ Факт на: + {formatDateRF(dateFact)} +
+ Длительность: + {durationMeasCode} +
+ Трудоёмкость: + {labMeasCode} + + } + /> +
+ + + +
+ ); +}; + +//Контроль свойств - Область параметров инициализации панели +InitPrmsArea.propTypes = { + dateBegin: PropTypes.instanceOf(Date), + dateFact: PropTypes.instanceOf(Date), + durationMeasCode: PropTypes.string, + labMeasCode: PropTypes.string, + onClick: PropTypes.func +}; + +//Область сохранения изменений +const SaveChangesArea = ({ onClick }) => { + return ( + + + + + + ); +}; + +//Контроль свойств - Область сохранения изменений +SaveChangesArea.propTypes = { + onClick: PropTypes.func +}; + //Список проектов const ProjectsList = ({ projects = [], selectedProject, onClick } = {}) => { //Подключение к контексту сообщений @@ -210,7 +259,9 @@ const PrjJobs = () => { dateBegin: null, dateFact: null, durationMeas: null, + durationMeasCode: null, labMeas: null, + labMeasCode: null, resourceStatus: null, ident: null, projects: [], @@ -270,12 +321,12 @@ const PrjJobs = () => { //Изменение работы в графике const modifyJob = useCallback( - async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => { + async (job, dateFrom, dateTo) => { let data = null; try { data = await executeStored({ stored: "PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD", - args: { NJB_JOBS: job, DDATE_FROM: dateFrom, DDATE_TO: dateTo, DBEGIN: dateBegin, DFACT: dateFact, NDURATION_MEAS: durationMeas } + args: { NJB_JOBS: job, DDATE_FROM: dateFrom, DDATE_TO: dateTo } }); if (data?.NRESOURCE_STATUS != -1) { setState(pv => ({ ...pv, resourceStatus: data.NRESOURCE_STATUS, needSave: true })); @@ -306,8 +357,6 @@ const PrjJobs = () => { args: { DBEGIN: state.dateBegin ? state.dateBegin : null, DFACT: state.dateFact ? state.dateFact : null, - NDURATION_MEAS: state.durationMeas, - SLAB_MEAS: state.labMeas, NIDENT: state.ident } }); @@ -318,12 +367,14 @@ const PrjJobs = () => { dateBegin: new Date(data.DBEGIN), dateFact: new Date(data.DFACT), durationMeas: data.NDURATION_MEAS, - labMeas: data.SLAB_MEAS, + durationMeasCode: data.SDURATION_MEAS, + labMeas: data.NLAB_MEAS, + labMeasCode: data.SLAB_MEAS, resourceStatus: data.NRESOURCE_STATUS, ident: data.NIDENT })); } - }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]); + }, [state.init, state.dateBegin, state.dateFact, state.ident, executeStored]); //Грузим список проектов при смене идентификатора процесса useEffect(() => { @@ -377,7 +428,7 @@ const PrjJobs = () => { //Обработка измненения сроков задачи в диаграмме Гантта const handleTaskDatesChange = ({ task, start, end, isMain }) => { - if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas); + if (isMain) modifyJob(task.rn, new Date(start), new Date(end)); }; //Отработка нажатия на отображения диалога параметров инициализации панели @@ -403,7 +454,7 @@ const PrjJobs = () => { return ( {state.showInitDialog ? ( - { > {state.projectsLoaded ? ( <> - - - - Начало: - {formatDateRF(state.dateBegin)} -
- Факт на: - {formatDateRF(state.dateFact)} -
- Длительность: - {DURATION_MEAS[state.durationMeas]} -
- Трудоёмкость: - {state.labMeas} - - } - /> -
- - - -
+ {state.needSave ? ( <> - - - - - + ) : null} -- 2.34.1 From 224d16858302847398fe59900b871aed87c1af49 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 19 Apr 2024 21:46:31 +0300 Subject: [PATCH 11/17] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2"=20-=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D1=87=D0=B5=D1=82=20=D0=B4=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9=20=D0=B2=20=D0=B5?= =?UTF-8?q?=D0=B4=D0=B8=D0=BD=D0=B8=D1=86=D1=8B=20=D0=B8=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8,=20=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82?= =?UTF-8?q?=D0=BC=D0=BE=D0=B2=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B5=D1=82=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B9,=20=D0=B1=D1=83=D1=84?= =?UTF-8?q?=D0=B5=D1=80=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/P8PNL_JB_PRMS.sql | 19 + db/PKG_P8PANELS_PROJECTS.pck | 1409 +++++++++++++++++++--------------- 2 files changed, 813 insertions(+), 615 deletions(-) create mode 100644 db/P8PNL_JB_PRMS.sql diff --git a/db/P8PNL_JB_PRMS.sql b/db/P8PNL_JB_PRMS.sql new file mode 100644 index 0000000..459c429 --- /dev/null +++ b/db/P8PNL_JB_PRMS.sql @@ -0,0 +1,19 @@ +/* + Парус 8 - Панели мониторинга - ПУП - Балансировка планов-графиков проектов + Параметры балансировки +*/ +create table P8PNL_JB_PRMS +( + RN number(17) not null, -- Рег. номер записи + IDENT number(17) not null, -- Идентификатор процесса + DATE_BEGIN date not null, -- Дата начала периода балансировки + DATE_FACT date not null, -- Факт по состоянию на + DURATION_MEAS number(1) not null, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год) + DURATION_MEAS_CODE varchar2(40) not null, -- Единица измерения длительности (мнемокод) + LAB_MEAS number(17) not null, -- Единица измерения трудоёмкости + LAB_MEAS_CODE varchar2(40) not null, -- Единица измерения трудоёмкости (мнемокод) + constraint C_P8PNL_JB_PRMS_RN_PK primary key (RN), + constraint C_P8PNL_JB_PRMS_LAB_MEAS_FK foreign key (LAB_MEAS) references DICMUNTS (RN) on delete cascade, + constraint C_P8PNL_JB_PRMS_DUR_MEAS_VAL check (DURATION_MEAS in (0, 1, 2, 3, 4, 5)), + constraint C_P8PNL_JB_PRMS_UN unique (IDENT) +); diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck index 4be75bf..850336a 100644 --- a/db/PKG_P8PANELS_PROJECTS.pck +++ b/db/PKG_P8PANELS_PROJECTS.pck @@ -365,9 +365,6 @@ create or replace package PKG_P8PANELS_PROJECTS as NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа DDATE_FROM in date, -- Новая дата начала DDATE_TO in date, -- Новая дата окончания - DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов - DFACT in date, -- Факт по состоянию на - NDURATION_MEAS in number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год) NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения, -1 - ничего не изменяли) ); @@ -381,18 +378,7 @@ create or replace package PKG_P8PANELS_PROJECTS as ); /* Получение списка для детализации трудоёмкости по ФОТ периода балансировки */ - procedure JB_PERIODS_LIST_PLAN_FOT - ( - 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_LIST_PLAN_JOBS + procedure JB_PERIODS_PLAN_FOT_LIST ( NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) @@ -403,7 +389,18 @@ create or replace package PKG_P8PANELS_PROJECTS as ); /* Получение списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */ - procedure JB_PERIODS_LIST_FACT_RPT + 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) @@ -417,7 +414,6 @@ create or replace package PKG_P8PANELS_PROJECTS as procedure JB_PERIODS_RECALC ( NIDENT in number, -- Идентификатор процесса - DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов NINITIAL in number, -- Признак первоначального рассчёта (0 - пересчёт, 1 - первоначальный рассчёт) NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения) ); @@ -449,44 +445,30 @@ create or replace package PKG_P8PANELS_PROJECTS as /* Формирование исходных данных для балансировки планов-графиков работ */ procedure JB_INIT ( - DBEGIN in out date, -- Дата начала периода мониторинга загрузки ресурсов - DFACT in out date, -- Факт по состоянию на - NDURATION_MEAS in out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год) - SLAB_MEAS in out varchar2, -- Единица измерения трудоёмкости - NIDENT in out number, -- Идентификатор процесса (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором) - NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения) + 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 - есть отклонения) ); end PKG_P8PANELS_PROJECTS; / create or replace package body PKG_P8PANELS_PROJECTS as -/* -TODO: owner="root" created="25.10.2023" -text="Пересчёт единиц измерения в мониторе плана-графика" -*/ - -/* -TODO: owner="root" created="25.10.2023" -text="Буфер для хранения параметров балансировки и читать их оттуда для вызовов JB_JOBS_MODIFY_PERIOD, JB_JOBS_PERIODS_RECALC" -*/ - /* TODO: owner="root" created="25.10.2023" text="Права доступа в мониторе ресурвов при балансировке планов-графиков" */ -/* -TODO: owner="root" created="25.10.2023" -text="Вынести расчте плановой трудоёмкости по графику (и всех её причендалов) в отдельную функцию (и), чтобы можно было включить её в динамический запрос и вернуть сортировку по полям трудоёмкости в JB_PERIODS_LIST_PLAN_JOBS" -*/ - /* TODO: owner="root" created="25.10.2023" text="Проверить, что для расчётных полей дата-гридов отключена сортировка - иначе получается ошибка, т.к. поля нет в SQL-запросе" */ - /* Константы - предопределённые значения */ SYES constant PKG_STD.TSTRING := 'Да'; -- Да NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- Лимит отстатка дней для контроля сроков @@ -495,6 +477,7 @@ text="Проверить, что для расчётных полей дата- 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 := 'Ч/Ч'; -- Единица измерения трудоёмкости в человеко/часах /* Константы - дополнительные свойства */ SDP_SECON_RESP constant PKG_STD.TSTRING := 'ПУП.SECON_RESP'; -- Ответственный экономист проекта @@ -1066,7 +1049,7 @@ text="Проверить, что для расчётных полей дата- begin /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); - /* Читем сортировки */ + /* Читаем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, @@ -2595,7 +2578,7 @@ text="Проверить, что для расчётных полей дата- FIND_FPDARTCL_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SFPDARTCL_REALIZ, NRN => NFPDARTCL_REALIZ); /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); - /* Читем сортировки */ + /* Читаем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, @@ -3905,7 +3888,7 @@ text="Проверить, что для расчётных полей дата- begin /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); - /* Читем сортировки */ + /* Читаем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, @@ -4359,6 +4342,85 @@ text="Проверить, что для расчётных полей дата- return LAST_DAY(DRES); end JB_GET_END; + /* Получение мнемокода единицы измерения длительности */ + function JB_GET_DURATION_MEAS_CODE + ( + NDURATION_MEAS in number -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год) + ) return varchar2 -- Мнемокод единицы измерения длительности + is + begin + /* Результат от указанного кода ЕИ длительности */ + case NDURATION_MEAS + /* Известные ЕИ */ + when 0 then + return 'День'; + when 1 then + return 'Неделя'; + when 2 then + return 'Декада'; + when 3 then + return 'Месяц'; + when 4 then + return 'Квартал'; + when 5 then + return 'Год'; + /* Неизвестная ЕИ */ + else + P_EXCEPTION(0, + 'Единица измерения длительности "%s" не поддерживается.', + COALESCE(TO_CHAR(NDURATION_MEAS), '<НЕ УКАЗАНА>')); + end case; + end JB_GET_DURATION_MEAS_CODE; + + /* Базовое добавление параметров балансировки */ + procedure JB_PRMS_BASE_INSERT + ( + NIDENT in number, -- Идентификатор процесса + DDATE_BEGIN in date, -- Дата начала периода балансировки + DDATE_FACT in date, -- Факт по состоянию на + NDURATION_MEAS in number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год) + SDURATION_MEAS_CODE in varchar2, -- Единица измерения длительности (мнемокод) + NLAB_MEAS in number, -- Единица измерения трудоёмкости + SLAB_MEAS_CODE in varchar2, -- Единица измерения трудоёмкости (мнемокод) + NRN out number -- Рег. номер записи + ) + is + begin + /* Сформируем рег. номер */ + NRN := GEN_ID(); + /* Добавим запись */ + insert into P8PNL_JB_PRMS + (RN, IDENT, DATE_BEGIN, DATE_FACT, DURATION_MEAS, DURATION_MEAS_CODE, LAB_MEAS, LAB_MEAS_CODE) + values + (NRN, NIDENT, DDATE_BEGIN, DDATE_FACT, NDURATION_MEAS, SDURATION_MEAS_CODE, NLAB_MEAS, SLAB_MEAS_CODE); + end JB_PRMS_BASE_INSERT; + + /* Очистка параметров балансировки */ + procedure JB_PRMS_CLEAN + ( + NIDENT in number -- Идентификатор процесса + ) + is + begin + /* Удаляем периоды балансировки */ + delete from P8PNL_JB_PRMS T where T.IDENT = NIDENT; + end JB_PRMS_CLEAN; + + /* Считывание записи параметров балансировки работ */ + function JB_PRMS_GET + ( + NIDENT in number -- Идентификатор процесса + ) return P8PNL_JB_PRMS%rowtype -- Запись параметров + is + RRES P8PNL_JB_PRMS%rowtype; -- Буфер для результата + begin + select P.* into RRES from P8PNL_JB_PRMS P where P.IDENT = NIDENT; + return RRES; + exception + when NO_DATA_FOUND then + PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NIDENT, SUNIT_TABLE => 'P8PNL_JB_PRMS'); + end JB_PRMS_GET; + /* Считывание записи проекта из буфера балансировки работ */ function JB_PRJCTS_GET ( @@ -4543,24 +4605,25 @@ text="Проверить, что для расчётных полей дата- (NJB_JOBS, NIDENT, NPRN, NHRN, NSOURCE, SNUMB, SNAME, DDATE_FROM, DDATE_TO, NDURATION, SEXECUTOR, NSTAGE, NEDITABLE); end JB_JOBS_BASE_INSERT; - /* Базовое изменением сроков работы в буфере балансировки */ + /* Базовое изменение сроков работы в буфере балансировки */ procedure JB_JOBS_BASE_MODIFY_PERIOD ( - NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа - NDELTA in number, -- Изменение срока работы - NCHANGE_FLAG in number, -- Флаг изменения данных (1 - изменять дату начала, 2 - изменять дату окончания) - DFACT in date, -- Факт по состоянию на - NDURATION_MEAS in number -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год) + NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа + NDELTA in number, -- Изменение срока работы + NCHANGE_FLAG in number -- Флаг изменения данных (1 - изменять дату начала, 2 - изменять дату окончания) ) is - RJ PROJECTJOB%rowtype; -- Запись работы в проекте - RS PROJECTSTAGE%rowtype; -- Запись этапа в проекте - RJB_J P8PNL_JB_JOBS%rowtype; -- Запись работы в буфере балансировки - DDATE_FROM_NEW PKG_STD.TLDATE; -- Новая дата начала работы - DDATE_TO_NEW PKG_STD.TLDATE; -- Новая дата окончания работы + RJ PROJECTJOB%rowtype; -- Запись работы в проекте + RS PROJECTSTAGE%rowtype; -- Запись этапа в проекте + RJB_J P8PNL_JB_JOBS%rowtype; -- Запись работы в буфере балансировки + RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки + DDATE_FROM_NEW PKG_STD.TLDATE; -- Новая дата начала работы + DDATE_TO_NEW PKG_STD.TLDATE; -- Новая дата окончания работы begin /* Считаем работу из буфера */ RJB_J := JB_JOBS_GET(NJB_JOBS => NJB_JOBS); + /* Считаем параметры балансировки */ + RJB_PRMS := JB_PRMS_GET(NIDENT => RJB_J.IDENT); /* Считаем работу проекта */ RJ := JOBS_GET(NRN => RJB_J.SOURCE); /* Проверки - работа должна быть привязана к этапу */ @@ -4589,27 +4652,27 @@ text="Проверить, что для расчётных полей дата- P_PROJECTJOB_GET_OFFSET_DATE(NCOMPANY => RJ.COMPANY, DSRC_DATE => DDATE_FROM_NEW, NOFFSET => RJ.DURATION_P, - NOFFSET_MEAS => NDURATION_MEAS, + NOFFSET_MEAS => RJB_PRMS.DURATION_MEAS, DDEST_DATE => DDATE_TO_NEW); else DDATE_TO_NEW := RJB_J.DATE_TO + NDELTA; P_PROJECTJOB_GET_OFFSET_DATE(NCOMPANY => RJ.COMPANY, DSRC_DATE => DDATE_TO_NEW, NOFFSET => -RJ.DURATION_P, - NOFFSET_MEAS => NDURATION_MEAS, + NOFFSET_MEAS => RJB_PRMS.DURATION_MEAS, DDEST_DATE => DDATE_FROM_NEW); end if; /* Проверки - дата начала работы не должна быть меньше даты факта */ - if ((NCHANGE_FLAG = 1) and (DDATE_FROM_NEW <= DFACT)) then + if ((NCHANGE_FLAG = 1) and (DDATE_FROM_NEW <= RJB_PRMS.DATE_FACT)) then P_EXCEPTION(0, 'Работа не может начинаться раньше даты "Факт по состоянию на" (%s).', - TO_CHAR(DFACT, 'DD.MM.YYYY')); + TO_CHAR(RJB_PRMS.DATE_FACT, 'DD.MM.YYYY')); end if; /* Проверки - дата окончания работы не должна быть меньше даты факта */ - if ((NCHANGE_FLAG = 2) and (DDATE_TO_NEW <= DFACT)) then + if ((NCHANGE_FLAG = 2) and (DDATE_TO_NEW <= RJB_PRMS.DATE_FACT)) then P_EXCEPTION(0, 'Работа не может заканчиваться раньше даты "Факт по состоянию на" (%s).', - TO_CHAR(DFACT, 'DD.MM.YYYY')); + TO_CHAR(RJB_PRMS.DATE_FACT, 'DD.MM.YYYY')); end if; /* Проверки - дата окончания работы не должна быть больше даты окончания этапа */ if ((NCHANGE_FLAG = 2) and (DDATE_TO_NEW >= RS.ENDPLAN)) then @@ -4632,11 +4695,7 @@ text="Проверить, что для расчётных полей дата- where PRV.IDENT = RJB_J.IDENT and PRV.JB_JOBS = RJB_J.RN)) loop - JB_JOBS_BASE_MODIFY_PERIOD(NJB_JOBS => C.RN, - NDELTA => NDELTA, - NCHANGE_FLAG => NCHANGE_FLAG, - DFACT => DFACT, - NDURATION_MEAS => NDURATION_MEAS); + JB_JOBS_BASE_MODIFY_PERIOD(NJB_JOBS => C.RN, NDELTA => NDELTA, NCHANGE_FLAG => NCHANGE_FLAG); end loop; end JB_JOBS_BASE_MODIFY_PERIOD; @@ -4646,9 +4705,6 @@ text="Проверить, что для расчётных полей дата- NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа DDATE_FROM in date, -- Новая дата начала DDATE_TO in date, -- Новая дата окончания - DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов - DFACT in date, -- Факт по состоянию на - NDURATION_MEAS in number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год) NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения, -1 - ничего не изменяли) ) is @@ -4691,13 +4747,11 @@ text="Проверить, что для расчётных полей дата- /* Изменяем работы */ JB_JOBS_BASE_MODIFY_PERIOD(NJB_JOBS => RJB_J.RN, NDELTA => NDELTA, - NCHANGE_FLAG => NCHANGE_FLAG, - DFACT => DFACT, - NDURATION_MEAS => NDURATION_MEAS); + NCHANGE_FLAG => NCHANGE_FLAG); /* Выставим признак изменений в проекте */ JB_PRJCTS_SET_CHANGED(NJB_PRJCTS => RJB_P.RN, NCHANGED => 1); /* Выполним пересчёт монитора */ - JB_PERIODS_RECALC(NIDENT => RJB_P.IDENT, DBEGIN => DBEGIN, NINITIAL => 0, NRESOURCE_STATUS => NRESOURCE_STATUS); + JB_PERIODS_RECALC(NIDENT => RJB_P.IDENT, NINITIAL => 0, NRESOURCE_STATUS => NRESOURCE_STATUS); else /* Ничего не изменили */ NRESOURCE_STATUS := -1; @@ -4949,19 +5003,22 @@ text="Проверить, что для расчётных полей дата- PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NJB_PERIODS, SUNIT_TABLE => 'P8PNL_JB_PERIODS'); end JB_PERIODS_GET; - /* Получение списка для детализации трудоёмкости по ФОТ периода балансировки */ - procedure JB_PERIODS_LIST_PLAN_FOT + /* Формирование и расчет списка для детализации трудоёмкости по ФОТ периода балансировки */ + procedure JB_PERIODS_PLAN_FOT_BUILD ( 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 -- Сериализованная таблица данных + NMODE in number := 0, -- Режим (0 - список для клиента, 1 - только расчёты) + NPAGE_NUMBER in number := 0, -- Номер страницы (игнорируется при NPAGE_SIZE=0 и NMODE = 1) + NPAGE_SIZE in number := 0, -- Количество записей на странице (0 - все, игнорируется при NMODE = 1) + CORDERS in clob := null, -- Сортировки (игнорируется при NMODE = 1) + NINCLUDE_DEF in number := 1, -- Признак включения описания колонок таблицы в ответ (игнорируется при NMODE = 1) + NLAB_PLAN_FOT out number, -- Плановая трудоёмкость согласно ФОТ + COUT out clob -- Сериализованная таблица данных (заполняется только при NMODE = 0) ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода + RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы @@ -4969,36 +5026,54 @@ text="Проверить, что для расчётных полей дата- ICURSOR integer; -- Курсор для исполнения запроса NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по + NPERS_LAB PKG_STD.TLNUMBER; -- Трудоёмкость текущего сотрудника + NLAB_MEAS_HOURS PKG_STD.TREF; -- Рег. номер ЕИ трудоёмкости для человеко/часов begin + /* Определим рег. номер ЕИ трудоёскости для человеко/часов */ + FIND_DICMUNTS_BY_MNEMO(NFLAG_SMART => 0, + NCOMPANY => NCOMPANY, + SMEAS_MNEMO => SLAB_MEAS_HOURS, + NRN => NLAB_MEAS_HOURS); + /* Инициализируем сумму плановой трудоёмкости по ФОТ */ + NLAB_PLAN_FOT := 0; /* Считаем детализируемую запись периода */ RPRD := JB_PERIODS_GET(NJB_PERIODS => NJB_PERIODS); - /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); - /* Преобразуем номер и размер страницы в номер строк с и по */ - PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, - NPAGE_SIZE => NPAGE_SIZE, - NROW_FROM => NROW_FROM, - NROW_TO => NROW_TO); - /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); - /* Добавляем в таблицу описание колонок */ - 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 => 'SPERSON', - SCAPTION => 'Сотрудник', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB_PLAN_FOT', - SCAPTION => 'Трудоёмкость', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => false, - BFILTER => false); + /* Считаем параметры балансировки */ + RJB_PRMS := JB_PRMS_GET(NIDENT => RPRD.IDENT); + /* Если не формируем данные для клиента */ + if (NMODE = 1) then + /* Преобразуем номер и размер страницы в номер строк с и по - нам нужны все записи */ + PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => 0, + NPAGE_SIZE => 0, + NROW_FROM => NROW_FROM, + NROW_TO => NROW_TO); + else + /* Будем строить курсор по параметрам - читаем сортировки */ + RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + /* Преобразуем номер и размер страницы в номер строк с и по */ + PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, + NPAGE_SIZE => NPAGE_SIZE, + NROW_FROM => NROW_FROM, + NROW_TO => NROW_TO); + /* Инициализируем таблицу данных */ + RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + /* Добавляем в таблицу описание колонок */ + 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 => 'SPERSON', + SCAPTION => 'Сотрудник', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB_PLAN_FOT', + SCAPTION => 'Трудоёмкость (' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); + end if; /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -5054,19 +5129,31 @@ 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_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPERSON', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLAB_PLAN_FOT', - ICURSOR => ICURSOR, - NPOSITION => 3); - /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + /* Вычислим трудоёмкость по ФОТ (в ЕИ параметров инициализации панели переводим из ч/ч, т.к. мы считали из графика среднемесячное количество часов) */ + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 3, NVALUE => NPERS_LAB); + NPERS_LAB := F_DICMUNTS_BASE_RECALC_QUANT(NFLAG_SMART => 0, + NCOMPANY => NCOMPANY, + NUMEAS_FROM => NLAB_MEAS_HOURS, + NQUANT_FROM => NPERS_LAB, + NUMEAS_TO => RJB_PRMS.LAB_MEAS); + /* Накопим сумму в буфере результата */ + NLAB_PLAN_FOT := NLAB_PLAN_FOT + NPERS_LAB; + /* При формировании списка для клиента */ + if (NMODE = 0) then + /* Добавляем колонки с данными */ + 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 => 'SPERSON', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLAB_PLAN_FOT', NVALUE => NPERS_LAB); + /* Добавляем строку в таблицу */ + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + end if; end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); @@ -5075,58 +5162,359 @@ text="Проверить, что для расчётных полей дата- PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); raise; end; - /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); - end JB_PERIODS_LIST_PLAN_FOT; + /* При формировании списка для клиента */ + if (NMODE = 0) then + /* Сериализуем описание */ + COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + end if; + end JB_PERIODS_PLAN_FOT_BUILD; - /* Получение плановой трудоёмкости по ФОТ для периода балансировки (в часах) */ - function JB_PERIODS_GET_PLAN_FOT + /* Получение списка для детализации трудоёмкости по ФОТ периода балансировки */ + procedure JB_PERIODS_PLAN_FOT_LIST ( - NCOMPANY in number, -- Рег. номер организации - DDATE_FROM in date, -- Начало - DDATE_TO in date, -- Окончание - NINS_DEPARTMENT in number, -- Рег. номер штатного подразделения - NFCMANPOWER in number -- Рег. номер трудового ресурса + 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 -- Сериализованная таблица данных + ) + is + NTMP PKG_STD.TLNUMBER; -- Буфер для рассчетов + begin + /* Сформируем список детализации по ФОТ */ + JB_PERIODS_PLAN_FOT_BUILD(NJB_PERIODS => NJB_PERIODS, + NMODE => 0, + NPAGE_NUMBER => NPAGE_NUMBER, + NPAGE_SIZE => NPAGE_SIZE, + CORDERS => CORDERS, + NINCLUDE_DEF => NINCLUDE_DEF, + NLAB_PLAN_FOT => NTMP, + COUT => COUT); + end JB_PERIODS_PLAN_FOT_LIST; + + /* Расчет плановой трудоёмкости по ФОТ для периода балансировки (в часах) */ + function JB_PERIODS_PLAN_FOT_CALC + ( + NJB_PERIODS in number -- Рег. номер записи периода в буфере балансировки ) return number -- Плановая трудоёмкость по ФОТ (в часах) is NRES PKG_STD.TLNUMBER; -- Плановая трудоёмкость по ФОТ + CTMP clob; -- Буфер для вычислений begin - /* Обойдем подходящие исполнения и просуммируем среднемесячную численность часов */ - select sum(SH.AVG_HOURS) - into NRES - from CLNPSPFM FM, - CLNPSDEP PSD, - PRPROF PROF, - CLNPSPFMHS FMH, - SLSCHEDULE SH - where FM.COMPANY = NCOMPANY - and FM.DEPTRN = NINS_DEPARTMENT - and FM.PSDEPRN = PSD.RN - and PSD.PRPROF = PROF.RN - and PROF.RN in (select MP.PRPROF from FCMANPOWER MP where MP.RN = NFCMANPOWER) - and ((FM.BEGENG between DDATE_FROM and DDATE_TO) or (FM.ENDENG between DDATE_FROM and DDATE_TO) or - ((FM.BEGENG < DDATE_FROM) and (COALESCE(FM.ENDENG, DDATE_TO + 1) > DDATE_TO))) - and FM.RN = FMH.PRN - and ((FMH.DO_ACT_FROM between DDATE_FROM and DDATE_TO) or (FMH.DO_ACT_TO between DDATE_FROM and DDATE_TO) or - ((FMH.DO_ACT_FROM < DDATE_FROM) and (COALESCE(FMH.DO_ACT_TO, DDATE_TO + 1) > DDATE_TO))) - and FMH.SCHEDULE = SH.RN; + /* Рассчитаем плановую трудоемкость по ФОТ */ + JB_PERIODS_PLAN_FOT_BUILD(NJB_PERIODS => NJB_PERIODS, NMODE => 1, NLAB_PLAN_FOT => NRES, COUT => CTMP); /* Вернём собранный результат */ - return COALESCE(NRES, 0); - end JB_PERIODS_GET_PLAN_FOT; - - /* Получение списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */ - procedure JB_PERIODS_LIST_PLAN_JOBS + return NRES; + end JB_PERIODS_PLAN_FOT_CALC; + + /* Формирование и расчёт списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */ + procedure JB_PERIODS_FACT_RPT_BUILD ( 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 -- Сериализованная таблица данных + NMODE in number := 0, -- Режим (0 - список для клиента, 1 - только расчёты) + NPAGE_NUMBER in number := 0, -- Номер страницы (игнорируется при NPAGE_SIZE=0 и NMODE = 1) + NPAGE_SIZE in number := 0, -- Количество записей на странице (0 - все, игнорируется при NMODE = 1) + CORDERS in clob := null, -- Сортировки (игнорируется при NMODE = 1) + NINCLUDE_DEF in number := 1, -- Признак включения описания колонок таблицы в ответ (игнорируется при NMODE = 1) + NLAB_FACT_RPT out number, -- Фактическая трудоёмкость согласно "Планам и отчетам подразделений" + COUT out clob -- Сериализованная таблица данных (заполняется только при NMODE = 0) + ) + is + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса + RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода + RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки + RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + CSQL clob; -- Буфер для запроса + ICURSOR integer; -- Курсор для исполнения запроса + NROW_FROM PKG_STD.TREF; -- Номер строки с + NROW_TO PKG_STD.TREF; -- Номер строки по + DJOB_BEG PKG_STD.TLDATE; -- Дата начала текущей работы согласно проекту + DJOB_END PKG_STD.TLDATE; -- Дата окончания текущей работы согласно проекту + NJOB_DUR PKG_STD.TLNUMBER; -- Длительнось текущей работы согласно проекту + NJOB_LAB PKG_STD.TLNUMBER; -- Трудоёмкость текущей работы согласно отчету + NJOB_LAB_MEAS PKG_STD.TREF; -- ЕИ трудоемкости текущей работы согласно проекту + begin + /* Инициализируем сумму фактической трудоёмкости согласно "Планам и отчетам подразделений" */ + NLAB_FACT_RPT := 0; + /* Считаем детализируемую запись периода */ + RPRD := JB_PERIODS_GET(NJB_PERIODS => NJB_PERIODS); + /* Считаем параметры балансировки */ + RJB_PRMS := JB_PRMS_GET(NIDENT => RPRD.IDENT); + /* Если не формируем данные для клиента */ + if (NMODE = 1) then + /* Преобразуем номер и размер страницы в номер строк с и по - нам нужны все записи */ + PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => 0, + NPAGE_SIZE => 0, + NROW_FROM => NROW_FROM, + NROW_TO => NROW_TO); + else + /* Будем строить курсор по параметрам - читаем сортировки */ + RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + /* Преобразуем номер и размер страницы в номер строк с и по */ + PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, + NPAGE_SIZE => NPAGE_SIZE, + NROW_FROM => NROW_FROM, + NROW_TO => NROW_TO); + /* Инициализируем таблицу данных */ + RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + /* Добавляем в таблицу описание колонок */ + 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 => 'SPRJDEPLAN', + SCAPTION => 'Документ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPRJ', + SCAPTION => 'Проект', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTG_JOB', + SCAPTION => 'Этап-работа', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SJOB_NAME', + SCAPTION => 'Наим. работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJOB_STATE', + SCAPTION => 'Сост. работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DJOB_BEG', + SCAPTION => 'Начало работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DJOB_END', + SCAPTION => 'Окончание работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJOB_DUR', + SCAPTION => 'Длительн. работы (' || RJB_PRMS.DURATION_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPERSON', + SCAPTION => 'Сотрудник', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB', + SCAPTION => 'Труд. (' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); + end if; + /* Обходим данные */ + 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 MP.RN NRN,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE || '', '' || trim(T.DOCPREF) || ''/'' || trim(T.DOCNUMB) || '', '' || TO_CHAR(T.DOCDATE, ''dd.mm.yyyy'') SPRJDEPLAN,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.CODE || ''-'' || P.NAME_USL SPRJ,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(COALESCE(PS.NUMB, ''Б/Э'')) || ''-'' || trim(PJ.NUMB) SSTG_JOB,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.NAME SJOB_NAME,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.STATE NJOB_STATE,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.BEGPLAN DJOB_BEG,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.ENDPLAN DJOB_END,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F_CLNPERSONS_FORMAT_CODE(FMP.COMPANY, FMP.CODE) SPERSON,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MP.LABOUR_F NLAB,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.UMEAS NLAB_MEAS'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PRJDEPLAN T,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCTYPES DT,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ENPERIOD PR,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PRJDEPLANMANPOW MP'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join CLNPSPFM FM on MP.CLNPSPFM = FM.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join CLNPERSONS FMP on FM.PERSRN = FMP.RN,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOB PJ'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join PROJECTSTAGE PS on PJ.PROJECTSTAGE = PS.RN,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOBMANPOW PJMP'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.STATE = 2'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.PERIOD = PR.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.DOCTYPE = DT.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.SUBDIV = :NINS_DEPARTMENT'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((PR.STARTDATE between :DDATE_FROM and :DDATE_TO) or (PR.ENDDATE between :DDATE_FROM and :DDATE_TO) or'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((PR.STARTDATE < :DDATE_FROM) and (PR.ENDDATE > :DDATE_TO)))'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PRN in (select PJ.RN from PRJDEPPLANJOB PJ where PJ.PRN = T.RN)'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PROJECTJOBMANPOW = PJMP.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.PRN = PJ.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN %ORDER_BY%) D) F'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); + /* Учтём сортировки */ + PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + /* Разбираем его */ + ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); + PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); + /* Делаем подстановку параметров */ + PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY); + PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NINS_DEPARTMENT', NVALUE => RPRD.INS_DEPARTMENT); + PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCMANPOWER', NVALUE => RPRD.FCMANPOWER); + PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_FROM', DVALUE => RPRD.DATE_FROM); + PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => RPRD.DATE_TO); + 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.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_STR(ICURSOR => ICURSOR, IPOSITION => 9); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 12); + /* Делаем выборку */ + if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then + null; + end if; + /* Обходим выбранные записи */ + while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) + loop + /* Вычислим длительость работы в ЕИ панели */ + PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 7, DVALUE => DJOB_BEG); + PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 8, DVALUE => DJOB_END); + P_PROJECTJOB_GET_DURATION(NCOMPANY => NCOMPANY, + DBEG_DATE => DJOB_BEG, + DEND_DATE => DJOB_END, + NDURATION_MEAS => RJB_PRMS.DURATION_MEAS, + NDURATION => NJOB_DUR); + /* Вычислим трудоёмкость работ в ЕИ панели */ + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 10, NVALUE => NJOB_LAB); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 11, NVALUE => NJOB_LAB_MEAS); + NJOB_LAB := F_DICMUNTS_BASE_RECALC_QUANT(NFLAG_SMART => 0, + NCOMPANY => NCOMPANY, + NUMEAS_FROM => NJOB_LAB_MEAS, + NQUANT_FROM => NJOB_LAB, + NUMEAS_TO => RJB_PRMS.LAB_MEAS); + /* Накопим сумму в буфере результата */ + NLAB_FACT_RPT := NLAB_FACT_RPT + NJOB_LAB; + /* При формировании списка для клиента */ + if (NMODE = 0) then + /* Добавляем колонки с данными */ + 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 => 'SPRJDEPLAN', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 3); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSTG_JOB', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SJOB_NAME', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NJOB_STATE', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPERSON', + ICURSOR => ICURSOR, + NPOSITION => 9); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLAB', NVALUE => NJOB_LAB); + /* Добавляем строку в таблицу */ + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + end if; + end loop; + /* Освобождаем курсор */ + PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); + exception + when others then + PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); + raise; + end; + /* При формировании списка для клиента */ + if (NMODE = 0) then + /* Сериализуем описание */ + COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + end if; + end JB_PERIODS_FACT_RPT_BUILD; + + /* Получение списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */ + 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 -- Сериализованная таблица данных + ) + is + NTMP PKG_STD.TLNUMBER; -- Буфер для рассчетов + begin + /* Сформируем список детализации по "Планам и отчетам подразделений" */ + JB_PERIODS_FACT_RPT_BUILD(NJB_PERIODS => NJB_PERIODS, + NMODE => 0, + NPAGE_NUMBER => NPAGE_NUMBER, + NPAGE_SIZE => NPAGE_SIZE, + CORDERS => CORDERS, + NINCLUDE_DEF => NINCLUDE_DEF, + NLAB_FACT_RPT => NTMP, + COUT => COUT); + end JB_PERIODS_FACT_RPT_LIST; + + /* Расчёт фактической трудоёмкости трудового ресурса по "Планам и отчетам подразделеий" для периода балансировки */ + function JB_PERIODS_FACT_RPT_CALC + ( + NJB_PERIODS in number -- Рег. номер записи периода в буфере балансировки + ) return number -- Фактическая трудоёмкость трудового ресурса по "Планам и отчетам подразделеий" + is + NRES PKG_STD.TLNUMBER; -- Буфер для результата + CTMP clob; -- Буфер для вычислений + begin + /* Рассчитаем фактическую трудоемкость по "Планам и отчетам подразделений" */ + JB_PERIODS_FACT_RPT_BUILD(NJB_PERIODS => NJB_PERIODS, NMODE => 1, NLAB_FACT_RPT => NRES, COUT => CTMP); + /* Вернём собранный результат */ + return NRES; + end JB_PERIODS_FACT_RPT_CALC; + + /* Формирование и расчёт списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */ + procedure JB_PERIODS_PLAN_JOBS_BUILD + ( + NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки + NMODE in number := 0, -- Режим (0 - список для клиента, 1 - только расчёты) + NPAGE_NUMBER in number := 0, -- Номер страницы (игнорируется при NPAGE_SIZE=0 и NMODE = 1) + NPAGE_SIZE in number := 0, -- Количество записей на странице (0 - все, игнорируется при NMODE = 1) + CORDERS in clob := null, -- Сортировки (игнорируется при NMODE = 1) + NINCLUDE_DEF in number := 1, -- Признак включения описания колонок таблицы в ответ (игнорируется при NMODE = 1) + NLAB_PLAN_JOB out number, -- Плановая трудоёмкость согласно графика + COUT out clob -- Сериализованная таблица данных (заполняется только при NMODE = 0) ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода + RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы @@ -5139,97 +5527,97 @@ text="Проверить, что для расчётных полей дата- DJOB_BEG PKG_STD.TLDATE; -- Дата начала текущей работы согласно плану-груфику DJOB_END PKG_STD.TLDATE; -- Дата окончания текущей работы согласно плану-груфику NJOB_DUR PKG_STD.TLNUMBER; -- Длительнось текущей работы согласно плану-груфику + NMP_LAB_MEAS PKG_STD.TREF; -- ЕИ трудоёмкости трудового ресурса согласно проекта NMP_LAB PKG_STD.TLNUMBER; -- Трудоёмкость трудового ресурса в текущей работе согласно проекта NMP_LAB_ONE PKG_STD.TLNUMBER; -- Трудоёмкость (за единицу длительности) трудового ресурса в текущей работе согласно проекта NMP_LAB_PLAN PKG_STD.TLNUMBER; -- Трудоёмкость трудового ресурса в текущей работе согласно плана-графика begin + /* Инициализируем сумму плановой трудоёмкости согласно графика */ + NLAB_PLAN_JOB := 0; /* Считаем детализируемую запись периода */ RPRD := JB_PERIODS_GET(NJB_PERIODS => NJB_PERIODS); - /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); - /* Преобразуем номер и размер страницы в номер строк с и по */ - PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, - NPAGE_SIZE => NPAGE_SIZE, - NROW_FROM => NROW_FROM, - NROW_TO => NROW_TO); - /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); - /* Добавляем в таблицу описание колонок */ - 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 => 'NPROJECT', - SCAPTION => 'Рег. номер проекта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJB_PRJCTS', - SCAPTION => 'Рег. номер буфера балансировки проекта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPRJ', - SCAPTION => 'Проект', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTG_JOB', - SCAPTION => 'Этап-работа', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SJOB_NAME', - SCAPTION => 'Наим. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJOB_STATE', - SCAPTION => 'Сост. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DJOB_BEG', - SCAPTION => 'Начало работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DJOB_END', - SCAPTION => 'Окончание работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJOB_DUR', - SCAPTION => 'Длительн. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => false, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NMP_LAB', - SCAPTION => 'Труд.', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => false, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NMP_LAB_ONE', - SCAPTION => 'Труд. (в ед. длит.)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => false, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NMP_LAB_PLAN', - SCAPTION => 'Труд. (план, график)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => false, - BFILTER => false); + /* Считаем параметры балансировки */ + RJB_PRMS := JB_PRMS_GET(NIDENT => RPRD.IDENT); + /* Если не формируем данные для клиента */ + if (NMODE = 1) then + /* Преобразуем номер и размер страницы в номер строк с и по - нам нужны все записи */ + PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => 0, + NPAGE_SIZE => 0, + NROW_FROM => NROW_FROM, + NROW_TO => NROW_TO); + else + /* Будем строить курсор по параметрам - читаем сортировки */ + RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + /* Преобразуем номер и размер страницы в номер строк с и по */ + PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, + NPAGE_SIZE => NPAGE_SIZE, + NROW_FROM => NROW_FROM, + NROW_TO => NROW_TO); + /* Инициализируем таблицу данных */ + RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + /* Добавляем в таблицу описание колонок */ + 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 => 'NPROJECT', + SCAPTION => 'Рег. номер проекта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJB_PRJCTS', + SCAPTION => 'Рег. номер буфера балансировки проекта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPRJ', + SCAPTION => 'Проект', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTG_JOB', + SCAPTION => 'Этап-работа', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SJOB_NAME', + SCAPTION => 'Наим. работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJOB_STATE', + SCAPTION => 'Сост. работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DJOB_BEG', + SCAPTION => 'Начало работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DJOB_END', + SCAPTION => 'Окончание работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJOB_DUR', + SCAPTION => 'Длительн. работы (' || RJB_PRMS.DURATION_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NMP_LAB', + SCAPTION => 'Труд. (' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NMP_LAB_ONE', + SCAPTION => 'Труд. (в ед. длит., ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NMP_LAB_PLAN', + SCAPTION => 'Труд. (план, график, ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + end if; /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -5238,7 +5626,7 @@ text="Проверить, что для расчётных полей дата- 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 JB.RN NRN,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select JB.RN NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.RN NPROJECT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JBP.RN NJB_PRJCTS,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.CODE || ''-'' || P.NAME_USL SPRJ,'); @@ -5247,7 +5635,8 @@ text="Проверить, что для расчётных полей дата- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.STATE NJOB_STATE,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JB.DATE_FROM DJOB_BEG,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JB.DATE_TO DJOB_END,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.LABOUR_P NLABOUR_P'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.LABOUR_P NLABOUR_P,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.UMEAS NLABOUR_P_UMEAS'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from P8PNL_JB_JOBS JB,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P8PNL_JB_PRJCTS JBP,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOB PJ'); @@ -5292,6 +5681,7 @@ text="Проверить, что для расчётных полей дата- PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 9); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 12); /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; @@ -5299,16 +5689,22 @@ text="Проверить, что для расчётных полей дата- /* Обходим выбранные записи */ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop - /* Вычислим трудоёмкость в датлизируемом периоде по буферу балансировки */ + /* Вычислим длительность и трудоёмкость в датлизируемом периоде по буферу балансировки (в ЕИ панели) */ PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 8, DVALUE => DJOB_BEG); PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 9, DVALUE => DJOB_END); PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 10, NVALUE => NMP_LAB); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 11, NVALUE => NMP_LAB_MEAS); P_PROJECTJOB_GET_DURATION(NCOMPANY => NCOMPANY, DBEG_DATE => DJOB_BEG, DEND_DATE => DJOB_END, - NDURATION_MEAS => NJB_DURATION_MEAS, + NDURATION_MEAS => RJB_PRMS.DURATION_MEAS, NDURATION => NJOB_DUR); - DBEG := RPRD.DATE_FROM; + NMP_LAB := F_DICMUNTS_BASE_RECALC_QUANT(NFLAG_SMART => 0, + NCOMPANY => NCOMPANY, + NUMEAS_FROM => NMP_LAB_MEAS, + NQUANT_FROM => NMP_LAB, + NUMEAS_TO => RJB_PRMS.LAB_MEAS); + DBEG := RPRD.DATE_FROM; if (DJOB_BEG > RPRD.DATE_FROM) then DBEG := DJOB_BEG; end if; @@ -5320,37 +5716,48 @@ text="Проверить, что для расчётных полей дата- NMP_LAB_ONE := ROUND(NMP_LAB / (DJOB_END - DJOB_BEG), 3); else NMP_LAB_ONE := ROUND(NMP_LAB, 3); - end if; + end if; NMP_LAB_PLAN := ROUND((DEND - DBEG) * NMP_LAB_ONE, 3); - /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NPROJECT', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NJB_PRJCTS', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTG_JOB', ICURSOR => ICURSOR, NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SJOB_NAME', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NJOB_STATE', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB', NVALUE => NMP_LAB); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_ONE', NVALUE => NMP_LAB_ONE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_PLAN', NVALUE => NMP_LAB_PLAN); - /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + /* Накопим сумму в буфере результата */ + NLAB_PLAN_JOB := NLAB_PLAN_JOB + NMP_LAB_PLAN; + /* При формировании списка для клиента */ + if (NMODE = 0) then + /* Добавляем колонки с данными */ + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NPROJECT', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NJB_PRJCTS', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 4); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSTG_JOB', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SJOB_NAME', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NJOB_STATE', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB', NVALUE => NMP_LAB); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_ONE', NVALUE => NMP_LAB_ONE); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_PLAN', NVALUE => NMP_LAB_PLAN); + /* Добавляем строку в таблицу */ + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + end if; end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); @@ -5359,308 +5766,69 @@ text="Проверить, что для расчётных полей дата- PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); raise; end; - /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); - end JB_PERIODS_LIST_PLAN_JOBS; + /* При формировании списка для клиента */ + if (NMODE = 0) then + /* Сериализуем описание */ + COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + end if; + end JB_PERIODS_PLAN_JOBS_BUILD; - /* Получение плановой трудоёмкости по текущему состоянию графиков в буфере балансировки для периода балансировки */ - function JB_PERIODS_GET_PLAN_JOBS + /* Получение списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */ + procedure JB_PERIODS_PLAN_JOBS_LIST ( - NIDENT in number, -- Идентификатор процесса - DDATE_FROM in date, -- Начало - DDATE_TO in date, -- Окончание - NINS_DEPARTMENT in number, -- Рег. номер штатного подразделения - NFCMANPOWER in number -- Рег. номер трудового ресурса + 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 -- Сериализованная таблица данных + ) + is + NTMP PKG_STD.TLNUMBER; -- Буфер для рассчетов + begin + /* Сформируем список детализации по текущему состоянию плана-графика */ + JB_PERIODS_PLAN_JOBS_BUILD(NJB_PERIODS => NJB_PERIODS, + NMODE => 0, + NPAGE_NUMBER => NPAGE_NUMBER, + NPAGE_SIZE => NPAGE_SIZE, + CORDERS => CORDERS, + NINCLUDE_DEF => NINCLUDE_DEF, + NLAB_PLAN_JOB => NTMP, + COUT => COUT); + end JB_PERIODS_PLAN_JOBS_LIST; + + /* Расчёт плановой трудоёмкости по текущему состоянию графиков в буфере балансировки для периода балансировки */ + function JB_PERIODS_PLAN_JOBS_CALC + ( + NJB_PERIODS in number -- Рег. номер записи периода в буфере балансировки ) return number -- Плановая трудоёмкость по текущему состоянию графиков в буфере балансировки is NRES PKG_STD.TLNUMBER; -- Буфер для результата - NPLAN_JOB PKG_STD.TLNUMBER; -- Плановая трудоёмкость текущей работы согласно графика - DBEG PKG_STD.TLDATE; -- Дата начала для расчёта трудоёмкости текущей работы - DEND PKG_STD.TLDATE; -- Дата окончания для расчёта трудоёмкости текущей работы + CTMP clob; -- Буфер для вычислений begin - /* Обходим все работы в буфере подходящие по условиям */ - for C in (select JB.*, - PJMP.LABOUR_P - from P8PNL_JB_JOBS JB, - PROJECTJOB PJ, - PROJECTJOBMANPOW PJMP - where JB.IDENT = NIDENT - and JB.STAGE = 0 - and JB.SOURCE = PJ.RN - and PJ.RN = PJMP.PRN - and PJMP.FCMANPOWER = NFCMANPOWER - and PJMP.SUBDIV = NINS_DEPARTMENT - and ((JB.DATE_FROM between DDATE_FROM and DDATE_TO) or (JB.DATE_TO between DDATE_FROM and DDATE_TO) or - ((JB.DATE_FROM < DDATE_FROM) and (JB.DATE_TO > DDATE_TO)))) - loop - /* Вычислим трудоёмкость по графику для попавшейся работы */ - DBEG := DDATE_FROM; - if (C.DATE_FROM > DDATE_FROM) then - DBEG := C.DATE_FROM; - end if; - DEND := DDATE_TO; - if (C.DATE_TO < DDATE_TO) then - DEND := C.DATE_TO; - end if; - if (C.LABOUR_P <> 0) then - if (C.DATE_TO - C.DATE_FROM <> 0) then - NPLAN_JOB := ROUND((DEND - DBEG) * (C.LABOUR_P / (C.DATE_TO - C.DATE_FROM)), 3); - else - NPLAN_JOB := ROUND((DEND - DBEG) * C.LABOUR_P, 3); - end if; - else - NPLAN_JOB := 0; - end if; - /* Накопим сумму в буфере результата */ - NRES := COALESCE(NRES, 0) + NPLAN_JOB; - end loop; - /* Вернём собранный результат */ - return COALESCE(NRES, 0); - end JB_PERIODS_GET_PLAN_JOBS; + /* Рассчитаем плановую трудоёмкость по текущему состоянию графиков */ + JB_PERIODS_PLAN_JOBS_BUILD(NJB_PERIODS => NJB_PERIODS, NMODE => 1, NLAB_PLAN_JOB => NRES, COUT => CTMP); + /* Вернём результат */ + return NRES; + end JB_PERIODS_PLAN_JOBS_CALC; - /* Получение списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */ - procedure JB_PERIODS_LIST_FACT_RPT + /* Установка трудоемкостей в записи периода балансировки работ */ + procedure JB_PERIODS_SET_LAB ( - 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 -- Сериализованная таблица данных - ) + NJB_PERIODS in number, -- Рег. номер записи периода балансировки + NLAB_PLAN_FOT in number, -- Плановая трудоёмкость по ФОТ + NLAB_FACT_RPT in number, -- Фактическая трудоёмкость по "Планам и отчетам подразделений" + NLAB_PLAN_JOBS in number -- Плановая трудоёмкость по плану-графику + ) is - NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы - CSQL clob; -- Буфер для запроса - ICURSOR integer; -- Курсор для исполнения запроса - NROW_FROM PKG_STD.TREF; -- Номер строки с - NROW_TO PKG_STD.TREF; -- Номер строки по - DJOB_BEG PKG_STD.TLDATE; -- Дата начала текущей работы согласно плану-груфику - DJOB_END PKG_STD.TLDATE; -- Дата окончания текущей работы согласно плану-груфику - NJOB_DUR PKG_STD.TLNUMBER; -- Длительнось текущей работы согласно плану-груфику begin - /* Считаем детализируемую запись периода */ - RPRD := JB_PERIODS_GET(NJB_PERIODS => NJB_PERIODS); - /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); - /* Преобразуем номер и размер страницы в номер строк с и по */ - PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, - NPAGE_SIZE => NPAGE_SIZE, - NROW_FROM => NROW_FROM, - NROW_TO => NROW_TO); - /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); - /* Добавляем в таблицу описание колонок */ - 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 => 'SPRJDEPLAN', - SCAPTION => 'Документ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPRJ', - SCAPTION => 'Проект', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTG_JOB', - SCAPTION => 'Этап-работа', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SJOB_NAME', - SCAPTION => 'Наим. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJOB_STATE', - SCAPTION => 'Сост. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DJOB_BEG', - SCAPTION => 'Начало работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DJOB_END', - SCAPTION => 'Окончание работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJOB_DUR', - SCAPTION => 'Длительн. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPERSON', - SCAPTION => 'Сотрудник', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB', - SCAPTION => 'Труд.', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => false); - /* Обходим данные */ - 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 MP.RN NRN,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE || '', '' || trim(T.DOCPREF) || ''/'' || trim(T.DOCNUMB) || '', '' || TO_CHAR(T.DOCDATE, ''dd.mm.yyyy'') SPRJDEPLAN,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.CODE || ''-'' || P.NAME_USL SPRJ,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(COALESCE(PS.NUMB, ''Б/Э'')) || ''-'' || trim(PJ.NUMB) SSTG_JOB,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.NAME SJOB_NAME,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.STATE NJOB_STATE,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.BEGPLAN DJOB_BEG,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.ENDPLAN DJOB_END,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F_CLNPERSONS_FORMAT_CODE(FMP.COMPANY, FMP.CODE) SPERSON,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MP.LABOUR_F NLAB'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PRJDEPLAN T,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCTYPES DT,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ENPERIOD PR,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PRJDEPLANMANPOW MP,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTSTAGE PS,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOB PJ,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOBMANPOW PJMP,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CLNPSPFM FM,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CLNPERSONS FMP'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.STATE = 2'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.PERIOD = PR.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.DOCTYPE = DT.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.SUBDIV = :NINS_DEPARTMENT'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((PR.STARTDATE between :DDATE_FROM and :DDATE_TO) or (PR.ENDDATE between :DDATE_FROM and :DDATE_TO) or'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((PR.STARTDATE < :DDATE_FROM) and (PR.ENDDATE > :DDATE_TO)))'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PRN in (select PJ.RN from PRJDEPPLANJOB PJ where PJ.PRN = T.RN)'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PROJECTJOBMANPOW = PJMP.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.CLNPSPFM = FM.RN(+)'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.PERSRN = FMP.RN(+)'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.PRN = PJ.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PROJECTSTAGE = PS.RN(+) %ORDER_BY%) D) F'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); - /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); - /* Разбираем его */ - ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); - PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); - /* Делаем подстановку параметров */ - PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY); - PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NINS_DEPARTMENT', NVALUE => RPRD.INS_DEPARTMENT); - PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCMANPOWER', NVALUE => RPRD.FCMANPOWER); - PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_FROM', DVALUE => RPRD.DATE_FROM); - PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => RPRD.DATE_TO); - 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.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_STR(ICURSOR => ICURSOR, IPOSITION => 9); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11); - /* Делаем выборку */ - if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then - null; - end if; - /* Обходим выбранные записи */ - while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) - loop - /* Вычислим длительость работы в ЕИ панели */ - PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 7, DVALUE => DJOB_BEG); - PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 8, DVALUE => DJOB_END); - P_PROJECTJOB_GET_DURATION(NCOMPANY => NCOMPANY, - DBEG_DATE => DJOB_BEG, - DEND_DATE => DJOB_END, - NDURATION_MEAS => NJB_DURATION_MEAS, - NDURATION => NJOB_DUR); - /* Добавляем колонки с данными */ - 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 => 'SPRJDEPLAN', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTG_JOB', ICURSOR => ICURSOR, NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SJOB_NAME', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NJOB_STATE', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPERSON', ICURSOR => ICURSOR, NPOSITION => 9); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NLAB', ICURSOR => ICURSOR, NPOSITION => 10); - /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); - end loop; - /* Освобождаем курсор */ - PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); - exception - when others then - PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); - raise; - end; - /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); - end JB_PERIODS_LIST_FACT_RPT; - - /* Получение фактической трудоёмкости трудового ресурса по "Планам и отчетам подразделеий" для периода балансировки */ - function JB_PERIODS_GET_FACT_RPT - ( - NCOMPANY in number, -- Рег. номер организации - DDATE_FROM in date, -- Начало - DDATE_TO in date, -- Окончание - NINS_DEPARTMENT in number, -- Рег. номер штатного подразделения - NFCMANPOWER in number -- Рег. номер трудового ресурса - ) return number -- Фактическая трудоёмкость трудового ресурса по "Планам и отчетам подразделеий" - is - NRES PKG_STD.TLNUMBER; -- Буфер для результата - begin - /* Суммируем фактические трудоёмкости из закрытых планов и отчетов подразеделений подходящим по параметрам */ - select sum(MP.LABOUR_F) - into NRES - from PRJDEPLAN T, - ENPERIOD P, - PRJDEPLANMANPOW MP, - PROJECTJOBMANPOW PJMP - where T.COMPANY = NCOMPANY - and T.STATE = 2 - and T.PERIOD = P.RN - and T.SUBDIV = NINS_DEPARTMENT - and ((P.STARTDATE between DDATE_FROM and DDATE_TO) or (P.ENDDATE between DDATE_FROM and DDATE_TO) or - ((P.STARTDATE < DDATE_FROM) and (P.ENDDATE > DDATE_TO))) - and MP.PRN in (select PJ.RN from PRJDEPPLANJOB PJ where PJ.PRN = T.RN) - and MP.PROJECTJOBMANPOW = PJMP.RN - and PJMP.FCMANPOWER = NFCMANPOWER; - /* Вернём собранный результат */ - return COALESCE(NRES, 0); - end JB_PERIODS_GET_FACT_RPT; + /* Установим трудоёмкости */ + update P8PNL_JB_PERIODS T + set T.LAB_PLAN_FOT = NLAB_PLAN_FOT, + T.LAB_FACT_RPT = NLAB_FACT_RPT, + T.LAB_PLAN_JOBS = NLAB_PLAN_JOBS + where T.RN = NJB_PERIODS; + end JB_PERIODS_SET_LAB; /* Базовое добавление периода балансировки работ */ procedure JB_PERIODS_BASE_INSERT @@ -5716,22 +5884,23 @@ text="Проверить, что для расчётных полей дата- /* Пересчёт периодов балансировки */ procedure JB_PERIODS_RECALC ( - NIDENT in number, -- Идентификатор процесса - DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов - NINITIAL in number, -- Признак первоначального рассчёта (0 - пересчёт, 1 - первоначальный рассчёт) - NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения) + NIDENT in number, -- Идентификатор процесса + NINITIAL in number, -- Признак первоначального рассчёта (0 - пересчёт, 1 - первоначальный рассчёт) + NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения) ) is - NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - DJB_BEG PKG_STD.TLDATE; -- Дата начала периода балансировки - DJB_END PKG_STD.TLDATE; -- Дата окончания периода балансировки - DBEG PKG_STD.TLDATE; -- Дата начала текущего месяца периода балансировки - DEND PKG_STD.TLDATE; -- Дата окончания текущего месяца периода балансировки - NJB_PERIODS PKG_STD.TREF; -- Рег. номер добавленного периода балансировки - NLAB_PLAN_FOT PKG_STD.TLNUMBER; -- Плановая трудоёмкость по ФОТ для текущего месяца периода балансировки - NLAB_FACT_RPT PKG_STD.TLNUMBER; -- Фактическая трудоёмкость по "Планам и отчетам подразделений" для текущего месяца периода балансировки - NLAB_PLAN_JOBS PKG_STD.TLNUMBER; -- Плановая трудоёмкость по плану-графику в буфере для текущего месяца периода балансировки + RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки + DJB_BEG PKG_STD.TLDATE; -- Дата начала периода балансировки + DJB_END PKG_STD.TLDATE; -- Дата окончания периода балансировки + DBEG PKG_STD.TLDATE; -- Дата начала текущего месяца периода балансировки + DEND PKG_STD.TLDATE; -- Дата окончания текущего месяца периода балансировки + NJB_PERIODS PKG_STD.TREF; -- Рег. номер добавленного периода балансировки + NLAB_PLAN_FOT PKG_STD.TLNUMBER; -- Плановая трудоёмкость по ФОТ для текущего месяца периода балансировки + NLAB_FACT_RPT PKG_STD.TLNUMBER; -- Фактическая трудоёмкость по "Планам и отчетам подразделений" для текущего месяца периода балансировки + NLAB_PLAN_JOBS PKG_STD.TLNUMBER; -- Плановая трудоёмкость по плану-графику в буфере для текущего месяца периода балансировки begin + /* Считаем параметры балансировки */ + RJB_PRMS := JB_PRMS_GET(NIDENT => NIDENT); /* Подчистка при перерасчёте */ if (NINITIAL = 0) then JB_PERIODS_CLEAN(NIDENT => NIDENT); @@ -5739,7 +5908,7 @@ text="Проверить, что для расчётных полей дата- /* Скажем, что нет отклонений */ NRESOURCE_STATUS := 0; /* Определим период балансировки */ - DJB_BEG := DBEGIN; + DJB_BEG := RJB_PRMS.DATE_BEGIN; DJB_END := JB_GET_END(NIDENT => NIDENT); /* Сформируем записи периодов балансировки */ for I in 0 .. FLOOR(MONTHS_BETWEEN(DJB_END, DJB_BEG)) @@ -5762,34 +5931,27 @@ text="Проверить, что для расчётных полей дата- group by JMP.FCMANPOWER, JMP.SUBDIV) loop - /* Рассчитаем трудоёмкость по ФОТ (в часах) */ - NLAB_PLAN_FOT := JB_PERIODS_GET_PLAN_FOT(NCOMPANY => NCOMPANY, - DDATE_FROM => DBEG, - DDATE_TO => DEND, - NINS_DEPARTMENT => D.SUBDIV, - NFCMANPOWER => D.FCMANPOWER); - /* Рассчитаем трудоемкость по "Планам и отчетам подразделений" */ - NLAB_FACT_RPT := JB_PERIODS_GET_FACT_RPT(NCOMPANY => NCOMPANY, - DDATE_FROM => DBEG, - DDATE_TO => DEND, - NINS_DEPARTMENT => D.SUBDIV, - NFCMANPOWER => D.FCMANPOWER); - /* Рассчитаем трудоёмкость по работам графика */ - NLAB_PLAN_JOBS := JB_PERIODS_GET_PLAN_JOBS(NIDENT => NIDENT, - DDATE_FROM => DBEG, - DDATE_TO => DEND, - NINS_DEPARTMENT => D.SUBDIV, - NFCMANPOWER => D.FCMANPOWER); /* Добавим запись периода балансировки */ JB_PERIODS_BASE_INSERT(NIDENT => NIDENT, DDATE_FROM => DBEG, DDATE_TO => DEND, NINS_DEPARTMENT => D.SUBDIV, NFCMANPOWER => D.FCMANPOWER, - NLAB_PLAN_FOT => NLAB_PLAN_FOT, - NLAB_FACT_RPT => NLAB_FACT_RPT, - NLAB_PLAN_JOBS => NLAB_PLAN_JOBS, + NLAB_PLAN_FOT => 0, + NLAB_FACT_RPT => 0, + NLAB_PLAN_JOBS => 0, NJB_PERIODS => NJB_PERIODS); + /* Рассчитаем трудоёмкость по ФОТ (в часах) */ + NLAB_PLAN_FOT := JB_PERIODS_PLAN_FOT_CALC(NJB_PERIODS => NJB_PERIODS); + /* Рассчитаем трудоемкость по "Планам и отчетам подразделений" */ + NLAB_FACT_RPT := JB_PERIODS_FACT_RPT_CALC(NJB_PERIODS => NJB_PERIODS); + /* Рассчитаем трудоёмкость по работам графика */ + NLAB_PLAN_JOBS := JB_PERIODS_PLAN_JOBS_CALC(NJB_PERIODS => NJB_PERIODS); + /* Сохраним расчёты */ + JB_PERIODS_SET_LAB(NJB_PERIODS => NJB_PERIODS, + NLAB_PLAN_FOT => NLAB_PLAN_FOT, + NLAB_FACT_RPT => NLAB_FACT_RPT, + NLAB_PLAN_JOBS => NLAB_PLAN_JOBS); /* Если плановая трудоёмкость по работам графика превысила ФОТ - значит с ресурсами всё плохо */ if (NLAB_PLAN_JOBS > NLAB_PLAN_FOT) then NRESOURCE_STATUS := 1; @@ -5809,6 +5971,7 @@ text="Проверить, что для расчётных полей дата- COUT out clob -- Сериализованная таблица данных ) is + RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы @@ -5817,7 +5980,9 @@ text="Проверить, что для расчётных полей дата- NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по begin - /* Читем сортировки */ + /* Считаем параметры балансировки */ + RJB_PRMS := JB_PRMS_GET(NIDENT => NIDENT); + /* Читаем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, @@ -5852,33 +6017,33 @@ text="Проверить, что для расчётных полей дата- BFILTER => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLAB_PLAN_FOT', - SCAPTION => 'Труд. (план, ФОТ)', + SCAPTION => 'Труд. (план, ФОТ, ' || RJB_PRMS.LAB_MEAS_CODE || ')', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BORDER => true, BFILTER => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLAB_FACT_RPT', - SCAPTION => 'Труд. (факт, отчёт)', + SCAPTION => 'Труд. (факт, отчёт, ' || RJB_PRMS.LAB_MEAS_CODE || ')', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => true, BORDER => true, BFILTER => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLAB_DIFF_RPT_FOT', - SCAPTION => 'Отклон. (факт-план)', + SCAPTION => 'Отклон. (факт-план, ' || RJB_PRMS.LAB_MEAS_CODE || ')', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => true, BORDER => true, BFILTER => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLAB_PLAN_JOBS', - SCAPTION => 'Труд. (план, график)', + SCAPTION => 'Труд. (план, график, ' || RJB_PRMS.LAB_MEAS_CODE || ')', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BORDER => true, BFILTER => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLAB_DIFF_JOBS_FOT', - SCAPTION => 'Отклон. (график-план)', + SCAPTION => 'Отклон. (график-план, ' || RJB_PRMS.LAB_MEAS_CODE || ')', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BORDER => true, BFILTER => false); @@ -5989,6 +6154,8 @@ text="Проверить, что для расчётных полей дата- ) is begin + /* Удаляем параметры балансировки */ + JB_PRMS_CLEAN(NIDENT => NIDENT); /* Удаляем список предшествующих работ */ delete from P8PNL_JB_JOBSPREV T where T.IDENT = NIDENT; /* Удаляем список работ */ @@ -6101,8 +6268,10 @@ text="Проверить, что для расчётных полей дата- ( DBEGIN in out date, -- Дата начала периода мониторинга загрузки ресурсов DFACT in out date, -- Факт по состоянию на - NDURATION_MEAS in out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год) - SLAB_MEAS in out varchar2, -- Единица измерения трудоёмкости + 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 - есть отклонения) ) @@ -6117,7 +6286,7 @@ text="Проверить, что для расчётных полей дата- RH_JB_JOBS_PREV P8PNL_JB_JOBS%rowtype; -- Запись предшествующей работы в иехархии балансируемых NDURATION P8PNL_JB_JOBS.DURATION%type; -- Длительност текущей работы/этапа NEDITABLE PKG_STD.TREF; -- Признак возможности редактирования работы - NLAB_MEAS PKG_STD.TREF; -- Рег. номер выбранной для рассчётов единицы измерения трудоёмкости + NPRMS PKG_STD.TREF; -- Рег. номер записи параметров балансировки begin /* Обработаем дату начала периода мониторинга загрузки ресурсов */ if (DBEGIN is null) then @@ -6128,7 +6297,7 @@ text="Проверить, что для расчётных полей дата- /* Обработаем дату факта */ if (DFACT is null) then select LAST_DAY(TRUNC(COALESCE(max(ENP.ENDDATE), DBEGIN), 'mm')) - into DFACT + into DFACT from PRJDEPLAN T, ENPERIOD ENP where T.COMPANY = NCOMPANY @@ -6139,6 +6308,7 @@ text="Проверить, что для расчётных полей дата- end if; /* Обработаем единицу измерения длительности (пока - она всегда должна быть "день", по умолчанию) */ NDURATION_MEAS := NJB_DURATION_MEAS; + SDURATION_MEAS := JB_GET_DURATION_MEAS_CODE(NDURATION_MEAS => NDURATION_MEAS); /* Обработаем единицу измерения трудоёмкости (пока - она всегда должна быть "ч/ч", по умолчанию) */ SLAB_MEAS := SJB_LAB_MEAS; FIND_DICMUNTS_BY_MNEMO(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, SMEAS_MNEMO => SLAB_MEAS, NRN => NLAB_MEAS); @@ -6148,6 +6318,15 @@ text="Проверить, что для расчётных полей дата- else JB_CLEAN(NIDENT => NIDENT); end if; + /* Сохраняем параметры балансировки */ + JB_PRMS_BASE_INSERT(NIDENT => NIDENT, + DDATE_BEGIN => DBEGIN, + DDATE_FACT => DFACT, + NDURATION_MEAS => NDURATION_MEAS, + SDURATION_MEAS_CODE => SDURATION_MEAS, + NLAB_MEAS => NLAB_MEAS, + SLAB_MEAS_CODE => SLAB_MEAS, + NRN => NPRMS); /* Обходим проекты */ for PRJ in (select P.RN NRN, COALESCE((select 1 @@ -6306,7 +6485,7 @@ text="Проверить, что для расчётных полей дата- end loop; end loop; /* Сформируем данные монитора загрузки ресурсов */ - JB_PERIODS_RECALC(NIDENT => NIDENT, DBEGIN => DBEGIN, NINITIAL => 1, NRESOURCE_STATUS => NRESOURCE_STATUS); + JB_PERIODS_RECALC(NIDENT => NIDENT, NINITIAL => 1, NRESOURCE_STATUS => NRESOURCE_STATUS); end JB_INIT; end PKG_P8PANELS_PROJECTS; -- 2.34.1 From 52c6cb126cf638d77e5ddb877ece0c6025dee320 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 19 Apr 2024 21:46:51 +0300 Subject: [PATCH 12/17] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index b7133de..1c111c6 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -3766,7 +3766,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabFactRptDtl: () => (/* binding */ LabFactRptDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nconst LabFactRptDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [factRptDtl, setFactRptDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации фактической трудоёмкости по отчетам для ресурса\n const loadFactRptDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (factRptDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_FACT_RPT\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(factRptDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: factRptDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: factRptDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setFactRptDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, factRptDtl.reload, factRptDtl.orders, factRptDtl.dataLoaded, factRptDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setFactRptDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGPagesCountChanged = () => setFactRptDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadFactRptDtl();\n }, [factRptDtl.reload, loadFactRptDtl]);\n\n //Генерация содержимого\n return factRptDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: factRptDtl.columnsDef,\n rows: factRptDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: factRptDtl.morePages,\n reloading: factRptDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlHeadCellRender,\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nLabFactRptDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_fact_rpt_dtl.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabFactRptDtl: () => (/* binding */ LabFactRptDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nconst LabFactRptDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [factRptDtl, setFactRptDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации фактической трудоёмкости по отчетам для ресурса\n const loadFactRptDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (factRptDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_FACT_RPT_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(factRptDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: factRptDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: factRptDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setFactRptDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, factRptDtl.reload, factRptDtl.orders, factRptDtl.dataLoaded, factRptDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setFactRptDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGPagesCountChanged = () => setFactRptDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadFactRptDtl();\n }, [factRptDtl.reload, loadFactRptDtl]);\n\n //Генерация содержимого\n return factRptDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: factRptDtl.columnsDef,\n rows: factRptDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: factRptDtl.morePages,\n reloading: factRptDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlHeadCellRender,\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nLabFactRptDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_fact_rpt_dtl.js?"); /***/ }), @@ -3777,7 +3777,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanFOTDtl: () => (/* binding */ LabPlanFOTDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по ФОТ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по ФОТ\nconst LabPlanFOTDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по ФОТ ресурса\n const [planFOTDtl, setPlanFOTDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по ФОТ для ресурса\n const loadPlanFOTDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planFOTDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_FOT\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planFOTDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planFOTDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planFOTDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanFOTDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planFOTDtl.reload, planFOTDtl.orders, planFOTDtl.dataLoaded, planFOTDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGOrderChanged = ({\n orders\n }) => setPlanFOTDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGPagesCountChanged = () => setPlanFOTDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanFOTDtl();\n }, [planFOTDtl.reload, loadPlanFOTDtl]);\n\n //Генерация содержимого\n return planFOTDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n open: true,\n onClose: onHide\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planFOTDtl.columnsDef,\n rows: planFOTDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planFOTDtl.morePages,\n reloading: planFOTDtl.reload,\n onOrderChanged: handlePlanFOTDtlDGOrderChanged,\n onPagesCountChanged: handlePlanFOTDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по ФОТ\nLabPlanFOTDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_fot_dtl.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanFOTDtl: () => (/* binding */ LabPlanFOTDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по ФОТ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по ФОТ\nconst LabPlanFOTDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по ФОТ ресурса\n const [planFOTDtl, setPlanFOTDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по ФОТ для ресурса\n const loadPlanFOTDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planFOTDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_FOT_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planFOTDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planFOTDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planFOTDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanFOTDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planFOTDtl.reload, planFOTDtl.orders, planFOTDtl.dataLoaded, planFOTDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGOrderChanged = ({\n orders\n }) => setPlanFOTDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGPagesCountChanged = () => setPlanFOTDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanFOTDtl();\n }, [planFOTDtl.reload, loadPlanFOTDtl]);\n\n //Генерация содержимого\n return planFOTDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n open: true,\n onClose: onHide\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planFOTDtl.columnsDef,\n rows: planFOTDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planFOTDtl.morePages,\n reloading: planFOTDtl.reload,\n onOrderChanged: handlePlanFOTDtlDGOrderChanged,\n onPagesCountChanged: handlePlanFOTDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по ФОТ\nLabPlanFOTDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_fot_dtl.js?"); /***/ }), @@ -3788,7 +3788,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по графику\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по графику для ресурса\n const loadPlanJobsDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_JOBS\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализаци\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanJobsDtl();\n }, [planJobsDtl.reload, loadPlanJobsDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlHeadCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlDataCellRender)({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по графику\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по графику для ресурса\n const loadPlanJobsDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_JOBS_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализаци\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanJobsDtl();\n }, [planJobsDtl.reload, loadPlanJobsDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlHeadCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlDataCellRender)({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?"); /***/ }), @@ -3810,7 +3810,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Текстовые ресурсы и константы\n //Монитор ресурсов\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//Единицы измерения длительности\nconst DURATION_MEAS = {\n 0: \"День\",\n 1: \"Неделя\",\n 2: \"Декада\",\n 3: \"Месяц\",\n 4: \"Квартал\",\n 5: \"Год\"\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Диалог параметров инициализации панели\nconst InitDialog = ({\n dateBegin,\n dateFact,\n onOk,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [values, setValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dateBegin: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateBegin),\n dateFact: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateFact)\n });\n\n //Отработка воода значения в фильтр\n const handleValueTextFieldChanged = e => setValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"init-dialog-title\",\n \"aria-describedby\": \"init-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"\\u041F\\u0430\\u0440\\u0430\\u043C\\u0435\\u0442\\u0440\\u044B \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u0438\\u0437\\u0430\\u0446\\u0438\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateBegin\",\n type: \"date\",\n value: values.dateBegin,\n onChange: handleValueTextFieldChanged,\n label: \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u0435\\u0440\\u0432\\u044B\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateFact\",\n type: \"date\",\n value: values.dateFact,\n onChange: handleValueTextFieldChanged,\n label: \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430 (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0438\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onOk ? onOk({\n dateBegin: new Date(values.dateBegin),\n dateFact: new Date(values.dateFact)\n }) : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_7__.BUTTONS.OK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_7__.BUTTONS.CANCEL)));\n};\n\n//Контроль свойств - Диалог параметров инициализации панели\nInitDialog.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date).isRequired,\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: [],\n showInitDialog: false\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? state.dateBegin : null,\n DFACT: state.dateFact ? state.dateFact : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n reInit: false,\n dateBegin: new Date(data.DBEGIN),\n dateFact: new Date(data.DFACT),\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При изменении флага инициализации\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n }, [state.init, initJobs]);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Отработка нажатия на отображения диалога параметров инициализации панели\n const handleShowInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: true\n }));\n\n //Отработка нажатия на \"ОК\" в диалоге параметров инициализации панели\n const handleOKInitDialogClick = values => setState(pv => ({\n ...pv,\n dateBegin: values.dateBegin,\n dateFact: values.dateFact,\n showInitDialog: false,\n init: false\n }));\n\n //Отработка нажатия на \"Отмена\" в диалоге параметров инициализации панели\n const handleCancelInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: false\n }));\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n p: 2\n }, state.showInitDialog ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitDialog, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n onOk: handleOKInitDialogClick,\n onCancel: handleCancelInitDialogClick\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(state.dateBegin), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(state.dateFact), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C: \"), DURATION_MEAS[state.durationMeas], /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0451\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C: \"), state.labMeas)\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"refresh\"),\n onClick: handleShowInitDialogClick\n }, \"\\u041F\\u0435\\u0440\\u0435\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C...\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], null), state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true,\n color: \"warning\",\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"save\"),\n onClick: handleSaveToProjectsClick\n }, \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], null)) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_8__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_9__.taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Текстовые ресурсы и константы\n //Монитор ресурсов\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Диалог параметров инициализации панели\nconst InitPrmsDialog = ({\n dateBegin,\n dateFact,\n onOk,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [values, setValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dateBegin: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateBegin),\n dateFact: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateFact)\n });\n\n //Отработка воода значения в фильтр\n const handleValueTextFieldChanged = e => setValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"init-dialog-title\",\n \"aria-describedby\": \"init-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"\\u041F\\u0430\\u0440\\u0430\\u043C\\u0435\\u0442\\u0440\\u044B \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u0438\\u0437\\u0430\\u0446\\u0438\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateBegin\",\n type: \"date\",\n value: values.dateBegin,\n onChange: handleValueTextFieldChanged,\n label: \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u0435\\u0440\\u0432\\u044B\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateFact\",\n type: \"date\",\n value: values.dateFact,\n onChange: handleValueTextFieldChanged,\n label: \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430 (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0438\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onOk ? onOk({\n dateBegin: new Date(values.dateBegin),\n dateFact: new Date(values.dateFact)\n }) : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_7__.BUTTONS.OK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_7__.BUTTONS.CANCEL)));\n};\n\n//Контроль свойств - Диалог параметров инициализации панели\nInitPrmsDialog.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date).isRequired,\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//Область параметров инициализации панели\nconst InitPrmsArea = ({\n dateBegin,\n dateFact,\n durationMeasCode,\n labMeasCode,\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(dateBegin), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(dateFact), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C: \"), durationMeasCode, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0451\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C: \"), labMeasCode)\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"refresh\"),\n onClick: onClick ? onClick : null\n }, \"\\u041F\\u0435\\u0440\\u0435\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C...\")));\n};\n\n//Контроль свойств - Область параметров инициализации панели\nInitPrmsArea.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date),\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date),\n durationMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().string),\n labMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().string),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//Область сохранения изменений\nconst SaveChangesArea = ({\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true,\n color: \"warning\",\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"save\"),\n onClick: onClick\n }, \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\")));\n};\n\n//Контроль свойств - Область сохранения изменений\nSaveChangesArea.propTypes = {\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n durationMeasCode: null,\n labMeas: null,\n labMeasCode: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: [],\n showInitDialog: false\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? state.dateBegin : null,\n DFACT: state.dateFact ? state.dateFact : null,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n reInit: false,\n dateBegin: new Date(data.DBEGIN),\n dateFact: new Date(data.DFACT),\n durationMeas: data.NDURATION_MEAS,\n durationMeasCode: data.SDURATION_MEAS,\n labMeas: data.NLAB_MEAS,\n labMeasCode: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При изменении флага инициализации\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n }, [state.init, initJobs]);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end));\n };\n\n //Отработка нажатия на отображения диалога параметров инициализации панели\n const handleShowInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: true\n }));\n\n //Отработка нажатия на \"ОК\" в диалоге параметров инициализации панели\n const handleOKInitDialogClick = values => setState(pv => ({\n ...pv,\n dateBegin: values.dateBegin,\n dateFact: values.dateFact,\n showInitDialog: false,\n init: false\n }));\n\n //Отработка нажатия на \"Отмена\" в диалоге параметров инициализации панели\n const handleCancelInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: false\n }));\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n p: 2\n }, state.showInitDialog ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitPrmsDialog, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n onOk: handleOKInitDialogClick,\n onCancel: handleCancelInitDialogClick\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitPrmsArea, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n durationMeasCode: state.durationMeasCode,\n labMeasCode: state.labMeasCode,\n onClick: handleShowInitDialogClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], null), state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SaveChangesArea, {\n onClick: handleSaveToProjectsClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], null)) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_8__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_9__.taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }), -- 2.34.1 From b16922360f36117b8ef3f68a8e078422ad72d6f1 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 22 Apr 2024 23:13:04 +0300 Subject: [PATCH 13/17] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2"=20-=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B0=20=D0=B2=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=BD=D0=B8=D1=82=D0=BE=D1=80=D0=B5=20=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=83=D1=80=D1=81=D0=BE=D0=B2=20=D0=B8=20=D0=B4=D0=B5=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_BASE.pck | 61 +++++++++++++++++++- db/PKG_P8PANELS_PROJECTS.pck | 104 ++++++++++++++++++++++++++--------- 2 files changed, 137 insertions(+), 28 deletions(-) diff --git a/db/PKG_P8PANELS_BASE.pck b/db/PKG_P8PANELS_BASE.pck index 6f151d5..2a54068 100644 --- a/db/PKG_P8PANELS_BASE.pck +++ b/db/PKG_P8PANELS_BASE.pck @@ -1,7 +1,11 @@ create or replace package PKG_P8PANELS_BASE as /*Константы - Типовой постфикс тега для массива (при переводе XML -> JSON) */ - SXML_ALWAYS_ARRAY_POSTFIX constant PKG_STD.TSTRING := '__SYSTEM__ARRAY__'; + SXML_ALWAYS_ARRAY_POSTFIX constant PKG_STD.TSTRING := '__SYSTEM__ARRAY__'; + + /* Константы - признаки наличия доступа */ + NACCESS_YES constant number(1) := 1; -- Доступ есть + NACCESS_NO constant number(1) := 0; -- Доступа нет /* Конвертация строки в число */ function UTL_S2N @@ -15,6 +19,14 @@ create or replace package PKG_P8PANELS_BASE as SVALUE in varchar2 -- Конвертируемое строковое значение ) return date; -- Конвертированная дата + /* Проверка доступности документа */ + function UTL_DOC_ACCESS_CHECK + ( + NCOMPANY in number, -- Рег. номер организации + SUNIT_CODE in varchar2, -- Код раздела + NDOCUMENT in number -- Рег. номер документа + ) return number; -- Флаг доступности (см. константы NACCESS_*) + /* Базовое исполнение действий */ procedure PROCESS ( @@ -132,6 +144,53 @@ create or replace package body PKG_P8PANELS_BASE as P_EXCEPTION(0, 'Неверный формат даты (%s).', SVALUE); end UTL_S2D; + /* Проверка доступности документа */ + function UTL_DOC_ACCESS_CHECK + ( + NCOMPANY in number, -- Рег. номер организации + SUNIT_CODE in varchar2, -- Код раздела + NDOCUMENT in number -- Рег. номер документа + ) return number -- Флаг доступности (см. константы NACCESS_*) + is + NRES PKG_STD.TNUMBER; -- Буфер для результата + NVERSION PKG_STD.TREF; -- Рег. номер версии + NCATALOG PKG_STD.TREF; -- Рег. номер каталога + NJUR_PERS PKG_STD.TREF; -- Рег. номер юридической принадлежности + NHIERARCHY PKG_STD.TREF; -- Рег. номер ирерархии + BTMP boolean; -- Буфер для расчетов + NTMP PKG_STD.TNUMBER; -- Буфер для расчетов + begin + /* Считаем стандартную атрибутику */ + PKG_DOCUMENT.GET_ATTRS(NFLAG_SMART => 0, + SUNITCODE => SUNIT_CODE, + NDOCUMENT => NDOCUMENT, + BFOUND => BTMP, + NCOMPANY => NTMP, + NVERSION => NVERSION, + NCATALOG => NCATALOG, + NJUR_PERS => NJUR_PERS, + NHIERARCHY => NHIERARCHY); + /* Проверким доступ */ + PKG_ENV.SMART_ACCESS(NCOMPANY => NCOMPANY, + NVERSION => NVERSION, + NCATALOG => NCATALOG, + NJUR_PERS => NJUR_PERS, + NHIERARCHY => NHIERARCHY, + SUNIT => SUNIT_CODE, + SACTION => null, + NRESULT => NRES); + /* Вернём результат */ + if (NRES = 1) then + return NACCESS_YES; + else + return NACCESS_NO; + end if; + exception + /* В случае ошибки - доступ закрыт */ + when others then + return NACCESS_NO; + end UTL_DOC_ACCESS_CHECK; + /* Формирование сообщения об отсутствии значения */ function MSG_NO_DATA_MAKE ( diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck index 850336a..7795123 100644 --- a/db/PKG_P8PANELS_PROJECTS.pck +++ b/db/PKG_P8PANELS_PROJECTS.pck @@ -459,31 +459,26 @@ end PKG_P8PANELS_PROJECTS; / create or replace package body PKG_P8PANELS_PROJECTS as -/* -TODO: owner="root" created="25.10.2023" -text="Права доступа в мониторе ресурвов при балансировке планов-графиков" -*/ - -/* -TODO: owner="root" created="25.10.2023" -text="Проверить, что для расчётных полей дата-гридов отключена сортировка - иначе получается ошибка, т.к. поля нет в SQL-запросе" -*/ + /* + TODO: owner="root" created="25.10.2023" + text="Проверить, что для расчётных полей дата-гридов отключена сортировка - иначе получается ошибка, т.к. поля нет в SQL-запросе" + */ /* Константы - предопределённые значения */ - 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 := 'Ч/Ч'; -- Единица измерения трудоёмкости в человеко/часах + 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 := 'Ч/Ч'; -- Единица измерения трудоёмкости в человеко/часах /* Константы - дополнительные свойства */ - 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'; -- Принзнак необходимости контроля контрактации по статье калькуляции + 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 @@ -1345,7 +1340,7 @@ text="Проверить, что для расчётных полей дата- 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 => ' 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'); /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); @@ -5102,7 +5097,9 @@ text="Проверить, что для расчётных полей дата- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.RN = FMH.PRN'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((FMH.DO_ACT_FROM between :DDATE_FROM and :DDATE_TO) or (FMH.DO_ACT_TO between :DDATE_FROM and :DDATE_TO) or'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((FMH.DO_ACT_FROM < :DDATE_FROM) and (COALESCE(FMH.DO_ACT_TO, :DDATE_TO + 1) > :DDATE_TO)))'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FMH.SCHEDULE = SH.RN %ORDER_BY%) D) F'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FMH.SCHEDULE = SH.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_BASE.UTL_DOC_ACCESS_CHECK') ||'(FM.COMPANY, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'ClientPostPerform') || ', FM.RN) = 1'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); @@ -5356,7 +5353,10 @@ text="Проверить, что для расчётных полей дата- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PROJECTJOBMANPOW = PJMP.RN'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.PRN = PJ.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN %ORDER_BY%) D) F'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = T.CRN)'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = T.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'ProjectDepartmentPlans') || ')'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); @@ -5653,7 +5653,10 @@ text="Проверить, что для расчётных полей дата- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.SUBDIV = :NINS_DEPARTMENT'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((JB.DATE_FROM between :DDATE_FROM and :DDATE_TO) or (JB.DATE_TO between :DDATE_FROM and :DDATE_TO) or'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((JB.DATE_FROM < :DDATE_FROM) and (JB.DATE_TO > :DDATE_TO))) %ORDER_BY%) D) F'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((JB.DATE_FROM < :DDATE_FROM) and (JB.DATE_TO > :DDATE_TO)))'); + 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 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); @@ -5928,6 +5931,46 @@ text="Проверить, что для расчётных полей дата- and JB.SOURCE = J.RN and J.RN = JMP.PRN and JMP.SUBDIV is not null + and exists (select null from V_USERPRIV UP where UP.CATALOG = J.CRN) + and exists (select null + from V_USERPRIV UP + where UP.JUR_PERS = J.JUR_PERS + and UP.UNITCODE = 'Projects') + and exists (select null + from UNITLIST UL + where UL.UNITCODE = 'INS_DEPARTMENT' + and UL.CHECK_ACCESS_HIER = 0 + and exists (select /*+ INDEX(UP I_USERPRIV_COMPANY_ROLEID) */ + null + from USERPRIV UP + where UP.COMPANY = JMP.COMPANY + and UP.UNITCODE = 'INS_DEPARTMENT' + 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_COMPANY_AUTHID) */ + null + from USERPRIV UP + where UP.COMPANY = JMP.COMPANY + and UP.UNITCODE = 'INS_DEPARTMENT' + and UP.AUTHID = UTILIZER) + union all + select /*+ INDEX(UP I_USERPRIV_HIERARCHY_ROLEID) */ + null + from USERPRIV UP + where UP.HIERARCHY = JMP.SUBDIV + 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_HIERARCHY_AUTHID) */ + null + from USERPRIV UP + where UP.HIERARCHY = JMP.SUBDIV + and UP.AUTHID = UTILIZER) group by JMP.FCMANPOWER, JMP.SUBDIV) loop @@ -6069,7 +6112,9 @@ text="Проверить, что для расчётных полей дата- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMANPOWER MP'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.IDENT = :NIDENT'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.INS_DEPARTMENT = INSD.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.FCMANPOWER = MP.RN %ORDER_BY%) D) F'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.FCMANPOWER = MP.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_BASE.UTL_DOC_ACCESS_CHECK') ||'(INSD.COMPANY, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'INS_DEPARTMENT') || ', INSD.RN) = 1'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); @@ -6302,7 +6347,12 @@ text="Проверить, что для расчётных полей дата- ENPERIOD ENP where T.COMPANY = NCOMPANY and T.STATE = 2 - and T.PERIOD = ENP.RN; + and T.PERIOD = ENP.RN + and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN) + and exists (select null + from V_USERPRIV UP + where UP.JUR_PERS = T.JUR_PERS + and UP.UNITCODE = 'ProjectDepartmentPlans'); else DFACT := LAST_DAY(TRUNC(DFACT, 'mm')); end if; -- 2.34.1 From e0f4269d8fa389345be0d48ff82af09422235d61 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Tue, 23 Apr 2024 18:55:30 +0300 Subject: [PATCH 14/17] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20-=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20to-do=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B5=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_PROJECTS.pck | 5 ----- 1 file changed, 5 deletions(-) diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck index 7795123..88c1733 100644 --- a/db/PKG_P8PANELS_PROJECTS.pck +++ b/db/PKG_P8PANELS_PROJECTS.pck @@ -459,11 +459,6 @@ end PKG_P8PANELS_PROJECTS; / create or replace package body PKG_P8PANELS_PROJECTS as - /* - TODO: owner="root" created="25.10.2023" - text="Проверить, что для расчётных полей дата-гридов отключена сортировка - иначе получается ошибка, т.к. поля нет в SQL-запросе" - */ - /* Константы - предопределённые значения */ SYES constant PKG_STD.TSTRING := 'Да'; -- Да NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- Лимит отстатка дней для контроля сроков -- 2.34.1 From cd4649bb96e5e32b04d97cc3a9ec8881fe0e2d91 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Wed, 24 Apr 2024 13:04:18 +0300 Subject: [PATCH 15/17] =?UTF-8?q?WEB=20APP:=20=D0=A6=D0=98=D0=A2=D0=9A-801?= =?UTF-8?q?=20-=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0=20=D1=88=D1=82=D0=B0=D1=82=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BA=20=D1=80=D0=B5=D0=BB=D0=B8=D0=B7=D1=83=20"=D0=BC?= =?UTF-8?q?=D0=B0=D1=80=D1=82=202024"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/prj_fin/projects.js | 6 +++--- app/panels/prj_fin/stage_arts.js | 2 +- app/panels/prj_fin/stage_contracts.js | 4 ++-- app/panels/prj_fin/stages.js | 5 ++--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/panels/prj_fin/projects.js b/app/panels/prj_fin/projects.js index ba4c6fb..9855e07 100644 --- a/app/panels/prj_fin/projects.js +++ b/app/panels/prj_fin/projects.js @@ -144,12 +144,12 @@ const Projects = () => { }; //Отображение детализации точки графика затрат - const showCostNotesChartDetail = async ({ unitCode, year, month }) => { + const showCostNotesChartDetail = async ({ year, month }) => { const data = await executeStored({ stored: "PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES_SELECT_COST", args: { NYEAR: year, NMONTH: month } }); - if (data.NIDENT) pOnlineShowUnit({ unitCode, inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] }); + if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] }); else showMsgErr(TEXTS.NO_DATA_FOUND); }; @@ -178,7 +178,7 @@ const Projects = () => { pageNumber: 1, reload: true })); - if (item.SUNITCODE && item.NYEAR && item.NMONTH) showCostNotesChartDetail({ unitCode: item.SUNITCODE, year: item.NYEAR, month: item.NMONTH }); + if (item.SUNITCODE == "CostNotes" && item.NYEAR && item.NMONTH) showCostNotesChartDetail({ year: item.NYEAR, month: item.NMONTH }); }; //При необходимости обновить данные diff --git a/app/panels/prj_fin/stage_arts.js b/app/panels/prj_fin/stage_arts.js index 37103c3..ca9d06b 100644 --- a/app/panels/prj_fin/stage_arts.js +++ b/app/panels/prj_fin/stage_arts.js @@ -71,7 +71,7 @@ const StageArts = ({ stage, filters }) => { stored: "PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_COST_FACT", args: { NSTAGE: stage, NFPDARTCL: sender.NRN } }); - if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] }); + if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] }); else showMsgErr(TEXTS.NO_DATA_FOUND); }; diff --git a/app/panels/prj_fin/stage_contracts.js b/app/panels/prj_fin/stage_contracts.js index c3395e6..dddc3fb 100644 --- a/app/panels/prj_fin/stage_contracts.js +++ b/app/panels/prj_fin/stage_contracts.js @@ -92,7 +92,7 @@ const StageContracts = ({ stage, filters }) => { stored: "PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN", args: { NPROJECTSTAGEPF: sender.NRN } }); - if (data.NIDENT) pOnlineShowUnit({ unitCode: "PaymentAccountsIn", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] }); + if (data.NIDENT) pOnlineShowUnit({ unitCode: "PaymentAccountsIn", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] }); else showMsgErr(TEXTS.NO_DATA_FOUND); }; @@ -112,7 +112,7 @@ const StageContracts = ({ stage, filters }) => { stored: "PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_ININV", args: { NPROJECTSTAGEPF: sender.NRN } }); - if (data.NIDENT) pOnlineShowUnit({ unitCode: "IncomingInvoices", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] }); + if (data.NIDENT) pOnlineShowUnit({ unitCode: "IncomingInvoices", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] }); else showMsgErr(TEXTS.NO_DATA_FOUND); }; diff --git a/app/panels/prj_fin/stages.js b/app/panels/prj_fin/stages.js index 32b836e..9fec2da 100644 --- a/app/panels/prj_fin/stages.js +++ b/app/panels/prj_fin/stages.js @@ -106,7 +106,7 @@ const Stages = ({ project, projectName, filters }) => { stored: "PKG_P8PANELS_PROJECTS.STAGES_SELECT_COST_FACT", args: { NRN: sender.NRN } }); - if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] }); + if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] }); else showMsgErr(TEXTS.NO_DATA_FOUND); }; @@ -116,8 +116,7 @@ const Stages = ({ project, projectName, filters }) => { stored: "PKG_P8PANELS_PROJECTS.STAGES_SELECT_SUMM_REALIZ", args: { NRN: sender.NRN } }); - if (data.NIDENT) - pOnlineShowUnit({ unitCode: "GoodsTransInvoicesToConsumers", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] }); + if (data.NIDENT) pOnlineShowUnit({ unitCode: "GoodsTransInvoicesToConsumers", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] }); else showMsgErr(TEXTS.NO_DATA_FOUND); }; -- 2.34.1 From 97b8cfbf78c41a46792491257c4d11377c9a38df Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Wed, 24 Apr 2024 13:04:41 +0300 Subject: [PATCH 16/17] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 1c111c6..14876b9 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -3656,7 +3656,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projects: () => (/* binding */ Projects)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\n/* harmony import */ var _stages__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stages */ \"./app/panels/prj_fin/stages.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Список проктов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Полноэкранный диалог\n //График\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n //Список этапов проекта\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CHART: {\n maxHeight: \"300px\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n CHART_PAPER: {\n height: \"100%\"\n },\n CHART_FAB: {\n position: \"absolute\",\n top: 80,\n left: 16\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список проектов\nconst Projects = () => {\n //Собственное состояние\n const [projectsDataGrid, setProjectsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedProject: null,\n stagesFilters: []\n });\n\n //Состояния графиков\n const [showCharts, setShowCharts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [problemsChart, setProblemsChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [customersChart, setCustomersChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [costNotesChart, setCostNotesChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_6__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_7__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_8__[\"MessagingСtx\"]);\n\n //Загрузка данных проектов с сервера\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (projectsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.LIST\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: projectsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: projectsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setProjectsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [projectsDataGrid.reload, projectsDataGrid.filters, projectsDataGrid.orders, projectsDataGrid.dataLoaded, projectsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Получение данных графиков\n const loadChartData = async () => {\n const problemsChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_PROBLEMS\",\n respArg: \"COUT\"\n });\n setProblemsChart(pv => ({\n ...pv,\n loaded: true,\n ...problemsChart.XCHART\n }));\n const customersChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_CUSTOMERS\",\n respArg: \"COUT\"\n });\n setCustomersChart(pv => ({\n ...pv,\n loaded: true,\n ...customersChart.XCHART\n }));\n const costNotesChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES\",\n respArg: \"COUT\"\n });\n setCostNotesChart(pv => ({\n ...pv,\n loaded: true,\n ...costNotesChart.XCHART\n }));\n };\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение детализации точки графика затрат\n const showCostNotesChartDetail = async ({\n unitCode,\n year,\n month\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES_SELECT_COST\",\n args: {\n NYEAR: year,\n NMONTH: month\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode,\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение этапов проекта\n const showStages = ({\n sender,\n filters = []\n } = {}) => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: {\n ...sender\n },\n stagesFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setProjectsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка этапов проекта\n const handleStagesClose = () => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: null,\n stagesFilters: []\n }));\n\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n if (item.SFILTER && item.SFILTER_VALUE) setProjectsDataGrid(pv => ({\n ...pv,\n filters: [{\n name: item.SFILTER,\n from: item.SFILTER_VALUE\n }],\n pageNumber: 1,\n reload: true\n }));\n if (item.SUNITCODE && item.NYEAR && item.NMONTH) showCostNotesChartDetail({\n unitCode: item.SUNITCODE,\n year: item.NYEAR,\n month: item.NMONTH\n });\n };\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadProjects();\n }, [projectsDataGrid.reload, loadProjects]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadChartData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n container: true,\n spacing: 1\n }, showCharts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, problemsChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, problemsChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, customersChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, customersChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, costNotesChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 12\n }, projectsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_9__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: projectsDataGrid.columnsDef,\n rows: projectsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n filtersInitial: projectsDataGrid.filters,\n morePages: projectsDataGrid.morePages,\n reloading: projectsDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_10__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n showStages\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n pOnlineShowDocument,\n showPayNotes,\n showStages\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, projectsDataGrid.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Этапы проекта \"${projectsDataGrid.selectedProject.SNAME_USL}\"`,\n onClose: handleStagesClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stages__WEBPACK_IMPORTED_MODULE_11__.Stages, {\n project: projectsDataGrid.selectedProject.NRN,\n projectName: projectsDataGrid.selectedProject.SNAME_USL,\n filters: projectsDataGrid.stagesFilters\n })) : null)), problemsChart.loaded || customersChart.loaded || costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n size: \"small\",\n color: \"secondary\",\n sx: STYLES.CHART_FAB,\n onClick: () => setShowCharts(!showCharts)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, showCharts ? \"expand_less\" : \"expand_more\")) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/projects.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projects: () => (/* binding */ Projects)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\n/* harmony import */ var _stages__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stages */ \"./app/panels/prj_fin/stages.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Список проктов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Полноэкранный диалог\n //График\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n //Список этапов проекта\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CHART: {\n maxHeight: \"300px\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n CHART_PAPER: {\n height: \"100%\"\n },\n CHART_FAB: {\n position: \"absolute\",\n top: 80,\n left: 16\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список проектов\nconst Projects = () => {\n //Собственное состояние\n const [projectsDataGrid, setProjectsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedProject: null,\n stagesFilters: []\n });\n\n //Состояния графиков\n const [showCharts, setShowCharts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [problemsChart, setProblemsChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [customersChart, setCustomersChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [costNotesChart, setCostNotesChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_6__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_7__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_8__[\"MessagingСtx\"]);\n\n //Загрузка данных проектов с сервера\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (projectsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.LIST\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: projectsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: projectsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setProjectsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [projectsDataGrid.reload, projectsDataGrid.filters, projectsDataGrid.orders, projectsDataGrid.dataLoaded, projectsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Получение данных графиков\n const loadChartData = async () => {\n const problemsChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_PROBLEMS\",\n respArg: \"COUT\"\n });\n setProblemsChart(pv => ({\n ...pv,\n loaded: true,\n ...problemsChart.XCHART\n }));\n const customersChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_CUSTOMERS\",\n respArg: \"COUT\"\n });\n setCustomersChart(pv => ({\n ...pv,\n loaded: true,\n ...customersChart.XCHART\n }));\n const costNotesChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES\",\n respArg: \"COUT\"\n });\n setCostNotesChart(pv => ({\n ...pv,\n loaded: true,\n ...costNotesChart.XCHART\n }));\n };\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение детализации точки графика затрат\n const showCostNotesChartDetail = async ({\n year,\n month\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES_SELECT_COST\",\n args: {\n NYEAR: year,\n NMONTH: month\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение этапов проекта\n const showStages = ({\n sender,\n filters = []\n } = {}) => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: {\n ...sender\n },\n stagesFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setProjectsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка этапов проекта\n const handleStagesClose = () => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: null,\n stagesFilters: []\n }));\n\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n if (item.SFILTER && item.SFILTER_VALUE) setProjectsDataGrid(pv => ({\n ...pv,\n filters: [{\n name: item.SFILTER,\n from: item.SFILTER_VALUE\n }],\n pageNumber: 1,\n reload: true\n }));\n if (item.SUNITCODE == \"CostNotes\" && item.NYEAR && item.NMONTH) showCostNotesChartDetail({\n year: item.NYEAR,\n month: item.NMONTH\n });\n };\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadProjects();\n }, [projectsDataGrid.reload, loadProjects]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadChartData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n container: true,\n spacing: 1\n }, showCharts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, problemsChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, problemsChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, customersChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, customersChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, costNotesChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 12\n }, projectsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_9__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: projectsDataGrid.columnsDef,\n rows: projectsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n filtersInitial: projectsDataGrid.filters,\n morePages: projectsDataGrid.morePages,\n reloading: projectsDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_10__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n showStages\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n pOnlineShowDocument,\n showPayNotes,\n showStages\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, projectsDataGrid.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Этапы проекта \"${projectsDataGrid.selectedProject.SNAME_USL}\"`,\n onClose: handleStagesClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stages__WEBPACK_IMPORTED_MODULE_11__.Stages, {\n project: projectsDataGrid.selectedProject.NRN,\n projectName: projectsDataGrid.selectedProject.SNAME_USL,\n filters: projectsDataGrid.stagesFilters\n })) : null)), problemsChart.loaded || customersChart.loaded || costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n size: \"small\",\n color: \"secondary\",\n sx: STYLES.CHART_FAB,\n onClick: () => setShowCharts(!showCharts)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, showCharts ? \"expand_less\" : \"expand_more\")) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/projects.js?"); /***/ }), @@ -3667,7 +3667,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageArts: () => (/* binding */ StageArts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Калькуляция этапа проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Калькуляция этапа проекта\nconst StageArts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageArtsDataGrid, setStageArtsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n rows: [],\n reload: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных калькуляции этапа с сервера\n const loadStageArts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageArtsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageArtsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NINCLUDE_DEF: stageArtsDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStageArtsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [stage, stageArtsDataGrid.reload, stageArtsDataGrid.filters, stageArtsDataGrid.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала затрат по статье калькуляции\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_COST_FACT\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение договоров по статье калькуляции\n const showContracts = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_CONTR\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"Contracts\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageArtsDataGrid(pv => ({\n ...pv,\n filters,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageArts();\n }, [stageArtsDataGrid.reload, loadStageArts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageArtsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageArtsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageArtsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: false,\n reloading: stageArtsDataGrid.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_ARTS,\n showCostNotes,\n showContracts\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onFilterChanged: handleFilterChanged\n })) : null);\n};\n\n//Контроль свойств - Калькуляция этапа проекта\nStageArts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_arts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageArts: () => (/* binding */ StageArts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Калькуляция этапа проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Калькуляция этапа проекта\nconst StageArts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageArtsDataGrid, setStageArtsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n rows: [],\n reload: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных калькуляции этапа с сервера\n const loadStageArts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageArtsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageArtsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NINCLUDE_DEF: stageArtsDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStageArtsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [stage, stageArtsDataGrid.reload, stageArtsDataGrid.filters, stageArtsDataGrid.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала затрат по статье калькуляции\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_COST_FACT\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение договоров по статье калькуляции\n const showContracts = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_CONTR\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"Contracts\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageArtsDataGrid(pv => ({\n ...pv,\n filters,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageArts();\n }, [stageArtsDataGrid.reload, loadStageArts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageArtsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageArtsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageArtsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: false,\n reloading: stageArtsDataGrid.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_ARTS,\n showCostNotes,\n showContracts\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onFilterChanged: handleFilterChanged\n })) : null);\n};\n\n//Контроль свойств - Калькуляция этапа проекта\nStageArts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_arts.js?"); /***/ }), @@ -3678,7 +3678,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageContracts: () => (/* binding */ StageContracts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Договоры с соисполнителями этапа проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Договоры с соисполнителями этапа проекта\nconst StageContracts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageContractsDataGrid, setStageContractsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStageContracts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageContractsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stageContractsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stageContractsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setStageContractsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [stage, stageContractsDataGrid.reload, stageContractsDataGrid.filters, stageContractsDataGrid.orders, stageContractsDataGrid.dataLoaded, stageContractsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение выходящих счетов на оплату от соисполнителя этапа\n const showPaymentAccountsIn = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PaymentAccountsIn\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение фактических платежей соисполнителю этапа\n const showPayNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_FIN_OUT\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение приходных накладных от соисполнителя этапа\n const showIncomingInvoices = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_ININV\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"IncomingInvoices\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStageContractsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageContracts();\n }, [stageContractsDataGrid.reload, loadStageContracts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageContractsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageContractsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageContractsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stageContractsDataGrid.morePages,\n reloading: stageContractsDataGrid.reload,\n expandable: true,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument,\n showPaymentAccountsIn,\n showPayNotes,\n showIncomingInvoices\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null);\n};\n\n//Контроль свойств - Договоры с соисполнителями этапа проекта\nStageContracts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_contracts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageContracts: () => (/* binding */ StageContracts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Договоры с соисполнителями этапа проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Договоры с соисполнителями этапа проекта\nconst StageContracts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageContractsDataGrid, setStageContractsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStageContracts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageContractsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stageContractsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stageContractsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setStageContractsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [stage, stageContractsDataGrid.reload, stageContractsDataGrid.filters, stageContractsDataGrid.orders, stageContractsDataGrid.dataLoaded, stageContractsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение выходящих счетов на оплату от соисполнителя этапа\n const showPaymentAccountsIn = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PaymentAccountsIn\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение фактических платежей соисполнителю этапа\n const showPayNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_FIN_OUT\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение приходных накладных от соисполнителя этапа\n const showIncomingInvoices = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_ININV\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"IncomingInvoices\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStageContractsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageContracts();\n }, [stageContractsDataGrid.reload, loadStageContracts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageContractsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageContractsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageContractsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stageContractsDataGrid.morePages,\n reloading: stageContractsDataGrid.reload,\n expandable: true,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument,\n showPaymentAccountsIn,\n showPayNotes,\n showIncomingInvoices\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null);\n};\n\n//Контроль свойств - Договоры с соисполнителями этапа проекта\nStageContracts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_contracts.js?"); /***/ }), @@ -3689,7 +3689,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Stages: () => (/* binding */ Stages)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _stage_arts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stage_arts */ \"./app/panels/prj_fin/stage_arts.js\");\n/* harmony import */ var _stage_contracts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stage_contracts */ \"./app/panels/prj_fin/stage_contracts.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Список этапов проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Полноэкранный диалог\n //Калькуляция этапа проекта\n //Договоры с соисполнителями этапа проекта\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список этапов проекта\nconst Stages = ({\n project,\n projectName,\n filters\n}) => {\n //Собственное состояние\n const [stagesDataGrid, setStagesDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedStageNumb: null,\n showStageArts: null,\n stageArtsFilters: [],\n showStageContracts: null,\n stageContractsFilters: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_7__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_8__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_9__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStages = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stagesDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_LIST\",\n args: {\n NPRN: project,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stagesDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stagesDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStagesDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [project, stagesDataGrid.reload, stagesDataGrid.filters, stagesDataGrid.orders, stagesDataGrid.dataLoaded, stagesDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение журнала затрат по этапу проекта\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_COST_FACT\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение расходных накладных на отпуск потребителям по этапу проекта\n const showGoodsTransInvoicesToConsumers = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_SUMM_REALIZ\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"GoodsTransInvoicesToConsumers\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение статей калькуляции по этапу проекта\n const showStageArts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageArtsFilters: [...filters]\n }));\n\n //Отображение договоров с соисполнителями по этапу проекта\n const showContracts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageContractsFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStagesDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStagesDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStagesDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка договоров этапа\n const handleStageContractsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: null,\n stageContractsFilters: []\n }));\n\n //При закрытии калькуляции этапа\n const handleStageArtsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: null,\n stageArtsFilters: []\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStages();\n }, [stagesDataGrid.reload, loadStages]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n pt: 2\n }, stagesDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_10__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stagesDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stagesDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stagesDataGrid.morePages,\n reloading: stagesDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_11__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n showStageArts,\n showContracts\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n pOnlineShowDocument,\n showStageArts,\n showContracts,\n showPayNotes,\n showCostNotes,\n showGoodsTransInvoicesToConsumers\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, stagesDataGrid.showStageContracts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Договоры этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageContractsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_contracts__WEBPACK_IMPORTED_MODULE_6__.StageContracts, {\n stage: stagesDataGrid.showStageContracts,\n filters: stagesDataGrid.stageContractsFilters\n })) : null, stagesDataGrid.showStageArts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Калькуляция этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageArtsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_arts__WEBPACK_IMPORTED_MODULE_5__.StageArts, {\n stage: stagesDataGrid.showStageArts,\n filters: stagesDataGrid.stageArtsFilters\n })) : null);\n};\n\n//Контроль свойств - Список этапов проекта\nStages.propTypes = {\n project: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n projectName: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_13___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stages.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Stages: () => (/* binding */ Stages)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _stage_arts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stage_arts */ \"./app/panels/prj_fin/stage_arts.js\");\n/* harmony import */ var _stage_contracts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stage_contracts */ \"./app/panels/prj_fin/stage_contracts.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Список этапов проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Полноэкранный диалог\n //Калькуляция этапа проекта\n //Договоры с соисполнителями этапа проекта\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список этапов проекта\nconst Stages = ({\n project,\n projectName,\n filters\n}) => {\n //Собственное состояние\n const [stagesDataGrid, setStagesDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedStageNumb: null,\n showStageArts: null,\n stageArtsFilters: [],\n showStageContracts: null,\n stageContractsFilters: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_7__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_8__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_9__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStages = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stagesDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_LIST\",\n args: {\n NPRN: project,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stagesDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stagesDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStagesDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [project, stagesDataGrid.reload, stagesDataGrid.filters, stagesDataGrid.orders, stagesDataGrid.dataLoaded, stagesDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение журнала затрат по этапу проекта\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_COST_FACT\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение расходных накладных на отпуск потребителям по этапу проекта\n const showGoodsTransInvoicesToConsumers = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_SUMM_REALIZ\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"GoodsTransInvoicesToConsumers\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение статей калькуляции по этапу проекта\n const showStageArts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageArtsFilters: [...filters]\n }));\n\n //Отображение договоров с соисполнителями по этапу проекта\n const showContracts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageContractsFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStagesDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStagesDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStagesDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка договоров этапа\n const handleStageContractsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: null,\n stageContractsFilters: []\n }));\n\n //При закрытии калькуляции этапа\n const handleStageArtsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: null,\n stageArtsFilters: []\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStages();\n }, [stagesDataGrid.reload, loadStages]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n pt: 2\n }, stagesDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_10__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stagesDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stagesDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stagesDataGrid.morePages,\n reloading: stagesDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_11__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n showStageArts,\n showContracts\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n pOnlineShowDocument,\n showStageArts,\n showContracts,\n showPayNotes,\n showCostNotes,\n showGoodsTransInvoicesToConsumers\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, stagesDataGrid.showStageContracts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Договоры этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageContractsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_contracts__WEBPACK_IMPORTED_MODULE_6__.StageContracts, {\n stage: stagesDataGrid.showStageContracts,\n filters: stagesDataGrid.stageContractsFilters\n })) : null, stagesDataGrid.showStageArts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Калькуляция этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageArtsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_arts__WEBPACK_IMPORTED_MODULE_5__.StageArts, {\n stage: stagesDataGrid.showStageArts,\n filters: stagesDataGrid.stageArtsFilters\n })) : null);\n};\n\n//Контроль свойств - Список этапов проекта\nStages.propTypes = {\n project: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n projectName: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_13___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stages.js?"); /***/ }), -- 2.34.1 From 06f0b35f926641e9943d619027c6123919b38d29 Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Wed, 24 Apr 2024 14:16:03 +0300 Subject: [PATCH 17/17] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-832?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/eqs_prfrm/eqs_prfrm.js | 26 +--- app/panels/eqs_prfrm/layouts.js | 78 +++------- db/PKG_P8PANELS_EQUIPSRV.pck | 247 +++++++++++++++++------------- 3 files changed, 164 insertions(+), 187 deletions(-) diff --git a/app/panels/eqs_prfrm/eqs_prfrm.js b/app/panels/eqs_prfrm/eqs_prfrm.js index 8cdfcc7..debbcaf 100644 --- a/app/panels/eqs_prfrm/eqs_prfrm.js +++ b/app/panels/eqs_prfrm/eqs_prfrm.js @@ -54,18 +54,6 @@ const EqsPrfrm = () => { // Состояние информации о трудоёмкости const [info, setInfo] = useState({ cntP: 0, sumP: 0, cntF: 0, sumF: 0 }); - // Состояние фильтра (для отладки) - // const [filter, setFilter] = useState({ - // belong: "Демопример", - // prodObj: "Карьер", - // techServ: "", - // respDep: "", - // fromMonth: 1, - // fromYear: 2024, - // toMonth: 12, - // toYear: 2024 - // }); - // Состояние фильтра const [filter, setFilter] = useState({ belong: "", @@ -79,7 +67,7 @@ const EqsPrfrm = () => { }); // Состояние открытия фильтра const [filterOpen, setFilterOpen] = useState(true); - // Состояние данных по умолчанию для фильтра (true - для отладки) + // Состояние данных по умолчанию для фильтра const [defaultLoaded, setDefaultLoaded] = useState(false); // Состояние хранения копии фильтра const [filterCopy, setFilterCopy] = useState({ ...filter }); @@ -177,19 +165,10 @@ const EqsPrfrm = () => { respArg: "COUT" }); - setFilter(pv => ({ ...pv, belong: data.JURPERS, fromMonth: data.MONTH, fromYear: data.YEAR, toMonth: data.MONTH, toYear: data.YEAR })); + setFilter(pv => ({ ...pv, belong: data.JURPERS, fromMonth: 1, fromYear: data.YEAR, toMonth: 12, toYear: data.YEAR })); setDefaultLoaded(true); }, [executeStored]); - //пользовательский параметр JuridicalPerson системы - // const getJurPers = useCallback(async () => { - // const data = await executeStored({ - // stored: "PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM", - // respArg: "CRES" - // }); - // setFilter(pv => ({ ...pv, belong: data })); - // }, [executeStored]); - // Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты const showEquipSrv = async ({ date, workType, info }) => { const [techName, servKind] = info.split("_"); @@ -279,7 +258,6 @@ const EqsPrfrm = () => { if (!refIsDeprecated) { if (activeRef) { var cellRect = activeRef.getBoundingClientRect(); - //console.log(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2); window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0); setRidFlag(true); } diff --git a/app/panels/eqs_prfrm/layouts.js b/app/panels/eqs_prfrm/layouts.js index 00efdac..ac7d2ee 100644 --- a/app/panels/eqs_prfrm/layouts.js +++ b/app/panels/eqs_prfrm/layouts.js @@ -54,53 +54,13 @@ export const headCellRender = ({ columnDef }, hClick, podr, cntP, sumP, cntF, su stackStyle = { flexDirection: "column" }; } - if (columnDef.name == "STEST") cellStyle = { display: "none" }; - if (columnDef.name == "SINFO" || columnDef.name == "SINFO2") { + if (columnDef.name == "SOBJINFO") cellStyle = { display: "none" }; + if (columnDef.name == "SINFO" || columnDef.name == "SWRKTYPE") { cellProps = { colSpan: 2 }; if (columnDef.name == "SINFO") cellProps = { ...cellProps, rowSpan: 2 }; - //if (columnDef.name == "SINFO") { - //cellStyle = { display: "none" }; - // cellStyle = { ...cellStyle, padding: "unset" }; - // data = ( - // - // - // - // Подразделение: - // - // - // {podr} - // - // - // Кол-во ремонтов, план: - // - // - // {cntP} - // - // - // Трудоемкость, час. план: - // - // - // {sumP} - // - // - // Кол-во ремонтов, факт: - // - // - // {cntF} - // - // - // Трудоемкость, час. факт: - // - // - // {sumF} - // - // - // - // ); - //} } - if (columnDef.name == "SINFO2") cellStyle = { display: "none" }; + if (columnDef.name == "SWRKTYPE") cellStyle = { display: "none" }; if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) { cellStyle = { ...cellStyle, padding: "5px", minWidth: "25px", maxWidth: "25px" }; @@ -119,16 +79,16 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => { let cellProps = {}; let data = " "; - if (row["SINFO2"] == undefined) { - if (columnDef.name == "STEST") { + if (row["SWRKTYPE"] == undefined) { + if (columnDef.name == "SOBJINFO") { cellProps = { colSpan: 2 }; cellStyle = { ...cellStyle, textAlign: "right", fontWeight: "bold" }; } - if (columnDef.name == "SINFO2") cellStyle = { display: "none" }; + if (columnDef.name == "SWRKTYPE") cellStyle = { display: "none" }; if (columnDef.parent == "" && columnDef.expandable == true && columnDef.expanded == false) { curParent = columnDef.name; return { cellStyle: { ...cellStyle, height: "25px" }, data }; - } else if (columnDef.name != "SINFO2" && columnDef.parent != "" && columnDef.expandable == false && columnDef.expanded == true) { + } else if (columnDef.name != "SWRKTYPE" && columnDef.parent != "" && columnDef.expandable == false && columnDef.expanded == true) { if (columnDef.name.endsWith("_1")) { curParent = columnDef.parent; const [year, month] = curParent.substring(1).split("_"); @@ -141,39 +101,39 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => { } } } - if (columnDef.name == "STEST" && row["SINFO2"] == "План") { + if (columnDef.name == "SOBJINFO" && row["SWRKTYPE"] == "План") { cellStyle = { ...cellStyle }; cellProps = { rowSpan: 2 }; } - if (columnDef.name == "STEST" && row["SINFO2"] == "Факт") { + if (columnDef.name == "SOBJINFO" && row["SWRKTYPE"] == "Факт") { cellStyle = { display: "none" }; } switch (row[columnDef.name]) { case "blue": - cellStyle = { ...cellStyle, backgroundColor: "lightblue", border: "1px solid rgba(0, 0, 0) !important" }; + cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "lightblue", border: "1px solid rgba(0, 0, 0) !important" }; cellProps = { title: formatDate(columnDef.name), onClick: () => { - showEquipSrv({ date: columnDef.name, workType: row["SINFO2"], info: row["groupName"] }); + showEquipSrv({ date: columnDef.name, workType: row["SWRKTYPE"], info: row["groupName"] }); } }; return { cellStyle, cellProps, data }; case "green": - cellStyle = { ...cellStyle, backgroundColor: "green", border: "1px solid rgba(0, 0, 0) !important" }; + cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "green", border: "1px solid rgba(0, 0, 0) !important" }; cellProps = { title: formatDate(columnDef.name), onClick: () => { - showEquipSrv({ date: columnDef.name, workType: row["SINFO2"], info: row["groupName"] }); + showEquipSrv({ date: columnDef.name, workType: row["SWRKTYPE"], info: row["groupName"] }); } }; return { cellStyle, cellProps, data }; case "red": - cellStyle = { ...cellStyle, backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0) !important" }; + cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0) !important" }; cellProps = { title: formatDate(columnDef.name), onClick: () => { - showEquipSrv({ date: columnDef.name, workType: row["SINFO2"], info: row["groupName"] }); + showEquipSrv({ date: columnDef.name, workType: row["SWRKTYPE"], info: row["groupName"] }); } }; return { cellStyle, cellProps, data }; @@ -187,16 +147,16 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => { showEquipSrv({ date: columnDef.name, workType: row["SINFO2"], info: row["groupName"] })} + sx={{ cursor: "pointer", backgroundColor: "green" }} + onClick={() => showEquipSrv({ date: columnDef.name, workType: row["SWRKTYPE"], info: row["groupName"] })} >

g

showEquipSrv({ date: columnDef.name, workType: row["SINFO2"], info: row["groupName"] })} + sx={{ cursor: "pointer", backgroundColor: "crimson" }} + onClick={() => showEquipSrv({ date: columnDef.name, workType: row["SWRKTYPE"], info: row["groupName"] })} >

r

diff --git a/db/PKG_P8PANELS_EQUIPSRV.pck b/db/PKG_P8PANELS_EQUIPSRV.pck index 7593cb7..3deb778 100644 --- a/db/PKG_P8PANELS_EQUIPSRV.pck +++ b/db/PKG_P8PANELS_EQUIPSRV.pck @@ -5,13 +5,13 @@ create or replace package PKG_P8PANELS_EQUIPSRV as ( COUT out clob -- XML с параметрами фильтра по умолчанию ); - + /* Формирование строки с кол-вом часов */ function HOURS_STR ( NHOURS in number -- Кол-во часов ) return varchar2; -- Результат работы - + /* Отбор документов (ТОиР или Графики ремонтов) по дате */ procedure SELECT_EQUIPSRV ( @@ -27,7 +27,7 @@ create or replace package PKG_P8PANELS_EQUIPSRV as NWORKTYPE in number, -- Тип работы (0 - план, 1 - факт) NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ); - + /* Выполнение работ по ТОиР */ procedure EQUIPSRV_GRID ( @@ -54,10 +54,9 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации SJUR_PERS PKG_STD.TSTRING := null; -- Юр. лицо (наименование) - NJUR_PERS PKG_STD.TREF := null; -- Юр. лицо (идентификатор) begin /* Находим юр. лицо */ - FIND_JURPERSONS_MAIN(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SJUR_PERS => SJUR_PERS, NJUR_PERS => NJUR_PERS); + SJUR_PERS := GET_OPTIONS_STR(SCODE => 'JuridicalPerson', NCOMP_VERS => NCOMPANY); /* Формируем XML */ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); PKG_XFAST.DOWN_NODE(SNAME => 'DATA'); @@ -75,7 +74,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as COUT := PKG_XFAST.SERIALIZE_TO_CLOB(); PKG_XFAST.EPILOGUE(); end GET_DEFAULT_FP; - + /* Формирование строки с кол-вом часов */ function HOURS_STR ( @@ -84,17 +83,18 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as is SRESULT PKG_STD.TSTRING; -- Строка результат begin - if ((mod(NHOURS, 10) = 1) and (mod(NHOURS, 100) != 11)) then + if ((mod(TRUNC(NHOURS), 10) = 1) and (mod(TRUNC(NHOURS), 100) != 11)) then SRESULT := NHOURS || ' час'; - elsif (((mod(NHOURS, 10) = 2) and (mod(NHOURS, 100) != 12)) or ((mod(NHOURS, 10) = 3) and (mod(NHOURS, 100) != 13)) or - ((mod(NHOURS, 10) = 4) and (mod(NHOURS, 100) != 14))) then + elsif (((mod(TRUNC(NHOURS), 10) = 2) and (mod(TRUNC(NHOURS), 100) != 12)) or + ((mod(TRUNC(NHOURS), 10) = 3) and (mod(TRUNC(NHOURS), 100) != 13)) or + ((mod(TRUNC(NHOURS), 10) = 4) and (mod(TRUNC(NHOURS), 100) != 14))) then SRESULT := NHOURS || ' часа'; else SRESULT := NHOURS || ' часов'; end if; return SRESULT; end HOURS_STR; - + /* Отбор документов (ТОиР или Графики ремонтов) по дате */ procedure SELECT_EQUIPSRV ( @@ -113,7 +113,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных - SDATE PKG_STD.TSTRING; -- Строка даты + SDATE PKG_STD.TSTRING; -- Строка даты begin /* Проверка на дату с днём */ if (NDAY is not null) then @@ -138,17 +138,19 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as and J.CODE = SBELONG and T.EQCONFIG = C1.RN and C1.CODE = SPRODOBJ - and T.DEPTTCSRV = DS.RN + and T.DEPTTCSRV = DS.RN(+) and (DS.CODE = STECHSERV or STECHSERV is null) - and T.DEPTRESP = DR.RN + and T.DEPTRESP = DR.RN(+) and (DR.CODE = SRESPDEP or SRESPDEP is null) and T.EQCONFIG_TECH = C2.RN and C2.NAME = STECHNAME and T.EQTECSRVKIND = SK.RN and SK.CODE = SSRVKIND and ((NDAY is not null and TO_DATE(SDATE, 'dd.mm.yyyy') between TRUNC(T.DATEPRD_BEG) and - TRUNC(T.DATEPRD_END)) or (NDAY is null and (SDATE = TO_CHAR(T.DATEPRD_BEG, 'mm.yyyy') or - SDATE = TO_CHAR(T.DATEPRD_END, 'mm.yyyy'))))) + TRUNC(T.DATEPRD_END)) or + (NDAY is null and TRUNC(T.DATEPRD_BEG, 'MONTH') <= TRUNC(TO_DATE(SDATE, 'mm.yyyy'), 'MONTH') and + TRUNC(TO_DATE(SDATE, 'mm.yyyy'), 'MONTH') <= TRUNC(LAST_DAY(T.DATEPRD_END))))) + loop /* Сформируем идентификатор буфера */ if (NIDENT is null) then @@ -183,8 +185,9 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as and T.TECSRVKIND = SK.RN and SK.CODE = SSRVKIND and ((NDAY is not null and TO_DATE(SDATE, 'dd.mm.yyyy') between TRUNC(T.DATEFACT_BEG) and - TRUNC(T.DATEFACT_END)) or (NDAY is null and (SDATE = TO_CHAR(T.DATEFACT_BEG, 'mm.yyyy') or - SDATE = TO_CHAR(T.DATEFACT_END, 'mm.yyyy'))))) + TRUNC(T.DATEFACT_END)) or + (NDAY is null and TRUNC(T.DATEFACT_BEG, 'MONTH') <= TRUNC(TO_DATE(SDATE, 'mm.yyyy'), 'MONTH') and + TRUNC(TO_DATE(SDATE, 'mm.yyyy'), 'MONTH') <= TRUNC(LAST_DAY(T.DATEFACT_END))))) loop /* Сформируем идентификатор буфера */ if (NIDENT is null) then @@ -243,85 +246,107 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as NDAY_FACT PKG_STD.TNUMBER; -- День факт SPERIODNAME PKG_STD.TSTRING; -- Имя периода SFACT_CLR PKG_STD.TSTRING; -- Цвет закрашивания фактических дат - NROWS PKG_STD.TNUMBER := 0; -- Кол-во строк в курсоре - NWORKPERDAY PKG_STD.TNUMBER(17,2) := null; -- Работы в день - SGROUP_FILLED PKG_STD.TLSTRING; -- Группы, заполненные строками план/факт - SCOLS PKG_STD.TLSTRING; -- Заполнение периодов работ + NROWS PKG_STD.TNUMBER := 0; -- Кол-во строк в курсоре + NWORKPERDAY PKG_STD.TNUMBER(17,2) := null; -- Работы в день YM PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для подсчёта работ за месяц MCLR PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для закрашивания месяцев CR PKG_STD.TSTRING; -- Текущий ключ коллекции MCLR - + GF PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция заполнения групп по объекту ремонта + COLS PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция закрашивания колонок + /* Курсор с работами ТОиР */ cursor C1 is - select TT.NEQV_RN, - TT.NEQS_RN, + select TT.NEQV_RN NEQV_RN, + TT.NEQS_RN NEQS_RN, TT.NWRK_RN NRN, - TT.COMPANY NCOMPANY, - TT.NAME_WORK SWORKNAME, + TT.NCOMPANY NCOMPANY, + TT.SNAME_WORK SWORKNAME, EC2.CODE STECHOBJCODE, EC2.NAME STECHOBJNAME, JP.CODE SBELONG, EC1.CODE SPRODOBJ, DS.CODE STECHSERV, DR.CODE SRESPDEP, - TT.DATEPRD_BEG DDATEPLANBEG, - TT.DATEPRD_END DDATEPLANEND, + TT.DDATEPRD_BEG DDATEPLANBEG, + TT.DDATEPRD_END DDATEPLANEND, EQJ.DATEFACT_BEG DDATEFACTBEG, - EQJ.DATEFACT_END DDATEFACTEND, + COALESCE(EQJ.DATEFACT_END, EQJ.DATEFACT_BEG) DDATEFACTEND, -- EK.CODE STECSRVKINDCODE, EK.NAME STECSRVKINDNAME, - COALESCE(EW.NSUM, (TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN, + COALESCE(EW.NSUM, (TT.DDATEPRD_END - TT.DDATEPRD_BEG) * 24) NSUMWORKPLAN, COALESCE(EWJ.NSUMF, (EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT - from (select B.*, - C.RN NWRK_RN, - C.PRN NWRK_PRN, - C.NAME_WORK, - C.DATEPLAN_BEG, - C.DATEPLAN_END, - C.TECSRVKIND, - C.EQCONFIG, - C.DEPTPERF, - C.DEPTTCSRV, - C.RESP_AGN - from (select EQV.RN NEQV_RN, - EQV.COMPANY, - EQV.JUR_PERS, - EQV.STATE, - EQV.DATEPRD_BEG, - EQV.DATEPRD_END, - EQS.RN NEQS_RN + from (select B.NEQV_RN NEQV_RN, + B.NCOMPANY NCOMPANY, + B.NJUR_PERS NJUR_PERS, + B.NSTATE NSTATE, + B.DDATEPRD_BEG DDATEPRD_BEG, + B.DDATEPRD_END DDATEPRD_END, + B.NEQS_RN NEQS_RN, + C.RN NWRK_RN, + C.PRN NWRK_PRN, + C.NAME_WORK SNAME_WORK, + C.DATEPLAN_BEG DDATEPLAN_BEG, + C.DATEPLAN_END DDATEPLAN_END, + COALESCE(C.TECSRVKIND, B.NEQTECSRVKIND) NTECSRVKIND, + COALESCE(C.EQCONFIG, B.NEQCONFIG_TECH) NEQCONFIG, + C.DEPTPERF NDEPTPERF, + C.DEPTTCSRV NDEPTTCSRV, + C.RESP_AGN NRESP_AGN + from (select EQV.RN NEQV_RN, + EQV.COMPANY NCOMPANY, + EQV.JUR_PERS NJUR_PERS, + EQV.STATE NSTATE, + EQV.DATEPRD_BEG DDATEPRD_BEG, + EQV.DATEPRD_END DDATEPRD_END, + EQV.EQTECSRVKIND NEQTECSRVKIND, + EQV.EQCONFIG_TECH NEQCONFIG_TECH, + EQS.RN NEQS_RN from EQTCHSRV EQV, + JURPERSONS J, DOCLINKS DL, EQRPSHEETS EQS - where EQV.RN = DL.IN_DOCUMENT(+) + where EQV.JUR_PERS = J.RN + and J.CODE = SBELONG + and EQV.RN = DL.IN_DOCUMENT(+) and DL.OUT_UNITCODE(+) = 'EquipRepairSheets' and DL.OUT_DOCUMENT = EQS.RN(+)) B, EQTCHSRWRK C where B.NEQV_RN = C.PRN(+) union all - select B.*, - C.RN NWRK_RN, - C.PRN NWRK_PRN, - C.NAME_WORK, - C.DATEPLAN_BEG, - C.DATEPLAN_END, - C.TECSRVKIND, - C.EQCONFIG, - C.DEPTPERF, - null DEPTTCSRV, - C.RESP_AGN + select B.NEQV_RN NEQV_RN, + B.NCOMPANY NCOMPANY, + B.NJUR_PERS NJUR_PERS, + B.NSTATE NSTATE, + B.DDATEPLAN_BEG DDATEPLAN_BEG, + B.DDATEPLAN_END DDATEPLAN_END, + B.NEQS_RN NEQS_RN, + C.RN NWRK_RN, + C.PRN NWRK_PRN, + C.NAME_WORK SNAME_WORK, + C.DATEPLAN_BEG DDATEPLAN_BEG, + C.DATEPLAN_END DDATEPLAN_END, + COALESCE(C.TECSRVKIND, B.NTECSRVKIND) NTECSRVKIND, + COALESCE(C.EQCONFIG, B.NEQCONFIG) NEQCONFIG, + C.DEPTPERF NDEPTPERF, + null NDEPTTCSRV, + C.RESP_AGN NRESP_AGN from (select null NEQV_RN, - EQS.COMPANY, - EQS.JURPERSONS JUR_PERS, - EQS.STATE, - EQS.DATEPLAN_BEG, - EQS.DATEPLAN_END, - EQS.RN NEQS_RN - from EQRPSHEETS EQS + EQS.COMPANY NCOMPANY, + EQS.JURPERSONS NJUR_PERS, + EQS.STATE NSTATE, + EQS.DATEPLAN_BEG DDATEPLAN_BEG, + EQS.DATEPLAN_END DDATEPLAN_END, + EQS.RN NEQS_RN, + EQS.EQCONFIG NEQCONFIG, + EQS.TECSRVKIND NTECSRVKIND + from EQRPSHEETS EQS, + JURPERSONS J where not exists (select 1 from DOCLINKS DL where DL.OUT_DOCUMENT = EQS.RN - and DL.IN_UNITCODE = 'EquipTechServices')) B, + and DL.IN_UNITCODE = 'EquipTechServices') + and EQS.JURPERSONS = J.RN + and J.CODE = SBELONG) B, EQRPSHWRK C where B.NEQS_RN = C.PRN(+)) TT, EQTECSRVKIND EK, @@ -332,28 +357,28 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as INS_DEPARTMENT DR, DOCLINKS DL, EQTECSRVJRNL EQJ, - (select T.PRN, + (select T.PRN NPRN, sum(T.WORKTIMEPLAN * T.PERFORM_QUANT) NSUM from EQTCHSRWRC T group by T.PRN) EW, - (select T.PRN, + (select T.PRN NPRN, sum(T.WORKTIMEFACT * T.QUANTFACT) NSUMF from EQTCHSRJRNLWRC T group by T.PRN) EWJ - where TT.COMPANY = NCOMPANY - and ((TT.STATE in (1, 2) and NEQV_RN is not null) or (TT.STATE in (0, 2, 3) and NEQV_RN is null)) - and TT.DATEPRD_BEG >= NFROMDATE - and TT.DATEPRD_END <= NTODATE + where TT.NCOMPANY = NCOMPANY + and ((TT.NSTATE in (1, 2) and TT.NEQV_RN is not null) or (TT.NSTATE in (0, 2, 3) and TT.NEQV_RN is null)) + and TT.DDATEPRD_BEG >= NFROMDATE + and TT.DDATEPRD_END <= NTODATE and JP.CODE = SBELONG and EC1.CODE = SPRODOBJ and (DS.CODE = STECHSERV or STECHSERV is null) and (DR.CODE = SRESPDEP or SRESPDEP is null) - and TT.EQCONFIG = EC2.RN(+) - and TT.DEPTPERF = DR.RN(+) - and TT.DEPTTCSRV = DS.RN(+) - and TT.NWRK_RN = EW.PRN(+) - and EQJ.RN = EWJ.PRN(+) - and TT.TECSRVKIND = EK.RN(+) + and TT.NEQCONFIG = EC2.RN(+) + and TT.NDEPTPERF = DR.RN(+) + and TT.NDEPTTCSRV = DS.RN(+) + and TT.NWRK_RN = EW.NPRN(+) + and EQJ.RN = EWJ.NPRN(+) + and TT.NTECSRVKIND = EK.RN(+) and TT.NWRK_RN = DL.IN_DOCUMENT(+) and ((DL.OUT_UNITCODE = 'EquipTechServiceJournal' and DL.RN is not null) or (DL.OUT_UNITCODE is null and DL.RN is null)) @@ -369,16 +394,16 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); /* Формируем структуру заголовка */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'STEST', - SCAPTION => 'ТЕСТ', + SNAME => 'SOBJINFO', + SCAPTION => 'Информация по объекту ремонта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SINFO', SCAPTION => 'Объект ремонта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SINFO2', - SCAPTION => 'Объект ремонта', + SNAME => 'SWRKTYPE', + SCAPTION => 'Тип работ', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SPARENT => 'SINFO'); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, @@ -459,6 +484,8 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as /* Очистка коллекций */ PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM); PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); + PKG_CONTVALLOC1S.PURGE(RCONTAINER => GF); + PKG_CONTVALLOC1S.PURGE(RCONTAINER => COLS); /* Текущий год */ NCURYEAR := EXTRACT(year from sysdate); /* Текущий месяц */ @@ -554,10 +581,12 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => SPERIODNAME, - SVALUE => 'план: ' || - HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || - ' факт: ' || - HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); + SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_P'), + 1)) || ' факт: ' || + HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_F'), + 1))); /* Добавление в коллекцию трудоёмкость план */ PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P', NVALUE => 0); /* Добавление в коллекцию трудоёмкость факт */ @@ -575,12 +604,12 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as SCAPTION => QQ.STECHOBJNAME, BEXPANDABLE => false); RDG_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'SOBJINFO', SVALUE => SCURTECHOBJ); end if; /* Формируем имя группы для вида ремонта */ SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE; /* Если по данной группе еще нет строк плана и факта */ - if (STRIN(SSUBSTR => SCURTSKCODE, SSOURCE => SGROUP_FILLED, SDELIM => ';') = 0) then + if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => GF, SROWID => SCURTSKCODE) = false) then /* Добавляем строку плана */ if (RDG_ROW.RCOLS is not null) then PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); @@ -607,13 +636,13 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as BEXPANDABLE => false); /* Строка плана */ RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STEST', SVALUE => QQ.STECSRVKINDCODE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SINFO2', SVALUE => 'План'); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SOBJINFO', SVALUE => QQ.STECSRVKINDCODE); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SWRKTYPE', SVALUE => 'План'); /* Строка факта */ RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SINFO2', SVALUE => 'Факт'); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SWRKTYPE', SVALUE => 'Факт'); /* Добавляем в заполненные группы */ - SGROUP_FILLED := SGROUP_FILLED || SPRJ_GROUP_NAME || ';'; + PKG_CONTVALLOC1S.PUTS(RCONTAINER => GF, SROWID => SPRJ_GROUP_NAME, SVALUE => ''); end if; /* Плановые работы */ if (QQ.NEQV_RN is not null) then @@ -634,16 +663,22 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as QQ.NSUMWORKPLAN); end if; /* Закрашивание месяца плана синим */ - if (STRIN(SSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SSOURCE => SCOLS, SDELIM => ';') = 0) then + if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') = + false) then PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); - SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; + PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS, + SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', + SVALUE => ''); end if; end if; SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || TO_CHAR(NMONTH_PLAN) || '_' || TO_CHAR(NDAY_PLAN); /* Закрашивание дня плана синим */ - if (STRIN(SSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SSOURCE => SCOLS, SDELIM => ';') = 0) then + if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') = + false) then PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); - SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; + PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS, + SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', + SVALUE => ''); end if; end loop; end if; @@ -739,12 +774,12 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => SPERIODNAME, - SVALUE => 'план: ' || - HOURS_STR(NHOURS => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_P')) || - ' факт: ' || - HOURS_STR(NHOURS => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_F'))); + SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_P'), + 1)) || ' факт: ' || + HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_F'), + 1))); end loop; end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); @@ -768,7 +803,11 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); + /* Очищаем контейнеры */ PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM); + PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); + PKG_CONTVALLOC1S.PURGE(RCONTAINER => GF); + PKG_CONTVALLOC1S.PURGE(RCONTAINER => COLS); end EQUIPSRV_GRID; end PKG_P8PANELS_EQUIPSRV; -- 2.34.1