odant-work 1.0.12 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/#system/certs/russian_trusted_root_ca.pem +33 -0
- package/#system/mail.json.example +9 -0
- package/#system/package-manifest.json +986 -0
- package/#system/sandbox.json +19 -0
- package/#system/settings.json.example +3 -0
- package/package.json +1 -1
- package/run.mjs +78 -11
- package/scripts/check-ignored-code.mjs +25 -1
- package/sources/data/api.js +1071 -0
- package/sources/data/choices.js +125 -0
- package/sources/data/classes.js +412 -0
- package/sources/data/db.js +383 -0
- package/sources/data/errors.js +15 -0
- package/sources/data/expr.js +456 -0
- package/sources/data/objects.js +950 -0
- package/sources/data/posting.js +657 -0
- package/sources/data/print.js +524 -0
- package/sources/data/progress.md +526 -0
- package/sources/data/readme.md +77 -0
- package/sources/data/reports.js +1033 -0
- package/sources/data/schema.js +586 -0
- package/sources/data/scope.js +281 -0
- package/sources/data/sql-inspector.js +892 -0
- package/sources/data/time.js +67 -0
- package/sources/data/workspace.js +152 -0
- package/sources/host/auto-updater.js +52 -10
- package/.vscode/launch.json +0 -32
- package/.vscode/settings.json +0 -2
- package/.vscode/tasks.json +0 -65
- package/ORGANIZATIONS//320/221/320/270/320/267/320/275/320/265/321/201 /320/230/320/275/321/202/320/265/321/200 /320/241/320/276/321/204/321/202/orders/$structure/video/IMG_8524.MP4 +0 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# sources/data — учётное ядро на SQLite (архитектура ODANT → WORK)
|
|
2
|
+
|
|
3
|
+
## 1. Что это
|
|
4
|
+
|
|
5
|
+
Модуль хранения и обработки прикладных учётных данных WORK: дерево учётных классов, объекты справочников (`$catalog`), составные структуры (`$struct`), виртуальные справочники (`$virtual`), первичные операции (`$operation`) и явная двойная запись в классы счетов (`$account`) единого журнала (`$register`).
|
|
6
|
+
|
|
7
|
+
Каждая организация (`$base` в `/ORGANIZATIONS/<Организация>`) хранит свои учётные данные в собственной изолированной БД `node:sqlite` (`<Организация>/$base/#system/work.db`). Полная архитектурная спецификация зафиксирована в [`docs/architecture-v2.md`](/docs/architecture-v2.md/~/handlers/pages/form/).
|
|
8
|
+
|
|
9
|
+
## 2. Зачем это нужно
|
|
10
|
+
|
|
11
|
+
Метаданные классов, экранные формы и печатные шаблоны остаются файлами дерева WORK (наследуются по трём осям: `Types` → `Ancestor` в `/MODULES` → `Parent` → `Сам класс`), а учётные объекты и движения по счетам получают транзакционность, индексацию, явную двойную запись по классам счетов и двухэтапную аналитическую отчётность со скоростью Си-движка `node:sqlite`.
|
|
12
|
+
|
|
13
|
+
## 3. Как это работает
|
|
14
|
+
|
|
15
|
+
- **Изолированная БД организации (`db.js`):**
|
|
16
|
+
- Для каждой `$base` открывается собственная БД `<Организация>/$base/#system/work.db` (`dataDb(basePath)`). Данные разных организаций никогда не смешиваются.
|
|
17
|
+
- Схема ведётся миграциями по `PRAGMA user_version`. `tx()` выполняет синхронную функцию в транзакции (вложенный вызов — `SAVEPOINT`).
|
|
18
|
+
- **Классы и домены (`classes.js`):**
|
|
19
|
+
- Идентификатор любого класса (`cid`) — его реальный путь в дереве WORK (`path`). Никаких искусственных `CID` не используется.
|
|
20
|
+
- Сканирование охватывает домены `/MODULES` (`$module`), `/ORGANIZATIONS` (`$base`, `$structure`) и подключённые внутри организаций модули (`/ORGANIZATIONS/<Орг>/MODULES/<Модуль>`).
|
|
21
|
+
- Иерархия хранится в таблице замыкания `class_tree`: потомки и предки любого класса выбираются одним SQL-запросом.
|
|
22
|
+
- Модули (`$module`) поддерживают блокировку (`disabled` / `set_enabled`) как на уровне отдельной организации (`$base/MODULES/<Модуль>`), так и на уровне всей системы (`/MODULES/<Модуль>`).
|
|
23
|
+
- **Трёхосевое наследование и схема (`schema.js`):**
|
|
24
|
+
- Метаданные класса (`FIELDS`, `STATIC`, `POSTINGS`, `OVERLAY`, `SOURCE`, `NORMS`) собираются по трём осям в порядке приоритета:
|
|
25
|
+
`1. Types (миксины) → 2. Ancestor (одноимённый класс в /MODULES) → 3. Parent (родитель в дереве) → 4. Сам класс`.
|
|
26
|
+
- Ссылки на справочники и счета (`target`, `catalog`, `account`) автоматически привязываются к контексту текущей организации (`resolveInBase`).
|
|
27
|
+
- Типы полей: `string`, `text`, `number`, `money`, `integer`, `boolean`, `date`, `datetime`, `link` (`$catalog` / `$virtual`), `struct` (`$struct` при `table: false`), `table` (`$struct` или инлайн-поля при `table: true`), `enum`, `file`.
|
|
28
|
+
- **Классы данных (`$catalog`, `$virtual`, `$struct`):**
|
|
29
|
+
- **`$catalog`** — единый тип реального справочника: группа агрегирует объекты всех дочерних классов, лист хранит объекты.
|
|
30
|
+
- **`$virtual`** — виртуальный справочник поверх базового справочника и счёта (`SOURCE: { registry, account, slot, mode }`):
|
|
31
|
+
- `mode: 'turnover'` — все объекты, участвовавшие в оборотах счёта («Клиенты», «Поставщики»);
|
|
32
|
+
- `mode: 'balance'` — объекты с ненулевым остатком на дату («Сотрудники», «В отпуске»).
|
|
33
|
+
- Поддерживаются вложенные специализированные `$virtual` (например, `CATALOGS/Сотрудники/В отпуске`), наследующие `SOURCE` и `OVERLAY` родителя и дополняющие их собственными полями расширения (`ext_of`).
|
|
34
|
+
- **`$struct`** — составная структура полей («Адрес», «Паспорт», «Единица измерения»). Поддерживается произвольная глубина рекурсивной вложенности структур (`Паспорт → Адрес`) и признак табличной части `table: true`.
|
|
35
|
+
- **Объекты и версии во времени (`objects.js`):**
|
|
36
|
+
- Объекты создаются только в классах-листьях (`$catalog`, `$operation`).
|
|
37
|
+
- Тело проверяется по схеме (`DataError.errors` передаётся в UI через `X-Work-Errors` с подсветкой конкретных полей и ячеек таблиц).
|
|
38
|
+
- Каждая запись сохраняет версию с `valid_from`; `readObject(id, { at })` возвращает состояние реквизитов на дату операции.
|
|
39
|
+
- Выборки `queryObjects` поддерживают фильтрацию `where` по точечным путям вложенных структур (`passport.address.city`), полнотекстовый поиск, фильтр подразделений (`unit`), сортировку и пагинацию.
|
|
40
|
+
- **Явная двойная запись и проведение операций (`posting.js`, `expr.js`):**
|
|
41
|
+
- При проведении операции (`$operation`) каждое правило `POSTINGS` создаёт в `account_entries` **две отдельные записи**:
|
|
42
|
+
1. запись в классе счёта Дебета (`$account`) со значениями только тех аналитик, которые объявлены на счёте Дебета;
|
|
43
|
+
2. запись в классе счёта Кредита (`$account`) со значениями только тех аналитик, которые объявлены на счёте Кредита.
|
|
44
|
+
- Обе записи связаны общим номером проводки `entry_id` и ссылкой на операцию `op_id`.
|
|
45
|
+
- Проведённая операция неизменяема: исправление (`correctOperation`) и отмена (`cancelOperation`) выполняются только через честное **сторно** прежних записей и создание новых.
|
|
46
|
+
- При проведении, исправлении или отмене операции задним числом автоматически выполняется каскадный пересчёт зависимых списаний по скользящей средней `unit_cost(...)` (`repostDependentOperations`).
|
|
47
|
+
- Каждая регистрация/исправление/отмена операции записывает факт в `data.logs` подразделения и автора (`logOperationFact`).
|
|
48
|
+
- **Двухэтапные аналитики и отчёты (`reports.js`):**
|
|
49
|
+
- Поля справочника-аналитики и поля его расширения `OVERLAY` выступают как **субаналитики** (`resolveAnalyticsFilter`): сначала отбираются или группируются объекты справочника по их полям, затем по найденным `id` фильтруются и агрегируются движения счёта.
|
|
50
|
+
- `trialBalance` (`db_sheet`) — Экран 1 (Общая ОСВ по дереву счетов) и Экран 2 (Анализ счёта в разрезе аналитик и субаналитик `by`).
|
|
51
|
+
- `accountTurnovers` (`db_turnovers`) — Экран 3 (двухпанельные Обороты счёта с группировкой `groupBy`: `none | day | week | month | quarter | year | operation | account | all` и списком первичных документов периода).
|
|
52
|
+
- `readEntry` (`db_entry`) — Экран 4 (сборная карточка проводки из записи счёта Дебета и записи счёта Кредита).
|
|
53
|
+
- `accountCard` (`db_card`) — карточка проводок счёта с текущим сальдо после каждой записи.
|
|
54
|
+
- `journal` (`db_journal`) — журнал проводок с фильтром `effective`.
|
|
55
|
+
- **Экранные формы в проводнике ODA (`work-form`):**
|
|
56
|
+
- Единственный UI — штатные вкладки проводника ODA с единой полосой периодов `oda-packets` сверху:
|
|
57
|
+
- `$register` → `form/sheet` (Экран 1: Общая ОСВ) и `form/journal` (Журнал проводок);
|
|
58
|
+
- `$account` → `form/postings` (режимы `card`, `analysis` — Экран 2, `turnovers` — Экран 3, модальная `entryCard` — Экран 4);
|
|
59
|
+
- `$catalog`, `$operation` → `form/objects` (единая форма списка и редактирования объектов, предпросмотр проводок, кнопки печати);
|
|
60
|
+
- `$virtual` → `form/virtual` (состав виртуального справочника на дату и редактирование полей `OVERLAY`).
|
|
61
|
+
- **Инструменты ИИ-агента (`sources/modules/agent/tools/work/data.js`):**
|
|
62
|
+
- `describe_class` (`db_schema`), `find_objects` (`db_query` / `db_members`), `register_operation` (`db_preview` / `db_create` / `db_register` / `db_correct` / `db_cancel` с подтверждением человека на запись), `report` (`sheet | turnovers | card | journal | entry`).
|
|
63
|
+
|
|
64
|
+
## 4. Из чего это состоит
|
|
65
|
+
|
|
66
|
+
- `db.js` — открытие изолированной БД организации (`<Организация>/$base/#system/work.db`), миграции, `tx`, настройки (`closed_until`)
|
|
67
|
+
- `classes.js` — синхронизация дерева классов (`MODULES`, `ORGANIZATIONS`), таблица замыкания `class_tree`, проверка блокировки модулей
|
|
68
|
+
- `expr.js` — безопасный вычислитель формул сумм, количеств и условий в `POSTINGS` и печатных шаблонах
|
|
69
|
+
- `schema.js` — трёхосевая сборка схемы класса (`Types` → `Ancestor` → `Parent` → `Сам класс`), разрешение ссылок `resolveInBase`, валидация правил листа
|
|
70
|
+
- `objects.js` — создание, версионирование (`valid_from`), чтение на дату, валидация вложенных структур `$struct` и табличных частей `table: true`, выборки `queryObjects`
|
|
71
|
+
- `posting.js` — явная двойная запись в `account_entries`, сторно, `norm()`, `coef()`, `unit_cost()`, каскадный пересчёт `repostDependentOperations`, запись в `data.logs`
|
|
72
|
+
- `reports.js` — `trialBalance`, `accountTurnovers`, `accountCard`, `readEntry`, `journal`, `objectState`, `objectTrajectory`, `virtualMembers`, двухэтапные субаналитики
|
|
73
|
+
- `choices.js` — `linkChoices` для полей-ссылок (`oda-link-input`) с учётом состава виртуального справочника на дату
|
|
74
|
+
- `scope.js` — права и область видимости (`own`, `place`, `unit`, `all`) по ссылкам рабочих мест (`LINKS` в `ROLES`)
|
|
75
|
+
- `print.js` — наследование и рендеринг HTML-шаблонов печати (`<класс>/$operation/print/*.html`), сумма прописью
|
|
76
|
+
- `api.js` — серверные методы `db_*` на прототипе `$class`, `classObjectCount` для счётчиков в дереве проводника
|
|
77
|
+
- `time.js`, `errors.js` — работа с локальными датами/периодами и структурированные ошибки `DataError`
|