Показаны сообщения с ярлыком bft. Показать все сообщения
Показаны сообщения с ярлыком bft. Показать все сообщения

четверг, 3 февраля 2022 г.

Проверка работоспособности Сервиса ЭП АЦК

Для проверки работоспособности Сервиса ЭП АЦК версии 1.0.4.3 и выше нужно открыть ссылки:
http://127.0.0.1:50003/cservice?act=GetVersion
https://127.0.0.1:50004/cservice?act=GetVersion
Обе ссылки должны выдавать один и тот же результат, пример:
{"result": "1.0.4.3"}

воскресенье, 9 января 2022 г.

showme_azknums.py

Пример запуска:

showme_azknums.py 2.54.0.500_FB_21003_UFALEI_2022-01-04

Пример результата:

C:\apps\azk\f\2.54.0.500_FB_21003_UFALEI_2022-01-04

АЦК-Финансы: 2.54.0.500

Отчеты АЦК: 2.54.0.80

СОФИТ: 2.54.0.447

Модуль ЕИС: 12.0.0.1

Исходный код скрипта:

# 09.01.2022

# Утилита сообщает версии системной сборки АЦК-Финансы и ее подсистем - отчеты, СОФИТ, ЕИС - в указанной пользователем папке.

# Принцип утилиты строится на том, что в каждой сборке АЦК-Финансы есть определенные jar-файлы (символизирующие системную сборку и ее подсистемы), содержащие определенные properties-файлы, в которых есть переменные "version.major", "version.minor", "version.release", "version.build" с информацией о полном номере версии (патча).

import sys, os, zipfile, webbrowser

# Список проверяемых jar-файлов и properties-файлов:

check_list = [

# АЦК-Финансы:

 {"jar": "server/AzkServer.jar", "properties": "com/bssys/version.properties", "encoding": "windows-1251"}

,{"jar": "server/AzkRepKernel.jar", "properties": "com/bssys/azkserver/reports/repversion.properties", "encoding": "windows-1251"}

,{"jar": "server/AzkSofit.jar", "properties": "com/bssys/azkserver/sofit/sofitversion.properties", "encoding": "windows-1251"}

,{"jar": "server/eis.jar", "properties": "azk/eis/version.properties", "encoding": "windows-1251"}

# АЦК-Госзаказ:

,{"jar": "server/ordersrv.jar", "properties": "com/bssys/version.properties", "encoding": "unicode_escape"}

]

# Папка сборки АЦК, которую пользователь указал в командной строке при запуске утилиты:

azkdir = ''

if len(sys.argv) == 2: azkdir = sys.argv[1]

tmp_env_dir = os.environ['TEMP']

tmpdir = os.path.join(tmp_env_dir, 'showme_nums_temp')

outputfile = os.path.join(tmp_env_dir, 'showme_nums_output.txt')

outputfile_write = open(outputfile,'w')

ss_out = sys.stdout

sys.stdout = outputfile_write

if len(azkdir) > 0 and os.path.isdir(azkdir):

    print(os.path.abspath(azkdir))

    for jarfile in check_list:

        product_name = ''

        version_major = ''

        version_minor = ''

        version_release = ''

        version_build = ''

        # jarpath - полный путь к jar-файлу из check_list:

        jarpath = os.path.join(azkdir, jarfile["jar"])

        if os.path.isfile(jarpath) and zipfile.is_zipfile(jarpath):

            # Извлекаем properties-файлы из jar-файла:

            zipfile.ZipFile(jarpath).extract(jarfile["properties"], path=tmpdir)

            # print(tmpdir + check_list[jarfile])

            tmpjarfile = os.path.join(tmpdir, jarfile["properties"])

            tmpjarfile_read = open(tmpjarfile, mode="r", encoding=jarfile["encoding"])

            for tmpjarfile_line in tmpjarfile_read:

                # Убираем лишний символ переноса в конце строки jar-файла:

                tmpjarfile_line = tmpjarfile_line.replace('\n','')

                # Делим строку по символу "=":

                tmpjarfile_split = tmpjarfile_line.split('=')

                if tmpjarfile_split[0] == 'product.name':

                    product_name = tmpjarfile_split[1]

                if tmpjarfile_split[0] == 'version.major':

                    version_major = tmpjarfile_split[1]

                if tmpjarfile_split[0] == 'version.minor':

                    version_minor = tmpjarfile_split[1]

                if tmpjarfile_split[0] == 'version.release':

                    version_release = tmpjarfile_split[1]

                if tmpjarfile_split[0] == 'version.build':

                    version_build = tmpjarfile_split[1]

        if len(product_name) > 0:

            print(f'{product_name}: {version_major}.{version_minor}.{version_release}.{version_build}')

