Регістри в K2 ERP: відмінності між версіями

Немає опису редагування
Немає опису редагування
 
Рядок 66: Рядок 66:
</pre>
</pre>


=== Вимоги до версії та смоук-тест ===
=== Вимоги до версії ===


{{Note|'''Мінімальна версія — 1.0.0''' (реліз від 15.03.2026). Саме в ній додано <code>$wgDiagramsDefaultFormat</code>, без якого документ рендериться в PNG і ER-діаграми розділу 9 стають нечитабельними. Автор супроводжує підняття мажорної версії до 1 формулюванням, що проєкт вийшов на стабільність.}}
{{Note|'''Мінімальна версія — 1.0.0''' (реліз від 15.03.2026). Саме в ній додано <code>$wgDiagramsDefaultFormat</code>, без якого документ рендериться в PNG і ER-діаграми розділу 9 стають нечитабельними. Автор супроводжує підняття мажорної версії до 1 формулюванням, що проєкт вийшов на стабільність.}}


{{Note|'''Інфобокс на mediawiki.org станом на дату складання ТЗ застарілий''' — показує версію 0.10.0 (2022) і сумісність «MediaWiki ≤ 1.39», тоді як у репозиторії 27 релізів і остання — 1.0.0 від 15.03.2026. '''Джерело істини — GitHub''' (<nowiki>https://github.com/samwilson/diagrams-extension/releases</nowiki>), а не інфобокс вікі-сторінки. Обмеження «≤ 1.39» перевіряти не за сторінкою, а за <code>extension.json</code> актуального релізу.}}
{{Note|'''Інфобокс на mediawiki.org станом на дату складання ТЗ застарілий''' — показує версію 0.10.0 (2022) і сумісність «MediaWiki ≤ 1.39», тоді як у репозиторії 27 релізів і остання — 1.0.0 від 15.03.2026. '''Джерело істини — GitHub''' (<nowiki>https://github.com/samwilson/diagrams-extension/releases</nowiki>), а не інфобокс вікі-сторінки.}}


Перед публікацією документа прогнати смоук-тест на цільовій вікі — по одному представнику кожного типу:
=== Кодування: обов'язкове налаштування ===
 
{{Note|'''Найчастіша поломка цього документа.''' Якщо кирилиця в діаграмах виводиться як <code>◆◆◆◆◆◆</code> (U+FFFD), проблема '''не в шрифтах''', а в кодуванні. Java до версії 18 бере <code>file.encoding</code> з локалі процесу. Якщо веб-сервер працює з <code>LANG=C</code> або без локалі, PlantUML читає вхід як US-ASCII, і '''кожен байт UTF-8 понад 127 перетворюється на окремий <code>&#65533;</code>'''.}}
 
'''Як відрізнити дві різні проблеми:'''
 
{| class="wikitable"
! Симптом !! Діагноз !! Що робити
|-
| <code>&#65533;&#65533;&#65533;&#65533;</code> — ромби зі знаком питання (U+FFFD). Кількість символів '''більша''' за кількість літер оригіналу: 1 кирилична літера → 2 ромби, стрілка <code>→</code> → 3 ромби || '''Кодування.''' Байти UTF-8 декодовані як ASCII/Latin-1 — по одному <code>&#65533;</code> на байт || Розділ нижче, п. «Виправлення»
|-
| <code>□□□□</code> — порожні прямокутники (tofu). Кількість '''збігається''' з кількістю літер || '''Шрифти.''' Кодування правильне, але у шрифті немає гліфів кирилиці || <code>apt install fonts-dejavu fonts-liberation</code>. У документі вже проставлено <code>skinparam defaultFontName "DejaVu Sans"</code> і <code>fontname="DejaVu Sans"</code> для GraphViz
|-
| <code>пÑивÑÑ</code> — «мохібейк» із латиниці з діакритикою || Подвійне перекодування UTF-8 ↔ Latin-1 || Перевірити <code>$wgDiagramsServiceUrl</code> — сервіс віддає не UTF-8
|}
 
'''Діагностика (на сервері вікі):'''
 
<syntaxhighlight lang="bash">
# 1. Що каже сам PlantUML про своє кодування
java -jar /usr/share/plantuml/plantuml.jar -version | grep -i "Default Encoding"
#  Default Encoding: UTF-8            <- норма
#  Default Encoding: ANSI_X3.4-1968  <- ЦЕ ПРИЧИНА (це US-ASCII)
#  Default Encoding: ISO-8859-1      <- ЦЕ ПРИЧИНА
 
# 2. Локаль процесу веб-сервера (а не вашого shell — вони різні!)
sudo -u www-data env | grep -E 'LANG|LC_'
#  порожньо або LANG=C / LANG=POSIX -> причина
 
# 3. Відтворення поза MediaWiki — ізолює проблему від вікі
printf '@startuml
A -> B : кирилиця та стрілка →
@enduml
'  | java -jar /usr/share/plantuml/plantuml.jar -pipe -tsvg > /tmp/test.svg
grep -c 'кирилиця' /tmp/test.svg      # 1 = добре; 0 = поламано
 
# 4. Чи є шрифти з кирилицею
java -jar /usr/share/plantuml/plantuml.jar -printfonts | grep -i dejavu
</syntaxhighlight>
 
'''Виправлення''' (за спаданням надійності — досить одного, але п. 1–2 разом надійніші):
 
<syntaxhighlight lang="php">
// LocalSettings.php
 
// СПОСІБ 1 (рекомендований): задати кодування явно в команді PlantUML.
// $wgDiagramsLocalCommands перевизначає команди локального рендерингу.
$wgDiagramsLocalCommands = [
    'plantuml' => '/usr/bin/java -Dfile.encoding=UTF-8 '
                . '-jar /usr/share/plantuml/plantuml.jar -charset UTF-8',
];
</syntaxhighlight>
 
<syntaxhighlight lang="bash">
# СПОСІБ 2: локаль процесу веб-сервера (systemd drop-in)
#  /etc/systemd/system/php8.2-fpm.service.d/locale.conf
[Service]
Environment=LANG=C.UTF-8
Environment=LC_ALL=C.UTF-8
#  далі: systemctl daemon-reload && systemctl restart php8.2-fpm
 
# СПОСІБ 3 (найчистіший): Java 18+.
# JEP 400 зробив UTF-8 кодуванням за замовчуванням незалежно від локалі ОС —
# проблема зникає структурно, без прапорців.
java -version
</syntaxhighlight>
 
{{Note|Спосіб 3 усуває цілий клас проблем і не лише для PlantUML. Якщо на сервері вікі Java 17 або старіша — це найкраща інвестиція з трьох.}}
 
=== Смоук-тест перед публікацією ===
 
Прогнати на цільовій вікі — по одному представнику кожного типу:


{| class="wikitable"
{| class="wikitable"
! # !! Що перевіряємо !! Де в документі !! Ознака успіху
! # !! Що перевіряємо !! Де в документі !! Ознака успіху
|-
|-
| 1 || <code><nowiki><graphviz></nowiki></code>, <code>rankdir</code>, <code>shape=record</code>, кластери || 5.1, 8.8, 9.5, Д.1, Д.8 || Діаграма рендериться, підписи не обрізані
| 1 || '''Кодування кирилиці''' || 9.1 (підписи зв'язків) || Читається «є регістром», а не <code>&#65533;&#65533;&#65533;</code>. '''Перевіряти першим''' — решта тестів без цього безглузді
|-
| 2 || Гліфи кирилиці у шрифті || 5.1, 6.1 || Немає <code>□□□</code>
|-
| 3 || <code><nowiki><graphviz></nowiki></code>: <code>rankdir</code>, <code>shape=record</code>, <code>cylinder</code> || 5.1, 6.1, 8.8, 9.5, Д.1, Д.8 || Діаграма рендериться, підписи не обрізані
|-
|-
| 2 || <code><nowiki><uml></nowiki></code> + <code>@startuml</code>, <code>entity</code>, <code>skinparam linetype ortho</code> || 9.1–9.4 || ER-модель із колонками та позначками PK/FK
| 4 || <code><nowiki><uml></nowiki></code> + <code>@startuml</code>, <code>entity</code>, <code>skinparam linetype ortho</code> || 9.1–9.4 || ER-модель із колонками та позначками PK/FK
|-
|-
| 3 || '''<code><nowiki><uml></nowiki></code> + <code>@startgantt</code>''' || '''7.5.1''' || Діаграма Ганта. '''Головний ризик:''' якщо розширення обгортає вміст у <code>@startuml</code> автоматично, <code>@startgantt</code> не спрацює
| 5 || '''<code><nowiki><uml></nowiki></code> + <code>@startgantt</code>''' || '''7.5.1''' || Діаграма Ганта. '''Головний ризик:''' якщо розширення обгортає вміст у <code>@startuml</code> автоматично, <code>@startgantt</code> не спрацює
|-
|-
| 4 || <code>$wgDiagramsDefaultFormat = 'svg'</code> || будь-яка || У HTML-коді сторінки <code>&lt;img src="…<b>.svg</b>"&gt;</code>, а не <code>.png</code>
| 6 || <code>$wgDiagramsDefaultFormat = 'svg'</code> || будь-яка || У HTML сторінки <code>&lt;img src="…<b>.svg</b>"&gt;</code>, а не <code>.png</code>
|-
|-
| 5 || Кирилиця в підписах вузлів || 5.1, 6.1 || Немає «квадратиків» — на сервері є потрібні шрифти
| 7 || GraphViz присутній для PlantUML || 9.1–9.4 || Немає повідомлення «Dot executable does not exist». PlantUML використовує dot для розкладки — <code>plantuml</code> без <code>graphviz</code> зрендерить лише sequence-діаграми (7.1), а ER-моделі — ні
|}
|}


{{Note|'''Щодо п. 3.''' Документ використовує явні роздільники <code>@startuml…@enduml</code> / <code>@startgantt…@endgantt</code> всередині тегів. Це відповідає нормалізованій поведінці PlantUML: розробники вимагають <code>@startXYZ</code> усюди, зокрема з прапорцем <code>-pipe</code>, а можливість опускати роздільник збережена лише як застаріла опція для сумісності зі старими скриптами. '''Перевірити на смоук-тесті''' я не мав змоги — це єдине непідтверджене припущення в розділі. Якщо <code>@startgantt</code> не відрендериться, замінити діаграму 7.5.1 на <code><nowiki><graphviz></nowiki></code> або повернути ASCII-схему з історії правок.}}
{{Note|'''Щодо п. 5.''' Документ використовує явні роздільники <code>@startuml…@enduml</code> / <code>@startgantt…@endgantt</code> всередині тегів. Це відповідає нормалізованій поведінці PlantUML: розробники вимагають <code>@startXYZ</code> усюди, зокрема з прапорцем <code>-pipe</code>, а можливість опускати роздільник збережена лише як застаріла опція для сумісності зі старими скриптами. Перевірити на живій вікі я не мав змоги — це єдине непідтверджене припущення розділу. Якщо <code>@startgantt</code> не відрендериться, замінити діаграму 7.5.1 на <code><nowiki><graphviz></nowiki></code> або повернути ASCII-схему з історії правок.}}


=== Альтернативи та запасний варіант ===
=== Альтернативи та запасний варіант ===
Рядок 338: Рядок 413:
   rankdir=TB;
   rankdir=TB;
   bgcolor="transparent";
   bgcolor="transparent";
   node [shape=box, style="rounded,filled", fillcolor="#f5f5f5", fontname="Helvetica", fontsize=10];
   node [shape=box, style="rounded,filled", fillcolor="#f5f5f5", fontname="DejaVu Sans", fontsize=10];
   edge [fontname="Helvetica", fontsize=8];
   edge [fontname="DejaVu Sans", fontsize=8];


   R [label="РЕГІСТР\n(абстрактний об'єкт метаданих)", fillcolor="#dbe9ff"];
   R [label="РЕГІСТР\n(абстрактний об'єкт метаданих)", fillcolor="#dbe9ff"];
Рядок 416: Рядок 491:
digraph ConfigTree {
digraph ConfigTree {
   rankdir=LR; bgcolor="transparent"; ranksep=0.35; nodesep=0.12;
   rankdir=LR; bgcolor="transparent"; ranksep=0.35; nodesep=0.12;
   node [shape=box, style="filled,rounded", fontname="Helvetica", fontsize=9, height=0.28];
   node [shape=box, style="filled,rounded", fontname="DejaVu Sans", fontsize=9, height=0.28];
   edge [arrowhead=none, color="#9e9e9e"];
   edge [arrowhead=none, color="#9e9e9e"];


Рядок 867: Рядок 942:
<uml>
<uml>
@startuml
@startuml
skinparam defaultFontName "DejaVu Sans"
skinparam monochrome false
skinparam monochrome false
skinparam shadowing false
skinparam shadowing false
Рядок 1036: Рядок 1112:
<uml>
<uml>
@startgantt
@startgantt
skinparam defaultFontName "DejaVu Sans"
title Витіснення за періодом дії. Період реєстрації: січень 2026
title Витіснення за періодом дії. Період реєстрації: січень 2026
caption Пріоритет витіснення: Лікарняний > Відпустка > Оклад
caption Пріоритет витіснення: Лікарняний > Відпустка > Оклад
Рядок 1819: Рядок 1896:
digraph Tables {
digraph Tables {
   rankdir=LR; bgcolor="transparent"; ranksep=0.6; nodesep=0.08;
   rankdir=LR; bgcolor="transparent"; ranksep=0.6; nodesep=0.08;
   node [shape=box, style="filled,rounded", fontname="Helvetica", fontsize=9, height=0.26];
   node [shape=box, style="filled,rounded", fontname="DejaVu Sans", fontsize=9, height=0.26];
   edge [color="#9e9e9e", arrowhead=vee];
   edge [color="#9e9e9e", arrowhead=vee];


Рядок 1870: Рядок 1947:
<uml>
<uml>
@startuml
@startuml
skinparam defaultFontName "DejaVu Sans"
hide circle
hide circle
skinparam linetype ortho
skinparam linetype ortho
Рядок 1978: Рядок 2056:
<uml>
<uml>
@startuml
@startuml
skinparam defaultFontName "DejaVu Sans"
hide circle
hide circle
skinparam linetype ortho
skinparam linetype ortho
Рядок 2086: Рядок 2165:
<uml>
<uml>
@startuml
@startuml
skinparam defaultFontName "DejaVu Sans"
hide circle
hide circle
skinparam linetype ortho
skinparam linetype ortho
Рядок 2202: Рядок 2282:
<uml>
<uml>
@startuml
@startuml
skinparam defaultFontName "DejaVu Sans"
hide circle
hide circle
skinparam linetype ortho
skinparam linetype ortho
Рядок 2304: Рядок 2385:
digraph ER {
digraph ER {
   rankdir=LR; bgcolor="transparent";
   rankdir=LR; bgcolor="transparent";
   node [shape=record, fontname="Helvetica", fontsize=9, style=filled];
   node [shape=record, fontname="DejaVu Sans", fontsize=9, style=filled];
   edge [fontname="Helvetica", fontsize=8];
   edge [fontname="DejaVu Sans", fontsize=8];


   MD  [label="{md_register|id (PK)\lname\lkind\lperiodicity\lwrite_mode\l...}", fillcolor="#dbe9ff"];
   MD  [label="{md_register|id (PK)\lname\lkind\lperiodicity\lwrite_mode\l...}", fillcolor="#dbe9ff"];
Рядок 2933: Рядок 3014:
digraph Choose {
digraph Choose {
   rankdir=TB; bgcolor="transparent";
   rankdir=TB; bgcolor="transparent";
   node [shape=box, style="rounded,filled", fontname="Helvetica", fontsize=9];
   node [shape=box, style="rounded,filled", fontname="DejaVu Sans", fontsize=9];
   edge [fontname="Helvetica", fontsize=8];
   edge [fontname="DejaVu Sans", fontsize=8];


   q1 [label="Що зберігаємо?", shape=diamond, fillcolor="#ffe0b2"];
   q1 [label="Що зберігаємо?", shape=diamond, fillcolor="#ffe0b2"];
Рядок 3828: Рядок 3909:
digraph Posting {
digraph Posting {
   rankdir=LR; bgcolor="transparent";
   rankdir=LR; bgcolor="transparent";
   node [shape=box, style="rounded,filled", fontname="Helvetica", fontsize=9];
   node [shape=box, style="rounded,filled", fontname="DejaVu Sans", fontsize=9];


   D [label="Документ\nВидаткова накладна №12\n05.07.2026", fillcolor="#fff8e1", shape=note];
   D [label="Документ\nВидаткова накладна №12\n05.07.2026", fillcolor="#fff8e1", shape=note];
Рядок 3847: Рядок 3928:


   label="ОДНА транзакція БД: усі 5 регістрів + підсумки + прапорець Проведений";
   label="ОДНА транзакція БД: усі 5 регістрів + підсумки + прапорець Проведений";
   labelloc=b; fontname="Helvetica"; fontsize=10;
   labelloc=b; fontname="DejaVu Sans"; fontsize=10;
}
}
</graphviz>
</graphviz>