Commit graph

55 commits

Author SHA1 Message Date
cf7f6f4510 test(e2e): стенд с реальным сервером и PostgreSQL 17
Зачем: 156 зелёных тестов на fakeDatabase не поймали, что ключевые
сценарии (создание сотрудника, подтверждение смены, расчёт зарплаты)
всегда падают на реальной PostgreSQL. Нужен приёмочный стенд, который
проверяет продукт как чёрный ящик: настоящий процесс сервера, настоящая
БД, роли как в pilot, но с минимальными привилегиями.

- tests/e2e/harness/global-setup.ts: создаёт БД и роли через
  scripts/test/provision-pg.mjs, применяет миграции ролью krona_migrator
  (NOSUPERUSER), поднимает `tsx src/server.ts` под krona_staff_app с
  токенами/VAPID из crypto.randomBytes; три процесса: с токенами, без
  токенов (как корневой compose.yaml) и отдельный для проверки rate limit;
  логи серверов пишутся в tests/e2e/evidence/.
- *.e2e.ts и отдельный vitest.e2e.config.ts: e2e не попадают в `npm test`,
  поэтому `npm run check` не требует БД и не краснеет от известных дефектов.
- [HARNESS]/[CTRL] — позитивные контроли (версия PG >= 17, атрибуты ролей,
  app-роль не видит schema_migrations, RBAC, уволенный теряет доступ):
  если они красные, красные дефектные сценарии ничего не доказывают.
- scripts/test/run-e2e.mjs: «храповик» известных дефектов по
  tests/e2e/known-defects.json (новый красный или исправленный-но-не-
  вычеркнутый ID = exit 1), таблица e2e-table.md и проверка, что в
  evidence нет ничего похожего на секреты стенда.