elif len(azkdir) > 0 and not os.path.isdir(azkdir):

    print(f"Указана несуществующая папка сборки АЦК: {azkdir}")

else:

    print(f"Утилиту \"{os.path.basename(__file__)}\" нужно запускать с указанием папки сборки АЦК, в формате:\n{os.path.basename(__file__)} <папка сборки АЦК>\n\nПример:\n{os.path.basename(__file__)} azkfin2.54.0.500_ORA_21001_AMUR")

outputfile_write.close()

sys.stdout = ss_out

#input("\nНажмите клавишу \"Enter\" для закрытия окна...")

#Открыть файл с результатом в ассоциированном приложении:

webbrowser.open(outputfile)

вторник, 12 октября 2021 г.

Шаблон для доработок

*Описание проблемы:*

*Цель/потребность доработки:*

*Предлагаемое решение Заказчика:*

*Заключение сотрудника БФТ (L2):*

+Предлагаемое решение Сотрудника БФТ (L2) (согласовано с Заказчиком):+

*История обращений:*
[SP-|https://sd.bftcom.com/browse/SP-] → [FIN-|https://jira.bftcom.com/browse/FIN-]

*Контактные данные Заказчика:*

Шаблон для дефектов

*Описание проблемы:*

*Предусловия:*

*Порядок действий:*

*Ожидаемый результат:*

*Фактический результат:*

*БД:*

*Заключение:*

*Обоснование заключения:*

*Временное решение:*

*Информация о критичности:*

четверг, 19 декабря 2019 г.

Обновление QDP под Windows

Устранения непоняточек псто.

Про указание путей в "upd.properties", когда веб-сервер установлен на Windows.

Правильный пример:
#Путь к папке, где находится томкат с приложением
tcHome=c:/azk/a/bin/analysis_stable/tomcat

#URI к репозитарию обновлений. Пока поддерживается только протокол файловой системы
buildRepo.uri=file:///c:/azk/a/bin/analysis_stable/update_dirs

В случаях некорректного формата указывания значений для этих параметров выполнение утилиты обновления ("updater.bat / updater (bash)") прерывается с ошибкой:
ERROR Provider "c" not installed

пятница, 2 августа 2019 г.

JQL: L2, get it!

Фильтры для JSD: 4 вспомогательных и 1 основной для email-уведомлений.

== (вспомогател) Киреевцы ==
filter = 16412
JQL:
«
"Ответственный L2" in (u.belokonenko, a.borzov, e.gorbel, e.zharova, o.dikareva, v.barakovskaya, v.rakityanskiy, e.kireev, D.Aryshtaev, a.kireeva)
».
== (вспомогател) НОВАЯ для L2 ==
filter = 16413
JQL:
«
project = SP
AND "Служебная линия обработки" = L2
AND status = Новая
AND "Ответственный L2" is EMPTY
».
== (вспомогател) ПОЛУЧЕНА ИНФОРМАЦИЯ для L2 от L1 или КЛИЕНТА ==
filter = 16414
JQL:
«
project = SP
AND "Служебная линия обработки" = L2
AND status = "Получена информация"
AND filter = 16412
».
== (вспомогател) ЗАПРОС ИНФОРМАЦИИ от L3 у L2 ==
filter = 16415
JQL:
«
project = SP
AND "Служебная линия обработки" = L2
AND "Линия OLA" = 3
AND status = "Запрос информации внутр"
AND filter = 16412
».
== (email) L2, в работу! (Киреевцы) ==
filter = 15427
JQL:
«
filter in (16413, 16414, 16415)
».

вторник, 14 мая 2019 г.

Про "log_level" для "taskaudit.xml"

Дополнительное описание параметра "log_level" для taskaudit.xml:
- log_level = 1: информация записывается в таблицу "TASKJOURNAL" (АРМ "Журнал действий пользователей");
- log_level = 2: информация записывается в таблицы "TASKJOURNAL" и "ANYDATA" (при чем в "ANYDATA.DATA" записывается полный текст XML-задания), связь между таблицами TASKJOURNAL.ID = ANYDATA.DATA_KEY.

четверг, 28 февраля 2019 г.

Jira: Ошибка "Unexpected server error" в "Rich Filter Controller" при открытии рабочего стола

Описание проблемы:
у некоторых пользователей при открытии рабочего стола Jira видна ошибка "Unexpected server error.", кнопка "Show details" открывает подробности:
REQUEST URL:
/rest/qoti-rich-filters/latest/gadgets/controller/load-quick-filters
REQUEST TYPE:
POST
REQUEST DATA:
{"richFilterId":8,"wantedFilters":"20-26-s25-d168-d105-d107-d111-d110-d123-d125-d126-d127-d128-d121-d167","activeFilters":{"dynamic":{"customfield_26713":["34920"]}}}
STATUS CODE:
500
STACK TRACE:
java.lang.NullPointerException
at java.util.LinkedHashSet.(LinkedHashSet.java:168)
at com.google.common.collect.Maps$7.transformEntry(Maps.java:1812)
at com.google.common.collect.Maps$10.getValue(Maps.java:1857)
at com.google.common.collect.ImmutableMap.copyOf(ImmutableMap.java:292)
...


Причина:
В структуре метаданных задач кто-то изменил поле, идентификатор которого виден в стеке ошибки (выделено красным), в данном случае было изменено наименование поля: было "Продукт (РЕО)" стало "Продукт (РЕО) old".
Увидев приписку "old" я удалил поле из списка "Dynamic Filters" (динамических фильтров) рич-фильтра проблемного рабочего стола.
Но т.к. по этому динам.фильтру у некоторых пользователей была включена фильтрация, то сервер для таких пользователей выдал указанную ошибку.

Как идентифицировать проблемное поле:
Определить поле можно либо, спросив у поддержки, либо использовать его идентификатор в поле для JQL-запросов, обращение к полю указывать в таком виде:
cf[26713] = ...
по выпадающим значениям после знака "=" можно понять, что за поле скрывается под идентификатором 26713.
После идентификации вернул поле в список "Dynamic Filters" рич-фильтра.

Что делать, чтобы избежать повторения:
Пока что решил вместо изменения старого рабочего стола создавать копию и в ее актуализировать, а старую версию удалять спустя какое-то время.

пятница, 15 февраля 2019 г.

JiraSD: поиск подстроки в поле, для которого не работает тильда

Для некоторых полей не поддерживается оператор тильда "~" (CONTAINS), выражается это в появлении сообщения при попытке выполнения JQL:
Оператор '~' не поддерживается 'Бюджет проекта ПУ' полем.
или
The operator '~' is not supported by the 'Бюджет проекта ПУ' field.

Решение:
Пример поиска подстроки "Сопр" (с игнорированием регистра букв) в поле, которое не поддерживает оператор тильда "~" (CONTAINS):
issueFunction in issueFieldMatch("project = FIN AND issuetype in (Доработка) AND statusCategory != Done AND status not in (Сделан) AND \"Бюджет проекта ПУ\" is not null and statusCategory != Done", "Бюджет проекта ПУ", "(?i)Сопр")

Примечание:
возможно, для таких полей можно включить поддержку оператора тильда "~" (CONTAINS) - уверен, выяснится со временем, "сейчас для этого нет ресурса".

четверг, 14 февраля 2019 г.

JiraSD: регулярные выражения

Поставлена такая задача:
отфильтровать записи в JiraSD, у которых в текстовом поле (к которому допустимо применять оператор "~") стоит одно значение "+" из трёх допустимых ("+", "-" или "null" (когда поле не задано)).

Найденное решение:
регулярные выражения и функция, которая позволяет их применять:
issueFieldMatch(subQuery, fieldname, regexp)

где, fieldname = "Зафиксирован срок выдачи".

Но эта функция очень ресурсозатратная, чем меньше количество записей, которое возвращает подзапрос "subQuery", тем быстрее отрабатывает весь JQL-запрос.
issueFunction in issueFieldMatch("project = FIN AND issuetype in (Доработка) AND statusCategory != Done AND status not in (Сделан)", "Зафиксирован срок выдачи", "^\\u002b$")

Самым быстрым вариантом оказался с проверкой наличия поля (is not null):
issueFunction in issueFieldMatch("project = FIN AND issuetype in (Доработка) AND statusCategory != Done AND status not in (Сделан) AND \"Зафиксирован срок выдачи\" is not null", "Зафиксирован срок выдачи", "^\\u002b$")

Примечание:
"быстрым" его можно назвать, лишь, относительно: 850 записей он обрабатывает за ~3,5 секунды :-(

среда, 13 февраля 2019 г.

JiraSD: еще про JQL

Выражение
labels not in (Ошибка_БЛ)
то же самое что и
labels != Ошибка_БЛ

Вместо
labels != Ошибка_БЛ
нужно применять
(labels != Ошибка_БЛ or labels is null)

вторник, 5 февраля 2019 г.

JiraSD: выявление задач без трудозатрат

Задачи проекта "SP", у которых:
- "Ответственный L2" = текущий пользователь
- дата создания в текущем месяце
- в журнале работ по текущему пользователю ни одной записи:
project = SP AND "Ответственный L2" = currentUser() AND created >= startOfMonth() AND created < endOfMonth() AND issueFunction not in worklogged("after startOfMonth() before endOfMonth() by currentUser()")

вторник, 29 января 2019 г.

понедельник, 28 января 2019 г.

Запуск win-клиента АЦК-Контроль (когда недоступна серверная часть)

0) закрыть АЦК-Контроль;
1) запустить regedit;
2) в разделе "HKEY_CURRENT_USER\Software\BFT\ControlOffline\Control\<Имя пользователя>"
2.1) параметр "Password" удалить;
2.2) параметру "StorePass" присвоить значение "0";
2.3) в параметре "Preferences" найти запись "REFRESHINTERVAL" и присвоить ей значение "0", чтобы получилось: «REFRESHINTERVAL="0"»;
3) сохранить изменения, запустить АЦК-Контроль, в окне запроса пароля нажать "Отмена".

вторник, 22 января 2019 г.

JiraSD: значения смарт-фильтра "Типовая ситуация (L2)"

Значения-маркеры:
(все описанные ниже задачи имеют значение "L2" в поле "Служебная линия обработки")

1 (красный)
Описание:
Задачи, которые поступили в работу на L2 или к ответственному на L2.
JQL-выражение:
Редакция №1:
"Служебная линия обработки" = L2 and (status = Новая or (status = "Получена информация" and "Ответственный L2" = currentUser()))
Редакция №2:
("Служебная линия обработки" = L2 and status = Новая)
or
("Служебная линия обработки" = L2 and status = "Получена информация" and "Ответственный L2" = currentUser())
or
("Служебная линия обработки" = L2 and status = "Запрос информации внутр" and "Ответственный L2" = currentUser() and "Линия OLA" = 3)


2 (белый)
Описание:
JQL-выражение:
"Служебная линия обработки" = L2 and status = "В работе" and "Ответственный L2" = currentUser()

3 (черный)
Исключение:
тут в поле "Служебная линия обработки" значение "L3".
Описание:
доработки, переданные на L3, по которым нужно отслеживать изменения вручную.
JQL-выражение:
"Служебная линия обработки" = L3 and "Ответственный L3" = currentUser()

четверг, 17 января 2019 г.

"Маячок" в "Скайпе для бизнеса"

Когда включаешь в списке контактов у определенного человека параметр "Получать оповещения о состоянии", то в момент, когда его статус меняется на "Доступен" (зеленый), появляется уведомление.

Включение "маячка" - щелкнуть правой кнопкой по контакту и поставить галочку "Получать оповещения о состоянии":


Когда у человека меняется статус на "зеленый" (В сети), то появляется такое уведомление:

Нажатие на уведомление открывает чат с этим человеком.


Когда "маячок" больше не нужен, то при очередном его появлении нажмите на кнопку "Удалить тег":

понедельник, 29 октября 2018 г.

АЦК jars (unistr <—> asciistr)

Для поиска в сборке:
select replace(replace(ASCIISTR('Документ "Сведение о платеже" не создан'),'\','\u'),'"','\"') from dual;
В обратную сторону:
select UNISTR(replace(replace('\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \"\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u043E \u043F\u043B\u0430\u0442\u0435\u0436\u0435\" \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u043D','\u','\'),'\"','"')) from dual;

Архив