Логи названы *.txt, т.к. *.log в .gitignore.
2026-09-26 14:27:59 +07:00
d7e9008b8c style(test): prettier для tenant-isolation.test.ts
Зачем: файл уже до правки N5 не проходил prettier --check (часть F14); форматирование вынесено в отдельный коммит, чтобы смысловая правка N5 читалась отдельно от шума.
2026-09-26 14:21:48 +07:00
88fc7491b6 test(integration): очистка tenant-isolation ролью мигратора (N5)
Зачем: afterAll удалял строки соединением роли приложения, а у
krona_staff_app намеренно нет DELETE на staff_employees. На реальной
PostgreSQL 17 тест проходил, но файл падал в afterAll ("permission denied
for table staff_employees", exit 1), поэтому любой CI с DATABASE_TEST_URL
был бы красным не из-за дефекта продукта, а из-за самого теста.
Выдавать app-роли DELETE ради теста нельзя: это ослабило бы модель прав.

Что сделано:
- очистка идёт отдельным соединением роли мигратора
  (DATABASE_TEST_MIGRATION_URL или DATABASE_MIGRATION_URL, который CI уже
  задаёт); так как FORCE RLS действует и на владельца таблиц, в транзакции
  выставляется app.tenant_id; удаляются строки обоих тестовых tenant;
- очистка выполняется и в beforeAll, чтобы остатки прошлого упавшего
  прогона не ломали уникальные ключи (EMP-PUSH-1, DEV-A);
- без URL мигратора тест падает с понятной ошибкой, а не оставляет мусор.

До: tests/e2e/evidence/n5-before.txt (1 passed, suite FAIL, exit=1).
После: tests/e2e/evidence/n5-after.txt (два прогона подряд, exit=0).
2026-09-26 14:21:47 +07:00
29fefc1933 test(db): стенд PostgreSQL с мигратором без SUPERUSER
Зачем: аудит показал, что 156 зелёных тестов на fakeDatabase не заметили,
что создание сотрудника, подтверждение смены и расчёт зарплаты всегда
падают на реальной PostgreSQL. Чтобы тесты и CI проверяли реальный SQL,
нужен воспроизводимый стенд с ролями как в pilot, но с минимальными
привилегиями:

- scripts/test/provision-pg.mjs: bootstrap-админ (только как DBA/entrypoint)
  создаёт krona_migrator (NOSUPERUSER NOCREATEDB NOCREATEROLE, владелец БД и
  схемы public) и krona_staff_app (NOSUPERUSER NOBYPASSRLS NOINHERIT); пароли
  crypto.randomBytes, пишутся только в env-файл 0600, в вывод не попадают.
  scripts/create-app-role.mjs здесь не используется, т.к. без SUPERUSER он
  падает (находка N6, продуктовый код не трогаем).
- scripts/test/migrate-roundtrip.mjs: up -> откат всех миграций -> up ->
  повторный up должен быть no-op; ролью мигратора, как требует AGENTS.md.

Проверено на PostgreSQL 17.11: 11 миграций применены, откачены, применены
повторно, третий up пустой.
2026-09-26 14:21:47 +07:00
Ochenstarik
778ba2d15b fix(portal): hide login after successful session
Some checks are pending
ci / verify (push) Waiting to run
2026-09-26 13:50:36 +07:00
Ochenstarik
3595792ef3 merge: offline sync backend with library portal
Some checks are pending
ci / verify (push) Waiting to run
2026-09-26 13:28:50 +07:00
Ochenstarik
5ee75177b9 feat(sync): add offline sync backend foundation
- Add PostgreSQL migrations with strict RLS policies (0011)
- Introduce SyncService for handling auth, token-based registration
- Add payload size and replay attack mitigations
- Provide HTTP fastify routes (pull, push, ack, device management)
- Validate openapi contracts and add comprehensive tests
2026-09-26 13:10:27 +07:00
Ochenstarik
1812870dd3 feat(portal): align workspace with Krona library 2026-09-26 12:58:51 +07:00
Ochenstarik
3e2054480c fix(push): isolate employee data and preserve platform outbox
Some checks are pending
ci / verify (push) Waiting to run
2026-09-26 12:31:10 +07:00
Ochenstarik
2f1bdf549d test(push): tenant isolation and web-push idempotency tests 2026-09-26 12:08:36 +07:00
Ochenstarik
87a6a447c2 feat(pwa): mobile-first employee portal with offline sync and push integration 2026-09-26 12:08:31 +07:00
Ochenstarik
fb1270a0a8 feat(notification): employee push subscriptions, rls migrations, and web-push dispatcher 2026-09-26 12:08:26 +07:00
Ochenstarik
f74aa6d7f5 fix(import): provision workbook profession catalog
Some checks are pending
ci / verify (push) Waiting to run
2026-09-24 21:25:13 +07:00
Ochenstarik
9ea9a004ed feat(ui): align Staff portal with Krona library 2026-09-24 21:14:20 +07:00
Ochenstarik
5b159f785c feat(staff): import workbook professions and dated payroll 2026-09-24 21:14:03 +07:00
Ochenstarik
4fe2f8799a fix(terminal): secure local state and background IPC 2026-09-24 21:13:46 +07:00
Ochenstarik
96a28f575f test(tenant): fix payroll ledger isolation query and verify migration rls 2026-09-24 19:11:45 +07:00
Ochenstarik
37da6f0418 feat(payroll): automatic payroll calculation, owner schemes, and UI integration 2026-09-24 19:00:25 +07:00
Ochenstarik
c08a7e6af1 fix(finance): preserve imported corrections 2026-09-24 18:28:58 +07:00
Ochenstarik
1007f929c2 fix(finance): cast derived revenue parameters 2026-09-24 18:25:56 +07:00
Ochenstarik
88804a0eea feat(staff): add finance calendar and employee portal 2026-09-24 18:12:24 +07:00
Ochenstarik
057ec75b26 fix(terminal): handle locked scans consistently 2026-09-24 18:09:42 +07:00
Ochenstarik
0f530dc633 fix: read terminal release version reliably
Some checks failed
ci / verify (push) Has been cancelled
2026-09-24 17:13:14 +07:00
Ochenstarik
df0da37d5c merge: integrate server portal and work sessions 2026-09-24 17:06:04 +07:00
Ochenstarik
6e5a1ad404 merge: integrate production terminal 2026-09-24 17:06:03 +07:00
Ochenstarik
2f6b367638 feat: reconcile and review attendance sessions 2026-09-24 17:00:08 +07:00
Ochenstarik
29c70e0107 refactor(terminal): decouple scanner via IFingerprintScanner factory and fix test cancellation token 2026-09-24 16:54:41 +07:00
Ochenstarik
39f0840087 Fix IPC framing, add global pipe name, and auto-reconnect tests 2026-09-24 16:49:07 +07:00
Ochenstarik
b3fdec1eb2 test(terminal): add comprehensive unit test suite covering scanner mock, deduplication, sync, and security 2026-09-24 16:37:59 +07:00
Ochenstarik
7ca8966084 docs(terminal): add API requirements, driver distribution policy, and SLK20R hardware report 2026-09-24 16:37:52 +07:00
Ochenstarik
b2f7a68589 feat(installer): update release build script and NSIS installer with Windows Service and driver detection 2026-09-24 16:37:48 +07:00
Ochenstarik
32e3c6f7f7 feat: add manager employee and timesheet workflows 2026-09-24 16:32:30 +07:00
Ochenstarik
71660745a5 feat(terminal): wire attendance tracker, tray states, fingerprint enrollment wizard, and re-authorization 2026-09-24 16:28:20 +07:00
Ochenstarik
fecf7e5911 chore: remove build artifacts from KronaStaffService and update .gitignore 2026-09-24 16:22:50 +07:00
Ochenstarik
0bd88142b8 feat(service): add KronaStaffService Windows Service with IPC and offline sync worker 2026-09-24 16:22:33 +07:00
Ochenstarik
94753c3105 feat(ipc): add NamedPipe contracts, secure IPC server, and client 2026-09-24 16:21:27 +07:00
Ochenstarik
5bf634278d feat(attendance): add AttendanceTracker with thread-safe duplicate guard and scheduled checkout 2026-09-24 16:21:07 +07:00
Ochenstarik
c479bb60ca feat(scanner): add IFingerprintScanner, deduplication, auto-reconnect, and state machine 2026-09-24 16:20:39 +07:00
Ochenstarik
14ce259a5b feat(store): configure DPAPI LocalMachine scope with restricted ACL and migration support 2026-09-24 16:20:00 +07:00
Ochenstarik
c41bdd8654 feat(sync): add configurable HTTPS endpoints, idempotency headers, and auto-checkout support 2026-09-24 16:19:16 +07:00
Ochenstarik
770ef00a28 feat(terminal): add Argon2id PIN hashing with lockout, license port, and model extensions 2026-09-24 16:19:03 +07:00
Ochenstarik
3464998168 feat: add secure attendance portal and payroll foundation
Some checks are pending
ci / verify (push) Waiting to run
2026-09-24 15:59:38 +07:00
Ochenstarik
b4eb3432ae feat(terminal): add scheduled automatic checkout
Some checks failed
ci / verify (push) Has been cancelled
2026-09-21 10:00:11 +07:00
Ochenstarik
4d37350757 feat(terminal): update attendance terminal to 0.2.4
Some checks are pending
ci / verify (push) Waiting to run
2026-09-20 23:40:43 +07:00
Ochenstarik
827d321a1a feat(terminal): add secure release updates and installer
Some checks failed
ci / verify (push) Has been cancelled
2026-09-19 02:08:26 +07:00
Ochenstarik
d45bee960a fix: harden terminal recovery and deployment
Some checks are pending
ci / verify (push) Waiting to run
2026-09-18 11:10:28 +07:00
Ochenstarik
7c8e7fcaf1 fix: close terminal audit findings
Some checks are pending
ci / verify (push) Waiting to run
2026-09-18 01:34:36 +07:00
Ochenstarik
64ac5c0c66 fix: enforce tenant isolation and runtime contracts 2026-09-18 01:34:12 +07:00
Ochenstarik
b88ff9195c fix: harden terminal scanner and background operation
Some checks are pending
ci / verify (push) Waiting to run
2026-09-18 00:49:34 +07:00
Ochenstarik
14ed610d14 feat: secure and brand staff terminal
Some checks are pending
ci / verify (push) Waiting to run
2026-09-18 00:11:29 +07:00