From 5ac248660a4d77ab147a0a75b84d4b5d849cf14a Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:21:47 +0700 Subject: [PATCH 01/28] =?UTF-8?q?test(db):=20=D1=81=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=20PostgreSQL=20=D1=81=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=BC=20=D0=B1=D0=B5=D0=B7=20SUPERUSER?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: аудит показал, что 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 пустой. --- scripts/test/migrate-roundtrip.mjs | 46 ++++++++ scripts/test/provision-pg.mjs | 117 +++++++++++++++++++++ tests/e2e/evidence/n5-after.txt | 22 ++++ tests/e2e/evidence/n5-before.txt | 30 ++++++ tests/integration/tenant-isolation.test.ts | 71 ++++++++++--- 5 files changed, 273 insertions(+), 13 deletions(-) create mode 100644 scripts/test/migrate-roundtrip.mjs create mode 100644 scripts/test/provision-pg.mjs create mode 100644 tests/e2e/evidence/n5-after.txt create mode 100644 tests/e2e/evidence/n5-before.txt diff --git a/scripts/test/migrate-roundtrip.mjs b/scripts/test/migrate-roundtrip.mjs new file mode 100644 index 0000000..7567631 --- /dev/null +++ b/scripts/test/migrate-roundtrip.mjs @@ -0,0 +1,46 @@ +#!/usr/bin/env node +// up -> откат ВСЕХ миграций по одной -> up -> повторный up (идемпотентность). +// Запускается ролью мигратора (DATABASE_MIGRATION_URL), без SUPERUSER. +import { spawnSync } from 'node:child_process'; + +function run(direction) { + const result = spawnSync(process.execPath, ['scripts/migrate.mjs', direction], { + env: { ...process.env, ALLOW_MIGRATION_DOWN: direction === 'down' ? 'true' : 'false' }, + encoding: 'utf8', + }); + process.stdout.write(result.stdout); + process.stderr.write(result.stderr); + if (result.status !== 0) { + console.error(`migrate ${direction} failed with exit ${result.status}`); + process.exit(result.status ?? 1); + } + return result.stdout; +} + +const mode = process.argv[2] ?? 'roundtrip'; +console.log('== migrate up (1)'); +const first = run('up'); +if (mode === 'up') process.exit(0); +const applied = (first.match(/^applied /gm) ?? []).length; +console.log(`== rollback all (applied now: ${applied})`); +let rolledBack = 0; +for (let i = 0; i < 1000; i += 1) { + const out = run('down'); + if (/no migration to roll back/.test(out)) break; + rolledBack += 1; +} +console.log(`== rolled back ${rolledBack} migrations`); +console.log('== migrate up (2)'); +const second = run('up'); +const reapplied = (second.match(/^applied /gm) ?? []).length; +console.log('== migrate up (3, must be no-op)'); +const third = run('up'); +if ((third.match(/^applied /gm) ?? []).length !== 0) { + console.error('third up applied migrations again: not idempotent'); + process.exit(1); +} +if (rolledBack === 0 || reapplied !== rolledBack) { + console.error(`rollback/reapply mismatch: rolledBack=${rolledBack} reapplied=${reapplied}`); + process.exit(1); +} +console.log(`== roundtrip OK: rolledBack=${rolledBack} reapplied=${reapplied}`); diff --git a/scripts/test/provision-pg.mjs b/scripts/test/provision-pg.mjs new file mode 100644 index 0000000..2db7ae5 --- /dev/null +++ b/scripts/test/provision-pg.mjs @@ -0,0 +1,117 @@ +#!/usr/bin/env node +// Тестовый стенд PostgreSQL, повторяющий роли pilot, но без суперпользователя-мигратора: +// * bootstrap-админ (E2E_PG_ADMIN_URL) используется ТОЛЬКО здесь, как DBA/entrypoint образа; +// * krona_migrator — NOSUPERUSER NOCREATEDB NOCREATEROLE, владелец БД и схемы public; +// * krona_staff_app — NOSUPERUSER NOBYPASSRLS NOINHERIT, права выдают миграции 0003+. +// Пароли генерируются crypto.randomBytes и пишутся только в env-файл с правами 0600. +// Печатаются имена ролей/БД, но не пароли. +import { randomBytes } from 'node:crypto'; +import { writeFileSync } from 'node:fs'; +import pg from 'pg'; + +const args = new Map(); +for (let i = 2; i < process.argv.length; i += 2) args.set(process.argv[i], process.argv[i + 1]); +const adminUrl = process.env.E2E_PG_ADMIN_URL; +const envFile = args.get('--out'); +const database = args.get('--db') ?? 'krona_staff_e2e'; +if (!adminUrl || !envFile) { + console.error( + 'Usage: E2E_PG_ADMIN_URL=... node scripts/test/provision-pg.mjs --out [--db name]', + ); + process.exit(2); +} +if (!/^[a-z_][a-z0-9_]{0,62}$/.test(database)) throw new Error('Invalid database name'); + +export async function provision() { + const migratorPassword = randomBytes(24).toString('hex'); + const appPassword = randomBytes(24).toString('hex'); + const admin = new pg.Client({ + connectionString: adminUrl, + application_name: 'krona-e2e-provision', + }); + await admin.connect(); + try { + await admin.query(` + DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'krona_migrator') THEN + CREATE ROLE krona_migrator LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS; + END IF; + IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'krona_staff_app') THEN + CREATE ROLE krona_staff_app LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT NOBYPASSRLS; + END IF; + END $$`); + const alterMigrator = await admin.query( + "SELECT format('ALTER ROLE krona_migrator WITH LOGIN PASSWORD %L NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS', $1::text) AS sql", + [migratorPassword], + ); + await admin.query(alterMigrator.rows[0].sql); + const alterApp = await admin.query( + "SELECT format('ALTER ROLE krona_staff_app WITH LOGIN PASSWORD %L NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT NOBYPASSRLS', $1::text) AS sql", + [appPassword], + ); + await admin.query(alterApp.rows[0].sql); + await admin.query( + `SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()`, + [database], + ); + await admin.query(`DROP DATABASE IF EXISTS ${database}`); + await admin.query( + `CREATE DATABASE ${database} OWNER krona_migrator ENCODING 'UTF8' TEMPLATE template0`, + ); + } finally { + await admin.end(); + } + const dbAdminUrl = new URL(adminUrl); + dbAdminUrl.pathname = `/${database}`; + const dbAdmin = new pg.Client({ connectionString: dbAdminUrl.toString() }); + await dbAdmin.connect(); + try { + await dbAdmin.query('ALTER SCHEMA public OWNER TO krona_migrator'); + await dbAdmin.query('REVOKE CREATE ON SCHEMA public FROM PUBLIC'); + await dbAdmin.query(`REVOKE ALL ON DATABASE ${database} FROM PUBLIC`); + await dbAdmin.query(`GRANT CONNECT ON DATABASE ${database} TO krona_staff_app`); + } finally { + await dbAdmin.end(); + } + const base = new URL(adminUrl); + const url = (user, password) => { + const u = new URL(base.toString()); + u.username = user; + u.password = password; + u.pathname = `/${database}`; + return u.toString(); + }; + const migratorUrl = url('krona_migrator', migratorPassword); + const appUrl = url('krona_staff_app', appPassword); + const lines = [ + `DATABASE_MIGRATION_URL=${migratorUrl}`, + `DATABASE_TEST_MIGRATION_URL=${migratorUrl}`, + `DATABASE_TEST_URL=${appUrl}`, + `DATABASE_URL=${appUrl}`, + `POSTGRES_APP_PASSWORD=${appPassword}`, + '', + ]; + writeFileSync(envFile, lines.join('\n'), { mode: 0o600 }); + // Проверяем атрибуты ролей и печатаем их (без паролей) как доказательство. + const check = new pg.Client({ connectionString: migratorUrl }); + await check.connect(); + try { + const roles = await check.query( + `SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolbypassrls + FROM pg_roles WHERE rolname IN ('krona_migrator','krona_staff_app') ORDER BY rolname`, + ); + const version = await check.query('SHOW server_version'); + console.log( + `provisioned database=${database} server_version=${version.rows[0].server_version}`, + ); + for (const r of roles.rows) { + console.log( + `role=${r.rolname} super=${r.rolsuper} createrole=${r.rolcreaterole} createdb=${r.rolcreatedb} bypassrls=${r.rolbypassrls}`, + ); + } + } finally { + await check.end(); + } +} + +await provision(); diff --git a/tests/e2e/evidence/n5-after.txt b/tests/e2e/evidence/n5-after.txt new file mode 100644 index 0000000..0255aa4 --- /dev/null +++ b/tests/e2e/evidence/n5-after.txt @@ -0,0 +1,22 @@ +== run 1: DATABASE_TEST_URL= DATABASE_TEST_MIGRATION_URL= npx vitest run tests/integration/tenant-isolation.test.ts + + RUN v5.0.1 /workspace/krona-staff + + + Test Files 1 passed (1) + Tests 1 passed (1) + Start at 14:20:56 + Duration 275ms (tests 63%, transform 23%, import 12%, worker 1%) + +exit=0 +== run 2: DATABASE_TEST_URL= DATABASE_TEST_MIGRATION_URL= npx vitest run tests/integration/tenant-isolation.test.ts + + RUN v5.0.1 /workspace/krona-staff + + + Test Files 1 passed (1) + Tests 1 passed (1) + Start at 14:20:57 + Duration 260ms (tests 62%, transform 23%, import 13%, worker 2%) + +exit=0 diff --git a/tests/e2e/evidence/n5-before.txt b/tests/e2e/evidence/n5-before.txt new file mode 100644 index 0000000..d2fa1d7 --- /dev/null +++ b/tests/e2e/evidence/n5-before.txt @@ -0,0 +1,30 @@ +== DATABASE_TEST_URL= npx vitest run tests/integration/tenant-isolation.test.ts (база 778ba2d, до исправления) + + RUN v5.0.1 /workspace/krona-staff + + ❯ tests/integration/tenant-isolation.test.ts (1 test) 114ms + +⎯⎯⎯⎯⎯⎯ Failed Suites 1 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL tests/integration/tenant-isolation.test.ts > PostgreSQL tenant isolation +error: permission denied for table staff_employees + ❯ node_modules/pg/lib/client.js:694:17 + ❯ tests/integration/tenant-isolation.test.ts:40:7 + 38| await client.query('DELETE FROM staff_outbox WHERE id = $1', [ev… + 39| await client.query('DELETE FROM staff_professions WHERE id = $1'… + 40| await client.query('DELETE FROM staff_employees WHERE id = $1', … + | ^ + 41| }); + 42| await database.close(); + ❯ Database.tenantTransaction src/infrastructure/database.ts:30:22 + ❯ tests/integration/tenant-isolation.test.ts:31:5 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ + + + Test Files 1 failed (1) + Tests 1 passed (1) + Start at 14:20:47 + Duration 265ms (tests 62%, transform 23%, import 14%, worker 1%) + +exit=1 diff --git a/tests/integration/tenant-isolation.test.ts b/tests/integration/tenant-isolation.test.ts index a954a3a..d806d26 100644 --- a/tests/integration/tenant-isolation.test.ts +++ b/tests/integration/tenant-isolation.test.ts @@ -1,3 +1,4 @@ +import pg from 'pg'; import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { Database } from '../../src/infrastructure/database.js'; import { newUlid, parseUlid } from '../../src/core/ids.js'; @@ -5,6 +6,23 @@ import { newUlid, parseUlid } from '../../src/core/ids.js'; const connectionString = process.env.DATABASE_TEST_URL; const describeDatabase = connectionString ? describe : describe.skip; +// Роль приложения намеренно не имеет DELETE на staff_employees и ряде других таблиц, +// поэтому очистка идёт соединением роли мигратора (владельца таблиц). FORCE RLS действует +// и на владельца, поэтому внутри транзакции выставляется app.tenant_id. +const migrationConnectionString = + process.env.DATABASE_TEST_MIGRATION_URL ?? process.env.DATABASE_MIGRATION_URL; +const cleanupTables = [ + 'staff_sync_device_checkpoints', + 'staff_sync_command_inbox', + 'staff_sync_change_log', + 'staff_sync_devices', + 'staff_notification_deliveries', + 'staff_push_subscriptions', + 'staff_outbox', + 'staff_professions', + 'staff_employees', +] as const; + describeDatabase('PostgreSQL tenant isolation', () => { const database = new Database(connectionString!); const tenantA = parseUlid('01J0000000000000000000000A'); @@ -20,26 +38,51 @@ describeDatabase('PostgreSQL tenant isolation', () => { const changeIdA = newUlid(); const commandIdA = newUlid(); + async function cleanupAsMigrator() { + if (!migrationConnectionString) { + throw new Error( + 'DATABASE_TEST_MIGRATION_URL (или DATABASE_MIGRATION_URL) обязателен вместе с DATABASE_TEST_URL: очистка выполняется ролью мигратора', + ); + } + const migrator = new pg.Client({ + connectionString: migrationConnectionString, + application_name: 'krona-staff-test-cleanup', + }); + await migrator.connect(); + try { + for (const tenant of [tenantA, tenantB]) { + await migrator.query('BEGIN'); + try { + await migrator.query("SELECT set_config('app.tenant_id', $1, true)", [tenant]); + for (const table of cleanupTables) { + await migrator.query(`DELETE FROM ${table} WHERE tenant_id = $1`, [tenant]); + } + await migrator.query('COMMIT'); + } catch (error) { + await migrator.query('ROLLBACK'); + throw error; + } + } + } finally { + await migrator.end(); + } + } + beforeAll(async () => { const role = await database.pool.query( 'SELECT rolsuper, rolbypassrls FROM pg_roles WHERE rolname = current_user', ); expect(role.rows[0]).toEqual({ rolsuper: false, rolbypassrls: false }); + // Остатки прошлого упавшего прогона иначе ломают уникальные ключи (EMP-PUSH-1, DEV-A). + await cleanupAsMigrator(); }); afterAll(async () => { - await database.tenantTransaction(tenantA, actorA, async (client) => { - await client.query('DELETE FROM staff_sync_device_checkpoints WHERE tenant_id = $1', [tenantA]); - await client.query('DELETE FROM staff_sync_command_inbox WHERE tenant_id = $1', [tenantA]); - await client.query('DELETE FROM staff_sync_change_log WHERE tenant_id = $1', [tenantA]); - await client.query('DELETE FROM staff_sync_devices WHERE tenant_id = $1', [tenantA]); - await client.query('DELETE FROM staff_notification_deliveries WHERE id = $1', [deliveryIdA]); - await client.query('DELETE FROM staff_push_subscriptions WHERE id = $1', [subscriptionIdA]); - await client.query('DELETE FROM staff_outbox WHERE id = $1', [eventId]); - await client.query('DELETE FROM staff_professions WHERE id = $1', [professionId]); - await client.query('DELETE FROM staff_employees WHERE id = $1', [employeeIdA]); - }); - await database.close(); + try { + await cleanupAsMigrator(); + } finally { + await database.close(); + } }); it('prevents reads and writes across two tenants', async () => { @@ -253,7 +296,9 @@ describeDatabase('PostgreSQL tenant isolation', () => { }); const cpVisibleToB = await database.tenantTransaction(tenantB, actorB, (client) => - client.query('SELECT device_id FROM staff_sync_device_checkpoints WHERE device_id = $1', [deviceIdA]), + client.query('SELECT device_id FROM staff_sync_device_checkpoints WHERE device_id = $1', [ + deviceIdA, + ]), ); expect(cpVisibleToB.rowCount).toBe(0); From 19a028970d2c4bf4d0a7766342c93f811b3e2de3 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:21:47 +0700 Subject: [PATCH 02/28] =?UTF-8?q?test(integration):=20=D0=BE=D1=87=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=BA=D0=B0=20tenant-isolation=20=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D1=8E=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=20(N5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: 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). --- tests/integration/tenant-isolation.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/integration/tenant-isolation.test.ts b/tests/integration/tenant-isolation.test.ts index d806d26..4f975d1 100644 --- a/tests/integration/tenant-isolation.test.ts +++ b/tests/integration/tenant-isolation.test.ts @@ -296,9 +296,7 @@ describeDatabase('PostgreSQL tenant isolation', () => { }); const cpVisibleToB = await database.tenantTransaction(tenantB, actorB, (client) => - client.query('SELECT device_id FROM staff_sync_device_checkpoints WHERE device_id = $1', [ - deviceIdA, - ]), + client.query('SELECT device_id FROM staff_sync_device_checkpoints WHERE device_id = $1', [deviceIdA]), ); expect(cpVisibleToB.rowCount).toBe(0); From 4f3e5c621ac855084597bbe40d87897c1068f5cb Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:21:48 +0700 Subject: [PATCH 03/28] =?UTF-8?q?style(test):=20prettier=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20tenant-isolation.test.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: файл уже до правки N5 не проходил prettier --check (часть F14); форматирование вынесено в отдельный коммит, чтобы смысловая правка N5 читалась отдельно от шума. --- tests/integration/tenant-isolation.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integration/tenant-isolation.test.ts b/tests/integration/tenant-isolation.test.ts index 4f975d1..d806d26 100644 --- a/tests/integration/tenant-isolation.test.ts +++ b/tests/integration/tenant-isolation.test.ts @@ -296,7 +296,9 @@ describeDatabase('PostgreSQL tenant isolation', () => { }); const cpVisibleToB = await database.tenantTransaction(tenantB, actorB, (client) => - client.query('SELECT device_id FROM staff_sync_device_checkpoints WHERE device_id = $1', [deviceIdA]), + client.query('SELECT device_id FROM staff_sync_device_checkpoints WHERE device_id = $1', [ + deviceIdA, + ]), ); expect(cpVisibleToB.rowCount).toBe(0); From 646e8d4f221d6f9c5f4ecb4ecda3209058104fb5 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:27:59 +0700 Subject: [PATCH 04/28] =?UTF-8?q?test(e2e):=20=D1=81=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=20=D1=81=20=D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=BC=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BE=D0=BC=20?= =?UTF-8?q?=D0=B8=20PostgreSQL=2017?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: 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. --- scripts/test/run-e2e.mjs | 122 +++++++++++++++++++ tests/e2e/00-harness.e2e.ts | 119 +++++++++++++++++++ tests/e2e/harness/client.ts | 86 ++++++++++++++ tests/e2e/harness/context.ts | 41 +++++++ tests/e2e/harness/fixtures.ts | 155 ++++++++++++++++++++++++ tests/e2e/harness/global-setup.ts | 190 ++++++++++++++++++++++++++++++ tests/e2e/known-defects.json | 4 + tests/e2e/vitest.e2e.config.ts | 18 +++ 8 files changed, 735 insertions(+) create mode 100644 scripts/test/run-e2e.mjs create mode 100644 tests/e2e/00-harness.e2e.ts create mode 100644 tests/e2e/harness/client.ts create mode 100644 tests/e2e/harness/context.ts create mode 100644 tests/e2e/harness/fixtures.ts create mode 100644 tests/e2e/harness/global-setup.ts create mode 100644 tests/e2e/known-defects.json create mode 100644 tests/e2e/vitest.e2e.config.ts diff --git a/scripts/test/run-e2e.mjs b/scripts/test/run-e2e.mjs new file mode 100644 index 0000000..bc693ed --- /dev/null +++ b/scripts/test/run-e2e.mjs @@ -0,0 +1,122 @@ +#!/usr/bin/env node +// Запуск e2e с «храповиком» известных дефектов. +// * Сценарии проверяют ПРАВИЛЬНОЕ поведение, поэтому открытые дефекты дают красные тесты. +// * tests/e2e/known-defects.json — список ID, красный цвет которых сейчас ожидаем. +// * exit 0, если: все [HARNESS]-тесты зелёные И каждый красный тест есть в списке +// И ни один ID из списка не стал полностью зелёным (исправленный дефект нужно +// убрать из списка — иначе регрессию потом никто не заметит). +// * --no-known-defects: строгий режим, exit = код vitest (все дефекты красные). +// Полный вывод пишется в tests/e2e/evidence/e2e-run.txt, таблица — в e2e-table.md. +import { spawn } from 'node:child_process'; +import { createWriteStream, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; + +const repoRoot = path.resolve(import.meta.dirname, '../..'); +const evidence = path.join(repoRoot, 'tests/e2e/evidence'); +mkdirSync(evidence, { recursive: true }); +const strict = process.argv.includes('--no-known-defects'); +const jsonPath = path.join(evidence, 'e2e-results.json'); +const logPath = path.join(evidence, 'e2e-run.txt'); +const extra = process.argv.slice(2).filter((arg) => !arg.startsWith('--no-known-defects')); + +const vitestArgs = [ + 'vitest', + 'run', + '--config', + 'tests/e2e/vitest.e2e.config.ts', + '--reporter=verbose', + '--reporter=json', + `--outputFile.json=${jsonPath}`, + ...extra, +]; +const log = createWriteStream(logPath); +log.write(`$ npx ${vitestArgs.join(' ')}\n`); +const exitCode = await new Promise((resolve) => { + const child = spawn('npx', vitestArgs, { cwd: repoRoot, env: process.env }); + for (const stream of [child.stdout, child.stderr]) { + stream.on('data', (chunk) => { + process.stdout.write(chunk); + log.write(chunk); + }); + } + child.on('close', (code) => resolve(code ?? 1)); +}); +log.end(); + +let results; +try { + results = JSON.parse(readFileSync(jsonPath, 'utf8')); +} catch { + console.error('[run-e2e] нет JSON-результатов: стенд не поднялся (см. e2e-run.txt)'); + process.exit(1); +} +const known = strict + ? {} + : JSON.parse(readFileSync(path.join(repoRoot, 'tests/e2e/known-defects.json'), 'utf8')).defects; + +const byId = new Map(); +for (const file of results.testResults) { + for (const test of file.assertionResults) { + const id = /^\[([A-Z0-9-]+)\]/.exec(test.title)?.[1] ?? 'UNTAGGED'; + const entry = byId.get(id) ?? { passed: 0, failed: 0, tests: [] }; + if (test.status === 'passed') entry.passed += 1; + else if (test.status === 'failed') entry.failed += 1; + entry.tests.push({ title: test.title, status: test.status }); + byId.set(id, entry); + } +} + +const problems = []; +// Страховка: в evidence не должно попасть ничего похожего на секреты стенда +// (hex-токены 48/64 символа, токены устройств kstaff_dev_*, URL с паролем). +const secretPatterns = [ + /\b[0-9a-f]{48}\b/, + /\b[0-9a-f]{64}\b/, + /kstaff_dev_[0-9A-Z]{26}_[0-9a-f]{16,}/, + /postgres:\/\/[^\s:@]+:[^\s@]+@/, +]; +for (const name of readdirSync(evidence)) { + const content = readFileSync(path.join(evidence, name), 'utf8'); + for (const pattern of secretPatterns) { + if (pattern.test(content)) + problems.push(`evidence/${name}: найдено похожее на секрет (${pattern})`); + } +} +const rows = []; +for (const [id, entry] of [...byId.entries()].sort()) { + const red = entry.failed > 0; + let verdict; + if (id === 'HARNESS' || id === 'UNTAGGED') { + verdict = red ? 'СТЕНД СЛОМАН' : 'зелёный (позитивный контроль)'; + if (red || id === 'UNTAGGED') problems.push(`${id}: ${red ? 'красный' : 'тест без ID'}`); + } else if (red && known[id]) verdict = 'красный (известный дефект)'; + else if (red) { + verdict = 'красный (НЕ в known-defects)'; + problems.push(`${id}: новый красный тест — регрессия или новый дефект`); + } else if (known[id]) { + verdict = 'зелёный — ИСПРАВЛЕН, уберите из known-defects.json'; + problems.push(`${id}: дефект исправлен, обновите known-defects.json`); + } else verdict = 'зелёный'; + rows.push( + `| ${id} | ${red ? 'RED' : 'GREEN'} | ${entry.passed}/${entry.passed + entry.failed} | ${verdict} |`, + ); +} +for (const id of Object.keys(known)) { + if (!byId.has(id)) problems.push(`${id}: есть в known-defects.json, но сценария нет`); +} +const table = ['| ID | Цвет | Зелёных/всего | Вердикт |', '|---|---|---|---|', ...rows].join('\n'); +writeFileSync(path.join(evidence, 'e2e-table.md'), `${table}\n`); +console.log(`\n[run-e2e] vitest exit=${exitCode}\n${table}`); + +if (strict) { + if (problems.some((p) => p.startsWith('evidence/'))) { + console.error(`\n[run-e2e] FAIL:\n- ${problems.join('\n- ')}`); + process.exit(1); + } + process.exit(exitCode); +} +if (problems.length > 0) { + console.error(`\n[run-e2e] FAIL:\n- ${problems.join('\n- ')}`); + process.exit(1); +} +console.log('\n[run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты'); diff --git a/tests/e2e/00-harness.e2e.ts b/tests/e2e/00-harness.e2e.ts new file mode 100644 index 0000000..b4fd772 --- /dev/null +++ b/tests/e2e/00-harness.e2e.ts @@ -0,0 +1,119 @@ +// [HARNESS] Позитивный контроль стенда: эти тесты обязаны быть зелёными всегда. +// Если они красные — сломан сам стенд, и красные дефектные сценарии ничего не доказывают. +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +import pg from 'pg'; +import { describe, expect, it } from 'vitest'; +import { api, ctx, describeResponse } from './harness/client.js'; + +describe('HARNESS: реальный сервер + PostgreSQL 17', () => { + it('[HARNESS] сервер отвечает live/ready (ready проверяет БД)', async () => { + const live = await api('GET', '/live'); + expect(live.status).toBe(200); + const ready = await api('GET', '/ready'); + expect(ready.status, describeResponse(ready)).toBe(200); + expect(ready.body).toEqual({ status: 'ready' }); + }); + + it('[HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER', async () => { + const client = new pg.Client({ connectionString: ctx().appDatabaseUrl }); + await client.connect(); + try { + const version = await client.query<{ server_version_num: string }>('SHOW server_version_num'); + expect(Number(version.rows[0]!.server_version_num)).toBeGreaterThanOrEqual(170000); + const roles = await client.query<{ + rolname: string; + rolsuper: boolean; + rolbypassrls: boolean; + rolcreaterole: boolean; + }>( + `SELECT rolname, rolsuper, rolbypassrls, rolcreaterole FROM pg_roles + WHERE rolname IN (current_user, 'krona_migrator') ORDER BY rolname`, + ); + expect(roles.rows).toEqual([ + { rolname: 'krona_migrator', rolsuper: false, rolbypassrls: false, rolcreaterole: false }, + { rolname: 'krona_staff_app', rolsuper: false, rolbypassrls: false, rolcreaterole: false }, + ]); + } finally { + await client.end(); + } + }); + + it('[HARNESS] миграции применены мигратором, app-роль не видит schema_migrations', async () => { + const migrator = new pg.Client({ connectionString: ctx().migrationDatabaseUrl }); + await migrator.connect(); + try { + const applied = await migrator.query<{ count: string }>( + 'SELECT count(*)::text AS count FROM schema_migrations', + ); + expect(Number(applied.rows[0]!.count)).toBeGreaterThanOrEqual(11); + } finally { + await migrator.end(); + } + const app = new pg.Client({ connectionString: ctx().appDatabaseUrl }); + await app.connect(); + try { + await expect(app.query('SELECT 1 FROM schema_migrations')).rejects.toThrow( + /permission denied/, + ); + } finally { + await app.end(); + } + }); + + it('[HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200', async () => { + expect((await api('GET', '/portal')).status).toBe(401); + expect((await api('GET', '/portal', { token: 'x'.repeat(64) })).status).toBe(401); + const ok = await api('GET', '/portal', { token: ctx().managerToken }); + expect(ok.status, describeResponse(ok)).toBe(200); + expect(ok.body.viewer.role).toBe('manager'); + }); + + it('[HARNESS] терминал: отметка сотрудника из импорта принимается (201)', async () => { + const { importEmployees, clock, daysAgo } = await import('./harness/fixtures.js'); + const [employee] = await importEmployees(1); + const response = await clock(employee!.id, 'check_in', daysAgo(1)); + expect(response.status, describeResponse(response)).toBe(201); + }); + + // [CTRL] Позитивные контроли безопасности, которые аудит признал рабочими: они + // должны оставаться зелёными и доказывают, что сценарии умеют быть зелёными. + it('[CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя', async () => { + const { importEmployees, issueEmployeeToken } = await import('./harness/fixtures.js'); + const [self, other] = await importEmployees(2); + const employeeToken = await issueEmployeeToken(self!.id); + const terminalPortal = await api('GET', '/portal', { token: ctx().terminalToken }); + const terminalCreate = await api('POST', '/employees', { + token: ctx().terminalToken, + body: { personnel_number: 'E2E-CTRL', display_name: 'E2E-CTRL' }, + }); + const own = await api('GET', '/portal', { token: employeeToken }); + const rows = (own.body?.employees ?? []) as Array<{ id: string }>; + const ids = rows.map((row) => row.id); + expect({ + terminalPortal: terminalPortal.status, + terminalCreate: terminalCreate.status, + own: own.status, + seesSelf: ids.includes(self!.id), + seesOther: ids.includes(other!.id), + }).toEqual({ + terminalPortal: 403, + terminalCreate: 403, + own: 200, + seesSelf: true, + seesOther: false, + }); + }); + + it('[CTRL] уволенный сотрудник теряет доступ (401)', async () => { + const { importEmployees, issueEmployeeToken } = await import('./harness/fixtures.js'); + const [employee] = await importEmployees(1); + const employeeToken = await issueEmployeeToken(employee!.id); + expect((await api('GET', '/portal', { token: employeeToken })).status).toBe(200); + const dismiss = await api('PATCH', `/employees/${employee!.id}`, { + token: ctx().managerToken, + body: { status: 'dismissed' }, + }); + expect(dismiss.status, describeResponse(dismiss)).toBe(200); + expect((await api('GET', '/portal', { token: employeeToken })).status).toBe(401); + }); +}); diff --git a/tests/e2e/harness/client.ts b/tests/e2e/harness/client.ts new file mode 100644 index 0000000..78be9ba --- /dev/null +++ b/tests/e2e/harness/client.ts @@ -0,0 +1,86 @@ +// HTTP-клиент e2e. Тело ответа типизировано как `any` намеренно: тесты проверяют +// внешний контракт JSON, а не типы src/. Правила no-unsafe-* отключены только здесь +// и в файлах сценариев. +/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment */ +import pg from 'pg'; +import { inject } from 'vitest'; +import type { E2EContext } from './context.js'; + +export interface ApiResponse { + status: number; + body: any; + text: string; + headers: Headers; +} + +export interface RequestOptions { + token?: string | undefined; + body?: unknown; + headers?: Record; + base?: 'secured' | 'open' | 'ratelimit'; +} + +export function ctx(): E2EContext { + return inject('e2e'); +} + +export async function api( + method: string, + path: string, + options: RequestOptions = {}, +): Promise { + const context = ctx(); + const base = + options.base === 'open' + ? context.openBaseUrl + : options.base === 'ratelimit' + ? context.rateLimitBaseUrl + : context.baseUrl; + const headers: Record = { ...(options.headers ?? {}) }; + if (options.token) headers.authorization = `Bearer ${options.token}`; + let payload: string | undefined; + if (options.body !== undefined) { + headers['content-type'] = 'application/json'; + payload = JSON.stringify(options.body); + } + const url = path.startsWith('/api/') || path.startsWith('/staff') ? path : `/api/v1/staff${path}`; + const response = await fetch(`${base}${url}`, { + method, + headers, + ...(payload === undefined ? {} : { body: payload }), + redirect: 'manual', + }); + const text = await response.text(); + let body: any = null; + try { + body = text ? JSON.parse(text) : null; + } catch { + body = null; + } + return { status: response.status, body, text, headers: response.headers }; +} + +/** Краткое описание ответа для сообщений assert (без токенов). */ +export function describeResponse(response: ApiResponse): string { + const snippet = response.text.length > 300 ? `${response.text.slice(0, 300)}…` : response.text; + return `HTTP ${response.status} ${snippet}`; +} + +/** Запрос к БД ролью приложения внутри tenant-транзакции (RLS действует). */ +export async function dbQuery>( + sql: string, + params: unknown[] = [], +): Promise { + const context = ctx(); + const client = new pg.Client({ connectionString: context.appDatabaseUrl }); + await client.connect(); + try { + await client.query('BEGIN'); + await client.query("SELECT set_config('app.tenant_id', $1, true)", [context.tenantId]); + const result = await client.query(sql, params); + await client.query('COMMIT'); + return result.rows; + } finally { + await client.end(); + } +} diff --git a/tests/e2e/harness/context.ts b/tests/e2e/harness/context.ts new file mode 100644 index 0000000..8e9dfcc --- /dev/null +++ b/tests/e2e/harness/context.ts @@ -0,0 +1,41 @@ +import { randomBytes } from 'node:crypto'; + +export interface E2EContext { + baseUrl: string; + openBaseUrl: string; + rateLimitBaseUrl: string; + managerToken: string; + terminalToken: string; + tenantId: string; + actorId: string; + terminalActorId: string; + appDatabaseUrl: string; + migrationDatabaseUrl: string; +} + +declare module 'vitest' { + export interface ProvidedContext { + e2e: E2EContext; + } +} + +const crockford = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; + +/** Случайный ULID (время + crypto.randomBytes), чтобы не зависеть от src/. */ +export function randomUlid(): string { + let time = Date.now(); + let timePart = ''; + for (let i = 0; i < 10; i += 1) { + timePart = crockford[time % 32]! + timePart; + time = Math.floor(time / 32); + } + const bytes = randomBytes(16); + let randomPart = ''; + for (let i = 0; i < 16; i += 1) randomPart += crockford[bytes[i]! % 32]!; + return timePart + randomPart; +} + +/** Синтетическая метка для данных тестов: очевидно не реальные люди/суммы. */ +export function synthetic(label: string): string { + return `E2E-${label}-${randomBytes(3).toString('hex')}`; +} diff --git a/tests/e2e/harness/fixtures.ts b/tests/e2e/harness/fixtures.ts new file mode 100644 index 0000000..cafcd4f --- /dev/null +++ b/tests/e2e/harness/fixtures.ts @@ -0,0 +1,155 @@ +// Подготовка данных через публичный API. Везде только синтетические данные. +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +import { expect } from 'vitest'; +import { api, ctx, dbQuery, describeResponse } from './client.js'; +import { randomUlid, synthetic } from './context.js'; + +export interface OrgUnit { + id: string; + code: string; +} + +export interface Employee { + id: string; + external_ref: string; + personnel_number: string; +} + +/** Создаёт торговые точки через импорт (единственный публичный способ в текущем API). */ +export async function createOrgUnits(count: number): Promise { + const units = Array.from({ length: count }, () => { + const code = `e2e-${randomUlid().slice(-10).toLowerCase()}`; + return { code, name: synthetic('Точка') }; + }); + const response = await api('POST', '/imports/owner-workbook', { + token: ctx().managerToken, + body: { source_name: synthetic('import-units'), units }, + }); + expect(response.status, describeResponse(response)).toBeLessThan(300); + const rows = await dbQuery<{ id: string; code: string }>( + 'SELECT id, code FROM staff_org_units WHERE code = ANY($1::text[])', + [units.map((unit) => unit.code)], + ); + return units.map((unit) => ({ + code: unit.code, + id: rows.find((row) => row.code === unit.code)!.id, + })); +} + +/** + * Создаёт сотрудников через импорт книги владельца: POST /employees на реальной БД + * сейчас падает (N1), а сценарии, не относящиеся к N1, не должны зависеть от этого дефекта. + */ +export async function importEmployees(count: number): Promise { + const employees = Array.from({ length: count }, () => { + const suffix = randomUlid().slice(-8); + return { + external_ref: `e2e:${suffix}`, + personnel_number: `E2E-${suffix}`, + display_name: synthetic('Сотрудник'), + }; + }); + const response = await api('POST', '/imports/owner-workbook', { + token: ctx().managerToken, + body: { source_name: synthetic('import-employees'), employees }, + }); + expect(response.status, describeResponse(response)).toBeLessThan(300); + const rows = await dbQuery<{ id: string; external_ref: string }>( + 'SELECT id, external_ref FROM staff_employees WHERE external_ref = ANY($1::text[])', + [employees.map((employee) => employee.external_ref)], + ); + return employees.map((employee) => ({ + ...employee, + id: rows.find((row) => row.external_ref === employee.external_ref)!.id, + })); +} + +export async function issueEmployeeToken(employeeId: string): Promise { + const response = await api('POST', `/employees/${employeeId}/access-token`, { + token: ctx().managerToken, + }); + expect(response.status, describeResponse(response)).toBe(200); + return response.body.access_token as string; +} + +export async function clock( + employeeId: string, + eventType: 'check_in' | 'check_out', + occurredAt: Date, + orgUnitId?: string, +) { + return api('POST', '/attendance/events', { + token: ctx().terminalToken, + body: { + employee_id: employeeId, + event_type: eventType, + occurred_at: occurredAt.toISOString(), + source_event_id: `e2e-${randomUlid()}`, + ...(orgUnitId ? { org_unit_id: orgUnitId } : {}), + }, + }); +} + +/** Дата (UTC) N дней назад в полдень: всегда в окне терминала (<=180 дней) и не в будущем. */ +export function daysAgo(days: number, hourUtc = 9): Date { + const date = new Date(); + date.setUTCDate(date.getUTCDate() - days); + date.setUTCHours(hourUtc, 0, 0, 0); + return date; +} + +export function isoDate(date: Date): string { + return date.toISOString().slice(0, 10); +} + +/** Отработанная смена: check_in/check_out терминалом + сверка; возвращает id смены. */ +export async function workedShift( + employeeId: string, + orgUnitId: string, + day: Date, + hours = 8, +): Promise { + const start = new Date(day); + const end = new Date(start.getTime() + hours * 3_600_000); + const inResponse = await clock(employeeId, 'check_in', start, orgUnitId); + expect(inResponse.status, describeResponse(inResponse)).toBe(201); + const outResponse = await clock(employeeId, 'check_out', end, orgUnitId); + expect(outResponse.status, describeResponse(outResponse)).toBe(201); + const reconcile = await api('POST', '/work-sessions/reconcile', { + token: ctx().managerToken, + body: { date_from: isoDate(start), date_to: isoDate(start) }, + }); + expect(reconcile.status, describeResponse(reconcile)).toBe(200); + const rows = await dbQuery<{ id: string }>( + `SELECT id FROM staff_work_sessions + WHERE employee_id = $1 AND org_unit_id = $2 AND business_date = $3::date`, + [employeeId, orgUnitId, isoDate(start)], + ); + expect(rows.length, 'сверка должна создать смену').toBe(1); + return rows[0]!.id; +} + +export async function hourlyRuleId(): Promise { + const response = await api('GET', '/pay-rules', { token: ctx().managerToken }); + expect(response.status, describeResponse(response)).toBe(200); + const rules = response.body.pay_rules as Array<{ id: string; code: string }>; + const hourly = rules.find((rule) => rule.code === 'hourly') ?? rules[0]; + expect(hourly, 'должно существовать хотя бы одно правило оплаты').toBeTruthy(); + return hourly!.id; +} + +/** Синтетическая ставка 123,45 ₽/ч (заведомо не реальная сумма). */ +export const SYNTHETIC_RATE_MINOR = 12_345; + +export async function assignHourly(employeeId: string, orgUnitId: string | null) { + const response = await api('PUT', `/employees/${employeeId}/pay-assignment`, { + token: ctx().managerToken, + body: { + pay_rule_id: await hourlyRuleId(), + org_unit_id: orgUnitId, + rate_minor: SYNTHETIC_RATE_MINOR, + effective_from: '2026-01-01', + }, + }); + expect(response.status, describeResponse(response)).toBe(200); +} diff --git a/tests/e2e/harness/global-setup.ts b/tests/e2e/harness/global-setup.ts new file mode 100644 index 0000000..5258209 --- /dev/null +++ b/tests/e2e/harness/global-setup.ts @@ -0,0 +1,190 @@ +// Глобальная подготовка e2e: реальная PostgreSQL 17, миграции ролью мигратора +// (без SUPERUSER), реальный процесс сервера под ролью приложения, случайные секреты. +import { spawn, spawnSync, type ChildProcess } from 'node:child_process'; +import { randomBytes } from 'node:crypto'; +import { createWriteStream, mkdirSync, mkdtempSync, readFileSync, rmSync } from 'node:fs'; +import { createServer } from 'node:net'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import type { TestProject } from 'vitest/node'; +import { randomUlid, type E2EContext } from './context.js'; + +const repoRoot = path.resolve(import.meta.dirname, '../../..'); +const evidenceDir = path.join(repoRoot, 'tests/e2e/evidence'); + +function parseEnvFile(file: string): Record { + const result: Record = {}; + for (const line of readFileSync(file, 'utf8').split('\n')) { + const index = line.indexOf('='); + if (index > 0) result[line.slice(0, index)] = line.slice(index + 1); + } + return result; +} + +async function freePort(): Promise { + return new Promise((resolve, reject) => { + const server = createServer(); + server.once('error', reject); + server.listen(0, '127.0.0.1', () => { + const address = server.address(); + const port = typeof address === 'object' && address ? address.port : 0; + server.close(() => resolve(port)); + }); + }); +} + +function runNode(args: string[], env: NodeJS.ProcessEnv, label: string) { + const result = spawnSync(process.execPath, args, { cwd: repoRoot, env, encoding: 'utf8' }); + const output = `${result.stdout}${result.stderr}`; + console.log(`[e2e] ${label}:\n${output.trim()}`); + if (result.status !== 0) throw new Error(`${label} failed with exit ${result.status}`); + return output; +} + +function vapidEnv(): Record { + const output = spawnSync(process.execPath, ['scripts/generate-vapid-keys.mjs'], { + cwd: repoRoot, + encoding: 'utf8', + }).stdout; + const env: Record = {}; + for (const line of output.split('\n')) { + const index = line.indexOf('='); + if (index > 0) env[line.slice(0, index)] = line.slice(index + 1); + } + return env; +} + +interface StartedServer { + child: ChildProcess; + baseUrl: string; +} + +async function startServer(name: string, env: Record): Promise { + const port = await freePort(); + const logPath = path.join(evidenceDir, `server-${name}.txt`); + const log = createWriteStream(logPath, { flags: 'w' }); + const tsx = path.join(repoRoot, 'node_modules/.bin/tsx'); + const child = spawn(tsx, ['src/server.ts'], { + cwd: repoRoot, + env: { + PATH: process.env.PATH ?? '', + NODE_ENV: 'test', + HOST: '127.0.0.1', + PORT: String(port), + LOG_LEVEL: 'info', + STAFF_RUNTIME_MODE: 'standalone', + ...env, + }, + stdio: ['ignore', 'pipe', 'pipe'], + }); + child.stdout?.pipe(log); + child.stderr?.pipe(log); + const baseUrl = `http://127.0.0.1:${port}`; + const deadline = Date.now() + 60_000; + while (Date.now() < deadline) { + if (child.exitCode !== null) { + throw new Error(`server ${name} exited early with ${child.exitCode}; see ${logPath}`); + } + try { + const response = await fetch(`${baseUrl}/api/v1/staff/ready`); + if (response.status === 200) { + console.log( + `[e2e] server ${name} ready at ${baseUrl} (log: ${path.relative(repoRoot, logPath)})`, + ); + return { child, baseUrl }; + } + } catch { + // сервер ещё не слушает порт + } + await new Promise((resolve) => setTimeout(resolve, 250)); + } + child.kill('SIGKILL'); + throw new Error(`server ${name} did not become ready; see ${logPath}`); +} + +export default async function setup(project: TestProject) { + mkdirSync(evidenceDir, { recursive: true }); + const adminUrl = process.env.E2E_PG_ADMIN_URL; + if (!adminUrl) { + throw new Error( + 'E2E_PG_ADMIN_URL не задан: нужен bootstrap-админ PostgreSQL 17 (только для создания ролей и БД)', + ); + } + const database = process.env.E2E_DATABASE_NAME ?? 'krona_staff_e2e'; + const secretsDir = mkdtempSync(path.join(tmpdir(), 'krona-e2e-')); + const envFile = path.join(secretsDir, 'db.env'); + runNode( + ['scripts/test/provision-pg.mjs', '--out', envFile, '--db', database], + { ...process.env, E2E_PG_ADMIN_URL: adminUrl }, + 'provision', + ); + const dbEnv = parseEnvFile(envFile); + rmSync(secretsDir, { recursive: true, force: true }); + const migrationUrl = dbEnv.DATABASE_MIGRATION_URL; + const appUrl = dbEnv.DATABASE_URL; + if (!migrationUrl || !appUrl) throw new Error('provision did not produce connection URLs'); + + const migrationMode = process.env.E2E_MIGRATIONS ?? 'up'; + runNode( + ['scripts/test/migrate-roundtrip.mjs', migrationMode === 'roundtrip' ? 'roundtrip' : 'up'], + { PATH: process.env.PATH ?? '', DATABASE_MIGRATION_URL: migrationUrl }, + `migrations (${migrationMode}) as krona_migrator`, + ); + + const tenantId = randomUlid(); + const actorId = randomUlid(); + const terminalActorId = randomUlid(); + const managerToken = randomBytes(32).toString('hex'); + const terminalToken = randomBytes(32).toString('hex'); + const common = { + DATABASE_URL: appUrl, + STANDALONE_TENANT_ID: tenantId, + STANDALONE_ACTOR_ID: actorId, + ...vapidEnv(), + }; + const secured = await startServer('secured', { + ...common, + STANDALONE_ACCESS: 'employee', + STANDALONE_MANAGER_TOKEN: managerToken, + STANDALONE_TERMINAL_TOKEN: terminalToken, + STANDALONE_TERMINAL_ACTOR_ID: terminalActorId, + }); + // Второй процесс без токенов (как корневой compose.yaml), тот же tenant и БД: для F2/K-сценариев. + const open = await startServer('no-tokens', { + ...common, + STANDALONE_ACCESS: 'manager', + }); + + // Третий процесс с собственными токенами только для F4 (перебор входа): если rate limit + // появится, он не должен блокировать вход в остальных сценариях с того же IP. + const rateLimited = await startServer('rate-limit', { + ...common, + STANDALONE_ACCESS: 'employee', + STANDALONE_MANAGER_TOKEN: randomBytes(32).toString('hex'), + STANDALONE_TERMINAL_TOKEN: randomBytes(32).toString('hex'), + }); + + const context: E2EContext = { + baseUrl: secured.baseUrl, + openBaseUrl: open.baseUrl, + rateLimitBaseUrl: rateLimited.baseUrl, + managerToken, + terminalToken, + tenantId, + actorId, + terminalActorId, + appDatabaseUrl: appUrl, + migrationDatabaseUrl: migrationUrl, + }; + project.provide('e2e', context); + + return async () => { + for (const server of [secured, open, rateLimited]) { + server.child.kill('SIGTERM'); + } + await new Promise((resolve) => setTimeout(resolve, 500)); + for (const server of [secured, open, rateLimited]) { + if (server.child.exitCode === null) server.child.kill('SIGKILL'); + } + }; +} diff --git a/tests/e2e/known-defects.json b/tests/e2e/known-defects.json new file mode 100644 index 0000000..dad4691 --- /dev/null +++ b/tests/e2e/known-defects.json @@ -0,0 +1,4 @@ +{ + "comment": "ID сценариев, красный цвет которых сейчас ожидаем (открытые дефекты или ещё не реализованные решения владельца). Когда дефект исправлен и все тесты ID зелёные, scripts/test/run-e2e.mjs падает, пока ID не убран отсюда. Добавлять ID сюда можно только вместе с записью в REPORT.md.", + "defects": {} +} diff --git a/tests/e2e/vitest.e2e.config.ts b/tests/e2e/vitest.e2e.config.ts new file mode 100644 index 0000000..e2c1648 --- /dev/null +++ b/tests/e2e/vitest.e2e.config.ts @@ -0,0 +1,18 @@ +import { fileURLToPath } from 'node:url'; +import { defineConfig } from 'vitest/config'; + +// Отдельный конфиг: e2e-файлы названы *.e2e.ts и не попадают в `npm test` +// (корневой vitest ищет только *.test.ts), поэтому `npm run check` не зависит от +// живой PostgreSQL и от известных открытых дефектов. +const root = fileURLToPath(new URL('../..', import.meta.url)); + +export default defineConfig({ + root, + test: { + include: ['tests/e2e/**/*.e2e.ts'], + globalSetup: ['tests/e2e/harness/global-setup.ts'], + fileParallelism: false, + testTimeout: 60_000, + hookTimeout: 180_000, + }, +}); From 397954be0aa2e00fab816d79a82a66c229312356 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:27:59 +0700 Subject: [PATCH 05/28] =?UTF-8?q?test(e2e):=20=D1=81=D1=86=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=B4=D0=B5=D1=84=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20API=20(N1-N4,=20N9-N12,=20F2-F4,=20F7,=20F10)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: каждый открытый дефект аудита должен иметь исполняемый сценарий на реальной БД, который проверяет ПРАВИЛЬНОЕ поведение. Тогда красный тест = открытый дефект, а исправление видно по смене цвета, без ручной перепроверки. - N1 POST /employees -> 201; N2 подтверждение смены, расчёт, утверждение и сумма начисления 8 ч x синтетическая ставка; N4 пересекающиеся периоды не начисляют смену дважды (сейчас блокирован N2 — это видно в сообщении assert как «предусловие, см. N2»); - N3 SSRF: подписка на https://127.0.0.1:<порт> должна отклоняться, и локальный слушатель не должен получить соединение; - N9, N12, N10, N11, F2 (процесс без токенов), F3, F4 (отдельный процесс), F7, F10. Сотрудники для сценариев, не относящихся к N1, создаются импортом, чтобы один дефект не маскировал остальные. Все данные синтетические (E2E-*), ставка 123,45 ₽/ч заведомо не реальная. --- tests/e2e/10-core-defects.e2e.ts | 326 +++++++++++++++++++++++++++++++ tests/e2e/known-defects.json | 16 +- 2 files changed, 341 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/10-core-defects.e2e.ts diff --git a/tests/e2e/10-core-defects.e2e.ts b/tests/e2e/10-core-defects.e2e.ts new file mode 100644 index 0000000..d2d8d74 --- /dev/null +++ b/tests/e2e/10-core-defects.e2e.ts @@ -0,0 +1,326 @@ +// Сценарии дефектов основного API (ID из аудита Grok 2026-09-26; сопоставление с ID +// владельца — в REPORT.md). Каждый тест проверяет ПРАВИЛЬНОЕ поведение, поэтому +// красный тест = открытый дефект. +/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */ +import { createECDH, randomBytes } from 'node:crypto'; +import { createServer, type Server } from 'node:net'; +import { describe, expect, it } from 'vitest'; +import { api, ctx, dbQuery, describeResponse } from './harness/client.js'; +import { randomUlid, synthetic } from './harness/context.js'; +import { + SYNTHETIC_RATE_MINOR, + assignHourly, + clock, + createOrgUnits, + daysAgo, + hourlyRuleId, + importEmployees, + isoDate, + issueEmployeeToken, + workedShift, +} from './harness/fixtures.js'; + +function pushKeys() { + const ecdh = createECDH('prime256v1'); + ecdh.generateKeys(); + return { + p256dh: ecdh.getPublicKey().toString('base64url'), + auth: randomBytes(16).toString('base64url'), + }; +} + +function monthOf(date: Date): string { + return date.toISOString().slice(0, 7); +} + +async function accrualsFor(employeeId: string) { + return dbQuery<{ amount_minor: string; ref_id: string }>( + `SELECT amount_minor::text AS amount_minor, ref_id FROM staff_payroll_ledger + WHERE employee_id = $1 AND kind = 'accrual'`, + [employeeId], + ); +} + +describe('Основной API на реальной PostgreSQL', () => { + it('[N1] менеджер создаёт сотрудника через POST /employees → 201', async () => { + const number = `E2E-${randomUlid().slice(-8)}`; + const response = await api('POST', '/employees', { + token: ctx().managerToken, + body: { + personnel_number: number, + display_name: synthetic('Сотрудник'), + position: 'E2E-должность', + }, + }); + expect(response.status, describeResponse(response)).toBe(201); + const rows = await dbQuery('SELECT id FROM staff_employees WHERE personnel_number = $1', [ + number, + ]); + expect(rows).toHaveLength(1); + }); + + it('[N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка', async () => { + const [unit] = await createOrgUnits(1); + const [employee] = await importEmployees(1); + await assignHourly(employee!.id, unit!.id); + const day = daysAgo(3); + const sessionId = await workedShift(employee!.id, unit!.id, day, 8); + + const confirm = await api('PATCH', `/work-sessions/${sessionId}`, { + token: ctx().managerToken, + body: { status: 'confirmed' }, + }); + expect(confirm.status, `подтверждение смены: ${describeResponse(confirm)}`).toBe(200); + + const calculate = await api('POST', '/payroll/calculate', { + token: ctx().managerToken, + body: { month: monthOf(day), org_unit_id: unit!.id }, + }); + expect(calculate.status, `расчёт: ${describeResponse(calculate)}`).toBe(200); + const runId = (calculate.body.run_id ?? calculate.body.id ?? calculate.body.run?.id) as string; + const approve = await api('POST', `/payroll/runs/${runId}/approve`, { + token: ctx().managerToken, + }); + expect(approve.status, `утверждение: ${describeResponse(approve)}`).toBe(200); + + const accruals = await accrualsFor(employee!.id); + const total = accruals.reduce((sum, row) => sum + BigInt(row.amount_minor), 0n); + expect(total).toBe(BigInt(8 * SYNTHETIC_RATE_MINOR)); + }); + + it('[N4] пересекающиеся расчёты не начисляют одну смену дважды', async () => { + const [unit] = await createOrgUnits(1); + const [employee] = await importEmployees(1); + await assignHourly(employee!.id, unit!.id); + const day = daysAgo(2); + const sessionId = await workedShift(employee!.id, unit!.id, day, 8); + const confirm = await api('PATCH', `/work-sessions/${sessionId}`, { + token: ctx().managerToken, + body: { status: 'confirmed' }, + }); + expect( + confirm.status, + `подтверждение смены (предусловие, см. N2): ${describeResponse(confirm)}`, + ).toBe(200); + + const month = monthOf(day); + const first = await api('POST', '/payroll/calculate', { + token: ctx().managerToken, + body: { month, org_unit_id: unit!.id }, + }); + expect(first.status, `первый расчёт (предусловие, см. N2): ${describeResponse(first)}`).toBe( + 200, + ); + const firstRun = (first.body.run_id ?? first.body.id) as string; + expect( + (await api('POST', `/payroll/runs/${firstRun}/approve`, { token: ctx().managerToken })) + .status, + ).toBe(200); + + const lastDay = new Date(Date.UTC(day.getUTCFullYear(), day.getUTCMonth() + 1, 0)); + const secondFrom = new Date(Date.UTC(day.getUTCFullYear(), day.getUTCMonth(), 2)); + const second = await api('POST', '/payroll/calculate', { + token: ctx().managerToken, + body: { from: isoDate(secondFrom), to: isoDate(lastDay), org_unit_id: unit!.id }, + }); + if (second.status === 200) { + const secondRun = (second.body.run_id ?? second.body.id) as string; + await api('POST', `/payroll/runs/${secondRun}/approve`, { token: ctx().managerToken }); + } else { + expect(second.status, describeResponse(second)).toBe(409); + } + const accruals = await accrualsFor(employee!.id); + const total = accruals.reduce((sum, row) => sum + BigInt(row.amount_minor), 0n); + expect(total, 'смена должна быть начислена ровно один раз').toBe( + BigInt(8 * SYNTHETIC_RATE_MINOR), + ); + }); + + it('[N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1', async () => { + const [employee] = await importEmployees(1); + const employeeToken = await issueEmployeeToken(employee!.id); + let connections = 0; + const listener: Server = createServer((socket) => { + connections += 1; + socket.destroy(); + }); + await new Promise((resolve) => listener.listen(0, '127.0.0.1', resolve)); + const address = listener.address(); + const port = typeof address === 'object' && address ? address.port : 0; + try { + const subscribe = await api('POST', '/push/subscriptions', { + token: employeeToken, + body: { endpoint: `https://127.0.0.1:${port}/e2e-internal-admin`, keys: pushKeys() }, + }); + // Инициируем отправку push этому сотруднику (отметка терминала) и ждём попытку соединения. + await clock(employee!.id, 'check_in', daysAgo(0, 0)); + await new Promise((resolve) => setTimeout(resolve, 2_500)); + expect( + { status: subscribe.status, connections }, + `подписка: ${describeResponse(subscribe)}`, + ).toEqual({ + status: expect.toSatisfy((s: number) => s === 400 || s === 422 || s === 403), + connections: 0, + }); + } finally { + listener.close(); + } + }); + + it('[N9] чужой push-endpoint нельзя перепривязать к другому сотруднику', async () => { + const [employeeA, employeeB] = await importEmployees(2); + const tokenA = await issueEmployeeToken(employeeA!.id); + const tokenB = await issueEmployeeToken(employeeB!.id); + const endpoint = `https://fcm.googleapis.com/fcm/send/e2e-${randomBytes(16).toString('hex')}`; + const first = await api('POST', '/push/subscriptions', { + token: tokenA, + body: { endpoint, keys: pushKeys() }, + }); + expect(first.status, describeResponse(first)).toBe(201); + const second = await api('POST', '/push/subscriptions', { + token: tokenB, + body: { endpoint, keys: pushKeys() }, + }); + const owner = await dbQuery<{ employee_id: string }>( + 'SELECT employee_id FROM staff_push_subscriptions WHERE endpoint = $1', + [endpoint], + ); + expect( + { status: second.status, owner: owner.map((row) => row.employee_id) }, + describeResponse(second), + ).toEqual({ + status: expect.toSatisfy((s: number) => s === 409 || s === 403), + owner: [employeeA!.id], + }); + }); + + it('[N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400)', async () => { + const [employee] = await importEmployees(1); + const payRuleId = await hourlyRuleId(); + const extra = await api('PUT', `/employees/${employee!.id}/pay-assignment`, { + token: ctx().managerToken, + body: { pay_rule_id: payRuleId, rate_minor: SYNTHETIC_RATE_MINOR, e2e_unexpected_field: 'x' }, + }); + const huge = await api('PUT', `/employees/${employee!.id}/pay-assignment`, { + token: ctx().managerToken, + body: { + pay_rule_id: payRuleId, + rate_minor: Number.MAX_SAFE_INTEGER, + guarantee_minor: Number.MAX_SAFE_INTEGER, + }, + }); + expect( + { extra: extra.status, huge: huge.status }, + `${describeResponse(extra)} | ${describeResponse(huge)}`, + ).toEqual({ + extra: 400, + huge: 400, + }); + }); + + it('[N10] терминальный токен не читает справочники профессий и точек (403)', async () => { + const professions = await api('GET', '/professions', { token: ctx().terminalToken }); + const units = await api('GET', '/org-units', { token: ctx().terminalToken }); + expect({ professions: professions.status, units: units.status }).toEqual({ + professions: 403, + units: 403, + }); + }); + + it('[F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)', async () => { + const portal = await api('GET', '/portal', { base: 'open' }); + const payroll = await api('GET', '/payroll', { base: 'open' }); + const write = await api('POST', '/professions', { + base: 'open', + body: { name: synthetic('Профессия') }, + }); + expect({ portal: portal.status, payroll: payroll.status, write: write.status }).toEqual({ + portal: 401, + payroll: 401, + write: 401, + }); + }); + + it('[F3] cookie сессии не содержит сырой токен и отзывается при выходе', async () => { + const login = await api('POST', '/session', { body: { access_token: ctx().managerToken } }); + expect(login.status, describeResponse(login)).toBe(200); + const setCookie = login.headers.get('set-cookie') ?? ''; + const value = decodeURIComponent( + /__Host-krona_staff_session=([^;]*)/.exec(setCookie)?.[1] ?? '', + ); + const cookie = `__Host-krona_staff_session=${encodeURIComponent(value)}`; + const logout = await api('DELETE', '/session', { headers: { cookie } }); + expect(logout.status).toBe(204); + const reuse = await api('GET', '/portal', { headers: { cookie } }); + expect({ rawTokenInCookie: value === ctx().managerToken, afterLogout: reuse.status }).toEqual({ + rawTokenInCookie: false, + afterLogout: 401, + }); + }); + + it('[F10] мутация по cookie без Origin отклоняется (CSRF, 403)', async () => { + const login = await api('POST', '/session', { body: { access_token: ctx().managerToken } }); + const setCookie = login.headers.get('set-cookie') ?? ''; + const cookie = /(__Host-krona_staff_session=[^;]*)/.exec(setCookie)?.[1] ?? ''; + const response = await api('POST', '/professions', { + headers: { cookie }, + body: { name: synthetic('CSRF-профессия') }, + }); + expect(response.status, describeResponse(response)).toBe(403); + }); + + it('[F7] повтор Idempotency-Key с другим телом не создаёт второе событие', async () => { + const [employee] = await importEmployees(1); + const key = `e2e-${randomUlid()}`; + const send = (sourceEventId: string) => + api('POST', '/attendance/events', { + token: ctx().terminalToken, + headers: { 'idempotency-key': key }, + body: { + employee_id: employee!.id, + event_type: 'check_in', + occurred_at: daysAgo(1).toISOString(), + source_event_id: sourceEventId, + }, + }); + const first = await send(`e2e-${randomUlid()}`); + const second = await send(`e2e-${randomUlid()}`); + expect({ first: first.status, secondCreated: second.status === 201 }).toEqual({ + first: 201, + secondCreated: false, + }); + }); + + it('[N11] импорт с неверным kind начисления → 400, а не 500', async () => { + const [employee] = await importEmployees(1); + const response = await api('POST', '/imports/owner-workbook', { + token: ctx().managerToken, + body: { + source_name: synthetic('import-bad-kind'), + payroll_entries: [ + { + external_key: `e2e-${randomUlid()}`, + employee_external_ref: employee!.external_ref, + business_date: isoDate(daysAgo(1)), + kind: 'e2e_bogus_kind', + amount_minor: 100, + }, + ], + }, + }); + expect(response.status, describeResponse(response)).toBe(400); + }); + + it('[F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)', async () => { + const statuses: number[] = []; + for (let attempt = 0; attempt < 30; attempt += 1) { + const response = await api('POST', '/session', { + base: 'ratelimit', + body: { access_token: randomBytes(32).toString('hex') }, + }); + statuses.push(response.status); + if (response.status === 429) break; + } + expect(statuses.includes(429), `статусы: ${[...new Set(statuses)].join(',')}`).toBe(true); + }); +}); diff --git a/tests/e2e/known-defects.json b/tests/e2e/known-defects.json index dad4691..92eaf60 100644 --- a/tests/e2e/known-defects.json +++ b/tests/e2e/known-defects.json @@ -1,4 +1,18 @@ { "comment": "ID сценариев, красный цвет которых сейчас ожидаем (открытые дефекты или ещё не реализованные решения владельца). Когда дефект исправлен и все тесты ID зелёные, scripts/test/run-e2e.mjs падает, пока ID не убран отсюда. Добавлять ID сюда можно только вместе с записью в REPORT.md.", - "defects": {} + "defects": { + "N1": "POST /employees: 42P08 inconsistent types for $2 на реальной PostgreSQL", + "N2": "подтверждение смены / расчёт / утверждение: staff_outbox.occurred_at NULL (23502)", + "N3": "SSRF через push-endpoint на внутренние адреса", + "N4": "двойное начисление при пересекающихся расчётах (сейчас блокирован N2)", + "N9": "перепривязка чужого push-endpoint", + "N10": "справочники доступны терминалу", + "N11": "импорт с неверным kind → 500", + "N12": "pay-assignment без additionalProperties:false и верхних границ", + "F2": "standalone без токенов даёт права STANDALONE_ACCESS анониму", + "F3": "cookie = сырой токен, logout не отзывает", + "F4": "нет rate limit на вход", + "F7": "Idempotency-Key не используется", + "F10": "CSRF: мутации по cookie без Origin разрешены" + } } From 2548bd7bdfa0a17bbf63573ed9c4ae18f7783df3 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:27:59 +0700 Subject: [PATCH 06/28] =?UTF-8?q?test(e2e):=20=D1=81=D1=86=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BE=D1=84=D0=BB=D0=B0=D0=B9=D0=BD?= =?UTF-8?q?-=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20(/sync/*)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: бэкенд офлайн-синхронизации (миграция 0011) покрыт только юнит-тестами без реальной БД. Сценарии на живом сервере показывают, как терминал реально взаимодействует с сервером, и фиксируют границы доверия к устройству. Проверяется правильное поведение: устройство не подтверждает смены и не утверждает табель сам (SYNC-A/B); начальная загрузка работает (SYNC-C0, сейчас 500 «column status does not exist» — у staff_org_units нет status) и не теряет сущности после 100-й (SYNC-C); правки из портала видны в инкрементальном pull (SYNC-D); отметки уволенных и вне окна времени отклоняются (SYNC-E/J); точка устройства сохраняется, чужая отклоняется (SYNC-F); битая команда не роняет пакет (SYNC-G); CSRF и анонимная регистрация устройств запрещены (SYNC-H/I); ack не принимает курсор из будущего (SYNC-K). SYNC-L — позитивный контроль отзыва. --- tests/e2e/20-sync-defects.e2e.ts | 287 +++++++++++++++++++++++++++++++ tests/e2e/known-defects.json | 14 +- 2 files changed, 300 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/20-sync-defects.e2e.ts diff --git a/tests/e2e/20-sync-defects.e2e.ts b/tests/e2e/20-sync-defects.e2e.ts new file mode 100644 index 0000000..3758c80 --- /dev/null +++ b/tests/e2e/20-sync-defects.e2e.ts @@ -0,0 +1,287 @@ +// Сценарии офлайн-синхронизации (/api/v1/staff/sync/*, миграция 0011). +// Проверяют ПРАВИЛЬНОЕ поведение: красный тест = открытый дефект. +/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call */ +import { createHash } from 'node:crypto'; +import { describe, expect, it } from 'vitest'; +import { api, ctx, dbQuery, describeResponse } from './harness/client.js'; +import { randomUlid, synthetic } from './harness/context.js'; +import { createOrgUnits, daysAgo, importEmployees, isoDate } from './harness/fixtures.js'; + +interface Device { + id: string; + token: string; +} + +async function registerDevice(orgUnitId?: string): Promise { + const response = await api('POST', '/sync/devices', { + token: ctx().managerToken, + body: { + device_code: `E2E-${randomUlid().slice(-10)}`, + name: synthetic('Терминал'), + ...(orgUnitId ? { org_unit_id: orgUnitId } : {}), + }, + }); + expect(response.status, describeResponse(response)).toBe(201); + return { id: response.body.device.id as string, token: response.body.token as string }; +} + +function command(commandType: string, payload: Record) { + return { + command_type: commandType, + schema_version: 1, + idempotency_key: `e2e-${randomUlid()}`, + correlation_id: randomUlid(), + created_at: new Date().toISOString(), + payload, + }; +} + +async function push(device: Device, commands: unknown[]) { + return api('POST', '/sync/push', { token: device.token, body: { commands } }); +} + +async function pullAll(device: Device, cursor: string | null = null) { + const changes: Array<{ entity_type: string; entity_id: string }> = []; + let next: string | null = cursor; + for (let page = 0; page < 50; page += 1) { + const response = await api('POST', '/sync/pull', { + token: device.token, + body: { cursor: next, limit: 100 }, + }); + expect(response.status, describeResponse(response)).toBe(200); + changes.push(...(response.body.changes as Array<{ entity_type: string; entity_id: string }>)); + next = response.body.next_cursor as string; + if (!response.body.has_more) break; + } + return { changes, cursor: next }; +} + +describe('Офлайн-синхронизация на реальной PostgreSQL', () => { + it('[SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)', async () => { + const [unit] = await createOrgUnits(1); + const [employee] = await importEmployees(1); + const device = await registerDevice(unit!.id); + const sessionId = randomUlid(); + const response = await push(device, [ + command('upsert_work_session', { + id: sessionId, + employee_id: employee!.id, + org_unit_id: unit!.id, + business_date: isoDate(daysAgo(1)), + worked_minutes: 600, + status: 'confirmed', + }), + ]); + const stored = await dbQuery<{ status: string }>( + 'SELECT status FROM staff_work_sessions WHERE id = $1', + [sessionId], + ); + expect( + { + http: response.status, + result: response.body?.results?.[0]?.status, + stored: stored[0]?.status ?? null, + }, + describeResponse(response), + ).toEqual({ http: 200, result: 'rejected', stored: null }); + }); + + it('[SYNC-B] устройство не может утвердить табель (status=approved отклоняется)', async () => { + const [employee] = await importEmployees(1); + const device = await registerDevice(); + const entryId = randomUlid(); + const response = await push(device, [ + command('upsert_timesheet_entry', { + id: entryId, + employee_id: employee!.id, + work_date: isoDate(daysAgo(1)), + minutes_worked: 600, + status: 'approved', + }), + ]); + const stored = await dbQuery<{ status: string }>( + 'SELECT status FROM staff_timesheet_entries WHERE id = $1', + [entryId], + ); + expect( + { result: response.body?.results?.[0]?.status, stored: stored[0]?.status ?? null }, + describeResponse(response), + ).toEqual({ result: 'rejected', stored: null }); + }); + + it('[SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200)', async () => { + await createOrgUnits(1); + await importEmployees(1); + const device = await registerDevice(); + const response = await api('POST', '/sync/pull', { + token: device.token, + body: { cursor: null }, + }); + expect(response.status, describeResponse(response)).toBe(200); + const types = new Set( + (response.body.changes as Array<{ entity_type: string }>).map((c) => c.entity_type), + ); + expect(types.has('employee') && types.has('org_unit')).toBe(true); + }); + + it('[SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично', async () => { + const employees = await importEmployees(120); + const device = await registerDevice(); + const { changes } = await pullAll(device, null); + const received = new Set( + changes.filter((c) => c.entity_type === 'employee').map((c) => c.entity_id), + ); + const missing = employees.filter((employee) => !received.has(employee.id)).length; + expect(missing, `не доставлено сотрудников: ${missing} из ${employees.length}`).toBe(0); + }); + + it('[SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull', async () => { + const device = await registerDevice(); + // Курсор берём из /sync/status, чтобы сценарий не зависел от начальной загрузки (SYNC-C0). + const status = await api('GET', '/sync/status', { token: device.token }); + expect(status.status, describeResponse(status)).toBe(200); + const cursor = status.body.latest_cursor as string; + const [employee] = await importEmployees(1); + const patch = await api('PATCH', `/employees/${employee!.id}`, { + token: ctx().managerToken, + body: { display_name: synthetic('Переименован') }, + }); + expect(patch.status, describeResponse(patch)).toBe(200); + const { changes } = await pullAll(device, cursor); + expect(changes.some((c) => c.entity_type === 'employee' && c.entity_id === employee!.id)).toBe( + true, + ); + }); + + it('[SYNC-E] отметка уволенного сотрудника через sync отклоняется', async () => { + const [employee] = await importEmployees(1); + const dismiss = await api('PATCH', `/employees/${employee!.id}`, { + token: ctx().managerToken, + body: { status: 'dismissed' }, + }); + expect(dismiss.status, describeResponse(dismiss)).toBe(200); + const device = await registerDevice(); + const response = await push(device, [ + command('attendance_event', { + employee_id: employee!.id, + event_type: 'check_in', + occurred_at: daysAgo(0, 0).toISOString(), + }), + ]); + expect(response.body?.results?.[0]?.status, describeResponse(response)).toBe('rejected'); + }); + + it('[SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется', async () => { + const [unitA, unitB] = await createOrgUnits(2); + const [employee] = await importEmployees(1); + const device = await registerDevice(unitA!.id); + const own = command('attendance_event', { + employee_id: employee!.id, + event_type: 'check_in', + occurred_at: daysAgo(0, 0).toISOString(), + }); + const foreign = command('attendance_event', { + employee_id: employee!.id, + event_type: 'check_out', + occurred_at: new Date(daysAgo(0, 0).getTime() + 60_000).toISOString(), + org_unit_id: unitB!.id, + }); + const response = await push(device, [own, foreign]); + expect(response.status, describeResponse(response)).toBe(200); + const ownEventId = response.body.results[0]?.result?.event_id as string | undefined; + const stored = await dbQuery<{ org_unit_id: string | null }>( + 'SELECT org_unit_id FROM staff_attendance_events WHERE id = $1', + [ownEventId ?? ''], + ); + expect( + { + ownOrgUnit: stored[0]?.org_unit_id ?? null, + foreign: response.body.results[1]?.status, + }, + describeResponse(response), + ).toEqual({ ownOrgUnit: unitA!.id, foreign: 'rejected' }); + }); + + it('[SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)', async () => { + const [employee] = await importEmployees(1); + const device = await registerDevice(); + const good = command('attendance_event', { + employee_id: employee!.id, + event_type: 'check_in', + occurred_at: daysAgo(0, 0).toISOString(), + }); + const bad = command('attendance_event', { + employee_id: employee!.id, + event_type: 'check_out', + occurred_at: 'e2e-not-a-timestamp', + }); + const response = await push(device, [good, bad]); + expect( + { + http: response.status, + statuses: (response.body?.results ?? []).map((r: { status: string }) => r.status), + }, + describeResponse(response), + ).toEqual({ http: 200, statuses: ['applied', 'rejected'] }); + }); + + it('[SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)', async () => { + const login = await api('POST', '/session', { body: { access_token: ctx().managerToken } }); + const cookie = + /(__Host-krona_staff_session=[^;]*)/.exec(login.headers.get('set-cookie') ?? '')?.[1] ?? ''; + const response = await api('POST', '/sync/devices', { + headers: { cookie, origin: 'https://attacker.e2e.invalid' }, + body: { device_code: `E2E-${randomUlid().slice(-10)}`, name: synthetic('CSRF-терминал') }, + }); + expect(response.status, describeResponse(response)).toBe(403); + }); + + it('[SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)', async () => { + const response = await api('POST', '/sync/devices', { + base: 'open', + body: { + device_code: `E2E-${randomUlid().slice(-10)}`, + name: synthetic('Анонимный терминал'), + }, + }); + expect(response.status, describeResponse(response)).toBe(401); + }); + + it('[SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events', async () => { + const [employee] = await importEmployees(1); + const device = await registerDevice(); + const response = await push(device, [ + command('attendance_event', { + employee_id: employee!.id, + event_type: 'check_in', + occurred_at: '2001-01-01T09:00:00.000Z', + }), + ]); + expect(response.body?.results?.[0]?.status, describeResponse(response)).toBe('rejected'); + }); + + it('[SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400)', async () => { + const device = await registerDevice(); + const tenant = ctx().tenantId; + const seq = '999999999'; + const hash = createHash('sha256') + .update(`${tenant}:${seq}:krona_staff_sync_cursor_salt_v1`) + .digest('hex') + .slice(0, 12); + const response = await api('POST', '/sync/ack', { + token: device.token, + body: { cursor: `cur_${seq}_${hash}` }, + }); + expect(response.status, describeResponse(response)).toBe(400); + }); + + it('[SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль', async () => { + const device = await registerDevice(); + const revoke = await api('POST', `/sync/devices/${device.id}/revoke`, { + token: ctx().managerToken, + }); + expect(revoke.status, describeResponse(revoke)).toBe(200); + const status = await api('GET', '/sync/status', { token: device.token }); + expect(status.status).toBe(403); + }); +}); diff --git a/tests/e2e/known-defects.json b/tests/e2e/known-defects.json index 92eaf60..49a3fc1 100644 --- a/tests/e2e/known-defects.json +++ b/tests/e2e/known-defects.json @@ -13,6 +13,18 @@ "F3": "cookie = сырой токен, logout не отзывает", "F4": "нет rate limit на вход", "F7": "Idempotency-Key не используется", - "F10": "CSRF: мутации по cookie без Origin разрешены" + "F10": "CSRF: мутации по cookie без Origin разрешены", + "SYNC-A": "устройство само подтверждает смену через upsert_work_session", + "SYNC-B": "устройство само утверждает табель через upsert_timesheet_entry", + "SYNC-C0": "начальная загрузка /sync/pull падает 500: column status does not exist (staff_org_units)", + "SYNC-C": "начальная загрузка обрезается на 100 сущностях (сейчас также блокирована SYNC-C0)", + "SYNC-D": "изменения из портала не пишутся в staff_sync_change_log", + "SYNC-E": "отметки уволенных сотрудников принимаются через sync", + "SYNC-F": "sync не сохраняет org_unit_id отметки и принимает чужую точку", + "SYNC-G": "одна битая команда роняет весь пакет (500)", + "SYNC-H": "регистрация устройства по cookie без проверки Origin", + "SYNC-I": "без токенов анонимно регистрируется устройство", + "SYNC-J": "sync принимает отметки вне окна времени", + "SYNC-K": "ack принимает курсор больше выданного сервером" } } From c68370b89071c7578c651b26309b8f51901c8ddb Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:29:47 +0700 Subject: [PATCH 07/28] =?UTF-8?q?test(e2e):=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81?= =?UTF-8?q?=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20json/md=20evidence=20prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: tests/e2e/evidence не входит в .prettierignore (файл вне разрешённых путей), и минифицированный JSON vitest делал бы npm run format:check красным из-за артефактов, а не из-за кода. --- scripts/test/run-e2e.mjs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/test/run-e2e.mjs b/scripts/test/run-e2e.mjs index bc693ed..22949ec 100644 --- a/scripts/test/run-e2e.mjs +++ b/scripts/test/run-e2e.mjs @@ -7,7 +7,7 @@ // убрать из списка — иначе регрессию потом никто не заметит). // * --no-known-defects: строгий режим, exit = код vitest (все дефекты красные). // Полный вывод пишется в tests/e2e/evidence/e2e-run.txt, таблица — в e2e-table.md. -import { spawn } from 'node:child_process'; +import { spawn, spawnSync } from 'node:child_process'; import { createWriteStream, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'; import path from 'node:path'; @@ -106,6 +106,12 @@ for (const id of Object.keys(known)) { } const table = ['| ID | Цвет | Зелёных/всего | Вердикт |', '|---|---|---|---|', ...rows].join('\n'); writeFileSync(path.join(evidence, 'e2e-table.md'), `${table}\n`); +// Сгенерированные json/md приводятся к prettier, чтобы `npm run format:check` не +// краснел из-за evidence (tests/e2e/evidence не в .prettierignore). +spawnSync('npx', ['prettier', '--write', jsonPath, path.join(evidence, 'e2e-table.md')], { + cwd: repoRoot, + stdio: 'ignore', +}); console.log(`\n[run-e2e] vitest exit=${exitCode}\n${table}`); if (strict) { From bc9b29dec853af01256b2c2a0753273e9e23d5c7 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:29:47 +0700 Subject: [PATCH 08/28] =?UTF-8?q?ci:=20PostgreSQL=2017=20=D1=81=20=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8F=D0=BC=D0=B8=20=D0=BA=D0=B0=D0=BA=20=D0=B2=20?= =?UTF-8?q?pilot,=20roundtrip=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B9,=20e2e,=20SHA-=D0=BF=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: прежний CI запускал миграции и тесты под POSTGRES_USER сервиса (суперпользователь), не проверял откат миграций, не запускал e2e на реальной БД, держал плавающие теги actions (F13) и выполнял docker build в контейнере без Docker daemon. - verify: bootstrap-админ сервиса только создаёт роли (provision-pg.mjs, пароли случайные); миграции up -> откат всех -> up -> up (no-op) ролью krona_migrator без SUPERUSER; `npm run check` с DATABASE_TEST_URL (app-роль) и DATABASE_TEST_MIGRATION_URL (очистка, см. N5); npm audit. - format: prettier вынесен в отдельную задачу — он красный по 25 файлам (F14) и не должен маскировать статус verify/e2e. - e2e: реальный сервер + PostgreSQL 17 через scripts/test/run-e2e.mjs. Выбран «храповик» known-defects.json, а не отдельная задача с continue-on-error: так CI зелёный, только если стенд работает и каждый красный сценарий — известный открытый дефект; новый красный сценарий (регрессия) или исправленный, но не вычеркнутый дефект делают задачу красной. continue-on-error скрыл бы и поломку самого стенда. - docker-build: отдельная задача на метке `docker-host` только для push, после verify; без такого раннера она ждёт в очереди, не блокируя остальные. - actions/checkout v4.4.0 и actions/setup-node v4.4.0 закреплены SHA (git ls-remote; одинаковы на github.com и code.forgejo.org). Проверено: actionlint 1.7.12 (метки docker/docker-host объявлены как self-hosted) — 0 замечаний; scripts/test/ci-local.sh повторяет шаги verify/format/e2e на локальной PostgreSQL 17.11 (Forgejo-раннер реально не запускался — не проверено). --- .forgejo/workflows/ci.yml | 98 +++++++++++++++++++++++++++++++++------ scripts/test/ci-local.sh | 30 ++++++++++++ 2 files changed, 113 insertions(+), 15 deletions(-) create mode 100755 scripts/test/ci-local.sh diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 1beabd2..a543a37 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -3,6 +3,16 @@ on: push: branches: [main, codex/bootstrap-platform-foundation] pull_request: + +# Все actions закреплены полным SHA коммита (F13); SHA получены `git ls-remote` +# и совпадают на github.com и code.forgejo.org (зеркало), поэтому закрепление +# работает при любом DEFAULT_ACTIONS_URL раннера. +# +# Роли БД как в pilot, но с минимальными привилегиями: POSTGRES_USER сервиса — +# только bootstrap-админ (роль DBA/entrypoint образа), им scripts/test/provision-pg.mjs +# создаёт krona_migrator (NOSUPERUSER, владелец БД) и krona_staff_app (NOBYPASSRLS) +# со случайными паролями. Ни миграции, ни тесты, ни сервер под bootstrap-админом не работают. + jobs: verify: runs-on: docker @@ -10,27 +20,85 @@ jobs: postgres: image: postgres:17-alpine@sha256:18cfe3ef5e6815560c98237d6216d1e5119702fb0f3894c8785dd58b8bbe5d73 env: - POSTGRES_DB: krona_staff - POSTGRES_USER: krona_migrator - POSTGRES_PASSWORD: ci-migration-password - ports: ['5432:5432'] + POSTGRES_DB: postgres + POSTGRES_USER: ci_bootstrap + POSTGRES_PASSWORD: ci-bootstrap-only options: >- - --health-cmd "pg_isready -U krona_migrator -d krona_staff" + --health-cmd "pg_isready -U ci_bootstrap -d postgres" --health-interval 5s --health-timeout 3s --health-retries 20 env: - DATABASE_MIGRATION_URL: postgres://krona_migrator:ci-migration-password@postgres:5432/krona_staff - DATABASE_TEST_URL: postgres://krona_staff_app:ci-app-password@postgres:5432/krona_staff - POSTGRES_APP_PASSWORD: ci-app-password + E2E_PG_ADMIN_URL: postgres://ci_bootstrap:ci-bootstrap-only@postgres:5432/postgres steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: { node-version: 22, cache: npm } - run: npm ci - - run: node scripts/create-app-role.mjs - - run: node scripts/migrate.mjs up - - run: npm run check - - run: npm run format:check + - name: provision roles (migrator NOSUPERUSER, app NOBYPASSRLS) + run: node scripts/test/provision-pg.mjs --out "$RUNNER_TEMP/db.env" --db krona_staff + - name: migrations up -> rollback all -> up -> up (no-op) + run: | + set -a; . "$RUNNER_TEMP/db.env"; set +a + node scripts/test/migrate-roundtrip.mjs roundtrip + - name: npm run check (tenant-isolation on real PostgreSQL as app role) + run: | + set -a; . "$RUNNER_TEMP/db.env"; set +a + unset DATABASE_URL POSTGRES_APP_PASSWORD + npm run check - run: npm audit --audit-level=high - - run: docker build -t krona-staff:${{ forgejo.sha }} . + + # Отдельная задача: prettier сейчас красный по 25 файлам (F14), и это не должно + # маскировать статус verify/e2e. + format: + runs-on: docker + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: { node-version: 22, cache: npm } + - run: npm ci + - run: npm run format:check + + # Приёмочные сценарии на реальном сервере и PostgreSQL 17. Красные сценарии + # известных открытых дефектов перечислены в tests/e2e/known-defects.json: + # задача зелёная, если стенд работает ([HARNESS]/[CTRL] зелёные) и каждый + # красный сценарий есть в списке; новый красный сценарий или исправленный, + # но не вычеркнутый дефект делают задачу красной. + e2e: + runs-on: docker + services: + postgres: + image: postgres:17-alpine@sha256:18cfe3ef5e6815560c98237d6216d1e5119702fb0f3894c8785dd58b8bbe5d73 + env: + POSTGRES_DB: postgres + POSTGRES_USER: ci_bootstrap + POSTGRES_PASSWORD: ci-bootstrap-only + options: >- + --health-cmd "pg_isready -U ci_bootstrap -d postgres" + --health-interval 5s + --health-timeout 3s + --health-retries 20 + env: + E2E_PG_ADMIN_URL: postgres://ci_bootstrap:ci-bootstrap-only@postgres:5432/postgres + E2E_MIGRATIONS: roundtrip + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: { node-version: 22, cache: npm } + - run: npm ci + - name: e2e (known-defects ratchet) + run: node scripts/test/run-e2e.mjs + - name: e2e table + if: always() + run: cat tests/e2e/evidence/e2e-table.md || true + + # docker build требует Docker daemon, которого нет в контейнере метки `docker`. + # Нужен раннер с меткой `docker-host` (хост с доступом к Docker). Пока такого + # раннера нет, задача ждёт в очереди и не блокирует verify/format/e2e. + docker-build: + runs-on: docker-host + needs: [verify] + if: github.event_name == 'push' + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - run: docker build -t "krona-staff:${GITHUB_SHA}" . diff --git a/scripts/test/ci-local.sh b/scripts/test/ci-local.sh new file mode 100755 index 0000000..aec3f08 --- /dev/null +++ b/scripts/test/ci-local.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# Локальный эквивалент задач verify/format/e2e из .forgejo/workflows/ci.yml +# (без Docker: PostgreSQL 17 уже запущен, E2E_PG_ADMIN_URL указывает на bootstrap-админа). +# docker-build локально не воспроизводится: Docker в этой среде нет. +set -uo pipefail +cd "$(dirname "$0")/../.." +: "${E2E_PG_ADMIN_URL:?E2E_PG_ADMIN_URL (bootstrap-админ PostgreSQL 17) обязателен}" +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT +status=0 +step() { + local name="$1" + shift + echo "::: [$name] $*" + if "$@"; then echo "::: [$name] OK"; else local code=$?; echo "::: [$name] FAIL exit=$code"; status=1; fi +} +with_db_env() { (set -a; . "$tmp/db.env"; set +a; unset DATABASE_URL POSTGRES_APP_PASSWORD; "$@"); } + +echo "=== job verify" +step npm-ci npm ci --no-audit --no-fund +step provision node scripts/test/provision-pg.mjs --out "$tmp/db.env" --db krona_staff +step migrate-roundtrip with_db_env node scripts/test/migrate-roundtrip.mjs roundtrip +step check with_db_env npm run check +step audit npm audit --audit-level=high +echo "=== job format" +step format-check npm run format:check +echo "=== job e2e" +step e2e env E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs +echo "=== итог: status=$status" +exit $status From c73c714611cf0a2b8d9578cdb856d9e457b5939e Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:30:10 +0700 Subject: [PATCH 09/28] =?UTF-8?q?test(e2e):=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20deploy/pilot/compose.yaml=20(PILOT-1?= =?UTF-8?q?..3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: корневой compose.yaml уже проверяется tests/unit/deployment.test.ts, а pilot-файл, который реально разворачивается у владельца, — нет. В нём подстановки вида ${STANDALONE_MANAGER_TOKEN} без :? молча дают пустое значение, а при пустых токенах standalone выдаёт права анониму (F2); NODE_ENV=development в pilot отключает production-проверки config.ts. - PILOT-1: каждая подстановка должна быть ${VAR:?сообщение}; - PILOT-2: ни один сервис не с NODE_ENV=development; - PILOT-3: у app нет учётных данных мигратора (сейчас зелёный). Файл в tests/e2e как *.e2e.ts: tests/unit вне разрешённых путей, а красные пункты (дефекты deploy/, которые правят исполнители) идут через known-defects.json и не ломают `npm run check`. Сейчас PILOT-1 и PILOT-2 красные: 14 подстановок без :?, app с NODE_ENV=development. --- tests/e2e/40-compose-pilot.e2e.ts | 56 +++++++++++++++++++++++++++++++ tests/e2e/known-defects.json | 4 ++- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/40-compose-pilot.e2e.ts diff --git a/tests/e2e/40-compose-pilot.e2e.ts b/tests/e2e/40-compose-pilot.e2e.ts new file mode 100644 index 0000000..466662c --- /dev/null +++ b/tests/e2e/40-compose-pilot.e2e.ts @@ -0,0 +1,56 @@ +// Статическая проверка deploy/pilot/compose.yaml (аналог tests/unit/deployment.test.ts +// для корневого compose.yaml). Лежит в tests/e2e, а не в tests/unit: у исполнителя +// теста нет права менять tests/unit, а красные пункты (открытые дефекты deploy/) +// должны идти через known-defects.json, не ломая `npm run check`. +import { readFileSync } from 'node:fs'; +import path from 'node:path'; +import { describe, expect, it } from 'vitest'; +import { parse } from 'yaml'; + +const composePath = path.resolve(import.meta.dirname, '../../deploy/pilot/compose.yaml'); +const raw = readFileSync(composePath, 'utf8'); +const compose = parse(raw) as { + services: Record | string[] }>; +}; + +function environmentOf(service: string): Record { + const env = compose.services[service]?.environment ?? {}; + if (Array.isArray(env)) { + return Object.fromEntries( + env.map((entry) => { + const index = entry.indexOf('='); + return index < 0 ? [entry, ''] : [entry.slice(0, index), entry.slice(index + 1)]; + }), + ); + } + return Object.fromEntries(Object.entries(env).map(([key, value]) => [key, String(value)])); +} + +describe('deploy/pilot/compose.yaml', () => { + it('[PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}', () => { + const interpolations = [...raw.matchAll(/\$\{([^}]*)\}/g)].map((match) => match[1]!); + expect(interpolations.length).toBeGreaterThan(0); + const optional = interpolations.filter((inner) => !/^[A-Z0-9_]+:\?.+$/.test(inner)); + expect(optional, 'переменные без :? — пустое значение молча попадёт в контейнер').toEqual([]); + }); + + it('[PILOT-2] ни один сервис не запускается с NODE_ENV=development', () => { + const offenders = Object.keys(compose.services).filter( + (service) => environmentOf(service).NODE_ENV === 'development', + ); + expect(offenders).toEqual([]); + }); + + it('[PILOT-3] у сервиса app нет учётных данных мигратора', () => { + const env = environmentOf('app'); + const keys = Object.keys(env).filter((key) => + ['DATABASE_MIGRATION_URL', 'POSTGRES_MIGRATION_PASSWORD', 'POSTGRES_MIGRATION_USER'].includes( + key, + ), + ); + const values = Object.entries(env) + .filter(([, value]) => /POSTGRES_MIGRATION_PASSWORD|krona_migrator/.test(value)) + .map(([key]) => key); + expect({ keys, values }).toEqual({ keys: [], values: [] }); + }); +}); diff --git a/tests/e2e/known-defects.json b/tests/e2e/known-defects.json index 49a3fc1..39086ed 100644 --- a/tests/e2e/known-defects.json +++ b/tests/e2e/known-defects.json @@ -25,6 +25,8 @@ "SYNC-H": "регистрация устройства по cookie без проверки Origin", "SYNC-I": "без токенов анонимно регистрируется устройство", "SYNC-J": "sync принимает отметки вне окна времени", - "SYNC-K": "ack принимает курсор больше выданного сервером" + "SYNC-K": "ack принимает курсор больше выданного сервером", + "PILOT-1": "deploy/pilot/compose.yaml: 14 подстановок без :? (пустые токены/пароли молча проходят)", + "PILOT-2": "deploy/pilot/compose.yaml: app с NODE_ENV=development" } } From 82a2a7ca378b84b6ea6e9dec2c4d169c4304d1df Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:30:46 +0700 Subject: [PATCH 10/28] =?UTF-8?q?test(e2e):=20=D1=81=D1=86=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BB=D1=8C=D1=86=D0=B0?= =?UTF-8?q?=20(OWN-01..11)=20=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: решения владельца (роли точки/бухгалтера/директора, пакет зарплаты с подписью директора, неизменяемость после подписи, зарплата по точке фактической смены, согласие на биометрию) должны стать исполняемыми критериями приёмки до того, как Codex начнёт этап 4, иначе реализацию будет нечем проверить. API ещё нет, поэтому тесты написаны против наиболее вероятного контракта C1 (access-grants), C2 (payroll/batches, submit/sign/return, notifications), C3 (biometric-consent, terminal enrollment); контракт и инварианты описаны в tests/e2e/NOTES-FOR-EXECUTORS.md. Сейчас все OWN красные (404 Route not found) и внесены в known-defects.json. В NOTES также: найденные сценариями дефекты с указанием файлов, конфликт NODE_ENV/standalone для pilot, N6, требования к раннеру docker-host. --- tests/e2e/30-owner-decisions.e2e.ts | 270 ++++++++++++++++++++++++++++ tests/e2e/NOTES-FOR-EXECUTORS.md | 121 +++++++++++++ tests/e2e/known-defects.json | 13 +- 3 files changed, 403 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/30-owner-decisions.e2e.ts create mode 100644 tests/e2e/NOTES-FOR-EXECUTORS.md diff --git a/tests/e2e/30-owner-decisions.e2e.ts b/tests/e2e/30-owner-decisions.e2e.ts new file mode 100644 index 0000000..18292b0 --- /dev/null +++ b/tests/e2e/30-owner-decisions.e2e.ts @@ -0,0 +1,270 @@ +// Сценарии решений владельца (ожидаемо КРАСНЫЕ до этапа 4 Codex). +// Публичного API для ролей точки/бухгалтера/директора, пакетов зарплаты и согласия +// на биометрию пока нет, поэтому тесты написаны против наиболее вероятного контракта, +// описанного в tests/e2e/NOTES-FOR-EXECUTORS.md (C1–C3). Если Codex выберет другой +// контракт — меняется только этот файл и NOTES, смысл проверок остаётся. +/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */ +import { describe, expect, it } from 'vitest'; +import { api, ctx, dbQuery, describeResponse } from './harness/client.js'; +import { synthetic } from './harness/context.js'; +import { + assignHourly, + createOrgUnits, + daysAgo, + importEmployees, + isoDate, + workedShift, + type OrgUnit, +} from './harness/fixtures.js'; + +type Role = 'point_manager' | 'accountant' | 'director'; + +/** C1: главный менеджер выдаёт ключ роли (standalone-аналог Core RBAC). */ +async function grant(role: Role, orgUnitIds: string[] = []): Promise { + const response = await api('POST', '/access-grants', { + token: ctx().managerToken, + body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(role) }, + }); + expect(response.status, `C1 POST /access-grants (${role}): ${describeResponse(response)}`).toBe( + 201, + ); + return response.body.access_token as string; +} + +async function confirm(sessionId: string) { + const response = await api('PATCH', `/work-sessions/${sessionId}`, { + token: ctx().managerToken, + body: { status: 'confirmed' }, + }); + expect(response.status, `подтверждение смены (см. N2): ${describeResponse(response)}`).toBe(200); +} + +interface World { + unitA: OrgUnit; + unitB: OrgUnit; + employeeId: string; + sessionId: string; + day: Date; +} + +/** Точка A и B, сотрудник точки A со сменой в точке A (по умолчанию подтверждённой; см. N2). */ +async function world(confirmShift = true): Promise { + const [unitA, unitB] = await createOrgUnits(2); + const [employee] = await importEmployees(1); + await assignHourly(employee!.id, unitA!.id); + const day = daysAgo(4); + const sessionId = await workedShift(employee!.id, unitA!.id, day, 8); + if (confirmShift) await confirm(sessionId); + return { unitA: unitA!, unitB: unitB!, employeeId: employee!.id, sessionId, day }; +} + +function period(day: Date) { + const from = new Date(Date.UTC(day.getUTCFullYear(), day.getUTCMonth(), 1)); + const to = new Date(Date.UTC(day.getUTCFullYear(), day.getUTCMonth() + 1, 0)); + return { from: isoDate(from), to: isoDate(to) }; +} + +/** C2: пакет зарплаты точки за месяц. */ +async function createBatch(token: string, orgUnitId: string, day: Date) { + return api('POST', '/payroll/batches', { + token, + body: { org_unit_id: orgUnitId, ...period(day) }, + }); +} + +async function submittedBatch(w: World, accountant: string): Promise { + const created = await createBatch(accountant, w.unitA.id, w.day); + expect(created.status, `C2 создание пакета: ${describeResponse(created)}`).toBe(201); + const batchId = created.body.id as string; + const submit = await api('POST', `/payroll/batches/${batchId}/submit`, { token: accountant }); + expect(submit.status, `C2 отправка пакета: ${describeResponse(submit)}`).toBe(200); + return batchId; +} + +async function ledgerFor(employeeId: string) { + return dbQuery<{ kind: string; amount_minor: string }>( + `SELECT kind, amount_minor::text AS amount_minor FROM staff_payroll_ledger WHERE employee_id = $1`, + [employeeId], + ); +} + +describe('Решения владельца: роли, пакеты зарплаты, согласие на биометрию', () => { + it('[OWN-01] менеджер точки A запускает расчёт для точки B → 403', async () => { + const w = await world(false); + const managerA = await grant('point_manager', [w.unitA.id]); + const batch = await createBatch(managerA, w.unitB.id, w.day); + const legacy = await api('POST', '/payroll/calculate', { + token: managerA, + body: { month: isoDate(w.day).slice(0, 7), org_unit_id: w.unitB.id }, + }); + expect({ batch: batch.status, legacy: legacy.status }).toEqual({ batch: 403, legacy: 403 }); + }); + + it('[OWN-02] менеджер точки отправляет пакет на согласование → 403', async () => { + const w = await world(false); + const managerA = await grant('point_manager', [w.unitA.id]); + const created = await createBatch(managerA, w.unitA.id, w.day); + expect( + created.status, + `C2 создание пакета менеджером своей точки: ${describeResponse(created)}`, + ).toBe(201); + const submit = await api('POST', `/payroll/batches/${created.body.id}/submit`, { + token: managerA, + }); + expect(submit.status, describeResponse(submit)).toBe(403); + }); + + it('[OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление', async () => { + const accountant = await grant('accountant'); + const directors = [await grant('director'), await grant('director')]; + const w = await world(); + const batchId = await submittedBatch(w, accountant); + for (const director of directors) { + const inbox = await api('GET', '/notifications', { token: director }); + expect(inbox.status, `C2 уведомления директора: ${describeResponse(inbox)}`).toBe(200); + const aboutBatch = ( + inbox.body.notifications as Array<{ type: string; subject_id: string }> + ).filter((n) => n.type === 'payroll.batch.submitted' && n.subject_id === batchId); + expect(aboutBatch).toHaveLength(1); + } + }); + + it('[OWN-04] бухгалтер пытается подписать пакет → 403', async () => { + const accountant = await grant('accountant'); + const w = await world(); + const batchId = await submittedBatch(w, accountant); + const sign = await api('POST', `/payroll/batches/${batchId}/sign`, { token: accountant }); + expect(sign.status, describeResponse(sign)).toBe(403); + }); + + it('[OWN-05] до подписи директора в ledger нет начислений и выплат', async () => { + const accountant = await grant('accountant'); + const w = await world(); + await submittedBatch(w, accountant); + expect(await ledgerFor(w.employeeId)).toEqual([]); + }); + + it('[OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы', async () => { + const accountant = await grant('accountant'); + const director = await grant('director'); + const w = await world(); + const batchId = await submittedBatch(w, accountant); + const sign = await api('POST', `/payroll/batches/${batchId}/sign`, { token: director }); + expect(sign.status, describeResponse(sign)).toBe(200); + const kinds = new Set((await ledgerFor(w.employeeId)).map((row) => row.kind)); + const editShift = await api('PATCH', `/work-sessions/${w.sessionId}`, { + token: ctx().managerToken, + body: { + status: 'confirmed', + worked_minutes: 1, + correction_note: 'E2E попытка правки после подписи', + }, + }); + const resubmit = await api('POST', `/payroll/batches/${batchId}/submit`, { token: accountant }); + expect({ + accrual: kinds.has('accrual'), + payout: kinds.has('payout'), + editShift: editShift.status, + resubmit: resubmit.status, + }).toEqual({ accrual: true, payout: true, editShift: 409, resubmit: 409 }); + }); + + it('[OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру', async () => { + const accountant = await grant('accountant'); + const director = await grant('director'); + const w = await world(); + const batchId = await submittedBatch(w, accountant); + const edit = await api('PATCH', `/work-sessions/${w.sessionId}`, { + token: ctx().managerToken, + body: { + status: 'confirmed', + worked_minutes: 420, + correction_note: 'E2E правка после отправки', + }, + }); + expect(edit.status, describeResponse(edit)).toBe(200); + const sign = await api('POST', `/payroll/batches/${batchId}/sign`, { token: director }); + const batch = await api('GET', `/payroll/batches/${batchId}`, { token: accountant }); + expect({ sign: sign.status, status: batch.body?.status }).toEqual({ + sign: 409, + status: 'returned', + }); + }); + + it('[OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён', async () => { + const accountant = await grant('accountant'); + const director = await grant('director'); + const w = await world(); + const batchId = await submittedBatch(w, accountant); + const comment = synthetic('Комментарий директора'); + const back = await api('POST', `/payroll/batches/${batchId}/return`, { + token: director, + body: { comment }, + }); + expect(back.status, describeResponse(back)).toBe(200); + const batch = await api('GET', `/payroll/batches/${batchId}`, { token: accountant }); + expect({ status: batch.body?.status, comment: batch.body?.return_comment }).toEqual({ + status: 'returned', + comment, + }); + }); + + it('[OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B', async () => { + const accountant = await grant('accountant'); + const [unitA, unitB] = await createOrgUnits(2); + const [employee] = await importEmployees(1); + await assignHourly(employee!.id, unitA!.id); + const day = daysAgo(5); + const sessionId = await workedShift(employee!.id, unitB!.id, day, 6); + await confirm(sessionId); + const batchB = await createBatch(accountant, unitB!.id, day); + const batchA = await createBatch(accountant, unitA!.id, day); + expect(batchB.status, describeResponse(batchB)).toBe(201); + const sessionsOf = (batch: typeof batchB) => + ((batch.body?.lines ?? []) as Array<{ work_session_id: string }>).map( + (l) => l.work_session_id, + ); + expect({ + inB: sessionsOf(batchB).includes(sessionId), + inA: sessionsOf(batchA).includes(sessionId), + }).toEqual({ + inB: true, + inA: false, + }); + }); + + it('[OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»', async () => { + const [employee] = await importEmployees(1); + const response = await api('GET', `/terminal/employees/${employee!.id}/enrollment`, { + token: ctx().terminalToken, + }); + expect(response.status, `C3: ${describeResponse(response)}`).toBe(200); + expect(response.body).toMatchObject({ registration_allowed: false, reason: 'consent_missing' }); + }); + + it('[OWN-11] согласие отозвано → статус для терминала меняется', async () => { + const [employee] = await importEmployees(1); + const setConsent = (status: 'granted' | 'revoked') => + api('PUT', `/employees/${employee!.id}/biometric-consent`, { + token: ctx().managerToken, + body: { status, document_ref: synthetic('согласие') }, + }); + const enrollment = () => + api('GET', `/terminal/employees/${employee!.id}/enrollment`, { token: ctx().terminalToken }); + const granted = await setConsent('granted'); + expect(granted.status, `C3 PUT biometric-consent: ${describeResponse(granted)}`).toBe(200); + const before = await enrollment(); + const revoked = await setConsent('revoked'); + expect(revoked.status, describeResponse(revoked)).toBe(200); + const after = await enrollment(); + expect({ + before: before.body?.registration_allowed, + after: after.body?.registration_allowed, + reason: after.body?.reason, + }).toEqual({ + before: true, + after: false, + reason: 'consent_revoked', + }); + }); +}); diff --git a/tests/e2e/NOTES-FOR-EXECUTORS.md b/tests/e2e/NOTES-FOR-EXECUTORS.md new file mode 100644 index 0000000..72a8ae3 --- /dev/null +++ b/tests/e2e/NOTES-FOR-EXECUTORS.md @@ -0,0 +1,121 @@ +# Заметки для исполнителей (Codex / Antigravity) + +Автор: Grok (стенд тестов и независимая приёмка). Я не меняю `src/`, `apps/`, +`migrations/`, `deploy/`; всё, что требует изменения продукта, описано здесь. + +Как запускать: + +```sh +# bootstrap-админ PostgreSQL 17 (только создаёт роли и БД; сервер и миграции под ним не работают) +export E2E_PG_ADMIN_URL=postgres://:@127.0.0.1:55433/postgres +node scripts/test/run-e2e.mjs # храповик known-defects (как в CI) +node scripts/test/run-e2e.mjs --no-known-defects # строгий режим: все дефекты красные +E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs # + откат всех миграций перед запуском +./scripts/test/ci-local.sh # локальный эквивалент verify/format/e2e +``` + +**Правило храповика.** Исправили дефект → его сценарий позеленел → +`run-e2e.mjs` падает с «дефект исправлен, обновите known-defects.json» — +удалите ID из `tests/e2e/known-defects.json` в том же коммите. Новый красный +сценарий, которого нет в списке, — регрессия. + +## 1. Предполагаемый контракт для решений владельца (OWN-01..11) — Codex, этап 4 + +API пока нет, поэтому сценарии `tests/e2e/30-owner-decisions.e2e.ts` написаны +против наиболее вероятного контракта. Если выбираете другой — поменяйте тесты и +этот раздел в том же PR, смысл проверок (кто что может и когда) менять нельзя. +Все пути относительно `/api/v1/staff`. + +### C1. Роли точки/бухгалтера/директора (standalone-аналог Core RBAC) + +- `POST /access-grants` (только главный менеджер, `staff:employee:write`) + тело `{ "role": "point_manager" | "accountant" | "director", "org_unit_ids": [""], "display_name": "..." }` + → `201 { "id", "role", "org_unit_ids", "access_token" }`. Токен показывается один раз, + хранится как хеш (как ключи сотрудников), используется как `Authorization: Bearer`. +- `point_manager` видит/считает только свои `org_unit_ids`; чужая точка → `403` + (и для нового `POST /payroll/batches`, и для старого `POST /payroll/calculate`). +- В platform-режиме те же роли приходят из Core (User ≠ Employee, AGENTS.md). + +### C2. Пакет зарплаты точки и согласование + +| Метод и путь | Кто | Результат | +| ------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| `POST /payroll/batches` `{org_unit_id, from, to}` | accountant; point_manager своей точки | `201 {id, status:"draft", org_unit_id, lines:[{work_session_id, employee_id, org_unit_id, amount_minor}]}` | +| `POST /payroll/batches/:id/submit` | только accountant | `200 {status:"submitted"}`; point_manager → `403`; повтор после подписи → `409` | +| `GET /notifications` | любой пользователь | `200 {notifications:[{type:"payroll.batch.submitted", subject_id:}]}`; каждому директору ровно одно уведомление на отправку | +| `POST /payroll/batches/:id/sign` | только director | `200 {status:"signed"}`; accountant → `403`; если смена пакета изменилась после отправки → `409`, пакет получает `status:"returned"` | +| `POST /payroll/batches/:id/return` `{comment}` | director | `200 {status:"returned", return_comment}` | +| `GET /payroll/batches/:id` | accountant, director | `200 {status, return_comment, lines:[...]}` | + +Инварианты, которые проверяют тесты: + +- до подписи в `staff_payroll_ledger` для сотрудников пакета нет ни `accrual`, ни `payout` (OWN-05); +- подпись атомарно пишет `accrual` и `payout`; после подписи `PATCH /work-sessions/:id` + для смен пакета → `409`, пакет не отправляется повторно (OWN-06); +- строка пакета принадлежит точке, где отработана смена (`staff_work_sessions.org_unit_id`), + а не основной точке сотрудника (OWN-09). + +### C3. Согласие на биометрию + +- `PUT /employees/:id/biometric-consent` `{ "status": "granted" | "revoked", "document_ref": "..." }` + (главный менеджер) → `200`. +- `GET /terminal/employees/:id/enrollment` (терминальный токен) → + `200 { "employee_id", "registration_allowed": boolean, "reason": "consent_missing" | "consent_revoked" | null }`. + Без записи о согласии — `false/consent_missing` (OWN-10); после отзыва — `false/consent_revoked` (OWN-11). +- Шаблоны отпечатков на сервер не передаются (docs/TERMINAL-API-REQUIREMENTS.md); + сервер хранит только факт согласия. Тот же флаг стоит отдать в `/sync/pull` (employee payload). + +Сейчас все OWN красные с `404 Route ... not found` (C1–C3 не реализованы); +OWN-03..09 дополнительно упрутся в N2 (подтверждение смены падает 500). + +## 2. Дефекты продукта, найденные сценариями (все красные сейчас) + +Команда и фактический вывод — `tests/e2e/evidence/e2e-run.txt`; таблица — `tests/e2e/REPORT.md`. + +| ID | Файл | Что исправить | +| -------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| N1 | `src/portal.ts` POST /employees | `42P08 inconsistent types deduced for parameter $2`: явные `$2::varchar(26)`, `$5::text` или отдельный запрос профессии | +| N2 | `src/portal.ts` PATCH /work-sessions, `src/domain/payroll/service.ts` calculate/approve | `staff_outbox.occurred_at` NULL (23502): передавать `occurred_at` или `DEFAULT now()` новой миграцией | +| N4 | `service.ts` | после N2 проверить: пересекающийся период не должен начислять смену повторно (409 или исключение уже начисленных смен) | +| N3 | push-подписки | allowlist push-сервисов / запрет приватных адресов, `redirect:'manual'`; сейчас сервер подключается к `127.0.0.1` | +| N9 | `push-dispatcher.ts` | `ON CONFLICT ... DO UPDATE SET employee_id` → 409 для чужого endpoint | +| N10 | GET /professions, /org-units | требовать право справочника; терминал сейчас получает 200 | +| N11 | импорт | валидировать `kind` и схему `items` → 400 вместо 500 (23514) | +| N12 | PUT pay-assignment | `additionalProperties:false`, верхние границы сумм | +| F2 | `config.ts`/`identity.ts` | standalone без токенов не должен выдавать права (процесс без токенов отдаёт 200 на /portal, /payroll, POST /professions) | +| F3 | POST/DELETE /session | в cookie — идентификатор сессии, а не сырой токен; logout отзывает сессию | +| F4 | вход | rate limit (тест ждёт 429 не позже 30 неверных попыток; идёт на отдельном процессе, чтобы лимит не мешал другим сценариям) | +| F7 | POST /attendance/events | использовать `Idempotency-Key` / `staff_idempotency_keys` | +| F10 | `assertSameOrigin` | мутации по cookie без `Origin` отклонять | +| SYNC-A/B | `src/domain/sync/service.ts` | устройство не должно выставлять `confirmed`/`approved` (сейчас `applied`) | +| SYNC-C0 | `pull()` bootstrap | `SELECT ... status FROM staff_org_units` — такого столбца нет → 500 на любой начальной загрузке | +| SYNC-C | `pull()` bootstrap | при `has_more=true` отдаётся `next_cursor=latest`, остаток после 100 сущностей теряется; нужен курсор снимка | +| SYNC-D | портал/импорт | изменения вне sync не пишутся в `staff_sync_change_log` → терминал не узнаёт о новых/изменённых сотрудниках | +| SYNC-E | `executeCommand` | проверять `status='active'` сотрудника | +| SYNC-F | `executeCommand` | сохранять `org_unit_id` в `staff_attendance_events`; payload не может переопределить точку устройства | +| SYNC-G | `push()` | ошибки БД одной команды → `rejected` для неё, а не 500 и откат всего пакета | +| SYNC-H | `/sync/devices` | `assertCookieMutationOrigin` как в портале | +| SYNC-I | `requireManagerContext` | без токенов не выдавать права (как F2) | +| SYNC-J | `executeCommand` | окно времени отметки как в POST /attendance/events (−180 дней … +5 мин) | +| SYNC-K | `acknowledge()` | отклонять курсор больше `MAX(cursor_seq)` | + +## 3. deploy/ (PILOT-1, PILOT-2) — Codex + +- PILOT-1: все подстановки в `deploy/pilot/compose.yaml` → `${VAR:?VAR is required}` + (сейчас 14 без `:?`: пустой `STANDALONE_MANAGER_TOKEN` молча превращает pilot в F2). +- PILOT-2: `NODE_ENV: development` в `app`. Конфликт: `config.ts` запрещает + `STAFF_RUNTIME_MODE=standalone` при `NODE_ENV=production`. Нужно решение: либо + разрешить standalone в production при обязательных токенах и HTTPS, либо + отдельный режим для pilot. Тест требует только «не development». +- N6: `scripts/create-app-role.mjs` не работает мигратором без SUPERUSER + («Only roles with SUPERUSER may change the SUPERUSER attribute»). CI и e2e + обходятся `scripts/test/provision-pg.mjs` (роли создаёт bootstrap-админ, как + `docker/postgres/init-app-role.sh`). В pilot мигратор = `POSTGRES_USER` = + суперпользователь; рекомендую схему как в provision-pg.mjs. + +## 4. CI + +- Задаче `docker-build` нужен раннер с меткой `docker-host` (Docker daemon). + Без него задача ждёт в очереди; остальные задачи не блокируются. +- `format` красная, пока не исправлен F14 (25 файлов, в основном `src/`, `docs/`, `tests/unit/`). +- Реальный Forgejo-раннер мной не запускался (нет API-токена) — не проверено. diff --git a/tests/e2e/known-defects.json b/tests/e2e/known-defects.json index 39086ed..b3c0cf8 100644 --- a/tests/e2e/known-defects.json +++ b/tests/e2e/known-defects.json @@ -27,6 +27,17 @@ "SYNC-J": "sync принимает отметки вне окна времени", "SYNC-K": "ack принимает курсор больше выданного сервером", "PILOT-1": "deploy/pilot/compose.yaml: 14 подстановок без :? (пустые токены/пароли молча проходят)", - "PILOT-2": "deploy/pilot/compose.yaml: app с NODE_ENV=development" + "PILOT-2": "deploy/pilot/compose.yaml: app с NODE_ENV=development", + "OWN-01": "решение владельца: роли точки (этап 4 Codex)", + "OWN-02": "решение владельца: пакет отправляет только бухгалтер", + "OWN-03": "решение владельца: уведомления директорам", + "OWN-04": "решение владельца: подписывает только директор", + "OWN-05": "решение владельца: ledger пуст до подписи", + "OWN-06": "решение владельца: подпись → ledger, неизменяемость", + "OWN-07": "решение владельца: изменение смены после отправки возвращает пакет", + "OWN-08": "решение владельца: возврат с комментарием", + "OWN-09": "решение владельца: смена в чужой точке идёт в зарплату той точки", + "OWN-10": "решение владельца: нет согласия на биометрию → регистрация запрещена", + "OWN-11": "решение владельца: отзыв согласия меняет статус для терминала" } } From 045f6964252e100d6eca4eb554163ad0d703afef Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:33:11 +0700 Subject: [PATCH 11/28] =?UTF-8?q?test(e2e):=20N13=20=E2=80=94=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BE=D1=87=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B3=D0=BE?= =?UTF-8?q?=D0=BD=D0=BA=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D1=80=D0=B0=D1=81=D1=87=D1=91=D1=82=D0=B0=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: владелец пометил N13 как «не воспроизведено», а в коде окно гонки (SELECT ... FOR UPDATE по отсутствующей строке, затем INSERT ... ON CONFLICT DO NOTHING со своим runId) видно. Нужен повторяемый замер на живом сервере и реальной PostgreSQL 17, а не рассуждение. Что: scripts/test/n13-race.mjs — 10/25/50 параллельных первых POST /payroll/calculate, каждая попытка на новой точке, проверка статусов, числа run_id, строк в staff_payroll_runs и «фантомных» run_id. Режим as-is показывает, что сейчас всё упирается в N2 (500). Режим n2-bypass ставит DEFAULT now() только в одноразовой БД скрипта (продукт и миграции не меняются), чтобы увидеть саму гонку. Итог: 0 некорректных из 30 попыток; причина (из кода) — случайная сериализация через upsert ensureDefaultPayRules. Это записано в NOTES-FOR-EXECUTORS вместе с рекомендацией явной блокировки и замечанием об утечке текста ошибок БД в 500. --- scripts/test/n13-race.mjs | 298 ++++++++++++++ tests/e2e/NOTES-FOR-EXECUTORS.md | 20 + tests/e2e/evidence/n13-race.txt | 58 +++ tests/e2e/evidence/server-n13-as-is.txt | 425 ++++++++++++++++++++ tests/e2e/evidence/server-n13-n2-bypass.txt | 0 5 files changed, 801 insertions(+) create mode 100644 scripts/test/n13-race.mjs create mode 100644 tests/e2e/evidence/n13-race.txt create mode 100644 tests/e2e/evidence/server-n13-as-is.txt create mode 100644 tests/e2e/evidence/server-n13-n2-bypass.txt diff --git a/scripts/test/n13-race.mjs b/scripts/test/n13-race.mjs new file mode 100644 index 0000000..40e9e77 --- /dev/null +++ b/scripts/test/n13-race.mjs @@ -0,0 +1,298 @@ +#!/usr/bin/env node +// N13: гонка первого расчёта зарплаты. N параллельных POST /payroll/calculate для одной и той же +// пары (точка, месяц), когда расчёта ещё нет. Каждая попытка — новая точка (значит «первый» расчёт). +// +// Режимы: +// --mode as-is код и схема как есть (N2 не обходится); +// --mode n2-bypass ДИАГНОСТИКА: в одноразовой БД мигратор ставит DEFAULT now() для +// staff_outbox.occurred_at, чтобы обойти N2 и увидеть саму гонку. +// Продукт/миграции не меняются, БД удаляется при следующем provision. +// Опции: --sizes 10,25,50 --attempts 5 --with-sessions (подтверждённые смены, нужен n2-bypass) +// Требует E2E_PG_ADMIN_URL (bootstrap-админ только для создания ролей/БД). +// Правильное поведение: все ответы 200, один и тот же run_id, ровно один расчёт в БД, +// каждый возвращённый run_id существует в БД. +import { spawn, spawnSync } from 'node:child_process'; +import { randomBytes } from 'node:crypto'; +import { createWriteStream, mkdtempSync, readFileSync, rmSync } from 'node:fs'; +import { createServer } from 'node:net'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import pg from 'pg'; + +const repoRoot = path.resolve(import.meta.dirname, '../..'); +const args = process.argv.slice(2); +const opt = (name, fallback) => { + const index = args.indexOf(`--${name}`); + return index >= 0 ? args[index + 1] : fallback; +}; +const mode = opt('mode', 'as-is'); +const sizes = opt('sizes', '10,25,50').split(',').map(Number); +const attempts = Number(opt('attempts', '5')); +const withSessions = args.includes('--with-sessions'); +const database = opt('db', `krona_staff_n13_${mode.replace(/-/g, '_')}`); + +const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; +const ulid = () => + Array.from(randomBytes(26), (byte) => CROCKFORD[byte % 32]) + .join('') + .replace(/^./, '0'); + +function parseEnvFile(file) { + const result = {}; + for (const line of readFileSync(file, 'utf8').split('\n')) { + const index = line.indexOf('='); + if (index > 0) result[line.slice(0, index)] = line.slice(index + 1); + } + return result; +} + +function runNode(scriptArgs, env) { + const result = spawnSync(process.execPath, scriptArgs, { cwd: repoRoot, env, encoding: 'utf8' }); + if (result.status !== 0) { + process.stdout.write(`${result.stdout}${result.stderr}`); + throw new Error(`${scriptArgs.join(' ')} failed`); + } + return result.stdout; +} + +async function freePort() { + return new Promise((resolve) => { + const server = createServer(); + server.listen(0, '127.0.0.1', () => { + const { port } = server.address(); + server.close(() => resolve(port)); + }); + }); +} + +const adminUrl = process.env.E2E_PG_ADMIN_URL; +if (!adminUrl) throw new Error('E2E_PG_ADMIN_URL не задан'); +const secretsDir = mkdtempSync(path.join(tmpdir(), 'krona-n13-')); +runNode( + ['scripts/test/provision-pg.mjs', '--out', path.join(secretsDir, 'db.env'), '--db', database], + { + ...process.env, + }, +); +const dbEnv = parseEnvFile(path.join(secretsDir, 'db.env')); +rmSync(secretsDir, { recursive: true, force: true }); +runNode(['scripts/test/migrate-roundtrip.mjs', 'up'], { + PATH: process.env.PATH ?? '', + DATABASE_MIGRATION_URL: dbEnv.DATABASE_MIGRATION_URL, +}); +const migrator = new pg.Client({ connectionString: dbEnv.DATABASE_MIGRATION_URL }); +await migrator.connect(); +if (mode === 'n2-bypass') { + await migrator.query('ALTER TABLE staff_outbox ALTER COLUMN occurred_at SET DEFAULT now()'); + console.log( + '[n13] ДИАГНОСТИКА: staff_outbox.occurred_at DEFAULT now() (обход N2 только в этой БД)', + ); +} + +const tenantId = ulid(); +const managerToken = randomBytes(32).toString('hex'); +const terminalToken = randomBytes(32).toString('hex'); +const vapid = {}; +for (const line of runNode(['scripts/generate-vapid-keys.mjs'], process.env).split('\n')) { + const index = line.indexOf('='); + if (index > 0) vapid[line.slice(0, index)] = line.slice(index + 1); +} +const port = await freePort(); +const log = createWriteStream(path.join(repoRoot, `tests/e2e/evidence/server-n13-${mode}.txt`)); +const child = spawn(path.join(repoRoot, 'node_modules/.bin/tsx'), ['src/server.ts'], { + cwd: repoRoot, + env: { + PATH: process.env.PATH ?? '', + NODE_ENV: 'test', + HOST: '127.0.0.1', + PORT: String(port), + LOG_LEVEL: 'warn', + STAFF_RUNTIME_MODE: 'standalone', + DATABASE_URL: dbEnv.DATABASE_URL, + STANDALONE_TENANT_ID: tenantId, + STANDALONE_ACTOR_ID: ulid(), + STANDALONE_ACCESS: 'employee', + STANDALONE_MANAGER_TOKEN: managerToken, + STANDALONE_TERMINAL_TOKEN: terminalToken, + STANDALONE_TERMINAL_ACTOR_ID: ulid(), + ...vapid, + }, + stdio: ['ignore', 'pipe', 'pipe'], +}); +child.stdout.pipe(log); +child.stderr.pipe(log); +const base = `http://127.0.0.1:${port}/api/v1/staff`; + +async function api(method, route, token, body) { + const response = await fetch(`${base}${route}`, { + method, + headers: { + authorization: `Bearer ${token}`, + ...(body ? { 'content-type': 'application/json' } : {}), + }, + ...(body ? { body: JSON.stringify(body) } : {}), + }); + const text = await response.text(); + let json = null; + try { + json = JSON.parse(text); + } catch { + // не JSON + } + return { status: response.status, json, text }; +} + +try { + for (let i = 0; i < 240; i += 1) { + try { + if ((await fetch(`${base}/ready`)).status === 200) break; + } catch { + // ещё не слушает + } + await new Promise((resolve) => setTimeout(resolve, 250)); + } + await migrator.query("SELECT set_config('app.tenant_id', $1, false)", [tenantId]); + + const month = (() => { + const date = new Date(); + date.setUTCDate(1); + date.setUTCMonth(date.getUTCMonth() - 1); + return date.toISOString().slice(0, 7); + })(); + let hourlyRule = null; + if (withSessions) { + const rules = await api('GET', '/pay-rules', managerToken); + hourlyRule = ( + rules.json.pay_rules.find((rule) => rule.code === 'hourly') ?? rules.json.pay_rules[0] + ).id; + } + + async function prepareUnit() { + const code = `n13-${ulid().slice(-10).toLowerCase()}`; + const suffix = ulid().slice(-8); + const imported = await api('POST', '/imports/owner-workbook', managerToken, { + source_name: `n13-import-${suffix}`, + units: [{ code, name: `Синтетическая точка ${suffix}` }], + ...(withSessions + ? { + employees: [ + { + external_ref: `n13:${suffix}`, + personnel_number: `N13-${suffix}`, + display_name: `Синтетический ${suffix}`, + }, + ], + } + : {}), + }); + if (imported.status >= 300) throw new Error(`import ${imported.status} ${imported.text}`); + const unitId = (await migrator.query('SELECT id FROM staff_org_units WHERE code = $1', [code])) + .rows[0].id; + if (withSessions) { + const employeeId = ( + await migrator.query('SELECT id FROM staff_employees WHERE external_ref = $1', [ + `n13:${suffix}`, + ]) + ).rows[0].id; + const assign = await api('PUT', `/employees/${employeeId}/pay-assignment`, managerToken, { + pay_rule_id: hourlyRule, + org_unit_id: unitId, + rate_minor: 12345, + effective_from: '2026-01-01', + }); + if (assign.status !== 200) throw new Error(`assign ${assign.status} ${assign.text}`); + const start = new Date(`${month}-10T09:00:00Z`); + for (const [eventType, at] of [ + ['check_in', start], + ['check_out', new Date(start.getTime() + 8 * 3_600_000)], + ]) { + const event = await api('POST', '/attendance/events', terminalToken, { + employee_id: employeeId, + event_type: eventType, + occurred_at: at.toISOString(), + source_event_id: `n13-${ulid()}`, + org_unit_id: unitId, + }); + if (event.status !== 201) throw new Error(`clock ${event.status} ${event.text}`); + } + const day = start.toISOString().slice(0, 10); + const reconcile = await api('POST', '/work-sessions/reconcile', managerToken, { + date_from: day, + date_to: day, + }); + if (reconcile.status !== 200) throw new Error(`reconcile ${reconcile.status}`); + const sessionId = ( + await migrator.query('SELECT id FROM staff_work_sessions WHERE employee_id = $1', [ + employeeId, + ]) + ).rows[0].id; + const confirm = await api('PATCH', `/work-sessions/${sessionId}`, managerToken, { + status: 'confirmed', + }); + if (confirm.status !== 200) + throw new Error(`confirm ${confirm.status} ${confirm.text.slice(0, 200)}`); + } + return unitId; + } + + let totalBad = 0; + const summary = []; + for (const size of sizes) { + for (let attempt = 1; attempt <= attempts; attempt += 1) { + const unitId = await prepareUnit(); + const responses = await Promise.all( + Array.from({ length: size }, () => + api('POST', '/payroll/calculate', managerToken, { month, org_unit_id: unitId }), + ), + ); + const statuses = {}; + const errors = {}; + const runIds = new Set(); + for (const response of responses) { + statuses[response.status] = (statuses[response.status] ?? 0) + 1; + if (response.status === 200) { + const id = response.json?.run_id ?? response.json?.id ?? response.json?.run?.id; + if (id) runIds.add(id); + } else { + const key = ( + response.json?.error?.message ?? + response.json?.message ?? + response.text + ).slice(0, 90); + errors[key] = (errors[key] ?? 0) + 1; + } + } + const dbRuns = ( + await migrator.query('SELECT id FROM staff_payroll_runs WHERE org_unit_id = $1', [unitId]) + ).rows.map((row) => row.id); + const dbLines = Number( + ( + await migrator.query( + 'SELECT count(*) AS n FROM staff_payroll_lines WHERE org_unit_id = $1', + [unitId], + ) + ).rows[0].n, + ); + const phantom = [...runIds].filter((id) => !dbRuns.includes(id)); + const ok = + (statuses[200] ?? 0) === size && + runIds.size === 1 && + dbRuns.length === 1 && + phantom.length === 0; + if (!ok) totalBad += 1; + const line = + `[n13] mode=${mode} sessions=${withSessions} N=${size} attempt=${attempt}: ` + + `statuses=${JSON.stringify(statuses)} distinct_run_ids=${runIds.size} db_runs=${dbRuns.length} db_lines=${dbLines} ` + + `phantom_run_ids=${phantom.length} errors=${JSON.stringify(errors)} -> ${ok ? 'OK' : 'BAD'}`; + console.log(line); + summary.push(ok); + } + } + console.log( + `[n13] ИТОГ mode=${mode} sessions=${withSessions}: попыток ${summary.length}, некорректных ${totalBad}`, + ); + process.exitCode = totalBad > 0 ? 1 : 0; +} finally { + await migrator.end(); + child.kill('SIGTERM'); +} diff --git a/tests/e2e/NOTES-FOR-EXECUTORS.md b/tests/e2e/NOTES-FOR-EXECUTORS.md index 72a8ae3..4becfbb 100644 --- a/tests/e2e/NOTES-FOR-EXECUTORS.md +++ b/tests/e2e/NOTES-FOR-EXECUTORS.md @@ -119,3 +119,23 @@ OWN-03..09 дополнительно упрутся в N2 (подтвержде Без него задача ждёт в очереди; остальные задачи не блокируются. - `format` красная, пока не исправлен F14 (25 файлов, в основном `src/`, `docs/`, `tests/unit/`). - Реальный Forgejo-раннер мной не запускался (нет API-токена) — не проверено. + +## 5. N13 (гонка первого расчёта) и утечка текста ошибок БД + +- `scripts/test/n13-race.mjs`, вывод `tests/e2e/evidence/n13-race.txt`: 10/25/50 + параллельных первых `POST /payroll/calculate` × 5 попыток. Как есть — все 500 (N2), + гонку не видно. В одноразовой БД с обходом N2 (`DEFAULT now()` только там) — 0 из 30 + некорректных попыток (без смен и с подтверждённой сменой): один `run_id`, один расчёт в БД. +- Почему не воспроизводится (вывод из кода, не проверено отдельным экспериментом): + `calculatePayroll` сначала вызывает `ensureDefaultPayRules`, а там + `INSERT ... ON CONFLICT DO UPDATE` по одним и тем же строкам `staff_pay_rules` тенанта. + Первая транзакция держит блокировки этих строк до коммита, остальные ждут — расчёты + одного тенанта выполняются по очереди случайно. Если upsert правил вынесут из расчёта + или сделают `DO NOTHING`, окно `SELECT ... FOR UPDATE` (строки нет) → `INSERT ... ON +CONFLICT DO NOTHING` со своим `runId` → строки/UPDATE по несуществующему `runId` вернётся. + Рекомендация: явный `pg_advisory_xact_lock` по (tenant, org_unit, period_start) или + `INSERT ... ON CONFLICT DO UPDATE ... RETURNING id`. Скрипт стоит перезапустить после + такого изменения. +- Ответы 500 содержат сырой текст ошибки PostgreSQL (например + `null value in column "occurred_at" of relation "staff_outbox" ...`) — клиенту видна + схема БД. Для 5xx отдавать нейтральное сообщение, подробности — только в лог. diff --git a/tests/e2e/evidence/n13-race.txt b/tests/e2e/evidence/n13-race.txt new file mode 100644 index 0000000..a6b1ad2 --- /dev/null +++ b/tests/e2e/evidence/n13-race.txt @@ -0,0 +1,58 @@ +$ node scripts/test/n13-race.mjs --mode as-is --attempts 5 +[n13] mode=as-is sessions=false N=10 attempt=1: statuses={"500":10} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":10} -> BAD +[n13] mode=as-is sessions=false N=10 attempt=2: statuses={"500":10} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":10} -> BAD +[n13] mode=as-is sessions=false N=10 attempt=3: statuses={"500":10} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":10} -> BAD +[n13] mode=as-is sessions=false N=10 attempt=4: statuses={"500":10} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":10} -> BAD +[n13] mode=as-is sessions=false N=10 attempt=5: statuses={"500":10} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":10} -> BAD +[n13] mode=as-is sessions=false N=25 attempt=1: statuses={"500":25} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":25} -> BAD +[n13] mode=as-is sessions=false N=25 attempt=2: statuses={"500":25} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":25} -> BAD +[n13] mode=as-is sessions=false N=25 attempt=3: statuses={"500":25} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":25} -> BAD +[n13] mode=as-is sessions=false N=25 attempt=4: statuses={"500":25} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":25} -> BAD +[n13] mode=as-is sessions=false N=25 attempt=5: statuses={"500":25} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":25} -> BAD +[n13] mode=as-is sessions=false N=50 attempt=1: statuses={"500":50} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":50} -> BAD +[n13] mode=as-is sessions=false N=50 attempt=2: statuses={"500":50} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":50} -> BAD +[n13] mode=as-is sessions=false N=50 attempt=3: statuses={"500":50} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":50} -> BAD +[n13] mode=as-is sessions=false N=50 attempt=4: statuses={"500":50} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":50} -> BAD +[n13] mode=as-is sessions=false N=50 attempt=5: statuses={"500":50} distinct_run_ids=0 db_runs=0 db_lines=0 phantom_run_ids=0 errors={"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint":50} -> BAD +[n13] ИТОГ mode=as-is sessions=false: попыток 15, некорректных 15 +exit=1 + +$ node scripts/test/n13-race.mjs --mode n2-bypass --attempts 5 +[n13] ДИАГНОСТИКА: staff_outbox.occurred_at DEFAULT now() (обход N2 только в этой БД) +[n13] mode=n2-bypass sessions=false N=10 attempt=1: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=10 attempt=2: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=10 attempt=3: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=10 attempt=4: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=10 attempt=5: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=25 attempt=1: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=25 attempt=2: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=25 attempt=3: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=25 attempt=4: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=25 attempt=5: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=50 attempt=1: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=50 attempt=2: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=50 attempt=3: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=50 attempt=4: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=false N=50 attempt=5: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=0 phantom_run_ids=0 errors={} -> OK +[n13] ИТОГ mode=n2-bypass sessions=false: попыток 15, некорректных 0 +exit=0 + +$ node scripts/test/n13-race.mjs --mode n2-bypass --attempts 5 --with-sessions --db krona_staff_n13_sessions +[n13] ДИАГНОСТИКА: staff_outbox.occurred_at DEFAULT now() (обход N2 только в этой БД) +[n13] mode=n2-bypass sessions=true N=10 attempt=1: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=10 attempt=2: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=10 attempt=3: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=10 attempt=4: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=10 attempt=5: statuses={"200":10} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=25 attempt=1: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=25 attempt=2: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=25 attempt=3: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=25 attempt=4: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=25 attempt=5: statuses={"200":25} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=50 attempt=1: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=50 attempt=2: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=50 attempt=3: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=50 attempt=4: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] mode=n2-bypass sessions=true N=50 attempt=5: statuses={"200":50} distinct_run_ids=1 db_runs=1 db_lines=1 phantom_run_ids=0 errors={} -> OK +[n13] ИТОГ mode=n2-bypass sessions=true: попыток 15, некорректных 0 +exit=0 diff --git a/tests/e2e/evidence/server-n13-as-is.txt b/tests/e2e/evidence/server-n13-as-is.txt new file mode 100644 index 0000000..fee55ab --- /dev/null +++ b/tests/e2e/evidence/server-n13-as-is.txt @@ -0,0 +1,425 @@ +{"level":50,"time":1790407963311,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMRD8CMNHSB5ASJMFBS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963325,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMWG288RAXX5MB0GAME","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963331,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMSF3VNWBQZ79WKKNNG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963338,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMXA0R6KVNMAZ62PAP6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963345,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WN61YD42TVX52CPV29Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963352,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WN0ZPN48QJQF30N7F84","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963359,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMZEPFZW4MD43ACVP7A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963367,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WN2AXFW9XX343GSAYSW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963374,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WN4MZ157N86APJGC2W5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963381,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMV8PP6Y9KPJTRXMV3B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963412,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR5S56NK6Z7EHTXF0AX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963420,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR9TTXP41YVMF089FDK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963426,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR6BTDQAYWCVJ544482","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963432,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR93N9FS6NJY47Z5K8T","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963441,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR6VE5SZ9XVT27NETH8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963446,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR7ZW2HA8GW7X04F070","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963452,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR7H2A888DND2A80V6D","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963458,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR8E3C5SSTS1EZ28S0S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963464,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR8NK7NJQFVBXZT7NR3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963470,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR5QXAPDRTA7CT5WMDG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963500,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTW3GAAN5JX70CNESXB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963506,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WV0FZFTXVMET1EBJZRY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963513,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTXJJZPWPTVB1R6CCMT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963520,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WV0PNJ2MF2VVDHCGW3C","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963532,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTZJPMY0BR5888AQP04","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963537,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTZWYG3FW751JS6A98B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963543,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTY0WE4H6HATS4ZXQS7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963549,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTXTTXH6FDW0K9FHXNN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963554,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTY6460861YTBDC8JEJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963562,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTWVZVQK74PWS4YEYSA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963592,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXTQ1MQGD6ZGT6Z6NEN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963600,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXWTA8NVDQMKDZNC4JB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963606,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXV4877JVGAKE8QEMH9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963613,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXVEJG0SDHWEA8JRHQQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963620,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXYC8F53J2JYPW9GYEN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963625,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXY5QK5STGXYV8A5N72","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963632,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXWEXYB2JJRB97TS6V6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963638,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXX4RZG8AT10ZR3949K","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963643,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXXW5QCG2EN36ZABAWF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963649,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXW5386STRFC2ZSVTFB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963674,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0DR50W08E0TW1CJDP3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963680,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0ETN4VJ6E5S1XMJSRM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963686,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0F7CNQDM7KCBYWW10Q","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963691,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0FT5MZ86G8XCBYGVT0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963696,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0ES5PFCH22EDNXSRVA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963701,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0G5JEFCJWAZ1672ZB2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963708,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0F93X9X184JZ0DTAPM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963715,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0HG5RBXRHGAWM9YEKE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963721,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0HYAKNA5F7N1TM31GR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963726,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0G79BPG9S4WS477MEE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963789,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2XBGTKEMYHTVFRFT1Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963797,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X306DVB68DF24PN3AXY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963803,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2YKSQR2EQPRAY1185F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963809,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2X8HCENQG9T653YZ7H","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963815,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X34BVPQDV95ZRJTEG8C","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963821,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2ZY9M3A1EG0PM5M1YM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963828,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2YARTZ4F6WVQKG8JTT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963834,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X33NXYG4RXTQVYM7B7M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963841,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X3074X883NVBKAEPBH7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963847,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2ZBS9GGH585FQHC600","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963855,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X35PRRSCHX485RYE00R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963861,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X36TW0RQ6GCT38D0RGA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963869,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X30RSHEHPT6TKT4RA0A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963876,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X35GSGZSGZ2QB53EZE9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963882,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X37GYFQ44242WDJ925M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963888,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X47XAAP290ZPSD1B2MY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963893,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X310PWZXZM12NDZJ05X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963899,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X46M8YRPTZGA8W30TAK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963907,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X48EW7RG3Q5P1PFGCDV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963913,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X38E3GA8N20AABDZVD5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963919,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X3EQT9RSV7QYR4ZRWGF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963925,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X3F3M3N6VJN4XGE3Y8A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963932,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X49R4AWV6GZFZB9SDAJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963938,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X32DFS3V6T25XBS1JCH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963945,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X37AMJ23S5QXZTS3WPN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963978,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9TE8DMMHGT71KQTWVE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963984,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Y9EJQTH6B7482Q943","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963990,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9WGREC82MJZ9MP87X2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407963996,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9X6KVXK4P7QGAHGZ3B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964001,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9W1QH7Q0HHNHE596PK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964007,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9YRT3B6CJVGC8XBH8A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964014,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Z5G7KWKJWKYFRYGW3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964025,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9X87S66PMVGPNT11B1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964031,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0VEPEMTCAQXWAY20C","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964037,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0S7Z7GSVN27FK0RRF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964043,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0QVVZFPZNRMESZDMW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964050,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9VDX2TF8XD2B0RV2JZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964057,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9VB432D0EN7PY9F1KB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964062,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0ZD9KQHRZJ57YYG09","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964068,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0ZNA8N42MS6Q8VAM0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964074,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA014GN6FM8F9EVNHFC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964079,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA08CJPQ4PF92ZZE8ZC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964085,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Z4KDSDAW5VTJ5493V","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964091,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0PJEE6F4YVYAHKQVP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964097,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Z1XN8TG716AZE7EWJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964102,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA124E0FG1PFD1K6YVY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964107,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA1VKFBCRDYMP91AZF3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964112,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Z3M0CW5407VQTF7ED","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964117,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA1EMVC43JRJ8BPK3Q1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964124,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA1K9ZY3FB1Q2618QY4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964156,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFCB9SC9W9T63A1ZQ5B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964164,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFE2FA7V3NSD66BX231","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964170,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFFMWQ79R656KA6K3E1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964175,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFD1F3VSSC4Z4WN0N6Z","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964181,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFF61E76M61MEJ1VP02","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964187,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFERN16DRFNQGE1G33S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964193,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFG8VZSY2YJZZC6DSSY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964198,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFD0XTA0YHQQCY5C49A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964205,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFHVPRN3C754PSQJQZ7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964210,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFH5057G981ES6EPYCZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964216,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJR26DNEYQ8ZGCNQCF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964222,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJQQ05FYYQT4XNDFVZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964228,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFFJ6PKRNTQ0DWNB3RX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964233,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJ6RZPSD7RAAVK9SZ4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964239,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJ5PHMG859R0C9SB1F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964244,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFGBZADJY58BPVKXE29","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964249,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFHNM49XG13DKEKW0NH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964255,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFK75NJ8KA408MT2D56","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964265,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJTAZWFKVJG5B71M63","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964271,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFKDC5FQ3M1GQVNFNDR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964276,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFHJ4CK5H9DW9P1XGXA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964281,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFKYCE0GHBHP5ZCMYPT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964287,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFHW9D8GKFZ9Y3J4S8V","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964292,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJRVBQT6YZA8NA146A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964297,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFKX8CPRJ5VA8C185RT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964328,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMRN73PCR6ATE3H1PVC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964335,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMTCCQBRNQ0T67Y6HGX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964341,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMVMVYAT2SJNK43ECSF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964348,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMV3JJWYSX7GC1FFW2E","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964354,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMSZAHD6SBFGKJJKA8X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964360,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMREK8AD51VMJDQF4KT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964366,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMVADWS7XGPX2B8CDQC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964372,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMWDCPQFT4PNJ0G4ZXP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964377,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMTXCH6GJVT8060GJAP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964384,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMX7WQP1JKA12FHD7R8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964390,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMX9NSEYD5PJHQWAGTP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964395,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMS8NZVBMKQTCPEHAFP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964401,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMWCNAJ3MGDNPG76951","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964407,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMYXAWTSH7TBPT2JDGT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964412,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXH1VP5ZTG3S1XXZZ4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964418,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXEQWXR2NKENBZ5BQM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964423,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXR374KPSXPF4B6QJG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964429,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMYKTMWJ3EH8GPN92M0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964435,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXJN79QTBAJT3TV9ES","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964440,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXFDPGG6QZZ4EPAMHC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964445,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMX4Q7BNE2TCVGSSB3J","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964451,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMY0M84WZKHJT2HKSV3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964457,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMS76BPHAXCSCCKY5P2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964462,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMWEKXMJHX51CMRA10F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964467,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMY50VMYKXWGDXR46TV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964500,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT24NB574XWFWN98SR8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964506,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT4JXC06KKSZX77M0PZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964513,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT30G1V2198SRDW0K8C","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964520,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT4EP2GNZDRE640NBS1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964526,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT5SVJBGQ569N278Y90","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964531,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT6Q8JKVKKPX13K68YJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964536,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT2V7TW2N9SFGNZJZG4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964543,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT6W7MXW2P1A0V4P9D6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964550,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT43JQA5ZSJ04J6DTY9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964555,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT2D0WVR5QFAYPVN9MH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964562,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT5T50RW8M7KAM0GNVQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964569,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT3ZEXZPBCXNEX6C4CF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964575,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7MA1HN042QAAHPFVD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964581,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT6YGPWV3TRSDZGYFMM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964587,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7R2CZ98J7QYCQ2XZ3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964593,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT61N79MRYCW30M2B7S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964599,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7JQCTPF8JT72JW5RY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964605,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT78QB837WH5WDZJW50","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964610,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7H54YZ1B3DXS9M8FB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964615,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT62KADS90EG49V9CEZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964621,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT6G2FBNE7KCYVD8WTS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964627,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT70P57ECHSJVCNGFWZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964633,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT76C11XPFH99V7HK2S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964639,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7938D4BK129G6Y00D","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964647,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7TXS05R23GAT1QTCK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964680,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZRYDQ1RFA9J9ASAS2N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964685,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZW50956C67KTT2DH41","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964699,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZVQN75QWJ1S2GNM24R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964706,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZSBD9WTJ2PRTRY54BS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964711,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZT8AK3CVEQMKV55DDW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964717,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZV5CTRB1PZTAM3FW9Z","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964723,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZTYTSWG20Q5KAE44E5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964728,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXHQC3BAEAG3MGDQMY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964734,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZSXY7HT6BHVS3EES82","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964740,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZX9GTC764YTCMWGXBG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964747,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZVE55P7BR7M1Z07H7E","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964754,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXTE7D1QEDW8XF8H7R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964759,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZW4WSK4XGS1R4TFRJN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964764,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXYZSQJAWM9W564ACQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964771,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXTPQWVM1YET03ZQJP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964777,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZX9X1EF4AXG4GM2KX0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964783,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZYE18WNB3Y3NYF4QVF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964789,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZZ0THT610YYWWJMWES","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964794,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZYBB8W0KX81ZWY3A5R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964800,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0KWTYH51GYGY8RTQ7E","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964807,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXDMGP4AQPM597JHRV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964812,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0KQWYY6WRGMXRQ21D0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964818,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZY5G9X4RQNA006SNW7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964824,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZYMW881NSMWDX6EBSH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964830,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MQZ86WVEJBX4EG2A2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964837,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0M4WRW53H1BKJGHJ5Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964842,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MHNPHR49YZ2TV788K","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964848,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0KVTE5TKV6CXYC6QDC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964854,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MJG1GT81JW3YHPPTF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964860,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MTTPWRDMNXRPD8HHP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964865,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0KZSVSCQHYJES12M7Z","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964871,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZY1S5ESWG25P982Q57","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964877,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZY2JS5D989YRNRXA67","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964883,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZZB80CSCCHNK1GNCE5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964889,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NGVGYA7HPR5VTFPPF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964895,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NZZ5H29M3NDBP95AZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964901,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NX2W04XPC2AZW8E2T","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964908,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MW9QD684TRVF69NZ2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964914,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0N70Q70HT5DC9AVCRE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964921,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NFH191EAHW8N5KTKE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964926,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PD8CR9M02RK2ATYDE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964931,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MWCWGC4GKYRGZGJZJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964936,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PZCC413TQ6MP0TRQP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964941,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NQNSEWMBR0486JNWC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964947,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NSX46DV7P73B3TRC8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964954,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PDBEBK3HRPSAXN7VK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964959,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0N6HNP1C8BRD0W42C0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964965,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PK43FJ929JGG54YQN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964970,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0P7DA2KYH6JNJ2PDA5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407964976,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PF7R7DFRVSW8T5FS3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965016,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA36BF3P24RJ9SKX34B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965022,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA39KYMA48Z3TPB7NAK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965028,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA6H6JQG2Q1E1RMXV6R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965034,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA7CF5MCMDY4KDR39QP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965039,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8CQ0RSW12TSMDAFF4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965045,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA4CJR8K7R1M3M82TWR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965052,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA4TQX8RF6TV0RSQ1ZY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965057,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA5VXDVTAT12PEQBQSC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965063,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA92667DT1DH6R4R01P","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965068,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA658K4GZEPZSVWW7QX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965074,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA7306DGWX7K1PCE5T4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965080,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA9TMM1QFMJD91YQPTB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965086,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8FRY47X3P22M5D1WE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965092,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8TZFG6Q5CK8G54D92","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965098,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8SGGAD06FT56WY073","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965103,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA9JHF39K08JB7XWCZE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965109,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA92D1CFHEF6M838NHD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965116,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA9SB4ESYZTSJW4X3Q9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965122,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAA9SDTX0MX796MCRZN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965127,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAAZS5377NVG34RXACC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965133,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA9PDT48B3Q203S4Z2D","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965139,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAAHYZADFD8JTGF3SN2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965144,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA963VJ505CRYSF95ME","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965150,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8V97B41TV9RKCC3Z0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965156,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABVSDB8N0X3XK28Y2N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965161,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABW4PJ30ZBP8DBB4QM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965168,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAA4YWNQSGSSG8RYE7M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965173,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA56JJYYK1FE7ZY3AZK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965178,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAACHJVKGK5WJPQPRKN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965184,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABWE5RVMA0V67YY7FX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965190,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABKQP0TA9C5E4E204X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965196,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABTBEY78C36RB8X6FZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965201,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA911BQMZPGY9XW6N7F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965212,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAA4FKWGCWBWFY56T0G","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965217,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YACT1NJ7DWZWM4PS80Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965222,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAB3MNS49K6K991YMWH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965227,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAB66GP4FE1Y8HAX0YH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965233,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABHD4GQP7WPG5CRNGT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965238,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YACMR0RPCXY9XKF29B1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965244,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YACRBTBTZ6KYS2BEWA3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965250,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAC0Z83WPN3KK1KZ2G2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965255,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADH3FCP66EKN1XA0RR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965260,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADETCSN2DP6FYK619W","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965267,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAB3D9P3RQ54E5QXFG6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965273,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YACSSAWH4ERMM10WZHW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965279,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADRPT6D69QPQ9HZWQV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965284,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAC6RKR8DN5HPMEMWST","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965289,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADC8XHDDZB7TK5EW1Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965293,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADRQN6ABZ07BKN25ZB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965299,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAC9PRJ21A4R4HSKXQM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965332,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM3VZYNCDHRJ08BZ28F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965339,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM40WYDVMMMWEGF4VSD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965344,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM74YTH1R30R204S0P3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965351,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM7Y4NEM06JZG6H35HY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965356,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM5S6C3846JGCYM5HYA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965362,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM6T4MCTCZ9MNGHQFNA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965369,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM5XMP4GN9VB69XSVHB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965375,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM6ZE3NNVGG4Z6A8R8Q","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965381,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM891SXA4N2QNNK6R35","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965388,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM5J46VAB4K9E73RM5P","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965393,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM3NS8JH2NWPZPS7PZ9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965398,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM8JFPSGEDXNC05RMKC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965405,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM8GX0V7Q1NEQ7YK578","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965413,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM8WQJZJSXSN389JHC5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965418,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM7XYZKDFAGVS68ZCBY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965424,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM893G0FFHQZ9X6MXS4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965429,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM7PEFVY2D2AYT8M7P4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965435,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM97EGNADPKJE3FR0ME","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965444,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM4K8Z8HK0X02B8J655","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965452,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM89ZK5BV2MW0CAE22X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965458,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM87054EXYKYXE97R2Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965463,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM96PDVFN59EEVCPQ4T","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965469,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM91NZKEGSZXN27XS84","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965475,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM91TEDCZDKWYPBH0JQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965480,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM8AFRQCKHSD0CJDNH5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965486,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9N3CR0TJ46B21PQSC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965491,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9KZFZDCQDCR3J2A7G","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965497,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMA3XRG2ASSZF2BV7KH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965502,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMATNGRG9XT01VDMCCK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965507,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMAFHHD3SASE6YBGNKK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965512,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMA3TJFJGYWYNNYE5H6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965518,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9Z758WF96P9N779RY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965524,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9N3A0FT5NVX8JRXKR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965529,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB5MQMFJ00Y7RJWD81","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965535,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB4BPY4P0PHY108ZNR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965541,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMAPXXA6PJRJ7EJ3M74","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965547,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBT3ETTERG26CMV8XJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965553,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMAXFZT6X42PM7MC8TB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965558,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB0YBKZ6DHKCW3KVFJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965565,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMAPMFTVDSD87TBB91F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965570,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBDEBD7ZND56AH840S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965575,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBM779ZE2DBH05NSE7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965581,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBNZD3PT75A3BRFV26","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965587,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9BW06B1N3A3R2EHP9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965592,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBWCFPNNC7RK170JGS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965597,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMA3Z5S0ZZGAMFM7WJ2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965602,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMCKW5GH6X625Q9P45X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965608,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMCN8K7AJPPVZXSF6CT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965613,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB93JCRFF379W6DQBH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965618,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB603133XQGGPJ09HN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965654,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY42AZZHP2CSM5QD51H","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965659,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY6705R9KDCPDYVDEYN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965665,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY5S8RAFHE0M86NQDZ4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965670,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY671H84ETCJJHV69K7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965681,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY7WTHBKGDDMQZBN4GB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965686,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8585N9VH1J3JAB2CP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965691,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY6EGZSAXYDSFXDT16J","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965698,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY7D8FJRNS3Y4VQNFAA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965704,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8RNBEJTP1K5EXSKX0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965710,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY7K36Y1Y37JX8QT5VM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965716,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9MXW9KK63JP34P5X9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965722,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9YZZ1Z4X86SC2F23N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965727,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9Q01D5WDCJGCSGX7M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965732,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8Z5P3ED5PER21T0CZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965737,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY94NDXTWXCP20SV5A1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965744,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY98Z1E61C98CWDH9YQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965750,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9ZM69E4EPBT6KWD4Z","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965756,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8NNQS3740ZFJVQSCW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965762,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8ADPJD91SS7WN1CZR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965767,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9ZC9KFDW94X09XG0M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965772,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYAVWKDQ9RSHVHRYAPG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965778,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9BCZCEG858SEYZWPJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965783,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY4MGKKB4E8GWZ8X1C4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965790,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYARPAGF7XA9FC72QV6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965795,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYA7FB841BF8109WC2V","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965801,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY5M47QR5JPYYMGKJYK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965805,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBZJHPY029DF3975G0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965812,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBAWPS1WP6W8W99PWS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965817,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYAB65BX5WE894WBV9X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965823,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBV62PPKJ5C57GY4E9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965829,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBTZP7ZYDSKRBXC0Q1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965835,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBBKA6ZYBE5X3ARFBX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965840,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYAF600TEZ7EWNBW0HR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965845,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYANH6A95DXQKQW3E4J","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965853,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYA890DXAQ252EGN38A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965860,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYC6PMCBC8HX7HCRQ7A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965866,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCCES2JMHHGEM2PPAN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965872,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYB24AMATY82EAEJ1FK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965877,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCNK1T6GVG2Y81SEW8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965883,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYAFR6S5V4TDR9M01Z4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965889,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBY6G844P4EZBK70F8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965893,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCN7X755NRRWH7Q0VC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965899,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBTVRDTM1XKPR1FH61","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965903,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYB759SZTK1707Y6CVM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965909,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBY443NXAGQ0TQ7KVX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965915,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCC0ECBBQT0FKPMPD3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965921,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCCTRMMZJ6X8SVGTZ0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965927,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYC981T139JP60STH3D","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965934,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCT20MN11WTC7TXND3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965940,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYC8SKBX1ACPZ0X3ANT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965979,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z82PF421QGEA433F0J5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965984,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z853ZC384RKZ3GRCPBK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965990,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z84SZDS35KT0F0TFEXY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407965995,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z878Y4W6AXHC44H4M48","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966001,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z85449RSNZNCCXBA5SR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966007,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z84VST39574Z9TTNSAW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966012,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z86RSGEJB76S19ZJYTH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966018,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87YAM0E2W3WRXH4A2T","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966024,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87MBW2KWDGAE4MAAAC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966030,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z839DCTZQCDDF2G1TQP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966036,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z866R1TF6A0V8SW5SXR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966043,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z86VJE6A4R6HR1MZ1QN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966049,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87BN3E8614Q3NZZME8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966054,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87GPC9G8MAGDK8DHJV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966060,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z889N4HRHA1N8HJ5DQG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966068,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87GCARD3FJ10KXR424","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966075,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z883G5TQ5CJGZTCK5D9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966080,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z83J7K3GC393YWPSN0X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966088,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z84SDHESVNJ58ZYYF1B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966093,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8852W9KKHP616R5G2N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966099,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z88NJ8SCF82A7YMHKHD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966106,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z88C6A6J21GZTC139JD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966112,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z893ZQDZDQ85VXRY5VK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966119,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89R8297RXNR7QRGKEZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966126,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8AS1QPV0M8860CCP91","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966131,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89SHYVET82FT28W07F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966136,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8AA65NVS2PQ1GAXG98","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966142,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z88KYARSKGTTPR5A99N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966152,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89AK2EGF0THM2QR8H9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966158,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8BA9NNV6THDDTGCCMK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966163,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89S9V69EEQBAMEED5N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966168,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8ANH9J60334K44XNPJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966174,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8AQKJF1XN2NDDS864X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966179,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8BDSMZMSPDB566DDBZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966185,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8ASEVQMQ1R6GX92NND","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966190,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8B9ERJNWRZRS6419CQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966195,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8B0QQD0RRQQTSN8P63","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966200,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8BVZ6YGQ3ZT67BXB04","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966206,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89TKFEQ4H2SKGCQRGD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966210,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8C3PPTDCAXG4FW46DY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966215,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8B6WA84WC71GWYP20G","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966225,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8A319FY032CNA3VPTB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966230,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8CV5X8CCSJNWK9ACXS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966235,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8C07SAMHFQXX12J01F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966240,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8CR9E6TXJ4S0V0CJNA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966245,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8A08N2PFP6K7CC94Y6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966251,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8BMXA4GBCV9DTRSN93","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966260,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8C2Q0D58VJCBEQDQ46","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966265,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8CAPNAAFC9Z5H5D6BJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":50,"time":1790407966271,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8B7J6KW3JPGG1NMT0S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} diff --git a/tests/e2e/evidence/server-n13-n2-bypass.txt b/tests/e2e/evidence/server-n13-n2-bypass.txt new file mode 100644 index 0000000..e69de29 From 537b784da35ada2399174ef57f541e36a83753e4 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 14:35:19 +0700 Subject: [PATCH 12/28] =?UTF-8?q?docs(e2e):=20REPORT.md=20(=D0=BE=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20PR)=20=D0=B8=20=D1=81?= =?UTF-8?q?=D0=B2=D0=B5=D0=B6=D0=B8=D0=B5=20evidence=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: PR в Forgejo создать нельзя (нет API-токена), поэтому описание изменений, таблица green/red по ID с командами и фактическим выводом, итог N5 до/после, валидация CI и N13 лежат в репозитории рядом с тестами. Evidence перезаписаны финальным прогоном ./scripts/test/ci-local.sh, чтобы отчёт ссылался на те же числа, что в файлах (38 red / 9 green, храповик OK, format красный из-за F14). Число файлов F14 в комментарии ci.yml и в заметках уточнено до 23 по этому замеру. --- .forgejo/workflows/ci.yml | 2 +- tests/e2e/NOTES-FOR-EXECUTORS.md | 2 +- tests/e2e/REPORT.md | 225 +++++ tests/e2e/evidence/ci-local.txt | 1138 ++++++++++++++++++++++ tests/e2e/evidence/e2e-results.json | 669 +++++++++++++ tests/e2e/evidence/e2e-run.txt | 941 ++++++++++++++++++ tests/e2e/evidence/e2e-table.md | 44 + tests/e2e/evidence/server-no-tokens.txt | 11 + tests/e2e/evidence/server-rate-limit.txt | 93 ++ tests/e2e/evidence/server-secured.txt | 279 ++++++ 10 files changed, 3402 insertions(+), 2 deletions(-) create mode 100644 tests/e2e/REPORT.md create mode 100644 tests/e2e/evidence/ci-local.txt create mode 100644 tests/e2e/evidence/e2e-results.json create mode 100644 tests/e2e/evidence/e2e-run.txt create mode 100644 tests/e2e/evidence/e2e-table.md create mode 100644 tests/e2e/evidence/server-no-tokens.txt create mode 100644 tests/e2e/evidence/server-rate-limit.txt create mode 100644 tests/e2e/evidence/server-secured.txt diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index a543a37..054899a 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: npm run check - run: npm audit --audit-level=high - # Отдельная задача: prettier сейчас красный по 25 файлам (F14), и это не должно + # Отдельная задача: prettier сейчас красный по 23 файлам (F14; замер 2026-09-26), и это не должно # маскировать статус verify/e2e. format: runs-on: docker diff --git a/tests/e2e/NOTES-FOR-EXECUTORS.md b/tests/e2e/NOTES-FOR-EXECUTORS.md index 4becfbb..321099e 100644 --- a/tests/e2e/NOTES-FOR-EXECUTORS.md +++ b/tests/e2e/NOTES-FOR-EXECUTORS.md @@ -117,7 +117,7 @@ OWN-03..09 дополнительно упрутся в N2 (подтвержде - Задаче `docker-build` нужен раннер с меткой `docker-host` (Docker daemon). Без него задача ждёт в очереди; остальные задачи не блокируются. -- `format` красная, пока не исправлен F14 (25 файлов, в основном `src/`, `docs/`, `tests/unit/`). +- `format` красная, пока не исправлен F14 (23 файла на замер 2026-09-26, в основном `src/`, `docs/`, `tests/unit/`). - Реальный Forgejo-раннер мной не запускался (нет API-токена) — не проверено. ## 5. N13 (гонка первого расчёта) и утечка текста ошибок БД diff --git a/tests/e2e/REPORT.md b/tests/e2e/REPORT.md new file mode 100644 index 0000000..455a996 --- /dev/null +++ b/tests/e2e/REPORT.md @@ -0,0 +1,225 @@ +# PR: e2e-стенд на реальной PostgreSQL 17 и независимая приёмка (grok/e2e-harness) + +База: `codex/bootstrap-platform-foundation` @ `778ba2d`. Сравнение: + + +Изменены только `tests/e2e/**`, `tests/integration/tenant-isolation.test.ts`, +`.forgejo/workflows/ci.yml`, `scripts/test/**`. `src/`, `apps/`, `migrations/`, `deploy/`, +`package.json` не тронуты. Всё, что требует правки продукта, — в +[`NOTES-FOR-EXECUTORS.md`](NOTES-FOR-EXECUTORS.md). + +## Зачем + +156 зелёных тестов на поддельной БД не заметили, что создание сотрудника, +подтверждение смены и расчёт зарплаты на реальной PostgreSQL падают всегда. Этот PR +добавляет стенд, где реальный сервер (`tsx src/server.ts`) работает с реальной +PostgreSQL 17 под ролью приложения без привилегий, миграции применяет мигратор без +SUPERUSER, а все токены и пароли случайные (`crypto.randomBytes`). Каждый сценарий +проверяет **правильное** поведение, поэтому красный цвет означает открытый дефект. + +## Источник ID + +Файлы владельца (`AUDIT.md`, `live-audit.mjs`, `live-sync.mjs`) до конца работы в +`/workspace/uploads/krona-staff-owner/` не появились. Сценарии написаны по моему +аудиту `2026-09-26_full-project-audit_grok_3e20544.md` (ID `F*`/`N*`) и по коду. ID владельца +K1, K3, K4, K5, K6, K10, K11, K12, S1, S2, S9, A4 **не сопоставлены — не проверено**. +Синхронизация помечена `SYNC-*` (мои ID, вероятно пересекаются с S1–S9 владельца). +Когда файлы владельца будут доступны, достаточно переименовать теги в названиях +тестов (например `[K3/N1]`) и ключи в `known-defects.json`. + +## Коммиты + +| SHA | Что | +| --------- | ------------------------------------------------------------------------------------- | +| `29fefc1` | `scripts/test/provision-pg.mjs`, `migrate-roundtrip.mjs`: роли как в pilot, roundtrip | +| `88fc749` | N5: очистка tenant-isolation ролью мигратора | +| `d7e9008` | prettier для tenant-isolation.test.ts | +| `cf7f6f4` | стенд e2e: global-setup, клиент, фикстуры, храповик `run-e2e.mjs` | +| `518494d` | сценарии основного API (N1–N4, N9–N12, F2–F4, F7, F10) | +| `32ced4b` | сценарии `/sync/*` (SYNC-A…L) | +| `9bdfb66` | форматирование сгенерированных evidence | +| `f59be3a` | CI: PostgreSQL 17, роли, roundtrip, e2e, docker-build отдельно, SHA-пины | +| `a19c06b` | проверка `deploy/pilot/compose.yaml` (PILOT-1..3) | +| `1e325a6` | сценарии решений владельца (OWN-01..11) + заметки исполнителям | +| `3388b90` | N13: гонка первого расчёта (скрипт и замер) | +| (этот) | REPORT.md и свежие evidence | + +## Как запустить + +```sh +# PostgreSQL 17, bootstrap-админ нужен только для создания ролей и БД +export E2E_PG_ADMIN_URL=postgres://:@127.0.0.1:55433/postgres +node scripts/test/run-e2e.mjs # храповик known-defects (как в CI) +node scripts/test/run-e2e.mjs --no-known-defects # строго: любой красный = exit 1 +E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs +./scripts/test/ci-local.sh # локальный эквивалент всех задач CI +``` + +Роли (`provision-pg.mjs`): `krona_migrator` — NOSUPERUSER NOCREATEDB NOCREATEROLE, +владелец БД и схемы `public`; `krona_staff_app` — NOSUPERUSER NOBYPASSRLS, права выдают +миграции 0003/0004. Пароли случайные, пишутся в env-файл 0600 во временном каталоге, +который удаляется после запуска. + +## Таблица green/red по ID + +Команда: `E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs` (в составе +`./scripts/test/ci-local.sh`), 2026-09-26 14:33 (UTC+7), PostgreSQL 17.11. Фактический вывод: +[`evidence/e2e-run.txt`](evidence/e2e-run.txt), [`evidence/ci-local.txt`](evidence/ci-local.txt), +JSON — [`evidence/e2e-results.json`](evidence/e2e-results.json), логи серверов — `evidence/server-*.txt`. + +```text + Test Files 4 failed | 1 passed (5) + Tests 38 failed | 9 passed (47) +[run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты +``` + +| ID | Цвет | Что проверяется (правильное поведение) | Фактически (из вывода) | +| ------------ | ----- | -------------------------------------------------------------------- | ----------------------------------------------------------------- | +| HARNESS (×5) | GREEN | live/ready, PG17, app-роль без SUPERUSER/BYPASSRLS, токены, терминал | 5/5 passed | +| CTRL (×2) | GREEN | RBAC терминала/сотрудника, уволенный теряет доступ | 2/2 passed | +| N1 | RED | POST /employees → 201 | 500 `42P08 inconsistent types deduced for parameter $2` | +| N2 | RED | подтверждение смены, расчёт, утверждение → 200 | 500 `23502 null value in column "occurred_at" of "staff_outbox"` | +| N4 | RED | пересекающиеся расчёты не начисляют смену дважды | блокирован N2 (500 23502 на предусловии) — сам N4 **не проверен** | +| N3 | RED | push на внутренний адрес отклоняется, соединений нет | 201 и 1 входящее соединение на 127.0.0.1 | +| N9 | RED | чужой push-endpoint не перепривязывается | 201 | +| N10 | RED | терминал не читает справочники (403) | professions 200, org-units 200 | +| N11 | RED | импорт с неверным kind → 400 | 500 `23514` check constraint staff_payroll_ledger | +| N12 | RED | лишние поля/нереальные суммы → 400 | 200 | +| F2 | RED | процесс без токенов не даёт прав анониму (401) | /portal 200, /payroll 200, POST /professions 201 | +| F3 | RED | cookie без сырого токена, logout отзывает | `rawTokenInCookie: true` | +| F4 | RED | 429 не позже 30 неверных входов | все 401, 429 нет | +| F7 | RED | повтор Idempotency-Key с другим телом не создаёт событие | второе событие создано (201) | +| F10 | RED | мутация по cookie без Origin → 403 | 201 | +| SYNC-A | RED | устройство не подтверждает смену | `applied` | +| SYNC-B | RED | устройство не утверждает табель | `applied` | +| SYNC-C0 | RED | bootstrap pull без курсора → 200 | 500 `42703 column "status" does not exist` (новая находка) | +| SYNC-C | RED | bootstrap >100 сущностей постранично без потерь | 500 42703 (блокирован SYNC-C0) | +| SYNC-D | RED | изменения из портала видны в инкрементальном pull | изменения нет | +| SYNC-E | RED | отметка уволенного через sync отклоняется | `applied` | +| SYNC-F | RED | точка устройства сохраняется, чужая точка в payload не принимается | `applied`, точка не сохранена | +| SYNC-G | RED | битая команда отклоняется по отдельности | 500 `22007` на весь пакет | +| SYNC-H | RED | регистрация устройства по cookie с чужим Origin → 403 | 201 | +| SYNC-I | RED | без токенов анонимно устройство не регистрируется | 201 | +| SYNC-J | RED | отметка 2001 года через sync отклоняется | `applied` | +| SYNC-K | RED | ack курсора из будущего → 400 | 200 | +| SYNC-L | GREEN | отозванное устройство не синхронизируется (403) | 403 (позитивный контроль) | +| OWN-01 | RED | менеджер точки A считает зарплату точки B → 403 | 404 `Route POST:/api/v1/staff/access-grants not found` (нет API) | +| OWN-02 | RED | менеджер отправляет пакет на согласование → 403 | 404 access-grants (нет API) | +| OWN-03 | RED | бухгалтер отправляет пакет → успех, каждому директору 1 уведомление | 404 access-grants (нет API) | +| OWN-04 | RED | бухгалтер подписывает пакет → 403 | 404 access-grants (нет API) | +| OWN-05 | RED | до подписи в ledger нет начислений/выплат | 404 access-grants (нет API) | +| OWN-06 | RED | подпись директора → ledger, пакет и смены неизменяемы | 404 access-grants (нет API) | +| OWN-07 | RED | смена изменена после отправки → 409, пакет у бухгалтера | 404 access-grants (нет API) | +| OWN-08 | RED | возврат с комментарием → пакет у бухгалтера, комментарий сохранён | 404 access-grants (нет API) | +| OWN-09 | RED | смена сотрудника A в точке B → в расчёт точки B | 404 access-grants (нет API) | +| OWN-10 | RED | без согласия на биометрию → терминалу «регистрация запрещена» | 404 `GET .../terminal/employees/:id/enrollment` (нет API) | +| OWN-11 | RED | согласие отозвано → статус для терминала меняется | 404 `PUT .../biometric-consent` (нет API) | +| PILOT-1 | RED | все подстановки в pilot compose — `${VAR:?}` | 14 переменных без `:?` (первая — `STANDALONE_MANAGER_TOKEN`) | +| PILOT-2 | RED | нет `NODE_ENV=development` | сервис `app` | +| PILOT-3 | GREEN | у `app` нет кредов мигратора | passed | +| N13 | — | гонка первого расчёта (скрипт, не vitest) | см. ниже: как есть 15/15 → 500 (N2); с обходом N2 — 0/30 гонок | +| N5 | GREEN | tenant-isolation на живой БД | до: FAIL; после: 2/2 прогона exit=0 (см. ниже) | + +Предполагаемые контракты для OWN-01..11 (C1 роли точки/бухгалтера/директора, C2 пакет +зарплаты и согласование, C3 согласие на биометрию) описаны в `NOTES-FOR-EXECUTORS.md` §1. + +### Механизм для красных сценариев (храповик) + +Выбран список `tests/e2e/known-defects.json` и одна задача `e2e`, а не отдельная +задача «allowed to fail». Причины: задача с `continue-on-error` зеленеет при любом +сбое, включая сломанный стенд, а храповик различает три случая: (1) стенд сломан +(`[HARNESS]`/`[CTRL]` красные или тест без ID) → exit 1; (2) новый красный ID не из +списка (регрессия) → exit 1; (3) ID из списка стал зелёным → exit 1 с просьбой +вычеркнуть его (исправление фиксируется, откат снова станет красным). Строгий режим +`--no-known-defects` показывает полную картину. + +## N5: tenant-isolation до/после + +До (база 778ba2d, `DATABASE_TEST_URL` = роль приложения), [`evidence/n5-before.txt`](evidence/n5-before.txt): + +```text + FAIL tests/integration/tenant-isolation.test.ts > PostgreSQL tenant isolation +error: permission denied for table staff_employees + ❯ tests/integration/tenant-isolation.test.ts:40:7 + Test Files 1 failed (1) + Tests 1 passed (1) +exit=1 +``` + +После (очистка соединением мигратора `DATABASE_TEST_MIGRATION_URL`, с +`app.tenant_id` из-за FORCE RLS, до и после теста), [`evidence/n5-after.txt`](evidence/n5-after.txt): + +```text +== run 1 ... Test Files 1 passed (1) Tests 1 passed (1) exit=0 +== run 2 ... Test Files 1 passed (1) Tests 1 passed (1) exit=0 +``` + +Полный `npm run check` с тестовой БД (задача verify в `ci-local.sh`): +`Test Files 19 passed (19)`, `Tests 188 passed (188)`. + +## CI (`.forgejo/workflows/ci.yml`) + +- `verify`: сервис `postgres:17-alpine@sha256:18cfe3ef…` (bootstrap-пользователь только + для provision), роли как в pilot (мигратор без SUPERUSER, app без BYPASSRLS), + миграции `up → откат всех 11 → up → up (no-op)`, `npm run check` с + `DATABASE_TEST_URL`/`DATABASE_TEST_MIGRATION_URL` (tenant-isolation реально + выполняется), `npm audit --audit-level=high`. +- `format`: отдельно, чтобы F14 (23 файла вне моих путей) не маскировал остальное. +- `e2e`: тот же сервис PostgreSQL 17, `E2E_MIGRATIONS=roundtrip`, храповик. +- `docker-build`: отдельная задача на метке `docker-host`, `needs: verify`, только push. +- Все actions закреплены SHA (F13): `actions/checkout@11d5960a… # v4.4.0`, + `actions/setup-node@49933ea5… # v4.4.0` (SHA получены `git ls-remote`, совпадают на + github.com и code.forgejo.org). + +Валидация: `actionlint -config-file actionlint.yaml .forgejo/workflows/ci.yml` (1.7.12, +метки `docker`, `docker-host`) → 0 замечаний, exit 0. Локальный эквивалент +`./scripts/test/ci-local.sh` ([`evidence/ci-local.txt`](evidence/ci-local.txt)): + +```text +::: [migrate-roundtrip] OK (== roundtrip OK: rolledBack=11 reapplied=11) +::: [check] OK (Test Files 19 passed, Tests 188 passed) +::: [audit] OK (found 0 vulnerabilities) +::: [format-check] FAIL exit=1 (Code style issues found in 23 files — F14) +::: [e2e] OK (храповик: все красные — известные дефекты) +=== итог: status=1 (только из-за format) +``` + +## Проверка pilot compose (PILOT-1..3) + +`tests/e2e/40-compose-pilot.e2e.ts` читает `deploy/pilot/compose.yaml` (только чтение). +Положен в `tests/e2e/`, а не рядом с существующим тестом корневого compose +(`tests/unit/deployment.test.ts`), потому что `tests/unit/` вне разрешённых путей. +Результат: PILOT-1 RED (14 подстановок без `:?`), PILOT-2 RED (`NODE_ENV: development` в +`app`; конфликт с запретом standalone в production в `config.ts` описан в заметках), +PILOT-3 GREEN. + +## N13: гонка первого расчёта + +`node scripts/test/n13-race.mjs` — 10/25/50 параллельных первых `POST /payroll/calculate`, +5 попыток на размер, каждая попытка на новой точке. Вывод: [`evidence/n13-race.txt`](evidence/n13-race.txt). + +```text +[n13] ИТОГ mode=as-is sessions=false: попыток 15, некорректных 15 (все 500: N2, occurred_at) +[n13] ИТОГ mode=n2-bypass sessions=false: попыток 15, некорректных 0 (200×N, 1 run_id, 1 расчёт) +[n13] ИТОГ mode=n2-bypass sessions=true: попыток 15, некорректных 0 (с подтверждённой сменой, db_lines=1) +``` + +`n2-bypass` — диагностика: в одноразовой БД скрипта мигратор ставит +`DEFAULT now()` для `staff_outbox.occurred_at`; продукт и миграции не меняются. +Вердикт: **гонка не воспроизведена (0 из 30 попыток при 10/25/50)**, совпадает с +«N13 not reproduced» владельца. Вероятная причина (из кода, отдельно не проверено): +upsert `ensureDefaultPayRules` в начале расчёта случайно сериализует расчёты одного +тенанта. Окно в коде остаётся — рекомендация в заметках §5. + +## Не проверено + +- Реальный Forgejo-раннер: workflow не запускался на сервере (нет API-токена, задачи + выполнены локально эквивалентным скриптом). Раннера с меткой `docker-host` может не быть. +- `docker build` не запускался (на этой машине нет Docker). +- Windows-only: DPAPI, ACL каталога данных, установщик, WinUI, реальный named pipe — + не проверено; см. тесты Codex в `apps/KronaStaffTerminal.Tests`. +- Сопоставление с ID владельца K1/K3/K4/K5/K6/K10/K11/K12, S1/S2/S9, A4 и сверка с его + `live-audit.mjs`/`live-sync.mjs` — файлов нет. +- N4 и SYNC-C по существу: блокированы N2 и SYNC-C0 соответственно. +- OWN-01..11 проверяют предполагаемый контракт; реальный контракт Codex может отличаться. +- Причина невоспроизводимости N13 — гипотеза по коду. diff --git a/tests/e2e/evidence/ci-local.txt b/tests/e2e/evidence/ci-local.txt new file mode 100644 index 0000000..f3a0f1c --- /dev/null +++ b/tests/e2e/evidence/ci-local.txt @@ -0,0 +1,1138 @@ +=== job verify +::: [npm-ci] npm ci --no-audit --no-fund +npm warn deprecated eslint@9.39.5: This version is no longer supported. Please see https://eslint.org/version-support for other options. + +added 236 packages in 1s +::: [npm-ci] OK +::: [provision] node scripts/test/provision-pg.mjs --out /tmp/tmp.FbBHYTGgXb/db.env --db krona_staff +provisioned database=krona_staff server_version=17.11 +role=krona_migrator super=false createrole=false createdb=false bypassrls=false +role=krona_staff_app super=false createrole=false createdb=false bypassrls=false +::: [provision] OK +::: [migrate-roundtrip] with_db_env node scripts/test/migrate-roundtrip.mjs roundtrip +== migrate up (1) +applied 0001_infrastructure.up.sql +applied 0002_security_hardening.up.sql +applied 0003_app_role_privileges.up.sql +applied 0004_revoke_broad_default_privileges.up.sql +applied 0005_attendance_portal.up.sql +applied 0006_payroll_foundation.up.sql +applied 0007_work_session_trace.up.sql +applied 0008_employee_access.up.sql +applied 0009_professions.up.sql +applied 0010_employee_push_notifications.up.sql +applied 0011_offline_sync_backend.up.sql +== rollback all (applied now: 11) +rolled back 0011_offline_sync_backend.down.sql +rolled back 0010_employee_push_notifications.down.sql +rolled back 0009_professions.down.sql +rolled back 0008_employee_access.down.sql +rolled back 0007_work_session_trace.down.sql +rolled back 0006_payroll_foundation.down.sql +rolled back 0005_attendance_portal.down.sql +rolled back 0004_revoke_broad_default_privileges.down.sql +rolled back 0003_app_role_privileges.down.sql +rolled back 0002_security_hardening.down.sql +rolled back 0001_infrastructure.down.sql +no migration to roll back +== rolled back 11 migrations +== migrate up (2) +applied 0001_infrastructure.up.sql +applied 0002_security_hardening.up.sql +applied 0003_app_role_privileges.up.sql +applied 0004_revoke_broad_default_privileges.up.sql +applied 0005_attendance_portal.up.sql +applied 0006_payroll_foundation.up.sql +applied 0007_work_session_trace.up.sql +applied 0008_employee_access.up.sql +applied 0009_professions.up.sql +applied 0010_employee_push_notifications.up.sql +applied 0011_offline_sync_backend.up.sql +== migrate up (3, must be no-op) +== roundtrip OK: rolledBack=11 reapplied=11 +::: [migrate-roundtrip] OK +::: [check] with_db_env npm run check + +> @krona/staff@0.3.2 check +> npm run lint && npm run typecheck && npm run test && npm run check:migrations && npm run check:contracts && npm run build + + +> @krona/staff@0.3.2 lint +> eslint . + + +> @krona/staff@0.3.2 typecheck +> tsc --noEmit + + +> @krona/staff@0.3.2 test +> vitest run + + + RUN v5.0.1 /workspace/krona-staff + + + Test Files 19 passed (19) + Tests 188 passed (188) + Start at 14:33:25 + Duration 1.00s (tests 46%, transform 31%, import 22%, worker 1%) + + +> @krona/staff@0.3.2 check:migrations +> node scripts/check-migrations.mjs + +validated 11 reversible migration(s) + +> @krona/staff@0.3.2 check:contracts +> node scripts/check-contracts.mjs + + + ╔═══════════════════════════════════════════════════════╗ + ║ ║ + ║ A new version of Redocly CLI (2.54.3) is available. ║ + ║ Update now: `npm i -g @redocly/cli@latest`. ║ + ║ Changelog: https://redocly.com/docs/cli/changelog/ ║ + ║ ║ + ╚═══════════════════════════════════════════════════════╝ + +No configurations were provided -- using built in recommended configuration by default. + +validating api/openapi.yaml... +api/openapi.yaml: validated in 45ms + +Woohoo! Your API description is valid. 🎉 + +module manifest, settings schema and OpenAPI contract validated + +> @krona/staff@0.3.2 build +> tsc -p tsconfig.build.json + +::: [check] OK +::: [audit] npm audit --audit-level=high +found 0 vulnerabilities +::: [audit] OK +=== job format +::: [format-check] npm run format:check + +> @krona/staff@0.3.2 format:check +> prettier --check . + +Checking formatting... +[warn] api/openapi.yaml +[warn] apps/KronaStaffService/README.md +[warn] deploy/pilot/compose.yaml +[warn] docs/DRIVER-DISTRIBUTION.md +[warn] docs/HARDWARE-TEST-SLK20R.md +[warn] docs/OFFLINE-SYNC-PROTOCOL.md +[warn] docs/TERMINAL-API-REQUIREMENTS.md +[warn] scripts/check-migrations.mjs +[warn] src/adapters/identity.ts +[warn] src/app.ts +[warn] src/config.ts +[warn] src/domain/attendance/work-session.ts +[warn] src/domain/notification/web-push.ts +[warn] src/domain/sync/cursor.ts +[warn] src/domain/sync/service.ts +[warn] src/portal.ts +[warn] src/sync.ts +[warn] tests/unit/config.test.ts +[warn] tests/unit/employee-push.test.ts +[warn] tests/unit/portal-ui.test.ts +[warn] tests/unit/sync.test.ts +[warn] tests/unit/tenant-sql.test.ts +[warn] tests/unit/work-session.test.ts +[warn] Code style issues found in 23 files. Run Prettier with --write to fix. +::: [format-check] FAIL exit=1 +=== job e2e +::: [e2e] env E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs + + RUN v5.0.1 /workspace/krona-staff + +[e2e] provision: +provisioned database=krona_staff_e2e server_version=17.11 +role=krona_migrator super=false createrole=false createdb=false bypassrls=false +role=krona_staff_app super=false createrole=false createdb=false bypassrls=false +[e2e] migrations (roundtrip) as krona_migrator: +== migrate up (1) +applied 0001_infrastructure.up.sql +applied 0002_security_hardening.up.sql +applied 0003_app_role_privileges.up.sql +applied 0004_revoke_broad_default_privileges.up.sql +applied 0005_attendance_portal.up.sql +applied 0006_payroll_foundation.up.sql +applied 0007_work_session_trace.up.sql +applied 0008_employee_access.up.sql +applied 0009_professions.up.sql +applied 0010_employee_push_notifications.up.sql +applied 0011_offline_sync_backend.up.sql +== rollback all (applied now: 11) +rolled back 0011_offline_sync_backend.down.sql +rolled back 0010_employee_push_notifications.down.sql +rolled back 0009_professions.down.sql +rolled back 0008_employee_access.down.sql +rolled back 0007_work_session_trace.down.sql +rolled back 0006_payroll_foundation.down.sql +rolled back 0005_attendance_portal.down.sql +rolled back 0004_revoke_broad_default_privileges.down.sql +rolled back 0003_app_role_privileges.down.sql +rolled back 0002_security_hardening.down.sql +rolled back 0001_infrastructure.down.sql +no migration to roll back +== rolled back 11 migrations +== migrate up (2) +applied 0001_infrastructure.up.sql +applied 0002_security_hardening.up.sql +applied 0003_app_role_privileges.up.sql +applied 0004_revoke_broad_default_privileges.up.sql +applied 0005_attendance_portal.up.sql +applied 0006_payroll_foundation.up.sql +applied 0007_work_session_trace.up.sql +applied 0008_employee_access.up.sql +applied 0009_professions.up.sql +applied 0010_employee_push_notifications.up.sql +applied 0011_offline_sync_backend.up.sql +== migrate up (3, must be no-op) +== roundtrip OK: rolledBack=11 reapplied=11 +[e2e] server secured ready at http://127.0.0.1:35389 (log: tests/e2e/evidence/server-secured.txt) +[e2e] server no-tokens ready at http://127.0.0.1:33821 (log: tests/e2e/evidence/server-no-tokens.txt) +[e2e] server rate-limit ready at http://127.0.0.1:36299 (log: tests/e2e/evidence/server-rate-limit.txt) + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N1] менеджер создаёт сотрудника через POST /employees → 201 38ms + → HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка 111ms + → подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N4] пересекающиеся расчёты не начисляют одну смену дважды 66ms + → подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1 2544ms + → подписка: HTTP 201 {"id":"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5","endpoint":"https://127.0.0.1:36027/e2e-internal-admin"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику 44ms + → HTTP 201 {"id":"01M3EA4J0JSPFRDF22J6E2CEY1","endpoint":"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400) 31ms + → HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":12345,"percent_bp":0,"guarantee_minor":0,"pool_weight_bp":0… | HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":9007199254740991,"percent_bp":0,"guarantee_minor":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N10] терминальный токен не читает справочники профессий и точек (403) 4ms + → expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401) 20ms + → expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F3] cookie сессии не содержит сырой токен и отзывается при выходе 8ms + → expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F10] мутация по cookie без Origin отклоняется (CSRF, 403) 5ms + → HTTP 201 {"id":"01M3EA4J31CEM99Y9708PNVE90","code":"profession-01m3ea4j31cem99y9708pnve90","name":"E2E-CSRF-профессия-c30803","status":"active"}: expected 201 to be 403 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F7] повтор Idempotency-Key с другим телом не создаёт второе событие 31ms + → expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N11] импорт с неверным kind начисления → 400, а не 500 25ms + → HTTP 500 {"statusCode":500,"code":"23514","error":"Internal Server Error","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""}: expected 500 to be 400 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток) 75ms + → статусы: 401: expected false to be true // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-01] менеджер точки A запускает расчёт для точки B → 403 110ms + → C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-02] менеджер точки отправляет пакет на согласование → 403 64ms + → C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-04] бухгалтер пытается подписать пакет → 403 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-05] до подписи директора в ledger нет начислений и выплат 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру 1ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена» 15ms + → C3: HTTP 404 {"message":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-11] согласие отозвано → статус для терминала меняется 15ms + → C3 PUT biometric-consent: HTTP 404 {"message":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется) 87ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JPXC3E39GZMHFH33H92","command_type":"upsert_work_session","status":"applied","result":{"id":"01M3EA4JPXQPVQDPGEA3YVFPXV","revision":1,"status":"applied"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) } + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-B] устройство не может утвердить табель (status=approved отклоняется) 32ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JR4CST4PE643FC043K9","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"01M3EA4JR43V65BMVJVX5DHSV0","revision":1,"status":"applied"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null } + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200) 39ms + → HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично 55ms + → HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull 41ms + → expected false to be true // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-E] отметка уволенного сотрудника через sync отклоняется 24ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JXD7TMSBAMMAK6HMXK2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется 42ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JYH12S10KQ4NWN232FM","status":"accepted"}},{"idempotency_key":"e2e-01M3EA4JYFDXJXPH923SG1E832","command_type":"attendance_event","status":"applied","resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) } + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500) 21ms + → HTTP 500 {"statusCode":500,"code":"22007","error":"Internal Server Error","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] } + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403) 9ms + → HTTP 201 {"device":{"id":"01M3EA4JZKVD04KCMNCGGW1EAH","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-5J7EDPFQV6","name":"E2E-CSRF-терминал-34e01a","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.935Z","created_by":"01M3E…: expected 201 to be 403 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401) 7ms + → HTTP 201 {"device":{"id":"01M3EA4JZWQF4S3SXWCX77J9ST","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-KS5GF18F83","name":"E2E-Анонимный терминал-75d36d","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.940Z","created_by":"…: expected 201 to be 401 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events 24ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4K0NB5RS8GACHWC7N2C2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400) 7ms + → HTTP 200 {"acknowledged":true,"cursor":"cur_999999999_fd163ccb01a6","acknowledged_at":"2026-09-26T07:33:38.972Z"}: expected 200 to be 400 // Object.is equality + ✓ tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль 8ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] сервер отвечает live/ready (ready проверяет БД) 32ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER 14ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] миграции применены мигратором, app-роль не видит schema_migrations 14ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200 14ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] терминал: отметка сотрудника из импорта принимается (201) 25ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя 24ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [CTRL] уволенный сотрудник теряет доступ (401) 23ms + × tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение} 6ms + → переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal [] + × tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-2] ни один сервис не запускается с NODE_ENV=development 1ms + → expected [ 'app' ] to deeply equal [] + ✓ tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-3] у сервиса app нет учётных данных мигратора 1ms + +⎯⎯⎯⎯⎯⎯ Failed Tests 38 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N1] менеджер создаёт сотрудника через POST /employees → 201 +AssertionError: HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 500 + + ❯ tests/e2e/10-core-defects.e2e.ts:55:57 + 53| }, + 54| }); + 55| expect(response.status, describeResponse(response)).toBe(201); + | ^ + 56| const rows = await dbQuery('SELECT id FROM staff_employees WHERE p… + 57| number, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка +AssertionError: подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 500 + + ❯ tests/e2e/10-core-defects.e2e.ts:73:81 + 71| body: { status: 'confirmed' }, + 72| }); + 73| expect(confirm.status, `подтверждение смены: ${describeResponse(co… + | ^ + 74| + 75| const calculate = await api('POST', '/payroll/calculate', { + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N4] пересекающиеся расчёты не начисляют одну смену дважды +AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 500 + + ❯ tests/e2e/10-core-defects.e2e.ts:104:7 + 102| confirm.status, + 103| `подтверждение смены (предусловие, см. N2): ${describeResponse(c… + 104| ).toBe(200); + | ^ + 105| + 106| const month = monthOf(day); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1 +AssertionError: подписка: HTTP 201 {"id":"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5","endpoint":"https://127.0.0.1:36027/e2e-internal-admin"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) } + +- Expected ++ Received + + { +- "connections": 0, +- "status": toSatisfy<[Function anonymous]>, ++ "connections": 1, ++ "status": 201, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:161:9 + 159| { status: subscribe.status, connections }, + 160| `подписка: ${describeResponse(subscribe)}`, + 161| ).toEqual({ + | ^ + 162| status: expect.toSatisfy((s: number) => s === 400 || s === 422… + 163| connections: 0, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику +AssertionError: HTTP 201 {"id":"01M3EA4J0JSPFRDF22J6E2CEY1","endpoint":"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) } + +- Expected ++ Received + + { + "owner": [ +- "01M3EA4HZSY982GYTPDAVP0Z0Q", ++ "01M3EA4HZTSZ12MKP3SV134FKS", + ], +- "status": toSatisfy<[Function anonymous]>, ++ "status": 201, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:191:7 + 189| { status: second.status, owner: owner.map((row) => row.employee_… + 190| describeResponse(second), + 191| ).toEqual({ + | ^ + 192| status: expect.toSatisfy((s: number) => s === 409 || s === 403), + 193| owner: [employeeA!.id], + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400) +AssertionError: HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":12345,"percent_bp":0,"guarantee_minor":0,"pool_weight_bp":0… | HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":9007199254740991,"percent_bp":0,"guarantee_minor":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 } + +- Expected ++ Received + + { +- "extra": 400, +- "huge": 400, ++ "extra": 200, ++ "huge": 200, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:215:7 + 213| { extra: extra.status, huge: huge.status }, + 214| `${describeResponse(extra)} | ${describeResponse(huge)}`, + 215| ).toEqual({ + | ^ + 216| extra: 400, + 217| huge: 400, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N10] терминальный токен не читает справочники профессий и точек (403) +AssertionError: expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 } + +- Expected ++ Received + + { +- "professions": 403, +- "units": 403, ++ "professions": 200, ++ "units": 200, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:224:70 + 222| const professions = await api('GET', '/professions', { token: ctx(… + 223| const units = await api('GET', '/org-units', { token: ctx().termin… + 224| expect({ professions: professions.status, units: units.status }).t… + | ^ + 225| professions: 403, + 226| units: 403, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401) +AssertionError: expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) } + +- Expected ++ Received + + { +- "payroll": 401, +- "portal": 401, +- "write": 401, ++ "payroll": 200, ++ "portal": 200, ++ "write": 201, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:237:85 + 235| body: { name: synthetic('Профессия') }, + 236| }); + 237| expect({ portal: portal.status, payroll: payroll.status, write: wr… + | ^ + 238| portal: 401, + 239| payroll: 401, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F3] cookie сессии не содержит сырой токен и отзывается при выходе +AssertionError: expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) } + +- Expected ++ Received + + { +- "afterLogout": 401, +- "rawTokenInCookie": false, ++ "afterLogout": 200, ++ "rawTokenInCookie": true, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:255:91 + 253| expect(logout.status).toBe(204); + 254| const reuse = await api('GET', '/portal', { headers: { cookie } }); + 255| expect({ rawTokenInCookie: value === ctx().managerToken, afterLogo… + | ^ + 256| rawTokenInCookie: false, + 257| afterLogout: 401, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F10] мутация по cookie без Origin отклоняется (CSRF, 403) +AssertionError: HTTP 201 {"id":"01M3EA4J31CEM99Y9708PNVE90","code":"profession-01m3ea4j31cem99y9708pnve90","name":"E2E-CSRF-профессия-c30803","status":"active"}: expected 201 to be 403 // Object.is equality + +- Expected ++ Received + +- 403 ++ 201 + + ❯ tests/e2e/10-core-defects.e2e.ts:269:57 + 267| body: { name: synthetic('CSRF-профессия') }, + 268| }); + 269| expect(response.status, describeResponse(response)).toBe(403); + | ^ + 270| }); + 271| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F7] повтор Idempotency-Key с другим телом не создаёт второе событие +AssertionError: expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false } + +- Expected ++ Received + + { + "first": 201, +- "secondCreated": false, ++ "secondCreated": true, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:288:75 + 286| const first = await send(`e2e-${randomUlid()}`); + 287| const second = await send(`e2e-${randomUlid()}`); + 288| expect({ first: first.status, secondCreated: second.status === 201… + | ^ + 289| first: 201, + 290| secondCreated: false, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N11] импорт с неверным kind начисления → 400, а не 500 +AssertionError: HTTP 500 {"statusCode":500,"code":"23514","error":"Internal Server Error","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""}: expected 500 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 500 + + ❯ tests/e2e/10-core-defects.e2e.ts:311:57 + 309| }, + 310| }); + 311| expect(response.status, describeResponse(response)).toBe(400); + | ^ + 312| }); + 313| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток) +AssertionError: статусы: 401: expected false to be true // Object.is equality + +- Expected ++ Received + +- true ++ false + + ❯ tests/e2e/10-core-defects.e2e.ts:324:84 + 322| if (response.status === 429) break; + 323| } + 324| expect(statuses.includes(429), `статусы: ${[...new Set(statuses)].… + | ^ + 325| }); + 326| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется) +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JPXC3E39GZMHFH33H92","command_type":"upsert_work_session","status":"applied","result":{"id":"01M3EA4JPXQPVQDPGEA3YVFPXV","revision":1,"status":"applied"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) } + +- Expected ++ Received + + { + "http": 200, +- "result": "rejected", +- "stored": null, ++ "result": "applied", ++ "stored": "confirmed", + } + + ❯ tests/e2e/20-sync-defects.e2e.ts:86:7 + 84| }, + 85| describeResponse(response), + 86| ).toEqual({ http: 200, result: 'rejected', stored: null }); + | ^ + 87| }); + 88| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-B] устройство не может утвердить табель (status=approved отклоняется) +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JR4CST4PE643FC043K9","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"01M3EA4JR43V65BMVJVX5DHSV0","revision":1,"status":"applied"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null } + +- Expected ++ Received + + { +- "result": "rejected", +- "stored": null, ++ "result": "applied", ++ "stored": "approved", + } + + ❯ tests/e2e/20-sync-defects.e2e.ts:109:7 + 107| { result: response.body?.results?.[0]?.status, stored: stored[0]… + 108| describeResponse(response), + 109| ).toEqual({ result: 'rejected', stored: null }); + | ^ + 110| }); + 111| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200) +AssertionError: HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 500 + + ❯ tests/e2e/20-sync-defects.e2e.ts:120:57 + 118| body: { cursor: null }, + 119| }); + 120| expect(response.status, describeResponse(response)).toBe(200); + | ^ + 121| const types = new Set( + 122| (response.body.changes as Array<{ entity_type: string }>).map((c… + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично +AssertionError: HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 500 + + ❯ pullAll tests/e2e/20-sync-defects.e2e.ts:51:57 + 49| body: { cursor: next, limit: 100 }, + 50| }); + 51| expect(response.status, describeResponse(response)).toBe(200); + | ^ + 52| changes.push(...(response.body.changes as Array<{ entity_type: str… + 53| next = response.body.next_cursor as string; + ❯ tests/e2e/20-sync-defects.e2e.ts:130:25 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull +AssertionError: expected false to be true // Object.is equality + +- Expected ++ Received + +- true ++ false + + ❯ tests/e2e/20-sync-defects.e2e.ts:151:95 + 149| expect(patch.status, describeResponse(patch)).toBe(200); + 150| const { changes } = await pullAll(device, cursor); + 151| expect(changes.some((c) => c.entity_type === 'employee' && c.entit… + | ^ + 152| true, + 153| ); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-E] отметка уволенного сотрудника через sync отклоняется +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JXD7TMSBAMMAK6HMXK2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality + +Expected: "rejected" +Received: "applied" + + ❯ tests/e2e/20-sync-defects.e2e.ts:171:77 + 169| }), + 170| ]); + 171| expect(response.body?.results?.[0]?.status, describeResponse(respo… + | ^ + 172| }); + 173| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JYH12S10KQ4NWN232FM","status":"accepted"}},{"idempotency_key":"e2e-01M3EA4JYFDXJXPH923SG1E832","command_type":"attendance_event","status":"applied","resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) } + +- Expected ++ Received + + { +- "foreign": "rejected", +- "ownOrgUnit": "01M3EA4JXPPT6RXP11RKV1VY20", ++ "foreign": "applied", ++ "ownOrgUnit": null, + } + + ❯ tests/e2e/20-sync-defects.e2e.ts:202:7 + 200| }, + 201| describeResponse(response), + 202| ).toEqual({ ownOrgUnit: unitA!.id, foreign: 'rejected' }); + | ^ + 203| }); + 204| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500) +AssertionError: HTTP 500 {"statusCode":500,"code":"22007","error":"Internal Server Error","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] } + +- Expected ++ Received + + { +- "http": 200, +- "statuses": [ +- "applied", +- "rejected", +- ], ++ "http": 500, ++ "statuses": [], + } + + ❯ tests/e2e/20-sync-defects.e2e.ts:225:7 + 223| }, + 224| describeResponse(response), + 225| ).toEqual({ http: 200, statuses: ['applied', 'rejected'] }); + | ^ + 226| }); + 227| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403) +AssertionError: HTTP 201 {"device":{"id":"01M3EA4JZKVD04KCMNCGGW1EAH","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-5J7EDPFQV6","name":"E2E-CSRF-терминал-34e01a","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.935Z","created_by":"01M3E…: expected 201 to be 403 // Object.is equality + +- Expected ++ Received + +- 403 ++ 201 + + ❯ tests/e2e/20-sync-defects.e2e.ts:236:57 + 234| body: { device_code: `E2E-${randomUlid().slice(-10)}`, name: syn… + 235| }); + 236| expect(response.status, describeResponse(response)).toBe(403); + | ^ + 237| }); + 238| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401) +AssertionError: HTTP 201 {"device":{"id":"01M3EA4JZWQF4S3SXWCX77J9ST","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-KS5GF18F83","name":"E2E-Анонимный терминал-75d36d","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.940Z","created_by":"…: expected 201 to be 401 // Object.is equality + +- Expected ++ Received + +- 401 ++ 201 + + ❯ tests/e2e/20-sync-defects.e2e.ts:247:57 + 245| }, + 246| }); + 247| expect(response.status, describeResponse(response)).toBe(401); + | ^ + 248| }); + 249| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4K0NB5RS8GACHWC7N2C2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality + +Expected: "rejected" +Received: "applied" + + ❯ tests/e2e/20-sync-defects.e2e.ts:260:77 + 258| }), + 259| ]); + 260| expect(response.body?.results?.[0]?.status, describeResponse(respo… + | ^ + 261| }); + 262| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400) +AssertionError: HTTP 200 {"acknowledged":true,"cursor":"cur_999999999_fd163ccb01a6","acknowledged_at":"2026-09-26T07:33:38.972Z"}: expected 200 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 200 + + ❯ tests/e2e/20-sync-defects.e2e.ts:275:57 + 273| body: { cursor: `cur_${seq}_${hash}` }, + 274| }); + 275| expect(response.status, describeResponse(response)).toBe(400); + | ^ + 276| }); + 277| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-01] менеджер точки A запускает расчёт для точки B → 403 +AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:94:22 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-02] менеджер точки отправляет пакет на согласование → 403 +AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:105:22 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:118:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-04] бухгалтер пытается подписать пакет → 403 +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:133:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-05] до подписи директора в ledger нет начислений и выплат +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:141:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:148:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:173:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:195:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:213:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена» +AssertionError: C3: HTTP 404 {"message":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 404 + + ❯ tests/e2e/30-owner-decisions.e2e.ts:241:66 + 239| token: ctx().terminalToken, + 240| }); + 241| expect(response.status, `C3: ${describeResponse(response)}`).toBe(… + | ^ + 242| expect(response.body).toMatchObject({ registration_allowed: false,… + 243| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-11] согласие отозвано → статус для терминала меняется +AssertionError: C3 PUT biometric-consent: HTTP 404 {"message":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 404 + + ❯ tests/e2e/30-owner-decisions.e2e.ts:255:86 + 253| api('GET', `/terminal/employees/${employee!.id}/enrollment`, { t… + 254| const granted = await setConsent('granted'); + 255| expect(granted.status, `C3 PUT biometric-consent: ${describeRespon… + | ^ + 256| const before = await enrollment(); + 257| const revoked = await setConsent('revoked'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/38]⎯ + + FAIL tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение} +AssertionError: переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal [] + +- Expected ++ Received + +- [] ++ [ ++ "STANDALONE_MANAGER_TOKEN", ++ "STANDALONE_TERMINAL_TOKEN", ++ "STANDALONE_TENANT_ID", ++ "STANDALONE_ACTOR_ID", ++ "STANDALONE_TERMINAL_ACTOR_ID", ++ "VAPID_PUBLIC_KEY", ++ "VAPID_PRIVATE_KEY", ++ "VAPID_SUBJECT", ++ "POSTGRES_APP_PASSWORD", ++ "HTTPS_PFX_PASSPHRASE", ++ "POSTGRES_MIGRATION_PASSWORD", ++ "POSTGRES_APP_PASSWORD", ++ "POSTGRES_MIGRATION_PASSWORD", ++ "POSTGRES_MIGRATION_PASSWORD", ++ ] + + ❯ tests/e2e/40-compose-pilot.e2e.ts:34:87 + 32| expect(interpolations.length).toBeGreaterThan(0); + 33| const optional = interpolations.filter((inner) => !/^[A-Z0-9_]+:\?… + 34| expect(optional, 'переменные без :? — пустое значение молча попадё… + | ^ + 35| }); + 36| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/38]⎯ + + FAIL tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-2] ни один сервис не запускается с NODE_ENV=development +AssertionError: expected [ 'app' ] to deeply equal [] + +- Expected ++ Received + +- [] ++ [ ++ "app", ++ ] + + ❯ tests/e2e/40-compose-pilot.e2e.ts:41:23 + 39| (service) => environmentOf(service).NODE_ENV === 'development', + 40| ); + 41| expect(offenders).toEqual([]); + | ^ + 42| }); + 43| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[38/38]⎯ + + + Test Files 4 failed | 1 passed (5) + Tests 38 failed | 9 passed (47) + Start at 14:33:32 + Duration 7.22s (tests 95%, import 3%, transform 2%) + +JSON report written to /workspace/krona-staff/tests/e2e/evidence/e2e-results.json + +[run-e2e] vitest exit=1 +| ID | Цвет | Зелёных/всего | Вердикт | +|---|---|---|---| +| CTRL | GREEN | 2/2 | зелёный | +| F10 | RED | 0/1 | красный (известный дефект) | +| F2 | RED | 0/1 | красный (известный дефект) | +| F3 | RED | 0/1 | красный (известный дефект) | +| F4 | RED | 0/1 | красный (известный дефект) | +| F7 | RED | 0/1 | красный (известный дефект) | +| HARNESS | GREEN | 5/5 | зелёный (позитивный контроль) | +| N1 | RED | 0/1 | красный (известный дефект) | +| N10 | RED | 0/1 | красный (известный дефект) | +| N11 | RED | 0/1 | красный (известный дефект) | +| N12 | RED | 0/1 | красный (известный дефект) | +| N2 | RED | 0/1 | красный (известный дефект) | +| N3 | RED | 0/1 | красный (известный дефект) | +| N4 | RED | 0/1 | красный (известный дефект) | +| N9 | RED | 0/1 | красный (известный дефект) | +| OWN-01 | RED | 0/1 | красный (известный дефект) | +| OWN-02 | RED | 0/1 | красный (известный дефект) | +| OWN-03 | RED | 0/1 | красный (известный дефект) | +| OWN-04 | RED | 0/1 | красный (известный дефект) | +| OWN-05 | RED | 0/1 | красный (известный дефект) | +| OWN-06 | RED | 0/1 | красный (известный дефект) | +| OWN-07 | RED | 0/1 | красный (известный дефект) | +| OWN-08 | RED | 0/1 | красный (известный дефект) | +| OWN-09 | RED | 0/1 | красный (известный дефект) | +| OWN-10 | RED | 0/1 | красный (известный дефект) | +| OWN-11 | RED | 0/1 | красный (известный дефект) | +| PILOT-1 | RED | 0/1 | красный (известный дефект) | +| PILOT-2 | RED | 0/1 | красный (известный дефект) | +| PILOT-3 | GREEN | 1/1 | зелёный | +| SYNC-A | RED | 0/1 | красный (известный дефект) | +| SYNC-B | RED | 0/1 | красный (известный дефект) | +| SYNC-C | RED | 0/1 | красный (известный дефект) | +| SYNC-C0 | RED | 0/1 | красный (известный дефект) | +| SYNC-D | RED | 0/1 | красный (известный дефект) | +| SYNC-E | RED | 0/1 | красный (известный дефект) | +| SYNC-F | RED | 0/1 | красный (известный дефект) | +| SYNC-G | RED | 0/1 | красный (известный дефект) | +| SYNC-H | RED | 0/1 | красный (известный дефект) | +| SYNC-I | RED | 0/1 | красный (известный дефект) | +| SYNC-J | RED | 0/1 | красный (известный дефект) | +| SYNC-K | RED | 0/1 | красный (известный дефект) | +| SYNC-L | GREEN | 1/1 | зелёный | + +[run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты +::: [e2e] OK +=== итог: status=1 +ci-local exit=1 diff --git a/tests/e2e/evidence/e2e-results.json b/tests/e2e/evidence/e2e-results.json new file mode 100644 index 0000000..096268b --- /dev/null +++ b/tests/e2e/evidence/e2e-results.json @@ -0,0 +1,669 @@ +{ + "numTotalTestSuites": 10, + "numPassedTestSuites": 2, + "numFailedTestSuites": 8, + "numPendingTestSuites": 0, + "numTotalTests": 47, + "numPassedTests": 9, + "numFailedTests": 38, + "numPendingTests": 0, + "numTodoTests": 0, + "snapshot": { + "added": 0, + "failure": false, + "filesAdded": 0, + "filesRemoved": 0, + "filesRemovedList": [], + "filesUnmatched": 0, + "filesUpdated": 0, + "matched": 0, + "total": 0, + "unchecked": 0, + "uncheckedKeysByFile": [], + "unmatched": 0, + "updated": 0, + "didUpdate": false + }, + "startTime": 1790408012144, + "success": false, + "testResults": [ + { + "assertionResults": [ + { + "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], + "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] сервер отвечает live/ready (ready проверяет БД)", + "status": "passed", + "title": "[HARNESS] сервер отвечает live/ready (ready проверяет БД)", + "duration": 32.192098, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], + "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER", + "status": "passed", + "title": "[HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER", + "duration": 14.342552000000012, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], + "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] миграции применены мигратором, app-роль не видит schema_migrations", + "status": "passed", + "title": "[HARNESS] миграции применены мигратором, app-роль не видит schema_migrations", + "duration": 14.26604900000001, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], + "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200", + "status": "passed", + "title": "[HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200", + "duration": 13.863121000000007, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], + "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] терминал: отметка сотрудника из импорта принимается (201)", + "status": "passed", + "title": "[HARNESS] терминал: отметка сотрудника из импорта принимается (201)", + "duration": 24.62379200000001, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], + "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя", + "status": "passed", + "title": "[CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя", + "duration": 23.691180000000003, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], + "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [CTRL] уволенный сотрудник теряет доступ (401)", + "status": "passed", + "title": "[CTRL] уволенный сотрудник теряет доступ (401)", + "duration": 23.254977999999994, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + } + ], + "startTime": 1790408019083, + "endTime": 1790408019229.255, + "status": "passed", + "message": "", + "name": "/workspace/krona-staff/tests/e2e/00-harness.e2e.ts" + }, + { + "assertionResults": [ + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [N1] менеджер создаёт сотрудника через POST /employees → 201", + "status": "failed", + "title": "[N1] менеджер создаёт сотрудника через POST /employees → 201", + "duration": 38.316193, + "failureMessages": [ + "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42P08\",\"error\":\"Internal Server Error\",\"message\":\"inconsistent types deduced for parameter $2\"}: expected 500 to be 201 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:55:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка", + "status": "failed", + "title": "[N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка", + "duration": 110.697531, + "failureMessages": [ + "AssertionError: подтверждение смены: HTTP 500 {\"statusCode\":500,\"code\":\"23502\",\"error\":\"Internal Server Error\",\"message\":\"null value in column \\\"occurred_at\\\" of relation \\\"staff_outbox\\\" violates not-null constraint\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:73:81\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [N4] пересекающиеся расчёты не начисляют одну смену дважды", + "status": "failed", + "title": "[N4] пересекающиеся расчёты не начисляют одну смену дважды", + "duration": 66.33918700000004, + "failureMessages": [ + "AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {\"statusCode\":500,\"code\":\"23502\",\"error\":\"Internal Server Error\",\"message\":\"null value in column \\\"occurred_at\\\" of relation \\\"staff_outbox\\\" violates not-null constraint\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:104:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1", + "status": "failed", + "title": "[N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1", + "duration": 2544.330582, + "failureMessages": [ + "AssertionError: подписка: HTTP 201 {\"id\":\"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5\",\"endpoint\":\"https://127.0.0.1:36027/e2e-internal-admin\"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:161:9\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику", + "status": "failed", + "title": "[N9] чужой push-endpoint нельзя перепривязать к другому сотруднику", + "duration": 44.48753099999976, + "failureMessages": [ + "AssertionError: HTTP 201 {\"id\":\"01M3EA4J0JSPFRDF22J6E2CEY1\",\"endpoint\":\"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf\"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:191:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400)", + "status": "failed", + "title": "[N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400)", + "duration": 31.35817700000007, + "failureMessages": [ + "AssertionError: HTTP 200 {\"id\":\"01M3EA4J1PHXWHFMAMYYVRMK3E\",\"employee_id\":\"01M3EA4J151B1H9D5AKAR29AN9\",\"org_unit_id\":null,\"pay_rule_id\":\"01M3EA4FCDRQSS6V8H5Q6XS615\",\"pay_rule_code\":\"hourly\",\"pay_rule_name\":\"Почасовая (стажёр, дополнительный сотрудник)\",\"rate_minor\":12345,\"percent_bp\":0,\"guarantee_minor\":0,\"pool_weight_bp\":0… | HTTP 200 {\"id\":\"01M3EA4J1PHXWHFMAMYYVRMK3E\",\"employee_id\":\"01M3EA4J151B1H9D5AKAR29AN9\",\"org_unit_id\":null,\"pay_rule_id\":\"01M3EA4FCDRQSS6V8H5Q6XS615\",\"pay_rule_code\":\"hourly\",\"pay_rule_name\":\"Почасовая (стажёр, дополнительный сотрудник)\",\"rate_minor\":9007199254740991,\"percent_bp\":0,\"guarantee_minor\":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:215:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [N10] терминальный токен не читает справочники профессий и точек (403)", + "status": "failed", + "title": "[N10] терминальный токен не читает справочники профессий и точек (403)", + "duration": 4.364047000000028, + "failureMessages": [ + "AssertionError: expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:224:70\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)", + "status": "failed", + "title": "[F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)", + "duration": 19.630533999999898, + "failureMessages": [ + "AssertionError: expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:237:85\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [F3] cookie сессии не содержит сырой токен и отзывается при выходе", + "status": "failed", + "title": "[F3] cookie сессии не содержит сырой токен и отзывается при выходе", + "duration": 8.088321000000178, + "failureMessages": [ + "AssertionError: expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:255:91\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [F10] мутация по cookie без Origin отклоняется (CSRF, 403)", + "status": "failed", + "title": "[F10] мутация по cookie без Origin отклоняется (CSRF, 403)", + "duration": 5.457843000000139, + "failureMessages": [ + "AssertionError: HTTP 201 {\"id\":\"01M3EA4J31CEM99Y9708PNVE90\",\"code\":\"profession-01m3ea4j31cem99y9708pnve90\",\"name\":\"E2E-CSRF-профессия-c30803\",\"status\":\"active\"}: expected 201 to be 403 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:269:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [F7] повтор Idempotency-Key с другим телом не создаёт второе событие", + "status": "failed", + "title": "[F7] повтор Idempotency-Key с другим телом не создаёт второе событие", + "duration": 31.478251999999884, + "failureMessages": [ + "AssertionError: expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:288:75\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [N11] импорт с неверным kind начисления → 400, а не 500", + "status": "failed", + "title": "[N11] импорт с неверным kind начисления → 400, а не 500", + "duration": 24.907294000000093, + "failureMessages": [ + "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"23514\",\"error\":\"Internal Server Error\",\"message\":\"new row for relation \\\"staff_payroll_ledger\\\" violates check constraint \\\"staff_payroll_ledger_kind_check\\\"\"}: expected 500 to be 400 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:311:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Основной API на реальной PostgreSQL"], + "fullName": "Основной API на реальной PostgreSQL [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)", + "status": "failed", + "title": "[F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)", + "duration": 75.38818200000014, + "failureMessages": [ + "AssertionError: статусы: 401: expected false to be true // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:324:84\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + } + ], + "startTime": 1790408015147, + "endTime": 1790408018151.3882, + "status": "failed", + "message": "", + "name": "/workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts" + }, + { + "assertionResults": [ + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)", + "status": "failed", + "title": "[SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)", + "duration": 86.95440500000001, + "failureMessages": [ + "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JPXC3E39GZMHFH33H92\",\"command_type\":\"upsert_work_session\",\"status\":\"applied\",\"result\":{\"id\":\"01M3EA4JPXQPVQDPGEA3YVFPXV\",\"revision\":1,\"status\":\"applied\"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:86:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-B] устройство не может утвердить табель (status=approved отклоняется)", + "status": "failed", + "title": "[SYNC-B] устройство не может утвердить табель (status=approved отклоняется)", + "duration": 32.361658000000006, + "failureMessages": [ + "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JR4CST4PE643FC043K9\",\"command_type\":\"upsert_timesheet_entry\",\"status\":\"applied\",\"result\":{\"id\":\"01M3EA4JR43V65BMVJVX5DHSV0\",\"revision\":1,\"status\":\"applied\"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:109:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200)", + "status": "failed", + "title": "[SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200)", + "duration": 39.13565999999997, + "failureMessages": [ + "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42703\",\"error\":\"Internal Server Error\",\"message\":\"column \\\"status\\\" does not exist\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:120:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично", + "status": "failed", + "title": "[SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично", + "duration": 54.852048000000025, + "failureMessages": [ + "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42703\",\"error\":\"Internal Server Error\",\"message\":\"column \\\"status\\\" does not exist\"}: expected 500 to be 200 // Object.is equality\n at pullAll (/workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:51:57)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:130:25\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull", + "status": "failed", + "title": "[SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull", + "duration": 40.97763200000003, + "failureMessages": [ + "AssertionError: expected false to be true // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:151:95\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-E] отметка уволенного сотрудника через sync отклоняется", + "status": "failed", + "title": "[SYNC-E] отметка уволенного сотрудника через sync отклоняется", + "duration": 23.937388999999996, + "failureMessages": [ + "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4JXD7TMSBAMMAK6HMXK2\",\"status\":\"accepted\"}}]}: expected 'applied' to be 'rejected' // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:171:77\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется", + "status": "failed", + "title": "[SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется", + "duration": 42.41749800000002, + "failureMessages": [ + "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4JYH12S10KQ4NWN232FM\",\"status\":\"accepted\"}},{\"idempotency_key\":\"e2e-01M3EA4JYFDXJXPH923SG1E832\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:202:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)", + "status": "failed", + "title": "[SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)", + "duration": 20.59652299999999, + "failureMessages": [ + "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"22007\",\"error\":\"Internal Server Error\",\"message\":\"invalid input syntax for type timestamp with time zone: \\\"e2e-not-a-timestamp\\\"\"}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:225:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)", + "status": "failed", + "title": "[SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)", + "duration": 9.081312000000025, + "failureMessages": [ + "AssertionError: HTTP 201 {\"device\":{\"id\":\"01M3EA4JZKVD04KCMNCGGW1EAH\",\"tenant_id\":\"01M3EA4DJNEY3HRCYSBSX43XW0\",\"device_code\":\"E2E-5J7EDPFQV6\",\"name\":\"E2E-CSRF-терминал-34e01a\",\"token_hint\":\"kstaff_dev_01M3E\",\"status\":\"active\",\"allowed_scopes\":[\"attendance:sync\"],\"registered_at\":\"2026-09-26T07:33:38.935Z\",\"created_by\":\"01M3E…: expected 201 to be 403 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:236:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)", + "status": "failed", + "title": "[SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)", + "duration": 6.548922000000005, + "failureMessages": [ + "AssertionError: HTTP 201 {\"device\":{\"id\":\"01M3EA4JZWQF4S3SXWCX77J9ST\",\"tenant_id\":\"01M3EA4DJNEY3HRCYSBSX43XW0\",\"device_code\":\"E2E-KS5GF18F83\",\"name\":\"E2E-Анонимный терминал-75d36d\",\"token_hint\":\"kstaff_dev_01M3E\",\"status\":\"active\",\"allowed_scopes\":[\"attendance:sync\"],\"registered_at\":\"2026-09-26T07:33:38.940Z\",\"created_by\":\"…: expected 201 to be 401 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:247:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events", + "status": "failed", + "title": "[SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events", + "duration": 23.565251999999987, + "failureMessages": [ + "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4K0NB5RS8GACHWC7N2C2\",\"status\":\"accepted\"}}]}: expected 'applied' to be 'rejected' // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:260:77\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400)", + "status": "failed", + "title": "[SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400)", + "duration": 6.953785000000039, + "failureMessages": [ + "AssertionError: HTTP 200 {\"acknowledged\":true,\"cursor\":\"cur_999999999_fd163ccb01a6\",\"acknowledged_at\":\"2026-09-26T07:33:38.972Z\"}: expected 200 to be 400 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:275:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], + "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль", + "status": "passed", + "title": "[SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль", + "duration": 8.451247999999964, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + } + ], + "startTime": 1790408018587, + "endTime": 1790408018982.4512, + "status": "failed", + "message": "", + "name": "/workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts" + }, + { + "assertionResults": [ + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-01] менеджер точки A запускает расчёт для точки B → 403", + "status": "failed", + "title": "[OWN-01] менеджер точки A запускает расчёт для точки B → 403", + "duration": 109.84663699999999, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:94:22\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-02] менеджер точки отправляет пакет на согласование → 403", + "status": "failed", + "title": "[OWN-02] менеджер точки отправляет пакет на согласование → 403", + "duration": 64.021771, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:105:22\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление", + "status": "failed", + "title": "[OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление", + "duration": 1.5183850000000234, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:118:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-04] бухгалтер пытается подписать пакет → 403", + "status": "failed", + "title": "[OWN-04] бухгалтер пытается подписать пакет → 403", + "duration": 1.8508840000000077, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:133:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-05] до подписи директора в ledger нет начислений и выплат", + "status": "failed", + "title": "[OWN-05] до подписи директора в ledger нет начислений и выплат", + "duration": 1.9114280000000008, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:141:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы", + "status": "failed", + "title": "[OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы", + "duration": 1.5373430000000212, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:148:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру", + "status": "failed", + "title": "[OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру", + "duration": 1.4993349999999737, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:173:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён", + "status": "failed", + "title": "[OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён", + "duration": 2.188139000000035, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:195:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B", + "status": "failed", + "title": "[OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B", + "duration": 2.2691649999999868, + "failureMessages": [ + "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:213:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»", + "status": "failed", + "title": "[OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»", + "duration": 15.068132999999989, + "failureMessages": [ + "AssertionError: C3: HTTP 404 {\"message\":\"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:241:66\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], + "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-11] согласие отозвано → статус для терминала меняется", + "status": "failed", + "title": "[OWN-11] согласие отозвано → статус для терминала меняется", + "duration": 14.774637000000041, + "failureMessages": [ + "AssertionError: C3 PUT biometric-consent: HTTP 404 {\"message\":\"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:255:86\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + } + ], + "startTime": 1790408018262, + "endTime": 1790408018478.7747, + "status": "failed", + "message": "", + "name": "/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts" + }, + { + "assertionResults": [ + { + "ancestorTitles": ["deploy/pilot/compose.yaml"], + "fullName": "deploy/pilot/compose.yaml [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}", + "status": "failed", + "title": "[PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}", + "duration": 5.8893739999999895, + "failureMessages": [ + "AssertionError: переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal []\n at /workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts:34:87\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:1628:35\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:26\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3319:20\n at new Promise ()\n at runWithCancel (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3314:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3299:20\n at new Promise ()\n at runWithTimeout (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3257:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3876:64" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["deploy/pilot/compose.yaml"], + "fullName": "deploy/pilot/compose.yaml [PILOT-2] ни один сервис не запускается с NODE_ENV=development", + "status": "failed", + "title": "[PILOT-2] ни один сервис не запускается с NODE_ENV=development", + "duration": 1.0336859999999888, + "failureMessages": [ + "AssertionError: expected [ 'app' ] to deeply equal []\n at /workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts:41:23\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:1628:35\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:26\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3319:20\n at new Promise ()\n at runWithCancel (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3314:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3299:20\n at new Promise ()\n at runWithTimeout (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3257:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3876:64" + ], + "meta": {}, + "tags": [], + "benchmarks": [] + }, + { + "ancestorTitles": ["deploy/pilot/compose.yaml"], + "fullName": "deploy/pilot/compose.yaml [PILOT-3] у сервиса app нет учётных данных мигратора", + "status": "passed", + "title": "[PILOT-3] у сервиса app нет учётных данных мигратора", + "duration": 0.5442440000000062, + "failureMessages": [], + "meta": {}, + "tags": [], + "benchmarks": [] + } + ], + "startTime": 1790408019346, + "endTime": 1790408019353.5442, + "status": "failed", + "message": "", + "name": "/workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts" + } + ] +} diff --git a/tests/e2e/evidence/e2e-run.txt b/tests/e2e/evidence/e2e-run.txt new file mode 100644 index 0000000..8742401 --- /dev/null +++ b/tests/e2e/evidence/e2e-run.txt @@ -0,0 +1,941 @@ +$ npx vitest run --config tests/e2e/vitest.e2e.config.ts --reporter=verbose --reporter=json --outputFile.json=/workspace/krona-staff/tests/e2e/evidence/e2e-results.json + + RUN v5.0.1 /workspace/krona-staff + +[e2e] provision: +provisioned database=krona_staff_e2e server_version=17.11 +role=krona_migrator super=false createrole=false createdb=false bypassrls=false +role=krona_staff_app super=false createrole=false createdb=false bypassrls=false +[e2e] migrations (roundtrip) as krona_migrator: +== migrate up (1) +applied 0001_infrastructure.up.sql +applied 0002_security_hardening.up.sql +applied 0003_app_role_privileges.up.sql +applied 0004_revoke_broad_default_privileges.up.sql +applied 0005_attendance_portal.up.sql +applied 0006_payroll_foundation.up.sql +applied 0007_work_session_trace.up.sql +applied 0008_employee_access.up.sql +applied 0009_professions.up.sql +applied 0010_employee_push_notifications.up.sql +applied 0011_offline_sync_backend.up.sql +== rollback all (applied now: 11) +rolled back 0011_offline_sync_backend.down.sql +rolled back 0010_employee_push_notifications.down.sql +rolled back 0009_professions.down.sql +rolled back 0008_employee_access.down.sql +rolled back 0007_work_session_trace.down.sql +rolled back 0006_payroll_foundation.down.sql +rolled back 0005_attendance_portal.down.sql +rolled back 0004_revoke_broad_default_privileges.down.sql +rolled back 0003_app_role_privileges.down.sql +rolled back 0002_security_hardening.down.sql +rolled back 0001_infrastructure.down.sql +no migration to roll back +== rolled back 11 migrations +== migrate up (2) +applied 0001_infrastructure.up.sql +applied 0002_security_hardening.up.sql +applied 0003_app_role_privileges.up.sql +applied 0004_revoke_broad_default_privileges.up.sql +applied 0005_attendance_portal.up.sql +applied 0006_payroll_foundation.up.sql +applied 0007_work_session_trace.up.sql +applied 0008_employee_access.up.sql +applied 0009_professions.up.sql +applied 0010_employee_push_notifications.up.sql +applied 0011_offline_sync_backend.up.sql +== migrate up (3, must be no-op) +== roundtrip OK: rolledBack=11 reapplied=11 +[e2e] server secured ready at http://127.0.0.1:35389 (log: tests/e2e/evidence/server-secured.txt) +[e2e] server no-tokens ready at http://127.0.0.1:33821 (log: tests/e2e/evidence/server-no-tokens.txt) +[e2e] server rate-limit ready at http://127.0.0.1:36299 (log: tests/e2e/evidence/server-rate-limit.txt) + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N1] менеджер создаёт сотрудника через POST /employees → 201 38ms + → HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка 111ms + → подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N4] пересекающиеся расчёты не начисляют одну смену дважды 66ms + → подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1 2544ms + → подписка: HTTP 201 {"id":"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5","endpoint":"https://127.0.0.1:36027/e2e-internal-admin"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику 44ms + → HTTP 201 {"id":"01M3EA4J0JSPFRDF22J6E2CEY1","endpoint":"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400) 31ms + → HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":12345,"percent_bp":0,"guarantee_minor":0,"pool_weight_bp":0… | HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":9007199254740991,"percent_bp":0,"guarantee_minor":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N10] терминальный токен не читает справочники профессий и точек (403) 4ms + → expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401) 20ms + → expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F3] cookie сессии не содержит сырой токен и отзывается при выходе 8ms + → expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F10] мутация по cookie без Origin отклоняется (CSRF, 403) 5ms + → HTTP 201 {"id":"01M3EA4J31CEM99Y9708PNVE90","code":"profession-01m3ea4j31cem99y9708pnve90","name":"E2E-CSRF-профессия-c30803","status":"active"}: expected 201 to be 403 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F7] повтор Idempotency-Key с другим телом не создаёт второе событие 31ms + → expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false } + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N11] импорт с неверным kind начисления → 400, а не 500 25ms + → HTTP 500 {"statusCode":500,"code":"23514","error":"Internal Server Error","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""}: expected 500 to be 400 // Object.is equality + × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток) 75ms + → статусы: 401: expected false to be true // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-01] менеджер точки A запускает расчёт для точки B → 403 110ms + → C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-02] менеджер точки отправляет пакет на согласование → 403 64ms + → C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-04] бухгалтер пытается подписать пакет → 403 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-05] до подписи директора в ledger нет начислений и выплат 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру 1ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B 2ms + → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена» 15ms + → C3: HTTP 404 {"message":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-11] согласие отозвано → статус для терминала меняется 15ms + → C3 PUT biometric-consent: HTTP 404 {"message":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется) 87ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JPXC3E39GZMHFH33H92","command_type":"upsert_work_session","status":"applied","result":{"id":"01M3EA4JPXQPVQDPGEA3YVFPXV","revision":1,"status":"applied"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) } + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-B] устройство не может утвердить табель (status=approved отклоняется) 32ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JR4CST4PE643FC043K9","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"01M3EA4JR43V65BMVJVX5DHSV0","revision":1,"status":"applied"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null } + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200) 39ms + → HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично 55ms + → HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull 41ms + → expected false to be true // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-E] отметка уволенного сотрудника через sync отклоняется 24ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JXD7TMSBAMMAK6HMXK2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется 42ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JYH12S10KQ4NWN232FM","status":"accepted"}},{"idempotency_key":"e2e-01M3EA4JYFDXJXPH923SG1E832","command_type":"attendance_event","status":"applied","resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) } + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500) 21ms + → HTTP 500 {"statusCode":500,"code":"22007","error":"Internal Server Error","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] } + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403) 9ms + → HTTP 201 {"device":{"id":"01M3EA4JZKVD04KCMNCGGW1EAH","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-5J7EDPFQV6","name":"E2E-CSRF-терминал-34e01a","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.935Z","created_by":"01M3E…: expected 201 to be 403 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401) 7ms + → HTTP 201 {"device":{"id":"01M3EA4JZWQF4S3SXWCX77J9ST","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-KS5GF18F83","name":"E2E-Анонимный терминал-75d36d","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.940Z","created_by":"…: expected 201 to be 401 // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events 24ms + → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4K0NB5RS8GACHWC7N2C2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality + × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400) 7ms + → HTTP 200 {"acknowledged":true,"cursor":"cur_999999999_fd163ccb01a6","acknowledged_at":"2026-09-26T07:33:38.972Z"}: expected 200 to be 400 // Object.is equality + ✓ tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль 8ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] сервер отвечает live/ready (ready проверяет БД) 32ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER 14ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] миграции применены мигратором, app-роль не видит schema_migrations 14ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200 14ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] терминал: отметка сотрудника из импорта принимается (201) 25ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя 24ms + ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [CTRL] уволенный сотрудник теряет доступ (401) 23ms + × tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение} 6ms + → переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal [] + × tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-2] ни один сервис не запускается с NODE_ENV=development 1ms + → expected [ 'app' ] to deeply equal [] + ✓ tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-3] у сервиса app нет учётных данных мигратора 1ms + +⎯⎯⎯⎯⎯⎯ Failed Tests 38 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N1] менеджер создаёт сотрудника через POST /employees → 201 +AssertionError: HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 500 + + ❯ tests/e2e/10-core-defects.e2e.ts:55:57 + 53| }, + 54| }); + 55| expect(response.status, describeResponse(response)).toBe(201); + | ^ + 56| const rows = await dbQuery('SELECT id FROM staff_employees WHERE p… + 57| number, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка +AssertionError: подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 500 + + ❯ tests/e2e/10-core-defects.e2e.ts:73:81 + 71| body: { status: 'confirmed' }, + 72| }); + 73| expect(confirm.status, `подтверждение смены: ${describeResponse(co… + | ^ + 74| + 75| const calculate = await api('POST', '/payroll/calculate', { + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N4] пересекающиеся расчёты не начисляют одну смену дважды +AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 500 + + ❯ tests/e2e/10-core-defects.e2e.ts:104:7 + 102| confirm.status, + 103| `подтверждение смены (предусловие, см. N2): ${describeResponse(c… + 104| ).toBe(200); + | ^ + 105| + 106| const month = monthOf(day); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1 +AssertionError: подписка: HTTP 201 {"id":"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5","endpoint":"https://127.0.0.1:36027/e2e-internal-admin"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) } + +- Expected ++ Received + + { +- "connections": 0, +- "status": toSatisfy<[Function anonymous]>, ++ "connections": 1, ++ "status": 201, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:161:9 + 159| { status: subscribe.status, connections }, + 160| `подписка: ${describeResponse(subscribe)}`, + 161| ).toEqual({ + | ^ + 162| status: expect.toSatisfy((s: number) => s === 400 || s === 422… + 163| connections: 0, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику +AssertionError: HTTP 201 {"id":"01M3EA4J0JSPFRDF22J6E2CEY1","endpoint":"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) } + +- Expected ++ Received + + { + "owner": [ +- "01M3EA4HZSY982GYTPDAVP0Z0Q", ++ "01M3EA4HZTSZ12MKP3SV134FKS", + ], +- "status": toSatisfy<[Function anonymous]>, ++ "status": 201, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:191:7 + 189| { status: second.status, owner: owner.map((row) => row.employee_… + 190| describeResponse(second), + 191| ).toEqual({ + | ^ + 192| status: expect.toSatisfy((s: number) => s === 409 || s === 403), + 193| owner: [employeeA!.id], + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400) +AssertionError: HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":12345,"percent_bp":0,"guarantee_minor":0,"pool_weight_bp":0… | HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":9007199254740991,"percent_bp":0,"guarantee_minor":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 } + +- Expected ++ Received + + { +- "extra": 400, +- "huge": 400, ++ "extra": 200, ++ "huge": 200, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:215:7 + 213| { extra: extra.status, huge: huge.status }, + 214| `${describeResponse(extra)} | ${describeResponse(huge)}`, + 215| ).toEqual({ + | ^ + 216| extra: 400, + 217| huge: 400, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N10] терминальный токен не читает справочники профессий и точек (403) +AssertionError: expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 } + +- Expected ++ Received + + { +- "professions": 403, +- "units": 403, ++ "professions": 200, ++ "units": 200, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:224:70 + 222| const professions = await api('GET', '/professions', { token: ctx(… + 223| const units = await api('GET', '/org-units', { token: ctx().termin… + 224| expect({ professions: professions.status, units: units.status }).t… + | ^ + 225| professions: 403, + 226| units: 403, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401) +AssertionError: expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) } + +- Expected ++ Received + + { +- "payroll": 401, +- "portal": 401, +- "write": 401, ++ "payroll": 200, ++ "portal": 200, ++ "write": 201, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:237:85 + 235| body: { name: synthetic('Профессия') }, + 236| }); + 237| expect({ portal: portal.status, payroll: payroll.status, write: wr… + | ^ + 238| portal: 401, + 239| payroll: 401, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F3] cookie сессии не содержит сырой токен и отзывается при выходе +AssertionError: expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) } + +- Expected ++ Received + + { +- "afterLogout": 401, +- "rawTokenInCookie": false, ++ "afterLogout": 200, ++ "rawTokenInCookie": true, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:255:91 + 253| expect(logout.status).toBe(204); + 254| const reuse = await api('GET', '/portal', { headers: { cookie } }); + 255| expect({ rawTokenInCookie: value === ctx().managerToken, afterLogo… + | ^ + 256| rawTokenInCookie: false, + 257| afterLogout: 401, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F10] мутация по cookie без Origin отклоняется (CSRF, 403) +AssertionError: HTTP 201 {"id":"01M3EA4J31CEM99Y9708PNVE90","code":"profession-01m3ea4j31cem99y9708pnve90","name":"E2E-CSRF-профессия-c30803","status":"active"}: expected 201 to be 403 // Object.is equality + +- Expected ++ Received + +- 403 ++ 201 + + ❯ tests/e2e/10-core-defects.e2e.ts:269:57 + 267| body: { name: synthetic('CSRF-профессия') }, + 268| }); + 269| expect(response.status, describeResponse(response)).toBe(403); + | ^ + 270| }); + 271| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F7] повтор Idempotency-Key с другим телом не создаёт второе событие +AssertionError: expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false } + +- Expected ++ Received + + { + "first": 201, +- "secondCreated": false, ++ "secondCreated": true, + } + + ❯ tests/e2e/10-core-defects.e2e.ts:288:75 + 286| const first = await send(`e2e-${randomUlid()}`); + 287| const second = await send(`e2e-${randomUlid()}`); + 288| expect({ first: first.status, secondCreated: second.status === 201… + | ^ + 289| first: 201, + 290| secondCreated: false, + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N11] импорт с неверным kind начисления → 400, а не 500 +AssertionError: HTTP 500 {"statusCode":500,"code":"23514","error":"Internal Server Error","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""}: expected 500 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 500 + + ❯ tests/e2e/10-core-defects.e2e.ts:311:57 + 309| }, + 310| }); + 311| expect(response.status, describeResponse(response)).toBe(400); + | ^ + 312| }); + 313| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/38]⎯ + + FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток) +AssertionError: статусы: 401: expected false to be true // Object.is equality + +- Expected ++ Received + +- true ++ false + + ❯ tests/e2e/10-core-defects.e2e.ts:324:84 + 322| if (response.status === 429) break; + 323| } + 324| expect(statuses.includes(429), `статусы: ${[...new Set(statuses)].… + | ^ + 325| }); + 326| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется) +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JPXC3E39GZMHFH33H92","command_type":"upsert_work_session","status":"applied","result":{"id":"01M3EA4JPXQPVQDPGEA3YVFPXV","revision":1,"status":"applied"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) } + +- Expected ++ Received + + { + "http": 200, +- "result": "rejected", +- "stored": null, ++ "result": "applied", ++ "stored": "confirmed", + } + + ❯ tests/e2e/20-sync-defects.e2e.ts:86:7 + 84| }, + 85| describeResponse(response), + 86| ).toEqual({ http: 200, result: 'rejected', stored: null }); + | ^ + 87| }); + 88| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-B] устройство не может утвердить табель (status=approved отклоняется) +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JR4CST4PE643FC043K9","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"01M3EA4JR43V65BMVJVX5DHSV0","revision":1,"status":"applied"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null } + +- Expected ++ Received + + { +- "result": "rejected", +- "stored": null, ++ "result": "applied", ++ "stored": "approved", + } + + ❯ tests/e2e/20-sync-defects.e2e.ts:109:7 + 107| { result: response.body?.results?.[0]?.status, stored: stored[0]… + 108| describeResponse(response), + 109| ).toEqual({ result: 'rejected', stored: null }); + | ^ + 110| }); + 111| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200) +AssertionError: HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 500 + + ❯ tests/e2e/20-sync-defects.e2e.ts:120:57 + 118| body: { cursor: null }, + 119| }); + 120| expect(response.status, describeResponse(response)).toBe(200); + | ^ + 121| const types = new Set( + 122| (response.body.changes as Array<{ entity_type: string }>).map((c… + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично +AssertionError: HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 500 + + ❯ pullAll tests/e2e/20-sync-defects.e2e.ts:51:57 + 49| body: { cursor: next, limit: 100 }, + 50| }); + 51| expect(response.status, describeResponse(response)).toBe(200); + | ^ + 52| changes.push(...(response.body.changes as Array<{ entity_type: str… + 53| next = response.body.next_cursor as string; + ❯ tests/e2e/20-sync-defects.e2e.ts:130:25 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull +AssertionError: expected false to be true // Object.is equality + +- Expected ++ Received + +- true ++ false + + ❯ tests/e2e/20-sync-defects.e2e.ts:151:95 + 149| expect(patch.status, describeResponse(patch)).toBe(200); + 150| const { changes } = await pullAll(device, cursor); + 151| expect(changes.some((c) => c.entity_type === 'employee' && c.entit… + | ^ + 152| true, + 153| ); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-E] отметка уволенного сотрудника через sync отклоняется +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JXD7TMSBAMMAK6HMXK2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality + +Expected: "rejected" +Received: "applied" + + ❯ tests/e2e/20-sync-defects.e2e.ts:171:77 + 169| }), + 170| ]); + 171| expect(response.body?.results?.[0]?.status, describeResponse(respo… + | ^ + 172| }); + 173| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JYH12S10KQ4NWN232FM","status":"accepted"}},{"idempotency_key":"e2e-01M3EA4JYFDXJXPH923SG1E832","command_type":"attendance_event","status":"applied","resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) } + +- Expected ++ Received + + { +- "foreign": "rejected", +- "ownOrgUnit": "01M3EA4JXPPT6RXP11RKV1VY20", ++ "foreign": "applied", ++ "ownOrgUnit": null, + } + + ❯ tests/e2e/20-sync-defects.e2e.ts:202:7 + 200| }, + 201| describeResponse(response), + 202| ).toEqual({ ownOrgUnit: unitA!.id, foreign: 'rejected' }); + | ^ + 203| }); + 204| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500) +AssertionError: HTTP 500 {"statusCode":500,"code":"22007","error":"Internal Server Error","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] } + +- Expected ++ Received + + { +- "http": 200, +- "statuses": [ +- "applied", +- "rejected", +- ], ++ "http": 500, ++ "statuses": [], + } + + ❯ tests/e2e/20-sync-defects.e2e.ts:225:7 + 223| }, + 224| describeResponse(response), + 225| ).toEqual({ http: 200, statuses: ['applied', 'rejected'] }); + | ^ + 226| }); + 227| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403) +AssertionError: HTTP 201 {"device":{"id":"01M3EA4JZKVD04KCMNCGGW1EAH","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-5J7EDPFQV6","name":"E2E-CSRF-терминал-34e01a","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.935Z","created_by":"01M3E…: expected 201 to be 403 // Object.is equality + +- Expected ++ Received + +- 403 ++ 201 + + ❯ tests/e2e/20-sync-defects.e2e.ts:236:57 + 234| body: { device_code: `E2E-${randomUlid().slice(-10)}`, name: syn… + 235| }); + 236| expect(response.status, describeResponse(response)).toBe(403); + | ^ + 237| }); + 238| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401) +AssertionError: HTTP 201 {"device":{"id":"01M3EA4JZWQF4S3SXWCX77J9ST","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-KS5GF18F83","name":"E2E-Анонимный терминал-75d36d","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.940Z","created_by":"…: expected 201 to be 401 // Object.is equality + +- Expected ++ Received + +- 401 ++ 201 + + ❯ tests/e2e/20-sync-defects.e2e.ts:247:57 + 245| }, + 246| }); + 247| expect(response.status, describeResponse(response)).toBe(401); + | ^ + 248| }); + 249| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events +AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4K0NB5RS8GACHWC7N2C2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality + +Expected: "rejected" +Received: "applied" + + ❯ tests/e2e/20-sync-defects.e2e.ts:260:77 + 258| }), + 259| ]); + 260| expect(response.body?.results?.[0]?.status, describeResponse(respo… + | ^ + 261| }); + 262| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/38]⎯ + + FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400) +AssertionError: HTTP 200 {"acknowledged":true,"cursor":"cur_999999999_fd163ccb01a6","acknowledged_at":"2026-09-26T07:33:38.972Z"}: expected 200 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 200 + + ❯ tests/e2e/20-sync-defects.e2e.ts:275:57 + 273| body: { cursor: `cur_${seq}_${hash}` }, + 274| }); + 275| expect(response.status, describeResponse(response)).toBe(400); + | ^ + 276| }); + 277| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-01] менеджер точки A запускает расчёт для точки B → 403 +AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:94:22 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-02] менеджер точки отправляет пакет на согласование → 403 +AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:105:22 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:118:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-04] бухгалтер пытается подписать пакет → 403 +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:133:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-05] до подписи директора в ledger нет начислений и выплат +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:141:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:148:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:173:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:195:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B +AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality + +- Expected ++ Received + +- 201 ++ 404 + + ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 + 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… + 27| }); + 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… + | ^ + 29| 201, + 30| ); + ❯ tests/e2e/30-owner-decisions.e2e.ts:213:24 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена» +AssertionError: C3: HTTP 404 {"message":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 404 + + ❯ tests/e2e/30-owner-decisions.e2e.ts:241:66 + 239| token: ctx().terminalToken, + 240| }); + 241| expect(response.status, `C3: ${describeResponse(response)}`).toBe(… + | ^ + 242| expect(response.body).toMatchObject({ registration_allowed: false,… + 243| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/38]⎯ + + FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-11] согласие отозвано → статус для терминала меняется +AssertionError: C3 PUT biometric-consent: HTTP 404 {"message":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 404 + + ❯ tests/e2e/30-owner-decisions.e2e.ts:255:86 + 253| api('GET', `/terminal/employees/${employee!.id}/enrollment`, { t… + 254| const granted = await setConsent('granted'); + 255| expect(granted.status, `C3 PUT biometric-consent: ${describeRespon… + | ^ + 256| const before = await enrollment(); + 257| const revoked = await setConsent('revoked'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/38]⎯ + + FAIL tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение} +AssertionError: переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal [] + +- Expected ++ Received + +- [] ++ [ ++ "STANDALONE_MANAGER_TOKEN", ++ "STANDALONE_TERMINAL_TOKEN", ++ "STANDALONE_TENANT_ID", ++ "STANDALONE_ACTOR_ID", ++ "STANDALONE_TERMINAL_ACTOR_ID", ++ "VAPID_PUBLIC_KEY", ++ "VAPID_PRIVATE_KEY", ++ "VAPID_SUBJECT", ++ "POSTGRES_APP_PASSWORD", ++ "HTTPS_PFX_PASSPHRASE", ++ "POSTGRES_MIGRATION_PASSWORD", ++ "POSTGRES_APP_PASSWORD", ++ "POSTGRES_MIGRATION_PASSWORD", ++ "POSTGRES_MIGRATION_PASSWORD", ++ ] + + ❯ tests/e2e/40-compose-pilot.e2e.ts:34:87 + 32| expect(interpolations.length).toBeGreaterThan(0); + 33| const optional = interpolations.filter((inner) => !/^[A-Z0-9_]+:\?… + 34| expect(optional, 'переменные без :? — пустое значение молча попадё… + | ^ + 35| }); + 36| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/38]⎯ + + FAIL tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-2] ни один сервис не запускается с NODE_ENV=development +AssertionError: expected [ 'app' ] to deeply equal [] + +- Expected ++ Received + +- [] ++ [ ++ "app", ++ ] + + ❯ tests/e2e/40-compose-pilot.e2e.ts:41:23 + 39| (service) => environmentOf(service).NODE_ENV === 'development', + 40| ); + 41| expect(offenders).toEqual([]); + | ^ + 42| }); + 43| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[38/38]⎯ + + + Test Files 4 failed | 1 passed (5) + Tests 38 failed | 9 passed (47) + Start at 14:33:32 + Duration 7.22s (tests 95%, import 3%, transform 2%) + +JSON report written to /workspace/krona-staff/tests/e2e/evidence/e2e-results.json diff --git a/tests/e2e/evidence/e2e-table.md b/tests/e2e/evidence/e2e-table.md new file mode 100644 index 0000000..bbfceb0 --- /dev/null +++ b/tests/e2e/evidence/e2e-table.md @@ -0,0 +1,44 @@ +| ID | Цвет | Зелёных/всего | Вердикт | +| ------- | ----- | ------------- | ----------------------------- | +| CTRL | GREEN | 2/2 | зелёный | +| F10 | RED | 0/1 | красный (известный дефект) | +| F2 | RED | 0/1 | красный (известный дефект) | +| F3 | RED | 0/1 | красный (известный дефект) | +| F4 | RED | 0/1 | красный (известный дефект) | +| F7 | RED | 0/1 | красный (известный дефект) | +| HARNESS | GREEN | 5/5 | зелёный (позитивный контроль) | +| N1 | RED | 0/1 | красный (известный дефект) | +| N10 | RED | 0/1 | красный (известный дефект) | +| N11 | RED | 0/1 | красный (известный дефект) | +| N12 | RED | 0/1 | красный (известный дефект) | +| N2 | RED | 0/1 | красный (известный дефект) | +| N3 | RED | 0/1 | красный (известный дефект) | +| N4 | RED | 0/1 | красный (известный дефект) | +| N9 | RED | 0/1 | красный (известный дефект) | +| OWN-01 | RED | 0/1 | красный (известный дефект) | +| OWN-02 | RED | 0/1 | красный (известный дефект) | +| OWN-03 | RED | 0/1 | красный (известный дефект) | +| OWN-04 | RED | 0/1 | красный (известный дефект) | +| OWN-05 | RED | 0/1 | красный (известный дефект) | +| OWN-06 | RED | 0/1 | красный (известный дефект) | +| OWN-07 | RED | 0/1 | красный (известный дефект) | +| OWN-08 | RED | 0/1 | красный (известный дефект) | +| OWN-09 | RED | 0/1 | красный (известный дефект) | +| OWN-10 | RED | 0/1 | красный (известный дефект) | +| OWN-11 | RED | 0/1 | красный (известный дефект) | +| PILOT-1 | RED | 0/1 | красный (известный дефект) | +| PILOT-2 | RED | 0/1 | красный (известный дефект) | +| PILOT-3 | GREEN | 1/1 | зелёный | +| SYNC-A | RED | 0/1 | красный (известный дефект) | +| SYNC-B | RED | 0/1 | красный (известный дефект) | +| SYNC-C | RED | 0/1 | красный (известный дефект) | +| SYNC-C0 | RED | 0/1 | красный (известный дефект) | +| SYNC-D | RED | 0/1 | красный (известный дефект) | +| SYNC-E | RED | 0/1 | красный (известный дефект) | +| SYNC-F | RED | 0/1 | красный (известный дефект) | +| SYNC-G | RED | 0/1 | красный (известный дефект) | +| SYNC-H | RED | 0/1 | красный (известный дефект) | +| SYNC-I | RED | 0/1 | красный (известный дефект) | +| SYNC-J | RED | 0/1 | красный (известный дефект) | +| SYNC-K | RED | 0/1 | красный (известный дефект) | +| SYNC-L | GREEN | 1/1 | зелёный | diff --git a/tests/e2e/evidence/server-no-tokens.txt b/tests/e2e/evidence/server-no-tokens.txt new file mode 100644 index 0000000..a0429e7 --- /dev/null +++ b/tests/e2e/evidence/server-no-tokens.txt @@ -0,0 +1,11 @@ +{"level":30,"time":1790408014423,"pid":1688835,"hostname":"grok-bot-vm-420973429","msg":"Server listening at http://127.0.0.1:33821"} +{"level":30,"time":1790408014470,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4EM59MB3QYQ7QG56R4Q6","req":{"method":"GET","url":"/api/v1/staff/ready","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":43800},"msg":"incoming request"} +{"level":30,"time":1790408014485,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4EM59MB3QYQ7QG56R4Q6","res":{"statusCode":200},"responseTime":15.399766999999997,"msg":"request completed"} +{"level":30,"time":1790408017988,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J24H0CNE1DPZ87J7PY6","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":41914},"msg":"incoming request"} +{"level":30,"time":1790408017995,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J24H0CNE1DPZ87J7PY6","res":{"statusCode":200},"responseTime":7.126036999999997,"msg":"request completed"} +{"level":30,"time":1790408017997,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2CSDE96DCZ4X0TSJ1E","req":{"method":"GET","url":"/api/v1/staff/payroll","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":41916},"msg":"incoming request"} +{"level":30,"time":1790408018000,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2CSDE96DCZ4X0TSJ1E","res":{"statusCode":200},"responseTime":3.394659000000047,"msg":"request completed"} +{"level":30,"time":1790408018001,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2HH1VC67KYM9CGFM3R","req":{"method":"POST","url":"/api/v1/staff/professions","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":41914},"msg":"incoming request"} +{"level":30,"time":1790408018006,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2HH1VC67KYM9CGFM3R","res":{"statusCode":201},"responseTime":4.0853070000002845,"msg":"request completed"} +{"level":30,"time":1790408018939,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZTH0S49N5WD7NP5DXV","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":41926},"msg":"incoming request"} +{"level":30,"time":1790408018943,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZTH0S49N5WD7NP5DXV","res":{"statusCode":201},"responseTime":4.126679999999396,"msg":"request completed"} diff --git a/tests/e2e/evidence/server-rate-limit.txt b/tests/e2e/evidence/server-rate-limit.txt new file mode 100644 index 0000000..4bdfa60 --- /dev/null +++ b/tests/e2e/evidence/server-rate-limit.txt @@ -0,0 +1,93 @@ +{"level":30,"time":1790408014985,"pid":1688859,"hostname":"grok-bot-vm-420973429","msg":"Server listening at http://127.0.0.1:36299"} +{"level":30,"time":1790408014994,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F4HH3VG14PERD1YSY9Y","req":{"method":"GET","url":"/api/v1/staff/ready","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":38380},"msg":"incoming request"} +{"level":30,"time":1790408015008,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F4HH3VG14PERD1YSY9Y","res":{"statusCode":200},"responseTime":13.205045999999982,"msg":"request completed"} +{"level":30,"time":1790408018078,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4YV0JF6R2376AEHJPT","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018085,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4YV0JF6R2376AEHJPT","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018088,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4YV0JF6R2376AEHJPT","res":{"statusCode":401},"responseTime":10.026388999999654,"msg":"request completed"} +{"level":30,"time":1790408018090,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5AY86FT8CXCVMZBCVE","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018092,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5AY86FT8CXCVMZBCVE","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018093,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5AY86FT8CXCVMZBCVE","res":{"statusCode":401},"responseTime":3.1223180000001776,"msg":"request completed"} +{"level":30,"time":1790408018094,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5EVV7MG8NSJEN3BEHE","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018095,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5EVV7MG8NSJEN3BEHE","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018095,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5EVV7MG8NSJEN3BEHE","res":{"statusCode":401},"responseTime":1.5804190000003473,"msg":"request completed"} +{"level":30,"time":1790408018096,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5GS3DNBZVF696K10GB","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018097,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5GS3DNBZVF696K10GB","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018098,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5GS3DNBZVF696K10GB","res":{"statusCode":401},"responseTime":1.4676269999999931,"msg":"request completed"} +{"level":30,"time":1790408018099,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5J8T6KXH5TFHHSCHVF","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018100,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5J8T6KXH5TFHHSCHVF","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018100,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5J8T6KXH5TFHHSCHVF","res":{"statusCode":401},"responseTime":1.386855000000196,"msg":"request completed"} +{"level":30,"time":1790408018101,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5NP6FY0C583X92CP43","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018102,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5NP6FY0C583X92CP43","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018102,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5NP6FY0C583X92CP43","res":{"statusCode":401},"responseTime":1.2076160000001437,"msg":"request completed"} +{"level":30,"time":1790408018103,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5Q5TRCA85QYA3H0VYQ","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018104,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5Q5TRCA85QYA3H0VYQ","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018104,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5Q5TRCA85QYA3H0VYQ","res":{"statusCode":401},"responseTime":1.1122859999995853,"msg":"request completed"} +{"level":30,"time":1790408018105,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5SA4BPNWS2DED9PXYB","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018107,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5SA4BPNWS2DED9PXYB","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018107,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5SA4BPNWS2DED9PXYB","res":{"statusCode":401},"responseTime":1.8221369999996568,"msg":"request completed"} +{"level":30,"time":1790408018108,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5WVAX2TGTKMNXF5TMG","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018110,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5WVAX2TGTKMNXF5TMG","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018110,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5WVAX2TGTKMNXF5TMG","res":{"statusCode":401},"responseTime":1.6929129999998622,"msg":"request completed"} +{"level":30,"time":1790408018111,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5ZJ0TBAM6HCKDG31ST","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018112,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5ZJ0TBAM6HCKDG31ST","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018112,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5ZJ0TBAM6HCKDG31ST","res":{"statusCode":401},"responseTime":1.3584950000004028,"msg":"request completed"} +{"level":30,"time":1790408018113,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J61SAXX1SBMMF6K7MW7","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018114,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J61SAXX1SBMMF6K7MW7","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018115,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J61SAXX1SBMMF6K7MW7","res":{"statusCode":401},"responseTime":1.17779500000006,"msg":"request completed"} +{"level":30,"time":1790408018116,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J64PXWG5P4DSGFA9VDQ","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018117,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J64PXWG5P4DSGFA9VDQ","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018117,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J64PXWG5P4DSGFA9VDQ","res":{"statusCode":401},"responseTime":1.2440259999998489,"msg":"request completed"} +{"level":30,"time":1790408018118,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J665CYSPZZM1V2R18JN","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018119,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J665CYSPZZM1V2R18JN","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018120,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J665CYSPZZM1V2R18JN","res":{"statusCode":401},"responseTime":1.6543000000001484,"msg":"request completed"} +{"level":30,"time":1790408018120,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J681X6JYH17BSE6KS7T","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018121,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J681X6JYH17BSE6KS7T","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018121,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J681X6JYH17BSE6KS7T","res":{"statusCode":401},"responseTime":0.9558520000000499,"msg":"request completed"} +{"level":30,"time":1790408018122,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6AZB9EF2ZWRM58K33X","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018124,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6AZB9EF2ZWRM58K33X","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018124,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6AZB9EF2ZWRM58K33X","res":{"statusCode":401},"responseTime":1.3041690000000017,"msg":"request completed"} +{"level":30,"time":1790408018125,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6DANVFJ43ANCSWN2AD","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018126,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6DANVFJ43ANCSWN2AD","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018126,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6DANVFJ43ANCSWN2AD","res":{"statusCode":401},"responseTime":1.0975260000000162,"msg":"request completed"} +{"level":30,"time":1790408018127,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6FB5G9XGHEX6J2DQD9","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018128,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6FB5G9XGHEX6J2DQD9","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018128,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6FB5G9XGHEX6J2DQD9","res":{"statusCode":401},"responseTime":0.9584480000003168,"msg":"request completed"} +{"level":30,"time":1790408018129,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6HN1B0FT6JSM29WA43","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018129,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6HN1B0FT6JSM29WA43","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018130,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6HN1B0FT6JSM29WA43","res":{"statusCode":401},"responseTime":0.8860890000000836,"msg":"request completed"} +{"level":30,"time":1790408018130,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6JYZVQY0HTDDS7J417","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018131,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6JYZVQY0HTDDS7J417","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018131,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6JYZVQY0HTDDS7J417","res":{"statusCode":401},"responseTime":1.0295750000000226,"msg":"request completed"} +{"level":30,"time":1790408018132,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6MATZ7QY0BR7V8AW72","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018133,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6MATZ7QY0BR7V8AW72","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018133,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6MATZ7QY0BR7V8AW72","res":{"statusCode":401},"responseTime":0.9096939999999449,"msg":"request completed"} +{"level":30,"time":1790408018134,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6PDK66S783WHQ51ASV","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018135,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6PDK66S783WHQ51ASV","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018135,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6PDK66S783WHQ51ASV","res":{"statusCode":401},"responseTime":0.9012949999996636,"msg":"request completed"} +{"level":30,"time":1790408018136,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6R8EVAMEACB5RG5PMT","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018137,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6R8EVAMEACB5RG5PMT","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018137,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6R8EVAMEACB5RG5PMT","res":{"statusCode":401},"responseTime":0.97691500000019,"msg":"request completed"} +{"level":30,"time":1790408018137,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6S4NWEJWJSHW2QW0H1","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018138,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6S4NWEJWJSHW2QW0H1","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018139,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6S4NWEJWJSHW2QW0H1","res":{"statusCode":401},"responseTime":1.0356249999999818,"msg":"request completed"} +{"level":30,"time":1790408018139,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6V5MVSWERJFSE4H8S1","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018140,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6V5MVSWERJFSE4H8S1","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018140,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6V5MVSWERJFSE4H8S1","res":{"statusCode":401},"responseTime":0.9596630000000914,"msg":"request completed"} +{"level":30,"time":1790408018141,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6X3SS6P42S0J20JY43","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018142,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6X3SS6P42S0J20JY43","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018142,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6X3SS6P42S0J20JY43","res":{"statusCode":401},"responseTime":0.8438820000001215,"msg":"request completed"} +{"level":30,"time":1790408018143,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6ZGJ3J8AZ6CADNGANJ","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018144,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6ZGJ3J8AZ6CADNGANJ","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018144,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6ZGJ3J8AZ6CADNGANJ","res":{"statusCode":401},"responseTime":1.0216669999999795,"msg":"request completed"} +{"level":30,"time":1790408018145,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J70HW4EQGVGGWZBSN09","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018146,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J70HW4EQGVGGWZBSN09","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018146,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J70HW4EQGVGGWZBSN09","res":{"statusCode":401},"responseTime":1.648689000000104,"msg":"request completed"} +{"level":30,"time":1790408018147,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J73XM8Q0YNRJ914G8W1","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018148,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J73XM8Q0YNRJ914G8W1","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018148,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J73XM8Q0YNRJ914G8W1","res":{"statusCode":401},"responseTime":0.967511000000286,"msg":"request completed"} +{"level":30,"time":1790408018149,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J74SQB99XZJCVDXJNMT","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} +{"level":30,"time":1790408018149,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J74SQB99XZJCVDXJNMT","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018149,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J74SQB99XZJCVDXJNMT","res":{"statusCode":401},"responseTime":0.8698090000002594,"msg":"request completed"} +{"level":30,"time":1790408018150,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J76XMMPD5PD7AKCYR2N","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} +{"level":30,"time":1790408018151,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J76XMMPD5PD7AKCYR2N","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408018151,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J76XMMPD5PD7AKCYR2N","res":{"statusCode":401},"responseTime":1.0111910000000535,"msg":"request completed"} diff --git a/tests/e2e/evidence/server-secured.txt b/tests/e2e/evidence/server-secured.txt new file mode 100644 index 0000000..88cfa2e --- /dev/null +++ b/tests/e2e/evidence/server-secured.txt @@ -0,0 +1,279 @@ +{"level":30,"time":1790408013912,"pid":1688811,"hostname":"grok-bot-vm-420973429","msg":"Server listening at http://127.0.0.1:35389"} +{"level":30,"time":1790408013941,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4E3M5MJKAGV50FFXN9SZ","req":{"method":"GET","url":"/api/v1/staff/ready","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41352},"msg":"incoming request"} +{"level":30,"time":1790408013957,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4E3M5MJKAGV50FFXN9SZ","res":{"statusCode":200},"responseTime":16.484744000000035,"msg":"request completed"} +{"level":30,"time":1790408015166,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F9X4201XC0AAD6DNBP5","req":{"method":"POST","url":"/api/v1/staff/employees","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":50,"time":1790408015172,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F9X4201XC0AAD6DNBP5","req":{"method":"POST","url":"/api/v1/staff/employees","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"inconsistent types deduced for parameter $2","stack":"error: inconsistent types deduced for parameter $2\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/portal.ts:465:25)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/portal.ts:461:24)","length":155,"name":"error","severity":"ERROR","code":"42P08","detail":"text versus character varying","position":"150","file":"parse_param.c","line":"219","routine":"variable_coerce_param_hook"},"msg":"inconsistent types deduced for parameter $2"} +{"level":30,"time":1790408015177,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F9X4201XC0AAD6DNBP5","res":{"statusCode":500},"responseTime":11.21852100000001,"msg":"request completed"} +{"level":30,"time":1790408015188,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FAMNJX2833KF1T4TTXN","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408015205,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FAMNJX2833KF1T4TTXN","res":{"statusCode":202},"responseTime":17.02252499999986,"msg":"request completed"} +{"level":30,"time":1790408015223,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FBQJSK6DGCRM59J8R5P","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015232,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FBQJSK6DGCRM59J8R5P","res":{"statusCode":202},"responseTime":9.666789000000108,"msg":"request completed"} +{"level":30,"time":1790408015242,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCAV488NV3PYX6F3FJA","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015247,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCAV488NV3PYX6F3FJA","res":{"statusCode":200},"responseTime":4.858270000000175,"msg":"request completed"} +{"level":30,"time":1790408015249,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCGJF6Z76CTR188VGCN","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4FBZ4PJA3W2WDRQSRQSA/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408015257,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCGJF6Z76CTR188VGCN","res":{"statusCode":200},"responseTime":8.3228059999999,"msg":"request completed"} +{"level":30,"time":1790408015259,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCVQ0FHFZTP5RX5VGFS","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015262,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCVQ0FHFZTP5RX5VGFS","res":{"statusCode":201},"responseTime":3.2303699999999935,"msg":"request completed"} +{"level":30,"time":1790408015264,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCZJ2ZQZ454GQVQ000V","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408015272,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCZJ2ZQZ454GQVQ000V","res":{"statusCode":201},"responseTime":8.185108000000128,"msg":"request completed"} +{"level":30,"time":1790408015273,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FD9GB296ZS3YK71ZE6D","req":{"method":"POST","url":"/api/v1/staff/work-sessions/reconcile","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015279,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FD9GB296ZS3YK71ZE6D","res":{"statusCode":200},"responseTime":6.122667999999976,"msg":"request completed"} +{"level":30,"time":1790408015289,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FDSCE1FXX9KMABVM5TM","req":{"method":"PATCH","url":"/api/v1/staff/work-sessions/01M3EA4FDDGG7NT2PNT26E1QKB","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":50,"time":1790408015293,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FDSCE1FXX9KMABVM5TM","req":{"method":"PATCH","url":"/api/v1/staff/work-sessions/01M3EA4FDDGG7NT2PNT26E1QKB","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/portal.ts:1145:13)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/portal.ts:1053:23)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":30,"time":1790408015294,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FDSCE1FXX9KMABVM5TM","res":{"statusCode":500},"responseTime":4.745336999999836,"msg":"request completed"} +{"level":30,"time":1790408015297,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FE18FJJN9394Y3N6BJ5","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408015304,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FE18FJJN9394Y3N6BJ5","res":{"statusCode":202},"responseTime":6.942637999999988,"msg":"request completed"} +{"level":30,"time":1790408015313,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FEH4RF0G7FDCFWZYRG2","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015320,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FEH4RF0G7FDCFWZYRG2","res":{"statusCode":202},"responseTime":6.775562000000036,"msg":"request completed"} +{"level":30,"time":1790408015329,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FF1VZ350VV5QWXTG0CR","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015333,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FF1VZ350VV5QWXTG0CR","res":{"statusCode":200},"responseTime":3.717247000000043,"msg":"request completed"} +{"level":30,"time":1790408015334,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FF6VREYSW25ACQZKRG3","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4FEQWG7KW934X22C56ZR/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408015340,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FF6VREYSW25ACQZKRG3","res":{"statusCode":200},"responseTime":6.012408999999934,"msg":"request completed"} +{"level":30,"time":1790408015341,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFDF0DKJ2W7ZPPDR4DV","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015344,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFDF0DKJ2W7ZPPDR4DV","res":{"statusCode":201},"responseTime":2.4532470000001467,"msg":"request completed"} +{"level":30,"time":1790408015345,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFHKWR6VMNF2WQKGBWZ","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408015346,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFHKWR6VMNF2WQKGBWZ","res":{"statusCode":201},"responseTime":1.5671030000000883,"msg":"request completed"} +{"level":30,"time":1790408015347,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFKMGVXC8YMD6PFV6W2","req":{"method":"POST","url":"/api/v1/staff/work-sessions/reconcile","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015350,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFKMGVXC8YMD6PFV6W2","res":{"statusCode":200},"responseTime":3.180074999999988,"msg":"request completed"} +{"level":30,"time":1790408015358,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFYESE8NJFN70MAFRPV","req":{"method":"PATCH","url":"/api/v1/staff/work-sessions/01M3EA4FFN6TXZWFAV7AD8W931","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":50,"time":1790408015361,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFYESE8NJFN70MAFRPV","req":{"method":"PATCH","url":"/api/v1/staff/work-sessions/01M3EA4FFN6TXZWFAV7AD8W931","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/portal.ts:1145:13)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/portal.ts:1053:23)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} +{"level":30,"time":1790408015361,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFYESE8NJFN70MAFRPV","res":{"statusCode":500},"responseTime":2.768146999999999,"msg":"request completed"} +{"level":30,"time":1790408015363,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FG37GZKF5QXE421K1NS","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408015374,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FG37GZKF5QXE421K1NS","res":{"statusCode":202},"responseTime":10.611540999999988,"msg":"request completed"} +{"level":30,"time":1790408015383,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FGQ28S5QBWAQDRD3ENC","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4FGC5Y20677SW81GPFB2/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015387,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FGQ28S5QBWAQDRD3ENC","res":{"statusCode":200},"responseTime":4.416566000000103,"msg":"request completed"} +{"level":30,"time":1790408015392,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FH06VNHJY4EBW5EE2XX","req":{"method":"POST","url":"/api/v1/staff/push/subscriptions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408015397,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FH06VNHJY4EBW5EE2XX","res":{"statusCode":201},"responseTime":4.635773999999856,"msg":"request completed"} +{"level":30,"time":1790408015398,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FH57Y74WHQVGP02939Q","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408015401,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FH57Y74WHQVGP02939Q","res":{"statusCode":201},"responseTime":2.8056480000000192,"msg":"request completed"} +{"level":30,"time":1790408017908,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4HZMM5H00GW47QM8H57P","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408017915,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4HZMM5H00GW47QM8H57P","res":{"statusCode":202},"responseTime":6.821124000000054,"msg":"request completed"} +{"level":30,"time":1790408017927,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J070MWKRVC3R9SEXHZZ","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4HZSY982GYTPDAVP0Z0Q/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408017932,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J070MWKRVC3R9SEXHZZ","res":{"statusCode":200},"responseTime":4.815638999999464,"msg":"request completed"} +{"level":30,"time":1790408017933,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0D6X5ZRVMAHE2KHFP0","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4HZTSZ12MKP3SV134FKS/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408017935,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0D6X5ZRVMAHE2KHFP0","res":{"statusCode":200},"responseTime":2.3987600000000384,"msg":"request completed"} +{"level":30,"time":1790408017936,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0GAPK6MYZKS6CEP69P","req":{"method":"POST","url":"/api/v1/staff/push/subscriptions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408017938,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0GAPK6MYZKS6CEP69P","res":{"statusCode":201},"responseTime":1.9624579999999696,"msg":"request completed"} +{"level":30,"time":1790408017939,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0K1RMKPTCT5QNAGV7A","req":{"method":"POST","url":"/api/v1/staff/push/subscriptions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408017941,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0K1RMKPTCT5QNAGV7A","res":{"statusCode":201},"responseTime":2.340323000000353,"msg":"request completed"} +{"level":30,"time":1790408017952,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J10VK1XV0ZMVF812CYW","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408017958,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J10VK1XV0ZMVF812CYW","res":{"statusCode":202},"responseTime":5.686529999999948,"msg":"request completed"} +{"level":30,"time":1790408017965,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1DG7KEQN92H5D256PE","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408017970,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1DG7KEQN92H5D256PE","res":{"statusCode":200},"responseTime":4.494719000000259,"msg":"request completed"} +{"level":30,"time":1790408017971,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1KMHYPJ01JH6Z2WEQK","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4J151B1H9D5AKAR29AN9/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408017976,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1KMHYPJ01JH6Z2WEQK","res":{"statusCode":200},"responseTime":5.194629999999961,"msg":"request completed"} +{"level":30,"time":1790408017977,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1S0SNJZ8H7X0K9F7T1","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4J151B1H9D5AKAR29AN9/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408017981,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1S0SNJZ8H7X0K9F7T1","res":{"statusCode":200},"responseTime":4.459873999999218,"msg":"request completed"} +{"level":30,"time":1790408017983,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1ZDTDW66WF28KDYB4W","req":{"method":"GET","url":"/api/v1/staff/professions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408017984,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1ZDTDW66WF28KDYB4W","res":{"statusCode":200},"responseTime":1.0135330000002796,"msg":"request completed"} +{"level":30,"time":1790408017985,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J208WKMDXHJERS4H6MT","req":{"method":"GET","url":"/api/v1/staff/org-units","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408017986,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J208WKMDXHJERS4H6MT","res":{"statusCode":200},"responseTime":1.3112160000000586,"msg":"request completed"} +{"level":30,"time":1790408018007,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2Q3T2JSPF95TG96N6P","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408018008,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2Q3T2JSPF95TG96N6P","res":{"statusCode":200},"responseTime":0.6348109999998996,"msg":"request completed"} +{"level":30,"time":1790408018009,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2SK303DG80T5VC5DDC","req":{"method":"DELETE","url":"/api/v1/staff/session","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408018009,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2SK303DG80T5VC5DDC","res":{"statusCode":204},"responseTime":0.33697699999993347,"msg":"request completed"} +{"level":30,"time":1790408018010,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2S1XNED469T2N44WFY","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408018013,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2S1XNED469T2N44WFY","res":{"statusCode":200},"responseTime":3.6036009999997987,"msg":"request completed"} +{"level":30,"time":1790408018015,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2Z7TW54HTHRM9B7PFS","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408018016,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2Z7TW54HTHRM9B7PFS","res":{"statusCode":200},"responseTime":0.40848600000026636,"msg":"request completed"} +{"level":30,"time":1790408018017,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J31AWQFE866QK3R19T8","req":{"method":"POST","url":"/api/v1/staff/professions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408018019,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J31AWQFE866QK3R19T8","res":{"statusCode":201},"responseTime":2.3794800000005125,"msg":"request completed"} +{"level":30,"time":1790408018021,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J35B5NNN9AVW7EH7XVR","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408018027,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J35B5NNN9AVW7EH7XVR","res":{"statusCode":202},"responseTime":6.364180999999917,"msg":"request completed"} +{"level":30,"time":1790408018037,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J3NFJ32S6B487DGQF3F","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408018040,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J3NFJ32S6B487DGQF3F","res":{"statusCode":201},"responseTime":3.285291999999572,"msg":"request completed"} +{"level":30,"time":1790408018041,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J3S918GM99F9BXZKYHD","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} +{"level":30,"time":1790408018051,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J3S918GM99F9BXZKYHD","res":{"statusCode":201},"responseTime":9.325840999999855,"msg":"request completed"} +{"level":30,"time":1790408018052,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J44HBZG5R6A7238SHNC","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":30,"time":1790408018059,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J44HBZG5R6A7238SHNC","res":{"statusCode":202},"responseTime":6.6378679999997985,"msg":"request completed"} +{"level":30,"time":1790408018068,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4MJ6D7YHY7NJP8XW6B","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} +{"level":50,"time":1790408018073,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4MJ6D7YHY7NJP8XW6B","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\"","stack":"error: new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\"\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/operations.ts:1033:13)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:813:22)","length":229,"name":"error","severity":"ERROR","code":"23514","schema":"public","table":"staff_payroll_ledger","constraint":"staff_payroll_ledger_kind_check","file":"execMain.c","line":"2074","routine":"ExecConstraints"},"msg":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""} +{"level":30,"time":1790408018076,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4MJ6D7YHY7NJP8XW6B","res":{"statusCode":500},"responseTime":7.259319999999207,"msg":"request completed"} +{"level":30,"time":1790408018281,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JB912NAAC419Y02QPGD","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018289,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JB912NAAC419Y02QPGD","res":{"statusCode":202},"responseTime":7.542034999999487,"msg":"request completed"} +{"level":30,"time":1790408018310,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JC6JJ5PE5S4M8MJAPYQ","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018323,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JC6JJ5PE5S4M8MJAPYQ","res":{"statusCode":202},"responseTime":12.457030999999915,"msg":"request completed"} +{"level":30,"time":1790408018333,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JCXCHJFD211C4GCEFKB","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018338,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JCXCHJFD211C4GCEFKB","res":{"statusCode":200},"responseTime":4.526701000000685,"msg":"request completed"} +{"level":30,"time":1790408018340,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JD4NWCFKZRS9ENNQ1RR","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4JCJZDWYMA296ZFPY4DF/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018346,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JD4NWCFKZRS9ENNQ1RR","res":{"statusCode":200},"responseTime":5.515754999999444,"msg":"request completed"} +{"level":30,"time":1790408018348,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDC28B95P2KDW019QM5","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018350,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDC28B95P2KDW019QM5","res":{"statusCode":201},"responseTime":1.652274000000034,"msg":"request completed"} +{"level":30,"time":1790408018351,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDFHP41V6MX75HC8BA2","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018353,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDFHP41V6MX75HC8BA2","res":{"statusCode":201},"responseTime":1.7120279999999184,"msg":"request completed"} +{"level":30,"time":1790408018354,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDJP8QC0RWYNJG3BAWE","req":{"method":"POST","url":"/api/v1/staff/work-sessions/reconcile","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018357,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDJP8QC0RWYNJG3BAWE","res":{"statusCode":200},"responseTime":3.009777999999642,"msg":"request completed"} +{"level":30,"time":1790408018366,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDY7YVS8NFMK6B159M9","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018367,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDY7YVS8NFMK6B159M9","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018367,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDY7YVS8NFMK6B159M9","res":{"statusCode":404},"responseTime":0.45273399999950925,"msg":"request completed"} +{"level":30,"time":1790408018373,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JE5C72SJMQT011VRYK0","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018380,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JE5C72SJMQT011VRYK0","res":{"statusCode":202},"responseTime":6.309143000000404,"msg":"request completed"} +{"level":30,"time":1790408018391,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JEQ53Q7Q75D8JNWM330","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018395,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JEQ53Q7Q75D8JNWM330","res":{"statusCode":202},"responseTime":4.627241999999569,"msg":"request completed"} +{"level":30,"time":1790408018403,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JF35G4F1KTESX0J64QY","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018406,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JF35G4F1KTESX0J64QY","res":{"statusCode":200},"responseTime":2.5201289999995424,"msg":"request completed"} +{"level":30,"time":1790408018407,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JF75GCM7BPRQ93RQXGY","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4JETWGVJMHFN7Q38N6ZH/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018410,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JF75GCM7BPRQ93RQXGY","res":{"statusCode":200},"responseTime":3.6298900000001595,"msg":"request completed"} +{"level":30,"time":1790408018412,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFB7RG1HJWMFPP628P1","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018413,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFB7RG1HJWMFPP628P1","res":{"statusCode":201},"responseTime":1.662560000000667,"msg":"request completed"} +{"level":30,"time":1790408018414,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFEEZ33FSBQR5V8S3XG","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018422,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFEEZ33FSBQR5V8S3XG","res":{"statusCode":201},"responseTime":7.868167999999969,"msg":"request completed"} +{"level":30,"time":1790408018423,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFQ185WPASH3T84B2KY","req":{"method":"POST","url":"/api/v1/staff/work-sessions/reconcile","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018427,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFQ185WPASH3T84B2KY","res":{"statusCode":200},"responseTime":3.232307000000219,"msg":"request completed"} +{"level":30,"time":1790408018435,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG3C73K6MDYG5QKZBX4","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018435,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG3C73K6MDYG5QKZBX4","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018435,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG3C73K6MDYG5QKZBX4","res":{"statusCode":404},"responseTime":0.33230400000047666,"msg":"request completed"} +{"level":30,"time":1790408018437,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG57J9AN9YWDETCP3FJ","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018437,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG57J9AN9YWDETCP3FJ","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018437,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG57J9AN9YWDETCP3FJ","res":{"statusCode":404},"responseTime":0.2454699999998411,"msg":"request completed"} +{"level":30,"time":1790408018438,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG6X163QEGB6N85AM9P","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018439,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG6X163QEGB6N85AM9P","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018439,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG6X163QEGB6N85AM9P","res":{"statusCode":404},"responseTime":0.2565549999999348,"msg":"request completed"} +{"level":30,"time":1790408018440,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG8B5RZ5V4K0GB12G8X","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018441,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG8B5RZ5V4K0GB12G8X","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018441,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG8B5RZ5V4K0GB12G8X","res":{"statusCode":404},"responseTime":0.28928499999983615,"msg":"request completed"} +{"level":30,"time":1790408018442,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGAE9ZP2T630SJGVMDD","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018442,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGAE9ZP2T630SJGVMDD","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018443,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGAE9ZP2T630SJGVMDD","res":{"statusCode":404},"responseTime":0.2572410000002492,"msg":"request completed"} +{"level":30,"time":1790408018444,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGCQ53FE88AQGRDBRZG","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018444,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGCQ53FE88AQGRDBRZG","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018444,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGCQ53FE88AQGRDBRZG","res":{"statusCode":404},"responseTime":0.2509200000004057,"msg":"request completed"} +{"level":30,"time":1790408018445,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGDK389KPYPC2PXWXYA","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018446,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGDK389KPYPC2PXWXYA","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018446,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGDK389KPYPC2PXWXYA","res":{"statusCode":404},"responseTime":0.2959399999999732,"msg":"request completed"} +{"level":30,"time":1790408018448,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGGYYTDWN5DQXM5JY5P","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018448,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGGYYTDWN5DQXM5JY5P","msg":"Route POST:/api/v1/staff/access-grants not found"} +{"level":30,"time":1790408018448,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGGYYTDWN5DQXM5JY5P","res":{"statusCode":404},"responseTime":0.39974900000015623,"msg":"request completed"} +{"level":30,"time":1790408018450,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGJS6D7CH512HB9HZTM","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018455,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGJS6D7CH512HB9HZTM","res":{"statusCode":202},"responseTime":4.826310999999805,"msg":"request completed"} +{"level":30,"time":1790408018463,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGZ01CBTK1YMAHJRB18","req":{"method":"GET","url":"/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018463,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGZ01CBTK1YMAHJRB18","msg":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found"} +{"level":30,"time":1790408018463,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGZ01CBTK1YMAHJRB18","res":{"statusCode":404},"responseTime":0.3378870000005918,"msg":"request completed"} +{"level":30,"time":1790408018465,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JH1A0MMMC9Y5FHG5JR3","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} +{"level":30,"time":1790408018470,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JH1A0MMMC9Y5FHG5JR3","res":{"statusCode":202},"responseTime":5.273951000000125,"msg":"request completed"} +{"level":30,"time":1790408018478,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JHE1Z7JVRT7FTV70AXY","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} +{"level":30,"time":1790408018478,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JHE1Z7JVRT7FTV70AXY","msg":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found"} +{"level":30,"time":1790408018478,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JHE1Z7JVRT7FTV70AXY","res":{"statusCode":404},"responseTime":0.304058000000623,"msg":"request completed"} +{"level":30,"time":1790408018606,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JNE3G43KVT3QY8K1AEW","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018612,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JNE3G43KVT3QY8K1AEW","res":{"statusCode":202},"responseTime":6.345726999999897,"msg":"request completed"} +{"level":30,"time":1790408018632,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JP8Q2M2Y2BDPFWA68K7","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018637,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JP8Q2M2Y2BDPFWA68K7","res":{"statusCode":202},"responseTime":4.942963999999847,"msg":"request completed"} +{"level":30,"time":1790408018647,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JPQHAWFX6VEZQRJADJ4","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018650,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JPQHAWFX6VEZQRJADJ4","res":{"statusCode":201},"responseTime":2.9649260000005597,"msg":"request completed"} +{"level":30,"time":1790408018654,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JPYKMHN8AV2XRK1ZT9C","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018660,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JPYKMHN8AV2XRK1ZT9C","res":{"statusCode":200},"responseTime":5.449781000000257,"msg":"request completed"} +{"level":30,"time":1790408018675,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JQKCR13BT1AW47A8GYY","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018681,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JQKCR13BT1AW47A8GYY","res":{"statusCode":202},"responseTime":5.823410999999396,"msg":"request completed"} +{"level":30,"time":1790408018690,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JR2M60V60HT7JY4DVYZ","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018691,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JR2M60V60HT7JY4DVYZ","res":{"statusCode":201},"responseTime":1.3205479999996896,"msg":"request completed"} +{"level":30,"time":1790408018693,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JR5F9GRXENA9023DH3Q","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018697,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JR5F9GRXENA9023DH3Q","res":{"statusCode":200},"responseTime":3.8750069999996413,"msg":"request completed"} +{"level":30,"time":1790408018707,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JRKGVB9KFM4GW8JCCRS","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018712,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JRKGVB9KFM4GW8JCCRS","res":{"statusCode":202},"responseTime":4.9716669999997976,"msg":"request completed"} +{"level":30,"time":1790408018722,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JS290GZAPS7A6Z5YFZZ","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018727,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JS290GZAPS7A6Z5YFZZ","res":{"statusCode":202},"responseTime":5.085656000000199,"msg":"request completed"} +{"level":30,"time":1790408018736,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSG89R09EJQ2CDW87CW","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018738,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSG89R09EJQ2CDW87CW","res":{"statusCode":201},"responseTime":1.3734510000003866,"msg":"request completed"} +{"level":30,"time":1790408018739,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSKMK02GDMP23FZ2DZR","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":50,"time":1790408018743,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSKMK02GDMP23FZ2DZR","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"column \"status\" does not exist","stack":"error: column \"status\" does not exist\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/domain/sync/service.ts:389:24)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/sync.ts:306:28)","length":106,"name":"error","severity":"ERROR","code":"42703","position":"24","file":"parse_relation.c","line":"3716","routine":"errorMissingColumn"},"msg":"column \"status\" does not exist"} +{"level":30,"time":1790408018744,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSKMK02GDMP23FZ2DZR","res":{"statusCode":500},"responseTime":4.648181000000477,"msg":"request completed"} +{"level":30,"time":1790408018747,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSVD8C9S834XPRJQTD2","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018785,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSVD8C9S834XPRJQTD2","res":{"statusCode":202},"responseTime":37.420500999999604,"msg":"request completed"} +{"level":30,"time":1790408018793,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JV9WNV36C6MKDW979R6","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018796,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JV9WNV36C6MKDW979R6","res":{"statusCode":201},"responseTime":2.075665000000299,"msg":"request completed"} +{"level":30,"time":1790408018797,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVDPWZPXAZ8HFFNX7AB","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":50,"time":1790408018799,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVDPWZPXAZ8HFFNX7AB","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"column \"status\" does not exist","stack":"error: column \"status\" does not exist\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/domain/sync/service.ts:389:24)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/sync.ts:306:28)","length":106,"name":"error","severity":"ERROR","code":"42703","position":"24","file":"parse_relation.c","line":"3716","routine":"errorMissingColumn"},"msg":"column \"status\" does not exist"} +{"level":30,"time":1790408018799,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVDPWZPXAZ8HFFNX7AB","res":{"statusCode":500},"responseTime":2.661884999999529,"msg":"request completed"} +{"level":30,"time":1790408018801,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVHZF6TQCPQ6PWDKPCP","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018813,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVHZF6TQCPQ6PWDKPCP","res":{"statusCode":201},"responseTime":12.522825000000012,"msg":"request completed"} +{"level":30,"time":1790408018814,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVYMVC1M9CPBB2A3R39","req":{"method":"GET","url":"/api/v1/staff/sync/status","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018817,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVYMVC1M9CPBB2A3R39","res":{"statusCode":200},"responseTime":2.794176000000334,"msg":"request completed"} +{"level":30,"time":1790408018818,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JW2EXB5S1H9YVT9GK45","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018823,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JW2EXB5S1H9YVT9GK45","res":{"statusCode":202},"responseTime":4.881444999999985,"msg":"request completed"} +{"level":30,"time":1790408018834,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWJVPG8V84QAPCEE014","req":{"method":"PATCH","url":"/api/v1/staff/employees/01M3EA4JW60F9X6AEXP33M4MDQ","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018836,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWJVPG8V84QAPCEE014","res":{"statusCode":200},"responseTime":2.368786999999429,"msg":"request completed"} +{"level":30,"time":1790408018837,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWNGP1EJHDT3VJRAMN4","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018840,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWNGP1EJHDT3VJRAMN4","res":{"statusCode":200},"responseTime":2.5322159999996074,"msg":"request completed"} +{"level":30,"time":1790408018842,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWTMTYJ05Y0GV6PQS6B","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018846,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWTMTYJ05Y0GV6PQS6B","res":{"statusCode":202},"responseTime":4.6687080000001515,"msg":"request completed"} +{"level":30,"time":1790408018853,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JX5JMS8NPRX3DHT88ZC","req":{"method":"PATCH","url":"/api/v1/staff/employees/01M3EA4JWYGKJW3S3SQW7QMCF1","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018857,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JX5JMS8NPRX3DHT88ZC","res":{"statusCode":200},"responseTime":3.251942999999301,"msg":"request completed"} +{"level":30,"time":1790408018857,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JX9M65W8D65RMHR6D9Y","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018859,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JX9M65W8D65RMHR6D9Y","res":{"statusCode":201},"responseTime":1.2874750000000859,"msg":"request completed"} +{"level":30,"time":1790408018860,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXC3004KR4378VKCH5G","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018863,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXC3004KR4378VKCH5G","res":{"statusCode":200},"responseTime":3.7642430000005334,"msg":"request completed"} +{"level":30,"time":1790408018866,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXJBJV3807BHBFN5S1J","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018871,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXJBJV3807BHBFN5S1J","res":{"statusCode":202},"responseTime":5.396490000000085,"msg":"request completed"} +{"level":30,"time":1790408018879,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXZX0ABKYVBY9ZTNTH9","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018885,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXZX0ABKYVBY9ZTNTH9","res":{"statusCode":202},"responseTime":5.91953199999989,"msg":"request completed"} +{"level":30,"time":1790408018893,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYDQA2MT149ZXET8XDC","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018895,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYDQA2MT149ZXET8XDC","res":{"statusCode":201},"responseTime":1.6295439999994414,"msg":"request completed"} +{"level":30,"time":1790408018896,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYGEHZECWTJNPV5CJVK","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018899,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYGEHZECWTJNPV5CJVK","res":{"statusCode":200},"responseTime":3.3800209999999424,"msg":"request completed"} +{"level":30,"time":1790408018908,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYWF1Z6Y8YFD24BMCNK","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018913,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYWF1Z6Y8YFD24BMCNK","res":{"statusCode":202},"responseTime":4.775786000000153,"msg":"request completed"} +{"level":30,"time":1790408018920,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZ8P6JQC0MCXERDQG8A","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018922,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZ8P6JQC0MCXERDQG8A","res":{"statusCode":201},"responseTime":1.5908949999993638,"msg":"request completed"} +{"level":30,"time":1790408018923,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZBFX4VJZTS4YKEPZRK","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":50,"time":1790408018926,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZBFX4VJZTS4YKEPZRK","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\"","stack":"error: invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\"\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async SyncService.executeCommand (/workspace/krona-staff/src/domain/sync/service.ts:755:9)\n at async (/workspace/krona-staff/src/domain/sync/service.ts:701:33)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/sync.ts:390:25)","length":180,"name":"error","severity":"ERROR","code":"22007","where":"unnamed portal parameter $6 = '...'","file":"datetime.c","line":"4140","routine":"DateTimeParseError"},"msg":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""} +{"level":30,"time":1790408018927,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZBFX4VJZTS4YKEPZRK","res":{"statusCode":500},"responseTime":3.56025099999988,"msg":"request completed"} +{"level":30,"time":1790408018929,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZHQDMJQN1239C4STY6","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018929,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZHQDMJQN1239C4STY6","res":{"statusCode":200},"responseTime":0.275908999999956,"msg":"request completed"} +{"level":30,"time":1790408018931,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZKAZRYGPJS1C4JH86J","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018936,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZKAZRYGPJS1C4JH86J","res":{"statusCode":201},"responseTime":5.502994999999828,"msg":"request completed"} +{"level":30,"time":1790408018944,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K00QZ7RA4HCX365PH9C","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018952,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K00QZ7RA4HCX365PH9C","res":{"statusCode":202},"responseTime":7.422302000000855,"msg":"request completed"} +{"level":30,"time":1790408018960,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0GZZ935P4K7N775AKH","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018961,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0GZZ935P4K7N775AKH","res":{"statusCode":201},"responseTime":1.3733540000002904,"msg":"request completed"} +{"level":30,"time":1790408018962,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0J9ZACFMJQKXWB42BF","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018966,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0J9ZACFMJQKXWB42BF","res":{"statusCode":200},"responseTime":4.033708999999362,"msg":"request completed"} +{"level":30,"time":1790408018968,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0R231R31H7Y82XKEFW","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018969,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0R231R31H7Y82XKEFW","res":{"statusCode":201},"responseTime":1.091668000000027,"msg":"request completed"} +{"level":30,"time":1790408018971,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0VXYZRT371QPNE7KZA","req":{"method":"POST","url":"/api/v1/staff/sync/ack","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018973,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0VXYZRT371QPNE7KZA","res":{"statusCode":200},"responseTime":2.2560160000002725,"msg":"request completed"} +{"level":30,"time":1790408018975,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0ZTN3QWGTMYH903DYA","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018976,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0ZTN3QWGTMYH903DYA","res":{"statusCode":201},"responseTime":1.3257619999994859,"msg":"request completed"} +{"level":30,"time":1790408018977,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K111C5QFY8DC05HAMNK","req":{"method":"POST","url":"/api/v1/staff/sync/devices/01M3EA4K0ZYSXA5WW5PZG2TNS5/revoke","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} +{"level":30,"time":1790408018980,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K111C5QFY8DC05HAMNK","res":{"statusCode":200},"responseTime":2.1610540000001492,"msg":"request completed"} +{"level":30,"time":1790408018981,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K15V20PHSJGB9EQP4WN","req":{"method":"GET","url":"/api/v1/staff/sync/status","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} +{"level":30,"time":1790408018982,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K15V20PHSJGB9EQP4WN","res":{"statusCode":403},"err":{"type":"ForbiddenError","message":"Устройство отозвано","stack":"ForbiddenError: Устройство отозвано\n at Object.forbidden (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:33:12)\n at handleSyncError (/workspace/krona-staff/src/sync.ts:443:39)\n at Object. (/workspace/krona-staff/src/sync.ts:249:9)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)","status":403,"statusCode":403,"expose":true},"msg":"Устройство отозвано"} +{"level":30,"time":1790408018982,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K15V20PHSJGB9EQP4WN","res":{"statusCode":403},"responseTime":1.4805010000000038,"msg":"request completed"} +{"level":30,"time":1790408019100,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K4VD2Y9VX05D0YVHRPQ","req":{"method":"GET","url":"/api/v1/staff/live","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019100,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K4VD2Y9VX05D0YVHRPQ","res":{"statusCode":200},"responseTime":0.3551319999996849,"msg":"request completed"} +{"level":30,"time":1790408019106,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K52MQKWRNJHJ052QT1C","req":{"method":"GET","url":"/api/v1/staff/ready","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} +{"level":30,"time":1790408019113,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K52MQKWRNJHJ052QT1C","res":{"statusCode":200},"responseTime":7.321270999999797,"msg":"request completed"} +{"level":30,"time":1790408019144,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K68VG1ZD7J17S2G4TZV","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019145,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K68VG1ZD7J17S2G4TZV","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:280:21)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408019145,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K68VG1ZD7J17S2G4TZV","res":{"statusCode":401},"responseTime":0.6766259999994872,"msg":"request completed"} +{"level":30,"time":1790408019147,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6BA91KQ3B0K2DV1R8Z","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} +{"level":30,"time":1790408019149,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6BA91KQ3B0K2DV1R8Z","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:280:21)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408019149,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6BA91KQ3B0K2DV1R8Z","res":{"statusCode":401},"responseTime":2.714422000000013,"msg":"request completed"} +{"level":30,"time":1790408019151,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6FC17V38828NK5AWDH","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019156,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6FC17V38828NK5AWDH","res":{"statusCode":200},"responseTime":5.406590999999935,"msg":"request completed"} +{"level":30,"time":1790408019161,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6SBM3C4B20HGWAFBMZ","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} +{"level":30,"time":1790408019168,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6SBM3C4B20HGWAFBMZ","res":{"statusCode":202},"responseTime":7.204690999999912,"msg":"request completed"} +{"level":30,"time":1790408019178,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7AC5R9N6168RDHC6ZK","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019181,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7AC5R9N6168RDHC6ZK","res":{"statusCode":201},"responseTime":2.922958000000108,"msg":"request completed"} +{"level":30,"time":1790408019183,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7FA1GFE2QZ11B20ZRS","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} +{"level":30,"time":1790408019189,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7FA1GFE2QZ11B20ZRS","res":{"statusCode":202},"responseTime":5.149693999999727,"msg":"request completed"} +{"level":30,"time":1790408019196,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7WVTQDXRJXTNYDGR89","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4K7MJGQJ2T2YKG46NF7B/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019199,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7WVTQDXRJXTNYDGR89","res":{"statusCode":200},"responseTime":2.3117400000001,"msg":"request completed"} +{"level":30,"time":1790408019200,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K80FDTYG9ES87Q9ZQ7W","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} +{"level":30,"time":1790408019200,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K80FDTYG9ES87Q9ZQ7W","res":{"statusCode":403},"err":{"type":"ForbiddenError","message":"Недостаточно прав для просмотра посещаемости.","stack":"ForbiddenError: Недостаточно прав для просмотра посещаемости.\n at Object.forbidden (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:33:12)\n at _Reply.sensibleForbidden [as forbidden] (/workspace/krona-staff/node_modules/@fastify/sensible/index.js:55:44)\n at Object. (/workspace/krona-staff/src/portal.ts:283:20)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)","status":403,"statusCode":403,"expose":true},"msg":"Недостаточно прав для просмотра посещаемости."} +{"level":30,"time":1790408019201,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K80FDTYG9ES87Q9ZQ7W","res":{"statusCode":403},"responseTime":0.48845000000073924,"msg":"request completed"} +{"level":30,"time":1790408019202,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K810TRXD0SQ27W7YDGR","req":{"method":"POST","url":"/api/v1/staff/employees","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019202,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K810TRXD0SQ27W7YDGR","res":{"statusCode":403},"err":{"type":"ForbiddenError","message":"Недостаточно прав для этой операции.","stack":"ForbiddenError: Недостаточно прав для этой операции.\n at Object.forbidden (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:33:12)\n at requirePermission (/workspace/krona-staff/src/portal.ts:1383:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:454:23)","status":403,"statusCode":403,"expose":true},"msg":"Недостаточно прав для этой операции."} +{"level":30,"time":1790408019202,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K810TRXD0SQ27W7YDGR","res":{"statusCode":403},"responseTime":0.5087550000007468,"msg":"request completed"} +{"level":30,"time":1790408019203,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8324R3A78MXKWG5GN2","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} +{"level":30,"time":1790408019205,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8324R3A78MXKWG5GN2","res":{"statusCode":200},"responseTime":2.2520119999999224,"msg":"request completed"} +{"level":30,"time":1790408019207,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K87MB5BVVM753W72HHZ","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019212,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K87MB5BVVM753W72HHZ","res":{"statusCode":202},"responseTime":5.460973000000195,"msg":"request completed"} +{"level":30,"time":1790408019220,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8M7PQ0714YSD1M4CQP","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4K8BXTNNKH3PQYXZJNBE/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019222,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8M7PQ0714YSD1M4CQP","res":{"statusCode":200},"responseTime":1.5780409999997573,"msg":"request completed"} +{"level":30,"time":1790408019222,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8P75YVNTFTC53C6RE4","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} +{"level":30,"time":1790408019225,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8P75YVNTFTC53C6RE4","res":{"statusCode":200},"responseTime":2.076332000000548,"msg":"request completed"} +{"level":30,"time":1790408019225,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8S1H145G1H6N733Y63","req":{"method":"PATCH","url":"/api/v1/staff/employees/01M3EA4K8BXTNNKH3PQYXZJNBE","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} +{"level":30,"time":1790408019227,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8S1H145G1H6N733Y63","res":{"statusCode":200},"responseTime":1.5953489999992598,"msg":"request completed"} +{"level":30,"time":1790408019228,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8WFVAZS9JJ3Y48JK1Z","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} +{"level":30,"time":1790408019228,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8WFVAZS9JJ3Y48JK1Z","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:280:21)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} +{"level":30,"time":1790408019229,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8WFVAZS9JJ3Y48JK1Z","res":{"statusCode":401},"responseTime":0.9479200000005221,"msg":"request completed"} From 0aaa2f4d2dbf74b5778e21b5e96447454b15b69b Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:19:47 +0700 Subject: [PATCH 13/28] =?UTF-8?q?test(e2e):=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=20vitest/tsx/prettier=20=D0=B1=D0=B5=D0=B7=20.cmd-?= =?UTF-8?q?=D0=BE=D0=B1=D1=91=D1=80=D1=82=D0=BE=D0=BA=20(Windows)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: проект разрабатывается под Windows, а стенд там не стартовал: spawn('npx') и spawn('node_modules/.bin/tsx') без shell падают с ENOENT, потому что в Windows это .cmd-файлы (приёмка владельца, TASK-GROK-2 п.1). Что: scripts/test/node-commands.mjs находит JS-точки входа через require.resolve (tsx/cli, vitest.mjs, prettier.cjs) и всегда запускает их текущим node (process.execPath). Сервер запускается одним процессом `node --import tsx src/server.ts`: CLI tsx порождает дочерний node, и под Windows kill() родителя оставил бы сервер-сироту на порту. baseEnv() передаёт дочерним процессам PATH и под win32 системные переменные (SystemRoot, TEMP и др.), без которых node на Windows не работает с сетью, но не наследует секреты родителя. Проверка на Linux: tests/e2e/harness/node-commands.test.ts (входит в npm test) — команды начинаются с process.execPath, без .cmd/.bin/npx, файлы существуют; исходники стенда не вызывают npx и node_modules/.bin. Реальный прогон на Windows 11 — не проверено (нет Windows-раннера). --- scripts/test/n13-race.mjs | 8 ++- scripts/test/node-commands.d.mts | 9 +++ scripts/test/node-commands.mjs | 76 +++++++++++++++++++++++++ scripts/test/run-e2e.mjs | 13 ++--- tests/e2e/harness/global-setup.ts | 9 +-- tests/e2e/harness/node-commands.test.ts | 51 +++++++++++++++++ 6 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 scripts/test/node-commands.d.mts create mode 100644 scripts/test/node-commands.mjs create mode 100644 tests/e2e/harness/node-commands.test.ts diff --git a/scripts/test/n13-race.mjs b/scripts/test/n13-race.mjs index 40e9e77..dd113d6 100644 --- a/scripts/test/n13-race.mjs +++ b/scripts/test/n13-race.mjs @@ -18,6 +18,7 @@ import { createServer } from 'node:net'; import { tmpdir } from 'node:os'; import path from 'node:path'; import pg from 'pg'; +import { baseEnv, nodeWithTsx } from './node-commands.mjs'; const repoRoot = path.resolve(import.meta.dirname, '../..'); const args = process.argv.slice(2); @@ -77,7 +78,7 @@ runNode( const dbEnv = parseEnvFile(path.join(secretsDir, 'db.env')); rmSync(secretsDir, { recursive: true, force: true }); runNode(['scripts/test/migrate-roundtrip.mjs', 'up'], { - PATH: process.env.PATH ?? '', + ...baseEnv(), DATABASE_MIGRATION_URL: dbEnv.DATABASE_MIGRATION_URL, }); const migrator = new pg.Client({ connectionString: dbEnv.DATABASE_MIGRATION_URL }); @@ -99,10 +100,11 @@ for (const line of runNode(['scripts/generate-vapid-keys.mjs'], process.env).spl } const port = await freePort(); const log = createWriteStream(path.join(repoRoot, `tests/e2e/evidence/server-n13-${mode}.txt`)); -const child = spawn(path.join(repoRoot, 'node_modules/.bin/tsx'), ['src/server.ts'], { +const server = nodeWithTsx(['src/server.ts']); +const child = spawn(server.command, server.args, { cwd: repoRoot, env: { - PATH: process.env.PATH ?? '', + ...baseEnv(), NODE_ENV: 'test', HOST: '127.0.0.1', PORT: String(port), diff --git a/scripts/test/node-commands.d.mts b/scripts/test/node-commands.d.mts new file mode 100644 index 0000000..2a6a98c --- /dev/null +++ b/scripts/test/node-commands.d.mts @@ -0,0 +1,9 @@ +export type Tool = 'tsx' | 'vitest' | 'prettier'; +export declare function toolEntry(tool: Tool): string; +export declare function nodeTool(tool: Tool, args?: string[]): { command: string; args: string[] }; +export declare function nodeWithTsx(args?: string[]): { command: string; args: string[] }; +export declare function baseEnv( + platform?: NodeJS.Platform, + env?: NodeJS.ProcessEnv, +): Record; +export declare const repoRoot: string; diff --git a/scripts/test/node-commands.mjs b/scripts/test/node-commands.mjs new file mode 100644 index 0000000..3998fae --- /dev/null +++ b/scripts/test/node-commands.mjs @@ -0,0 +1,76 @@ +// Запуск инструментов из node_modules без .cmd-обёрток и без npx. +// Под Windows `node_modules/.bin/tsx` и `npx` — это .cmd-файлы: spawn() без shell +// падает с ENOENT. Поэтому всегда запускаем текущий node (process.execPath) с +// JS-точкой входа пакета, найденной через require.resolve. +import { createRequire } from 'node:module'; +import path from 'node:path'; +import { pathToFileURL } from 'node:url'; + +const repoRoot = path.resolve(import.meta.dirname, '../..'); +const require = createRequire(path.join(repoRoot, 'package.json')); + +function packageBin(name, binName = name) { + const manifestPath = require.resolve(`${name}/package.json`); + const manifest = require(manifestPath); + const bin = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.[binName]; + if (!bin) throw new Error(`${name}: в package.json нет bin "${binName}"`); + return path.join(path.dirname(manifestPath), bin); +} + +/** Абсолютный путь к JS-точке входа CLI (не .cmd, не .bin). */ +export function toolEntry(tool) { + switch (tool) { + case 'tsx': + return require.resolve('tsx/cli'); + case 'vitest': + return packageBin('vitest'); + case 'prettier': + return packageBin('prettier'); + default: + throw new Error(`неизвестный инструмент: ${tool}`); + } +} + +/** Команда для spawn(command, args): всегда process.execPath + JS-файл CLI. */ +export function nodeTool(tool, args = []) { + return { command: process.execPath, args: [toolEntry(tool), ...args] }; +} + +/** + * Запуск TypeScript-файла (например, src/server.ts) в ОДНОМ процессе node с + * загрузчиком tsx (`node --import tsx`). CLI tsx запускает дочерний node, и под + * Windows kill() родителя (TerminateProcess) оставил бы сервер-сироту на порту. + */ +export function nodeWithTsx(args = []) { + const loader = pathToFileURL(require.resolve('tsx')).href; + return { command: process.execPath, args: ['--import', loader, ...args] }; +} + +/** + * Минимальное окружение дочернего процесса: PATH и (под Windows) системные + * переменные, без которых node не может работать с сетью/криптографией + * (SystemRoot, WINDIR, TEMP и т. п.). Секреты родителя не наследуются. + */ +export function baseEnv(platform = process.platform, env = process.env) { + const keys = ['PATH']; + if (platform === 'win32') { + keys.push( + 'SystemRoot', + 'WINDIR', + 'TEMP', + 'TMP', + 'USERPROFILE', + 'LOCALAPPDATA', + 'APPDATA', + 'ComSpec', + 'PATHEXT', + ); + } + const result = {}; + for (const key of keys) { + if (env[key] !== undefined) result[key] = env[key]; + } + return result; +} + +export { repoRoot }; diff --git a/scripts/test/run-e2e.mjs b/scripts/test/run-e2e.mjs index 22949ec..6d4f92e 100644 --- a/scripts/test/run-e2e.mjs +++ b/scripts/test/run-e2e.mjs @@ -10,6 +10,7 @@ import { spawn, spawnSync } from 'node:child_process'; import { createWriteStream, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'; import path from 'node:path'; +import { nodeTool } from './node-commands.mjs'; const repoRoot = path.resolve(import.meta.dirname, '../..'); const evidence = path.join(repoRoot, 'tests/e2e/evidence'); @@ -20,7 +21,6 @@ const logPath = path.join(evidence, 'e2e-run.txt'); const extra = process.argv.slice(2).filter((arg) => !arg.startsWith('--no-known-defects')); const vitestArgs = [ - 'vitest', 'run', '--config', 'tests/e2e/vitest.e2e.config.ts', @@ -30,9 +30,10 @@ const vitestArgs = [ ...extra, ]; const log = createWriteStream(logPath); -log.write(`$ npx ${vitestArgs.join(' ')}\n`); +const vitest = nodeTool('vitest', vitestArgs); +log.write(`$ node ${vitestArgs.join(' ')}\n`); const exitCode = await new Promise((resolve) => { - const child = spawn('npx', vitestArgs, { cwd: repoRoot, env: process.env }); + const child = spawn(vitest.command, vitest.args, { cwd: repoRoot, env: process.env }); for (const stream of [child.stdout, child.stderr]) { stream.on('data', (chunk) => { process.stdout.write(chunk); @@ -108,10 +109,8 @@ const table = ['| ID | Цвет | Зелёных/всего | Вердикт |', writeFileSync(path.join(evidence, 'e2e-table.md'), `${table}\n`); // Сгенерированные json/md приводятся к prettier, чтобы `npm run format:check` не // краснел из-за evidence (tests/e2e/evidence не в .prettierignore). -spawnSync('npx', ['prettier', '--write', jsonPath, path.join(evidence, 'e2e-table.md')], { - cwd: repoRoot, - stdio: 'ignore', -}); +const prettier = nodeTool('prettier', ['--write', jsonPath, path.join(evidence, 'e2e-table.md')]); +spawnSync(prettier.command, prettier.args, { cwd: repoRoot, stdio: 'ignore' }); console.log(`\n[run-e2e] vitest exit=${exitCode}\n${table}`); if (strict) { diff --git a/tests/e2e/harness/global-setup.ts b/tests/e2e/harness/global-setup.ts index 5258209..55ca631 100644 --- a/tests/e2e/harness/global-setup.ts +++ b/tests/e2e/harness/global-setup.ts @@ -7,6 +7,7 @@ import { createServer } from 'node:net'; import { tmpdir } from 'node:os'; import path from 'node:path'; import type { TestProject } from 'vitest/node'; +import { baseEnv, nodeWithTsx } from '../../../scripts/test/node-commands.mjs'; import { randomUlid, type E2EContext } from './context.js'; const repoRoot = path.resolve(import.meta.dirname, '../../..'); @@ -63,11 +64,11 @@ async function startServer(name: string, env: Record): Promise { + it.each(['tsx', 'vitest', 'prettier'] as const)('%s: process.execPath + JS-файл', (tool) => { + const command = nodeTool(tool, ['--version']); + expect(command.command).toBe(process.execPath); + const entry = command.args[0]!; + expect(entry).not.toMatch(forbidden); + expect(entry).toMatch(/\.(mjs|cjs|js)$/); + expect(path.isAbsolute(entry)).toBe(true); + expect(existsSync(entry)).toBe(true); + }); + + it('сервер: один процесс node с загрузчиком tsx', () => { + const command = nodeWithTsx(['src/server.ts']); + expect(command.command).toBe(process.execPath); + expect(command.args[0]).toBe('--import'); + expect(command.args[1]).toMatch(/^file:\/\/.*\.mjs$/); + expect(command.args.join(' ')).not.toMatch(forbidden); + expect(command.args.at(-1)).toBe('src/server.ts'); + }); + + it('под win32 дочерний процесс получает SystemRoot/TEMP, а секреты не наследуются', () => { + const env = baseEnv('win32', { + PATH: 'C:\\Windows', + SystemRoot: 'C:\\Windows', + TEMP: 'C:\\Temp', + DATABASE_URL: 'secret-must-not-leak', + }); + expect(env).toMatchObject({ PATH: 'C:\\Windows', SystemRoot: 'C:\\Windows', TEMP: 'C:\\Temp' }); + expect(env).not.toHaveProperty('DATABASE_URL'); + expect(baseEnv('linux', { PATH: '/bin', SystemRoot: 'x' })).toEqual({ PATH: '/bin' }); + }); + + it.each([ + 'scripts/test/run-e2e.mjs', + 'scripts/test/n13-race.mjs', + 'tests/e2e/harness/global-setup.ts', + ])('%s не вызывает npx и node_modules/.bin', (file) => { + const source = readFileSync(path.join(repoRoot, file), 'utf8'); + expect(source).not.toMatch(/spawn(Sync)?\(\s*['"`]npx/); + expect(source).not.toMatch(/node_modules\/\.bin/); + }); +}); From fc20f75b552bee38410d558c03f88d6536f390dc Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:20:28 +0700 Subject: [PATCH 14/28] =?UTF-8?q?test(e2e):=20evidence=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=D0=BD=D0=BE=D0=B2=20=D0=B2=D0=BD=D0=B5=20git?= =?UTF-8?q?,=20=D0=B2=20CI=20=E2=80=94=20=D0=B0=D1=80=D1=82=D0=B5=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: tests/e2e/evidence/ перезаписывается каждым прогоном (логи серверов с ULID и портами, JSON vitest), поэтому любой запуск стенда менял отслеживаемые файлы и засорял дифф (приёмка владельца, TASK-GROK-2 п.1). Что: tests/e2e/evidence/ убран из индекса (git rm --cached) и добавлен в корневой .gitignore (его же читает prettier, поэтому форматировать сгенерированные файлы больше не нужно — вызов prettier из run-e2e убран). В CI задача e2e выгружает папку артефактом e2e-evidence (actions/upload-artifact, закреплён SHA v4.6.2; Forgejo 9.0.3 поддерживает v4). Разовые доказательства, которые скрипты не перезаписывают (N5 до/после, замер N13), перенесены в tests/e2e/report-evidence/ — на них ссылается REPORT.md. --- .forgejo/workflows/ci.yml | 10 + .gitignore | 3 + scripts/test/run-e2e.mjs | 7 +- tests/e2e/evidence/ci-local.txt | 1138 ----------------- tests/e2e/evidence/e2e-results.json | 669 ---------- tests/e2e/evidence/e2e-run.txt | 941 -------------- tests/e2e/evidence/e2e-table.md | 44 - tests/e2e/evidence/server-n13-as-is.txt | 425 ------ tests/e2e/evidence/server-n13-n2-bypass.txt | 0 tests/e2e/evidence/server-no-tokens.txt | 11 - tests/e2e/evidence/server-rate-limit.txt | 93 -- tests/e2e/evidence/server-secured.txt | 279 ---- .../n13-race.txt | 0 .../n5-after.txt | 0 .../n5-before.txt | 0 15 files changed, 15 insertions(+), 3605 deletions(-) delete mode 100644 tests/e2e/evidence/ci-local.txt delete mode 100644 tests/e2e/evidence/e2e-results.json delete mode 100644 tests/e2e/evidence/e2e-run.txt delete mode 100644 tests/e2e/evidence/e2e-table.md delete mode 100644 tests/e2e/evidence/server-n13-as-is.txt delete mode 100644 tests/e2e/evidence/server-n13-n2-bypass.txt delete mode 100644 tests/e2e/evidence/server-no-tokens.txt delete mode 100644 tests/e2e/evidence/server-rate-limit.txt delete mode 100644 tests/e2e/evidence/server-secured.txt rename tests/e2e/{evidence => report-evidence}/n13-race.txt (100%) rename tests/e2e/{evidence => report-evidence}/n5-after.txt (100%) rename tests/e2e/{evidence => report-evidence}/n5-before.txt (100%) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 054899a..ebf9011 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -91,6 +91,16 @@ jobs: - name: e2e table if: always() run: cat tests/e2e/evidence/e2e-table.md || true + # tests/e2e/evidence/ в .gitignore: полный вывод vitest, JSON, логи серверов — + # артефакт прогона, а не файлы репозитория (TASK-GROK-2 п.1). + - name: upload e2e evidence + if: always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: e2e-evidence + path: tests/e2e/evidence/ + retention-days: 14 + if-no-files-found: warn # docker build требует Docker daemon, которого нет в контейнере метки `docker`. # Нужен раннер с меткой `docker-host` (хост с доступом к Docker). Пока такого diff --git a/.gitignore b/.gitignore index 9d8783f..a8e581e 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ apps/KronaStaffTerminal.Tests/bin/ apps/KronaStaffTerminal.Tests/obj/ artifacts/ .audit-build/ + +# Результаты прогонов e2e (логи серверов, JSON vitest, таблица) — артефакт CI, не исходники +tests/e2e/evidence/ diff --git a/scripts/test/run-e2e.mjs b/scripts/test/run-e2e.mjs index 6d4f92e..2fe8f68 100644 --- a/scripts/test/run-e2e.mjs +++ b/scripts/test/run-e2e.mjs @@ -7,7 +7,8 @@ // убрать из списка — иначе регрессию потом никто не заметит). // * --no-known-defects: строгий режим, exit = код vitest (все дефекты красные). // Полный вывод пишется в tests/e2e/evidence/e2e-run.txt, таблица — в e2e-table.md. -import { spawn, spawnSync } from 'node:child_process'; +// tests/e2e/evidence/ не хранится в git (.gitignore): в CI это артефакт задачи e2e. +import { spawn } from 'node:child_process'; import { createWriteStream, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'; import path from 'node:path'; import { nodeTool } from './node-commands.mjs'; @@ -107,10 +108,6 @@ for (const id of Object.keys(known)) { } const table = ['| ID | Цвет | Зелёных/всего | Вердикт |', '|---|---|---|---|', ...rows].join('\n'); writeFileSync(path.join(evidence, 'e2e-table.md'), `${table}\n`); -// Сгенерированные json/md приводятся к prettier, чтобы `npm run format:check` не -// краснел из-за evidence (tests/e2e/evidence не в .prettierignore). -const prettier = nodeTool('prettier', ['--write', jsonPath, path.join(evidence, 'e2e-table.md')]); -spawnSync(prettier.command, prettier.args, { cwd: repoRoot, stdio: 'ignore' }); console.log(`\n[run-e2e] vitest exit=${exitCode}\n${table}`); if (strict) { diff --git a/tests/e2e/evidence/ci-local.txt b/tests/e2e/evidence/ci-local.txt deleted file mode 100644 index f3a0f1c..0000000 --- a/tests/e2e/evidence/ci-local.txt +++ /dev/null @@ -1,1138 +0,0 @@ -=== job verify -::: [npm-ci] npm ci --no-audit --no-fund -npm warn deprecated eslint@9.39.5: This version is no longer supported. Please see https://eslint.org/version-support for other options. - -added 236 packages in 1s -::: [npm-ci] OK -::: [provision] node scripts/test/provision-pg.mjs --out /tmp/tmp.FbBHYTGgXb/db.env --db krona_staff -provisioned database=krona_staff server_version=17.11 -role=krona_migrator super=false createrole=false createdb=false bypassrls=false -role=krona_staff_app super=false createrole=false createdb=false bypassrls=false -::: [provision] OK -::: [migrate-roundtrip] with_db_env node scripts/test/migrate-roundtrip.mjs roundtrip -== migrate up (1) -applied 0001_infrastructure.up.sql -applied 0002_security_hardening.up.sql -applied 0003_app_role_privileges.up.sql -applied 0004_revoke_broad_default_privileges.up.sql -applied 0005_attendance_portal.up.sql -applied 0006_payroll_foundation.up.sql -applied 0007_work_session_trace.up.sql -applied 0008_employee_access.up.sql -applied 0009_professions.up.sql -applied 0010_employee_push_notifications.up.sql -applied 0011_offline_sync_backend.up.sql -== rollback all (applied now: 11) -rolled back 0011_offline_sync_backend.down.sql -rolled back 0010_employee_push_notifications.down.sql -rolled back 0009_professions.down.sql -rolled back 0008_employee_access.down.sql -rolled back 0007_work_session_trace.down.sql -rolled back 0006_payroll_foundation.down.sql -rolled back 0005_attendance_portal.down.sql -rolled back 0004_revoke_broad_default_privileges.down.sql -rolled back 0003_app_role_privileges.down.sql -rolled back 0002_security_hardening.down.sql -rolled back 0001_infrastructure.down.sql -no migration to roll back -== rolled back 11 migrations -== migrate up (2) -applied 0001_infrastructure.up.sql -applied 0002_security_hardening.up.sql -applied 0003_app_role_privileges.up.sql -applied 0004_revoke_broad_default_privileges.up.sql -applied 0005_attendance_portal.up.sql -applied 0006_payroll_foundation.up.sql -applied 0007_work_session_trace.up.sql -applied 0008_employee_access.up.sql -applied 0009_professions.up.sql -applied 0010_employee_push_notifications.up.sql -applied 0011_offline_sync_backend.up.sql -== migrate up (3, must be no-op) -== roundtrip OK: rolledBack=11 reapplied=11 -::: [migrate-roundtrip] OK -::: [check] with_db_env npm run check - -> @krona/staff@0.3.2 check -> npm run lint && npm run typecheck && npm run test && npm run check:migrations && npm run check:contracts && npm run build - - -> @krona/staff@0.3.2 lint -> eslint . - - -> @krona/staff@0.3.2 typecheck -> tsc --noEmit - - -> @krona/staff@0.3.2 test -> vitest run - - - RUN v5.0.1 /workspace/krona-staff - - - Test Files 19 passed (19) - Tests 188 passed (188) - Start at 14:33:25 - Duration 1.00s (tests 46%, transform 31%, import 22%, worker 1%) - - -> @krona/staff@0.3.2 check:migrations -> node scripts/check-migrations.mjs - -validated 11 reversible migration(s) - -> @krona/staff@0.3.2 check:contracts -> node scripts/check-contracts.mjs - - - ╔═══════════════════════════════════════════════════════╗ - ║ ║ - ║ A new version of Redocly CLI (2.54.3) is available. ║ - ║ Update now: `npm i -g @redocly/cli@latest`. ║ - ║ Changelog: https://redocly.com/docs/cli/changelog/ ║ - ║ ║ - ╚═══════════════════════════════════════════════════════╝ - -No configurations were provided -- using built in recommended configuration by default. - -validating api/openapi.yaml... -api/openapi.yaml: validated in 45ms - -Woohoo! Your API description is valid. 🎉 - -module manifest, settings schema and OpenAPI contract validated - -> @krona/staff@0.3.2 build -> tsc -p tsconfig.build.json - -::: [check] OK -::: [audit] npm audit --audit-level=high -found 0 vulnerabilities -::: [audit] OK -=== job format -::: [format-check] npm run format:check - -> @krona/staff@0.3.2 format:check -> prettier --check . - -Checking formatting... -[warn] api/openapi.yaml -[warn] apps/KronaStaffService/README.md -[warn] deploy/pilot/compose.yaml -[warn] docs/DRIVER-DISTRIBUTION.md -[warn] docs/HARDWARE-TEST-SLK20R.md -[warn] docs/OFFLINE-SYNC-PROTOCOL.md -[warn] docs/TERMINAL-API-REQUIREMENTS.md -[warn] scripts/check-migrations.mjs -[warn] src/adapters/identity.ts -[warn] src/app.ts -[warn] src/config.ts -[warn] src/domain/attendance/work-session.ts -[warn] src/domain/notification/web-push.ts -[warn] src/domain/sync/cursor.ts -[warn] src/domain/sync/service.ts -[warn] src/portal.ts -[warn] src/sync.ts -[warn] tests/unit/config.test.ts -[warn] tests/unit/employee-push.test.ts -[warn] tests/unit/portal-ui.test.ts -[warn] tests/unit/sync.test.ts -[warn] tests/unit/tenant-sql.test.ts -[warn] tests/unit/work-session.test.ts -[warn] Code style issues found in 23 files. Run Prettier with --write to fix. -::: [format-check] FAIL exit=1 -=== job e2e -::: [e2e] env E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs - - RUN v5.0.1 /workspace/krona-staff - -[e2e] provision: -provisioned database=krona_staff_e2e server_version=17.11 -role=krona_migrator super=false createrole=false createdb=false bypassrls=false -role=krona_staff_app super=false createrole=false createdb=false bypassrls=false -[e2e] migrations (roundtrip) as krona_migrator: -== migrate up (1) -applied 0001_infrastructure.up.sql -applied 0002_security_hardening.up.sql -applied 0003_app_role_privileges.up.sql -applied 0004_revoke_broad_default_privileges.up.sql -applied 0005_attendance_portal.up.sql -applied 0006_payroll_foundation.up.sql -applied 0007_work_session_trace.up.sql -applied 0008_employee_access.up.sql -applied 0009_professions.up.sql -applied 0010_employee_push_notifications.up.sql -applied 0011_offline_sync_backend.up.sql -== rollback all (applied now: 11) -rolled back 0011_offline_sync_backend.down.sql -rolled back 0010_employee_push_notifications.down.sql -rolled back 0009_professions.down.sql -rolled back 0008_employee_access.down.sql -rolled back 0007_work_session_trace.down.sql -rolled back 0006_payroll_foundation.down.sql -rolled back 0005_attendance_portal.down.sql -rolled back 0004_revoke_broad_default_privileges.down.sql -rolled back 0003_app_role_privileges.down.sql -rolled back 0002_security_hardening.down.sql -rolled back 0001_infrastructure.down.sql -no migration to roll back -== rolled back 11 migrations -== migrate up (2) -applied 0001_infrastructure.up.sql -applied 0002_security_hardening.up.sql -applied 0003_app_role_privileges.up.sql -applied 0004_revoke_broad_default_privileges.up.sql -applied 0005_attendance_portal.up.sql -applied 0006_payroll_foundation.up.sql -applied 0007_work_session_trace.up.sql -applied 0008_employee_access.up.sql -applied 0009_professions.up.sql -applied 0010_employee_push_notifications.up.sql -applied 0011_offline_sync_backend.up.sql -== migrate up (3, must be no-op) -== roundtrip OK: rolledBack=11 reapplied=11 -[e2e] server secured ready at http://127.0.0.1:35389 (log: tests/e2e/evidence/server-secured.txt) -[e2e] server no-tokens ready at http://127.0.0.1:33821 (log: tests/e2e/evidence/server-no-tokens.txt) -[e2e] server rate-limit ready at http://127.0.0.1:36299 (log: tests/e2e/evidence/server-rate-limit.txt) - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N1] менеджер создаёт сотрудника через POST /employees → 201 38ms - → HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка 111ms - → подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N4] пересекающиеся расчёты не начисляют одну смену дважды 66ms - → подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1 2544ms - → подписка: HTTP 201 {"id":"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5","endpoint":"https://127.0.0.1:36027/e2e-internal-admin"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику 44ms - → HTTP 201 {"id":"01M3EA4J0JSPFRDF22J6E2CEY1","endpoint":"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400) 31ms - → HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":12345,"percent_bp":0,"guarantee_minor":0,"pool_weight_bp":0… | HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":9007199254740991,"percent_bp":0,"guarantee_minor":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N10] терминальный токен не читает справочники профессий и точек (403) 4ms - → expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401) 20ms - → expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F3] cookie сессии не содержит сырой токен и отзывается при выходе 8ms - → expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F10] мутация по cookie без Origin отклоняется (CSRF, 403) 5ms - → HTTP 201 {"id":"01M3EA4J31CEM99Y9708PNVE90","code":"profession-01m3ea4j31cem99y9708pnve90","name":"E2E-CSRF-профессия-c30803","status":"active"}: expected 201 to be 403 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F7] повтор Idempotency-Key с другим телом не создаёт второе событие 31ms - → expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N11] импорт с неверным kind начисления → 400, а не 500 25ms - → HTTP 500 {"statusCode":500,"code":"23514","error":"Internal Server Error","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""}: expected 500 to be 400 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток) 75ms - → статусы: 401: expected false to be true // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-01] менеджер точки A запускает расчёт для точки B → 403 110ms - → C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-02] менеджер точки отправляет пакет на согласование → 403 64ms - → C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-04] бухгалтер пытается подписать пакет → 403 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-05] до подписи директора в ledger нет начислений и выплат 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру 1ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена» 15ms - → C3: HTTP 404 {"message":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-11] согласие отозвано → статус для терминала меняется 15ms - → C3 PUT biometric-consent: HTTP 404 {"message":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется) 87ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JPXC3E39GZMHFH33H92","command_type":"upsert_work_session","status":"applied","result":{"id":"01M3EA4JPXQPVQDPGEA3YVFPXV","revision":1,"status":"applied"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) } - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-B] устройство не может утвердить табель (status=approved отклоняется) 32ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JR4CST4PE643FC043K9","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"01M3EA4JR43V65BMVJVX5DHSV0","revision":1,"status":"applied"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null } - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200) 39ms - → HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично 55ms - → HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull 41ms - → expected false to be true // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-E] отметка уволенного сотрудника через sync отклоняется 24ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JXD7TMSBAMMAK6HMXK2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется 42ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JYH12S10KQ4NWN232FM","status":"accepted"}},{"idempotency_key":"e2e-01M3EA4JYFDXJXPH923SG1E832","command_type":"attendance_event","status":"applied","resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) } - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500) 21ms - → HTTP 500 {"statusCode":500,"code":"22007","error":"Internal Server Error","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] } - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403) 9ms - → HTTP 201 {"device":{"id":"01M3EA4JZKVD04KCMNCGGW1EAH","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-5J7EDPFQV6","name":"E2E-CSRF-терминал-34e01a","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.935Z","created_by":"01M3E…: expected 201 to be 403 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401) 7ms - → HTTP 201 {"device":{"id":"01M3EA4JZWQF4S3SXWCX77J9ST","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-KS5GF18F83","name":"E2E-Анонимный терминал-75d36d","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.940Z","created_by":"…: expected 201 to be 401 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events 24ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4K0NB5RS8GACHWC7N2C2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400) 7ms - → HTTP 200 {"acknowledged":true,"cursor":"cur_999999999_fd163ccb01a6","acknowledged_at":"2026-09-26T07:33:38.972Z"}: expected 200 to be 400 // Object.is equality - ✓ tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль 8ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] сервер отвечает live/ready (ready проверяет БД) 32ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER 14ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] миграции применены мигратором, app-роль не видит schema_migrations 14ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200 14ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] терминал: отметка сотрудника из импорта принимается (201) 25ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя 24ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [CTRL] уволенный сотрудник теряет доступ (401) 23ms - × tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение} 6ms - → переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal [] - × tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-2] ни один сервис не запускается с NODE_ENV=development 1ms - → expected [ 'app' ] to deeply equal [] - ✓ tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-3] у сервиса app нет учётных данных мигратора 1ms - -⎯⎯⎯⎯⎯⎯ Failed Tests 38 ⎯⎯⎯⎯⎯⎯⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N1] менеджер создаёт сотрудника через POST /employees → 201 -AssertionError: HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 500 - - ❯ tests/e2e/10-core-defects.e2e.ts:55:57 - 53| }, - 54| }); - 55| expect(response.status, describeResponse(response)).toBe(201); - | ^ - 56| const rows = await dbQuery('SELECT id FROM staff_employees WHERE p… - 57| number, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка -AssertionError: подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 500 - - ❯ tests/e2e/10-core-defects.e2e.ts:73:81 - 71| body: { status: 'confirmed' }, - 72| }); - 73| expect(confirm.status, `подтверждение смены: ${describeResponse(co… - | ^ - 74| - 75| const calculate = await api('POST', '/payroll/calculate', { - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N4] пересекающиеся расчёты не начисляют одну смену дважды -AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 500 - - ❯ tests/e2e/10-core-defects.e2e.ts:104:7 - 102| confirm.status, - 103| `подтверждение смены (предусловие, см. N2): ${describeResponse(c… - 104| ).toBe(200); - | ^ - 105| - 106| const month = monthOf(day); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1 -AssertionError: подписка: HTTP 201 {"id":"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5","endpoint":"https://127.0.0.1:36027/e2e-internal-admin"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) } - -- Expected -+ Received - - { -- "connections": 0, -- "status": toSatisfy<[Function anonymous]>, -+ "connections": 1, -+ "status": 201, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:161:9 - 159| { status: subscribe.status, connections }, - 160| `подписка: ${describeResponse(subscribe)}`, - 161| ).toEqual({ - | ^ - 162| status: expect.toSatisfy((s: number) => s === 400 || s === 422… - 163| connections: 0, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику -AssertionError: HTTP 201 {"id":"01M3EA4J0JSPFRDF22J6E2CEY1","endpoint":"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) } - -- Expected -+ Received - - { - "owner": [ -- "01M3EA4HZSY982GYTPDAVP0Z0Q", -+ "01M3EA4HZTSZ12MKP3SV134FKS", - ], -- "status": toSatisfy<[Function anonymous]>, -+ "status": 201, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:191:7 - 189| { status: second.status, owner: owner.map((row) => row.employee_… - 190| describeResponse(second), - 191| ).toEqual({ - | ^ - 192| status: expect.toSatisfy((s: number) => s === 409 || s === 403), - 193| owner: [employeeA!.id], - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400) -AssertionError: HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":12345,"percent_bp":0,"guarantee_minor":0,"pool_weight_bp":0… | HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":9007199254740991,"percent_bp":0,"guarantee_minor":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 } - -- Expected -+ Received - - { -- "extra": 400, -- "huge": 400, -+ "extra": 200, -+ "huge": 200, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:215:7 - 213| { extra: extra.status, huge: huge.status }, - 214| `${describeResponse(extra)} | ${describeResponse(huge)}`, - 215| ).toEqual({ - | ^ - 216| extra: 400, - 217| huge: 400, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N10] терминальный токен не читает справочники профессий и точек (403) -AssertionError: expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 } - -- Expected -+ Received - - { -- "professions": 403, -- "units": 403, -+ "professions": 200, -+ "units": 200, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:224:70 - 222| const professions = await api('GET', '/professions', { token: ctx(… - 223| const units = await api('GET', '/org-units', { token: ctx().termin… - 224| expect({ professions: professions.status, units: units.status }).t… - | ^ - 225| professions: 403, - 226| units: 403, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401) -AssertionError: expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) } - -- Expected -+ Received - - { -- "payroll": 401, -- "portal": 401, -- "write": 401, -+ "payroll": 200, -+ "portal": 200, -+ "write": 201, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:237:85 - 235| body: { name: synthetic('Профессия') }, - 236| }); - 237| expect({ portal: portal.status, payroll: payroll.status, write: wr… - | ^ - 238| portal: 401, - 239| payroll: 401, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F3] cookie сессии не содержит сырой токен и отзывается при выходе -AssertionError: expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) } - -- Expected -+ Received - - { -- "afterLogout": 401, -- "rawTokenInCookie": false, -+ "afterLogout": 200, -+ "rawTokenInCookie": true, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:255:91 - 253| expect(logout.status).toBe(204); - 254| const reuse = await api('GET', '/portal', { headers: { cookie } }); - 255| expect({ rawTokenInCookie: value === ctx().managerToken, afterLogo… - | ^ - 256| rawTokenInCookie: false, - 257| afterLogout: 401, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F10] мутация по cookie без Origin отклоняется (CSRF, 403) -AssertionError: HTTP 201 {"id":"01M3EA4J31CEM99Y9708PNVE90","code":"profession-01m3ea4j31cem99y9708pnve90","name":"E2E-CSRF-профессия-c30803","status":"active"}: expected 201 to be 403 // Object.is equality - -- Expected -+ Received - -- 403 -+ 201 - - ❯ tests/e2e/10-core-defects.e2e.ts:269:57 - 267| body: { name: synthetic('CSRF-профессия') }, - 268| }); - 269| expect(response.status, describeResponse(response)).toBe(403); - | ^ - 270| }); - 271| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F7] повтор Idempotency-Key с другим телом не создаёт второе событие -AssertionError: expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false } - -- Expected -+ Received - - { - "first": 201, -- "secondCreated": false, -+ "secondCreated": true, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:288:75 - 286| const first = await send(`e2e-${randomUlid()}`); - 287| const second = await send(`e2e-${randomUlid()}`); - 288| expect({ first: first.status, secondCreated: second.status === 201… - | ^ - 289| first: 201, - 290| secondCreated: false, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N11] импорт с неверным kind начисления → 400, а не 500 -AssertionError: HTTP 500 {"statusCode":500,"code":"23514","error":"Internal Server Error","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""}: expected 500 to be 400 // Object.is equality - -- Expected -+ Received - -- 400 -+ 500 - - ❯ tests/e2e/10-core-defects.e2e.ts:311:57 - 309| }, - 310| }); - 311| expect(response.status, describeResponse(response)).toBe(400); - | ^ - 312| }); - 313| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток) -AssertionError: статусы: 401: expected false to be true // Object.is equality - -- Expected -+ Received - -- true -+ false - - ❯ tests/e2e/10-core-defects.e2e.ts:324:84 - 322| if (response.status === 429) break; - 323| } - 324| expect(statuses.includes(429), `статусы: ${[...new Set(statuses)].… - | ^ - 325| }); - 326| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется) -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JPXC3E39GZMHFH33H92","command_type":"upsert_work_session","status":"applied","result":{"id":"01M3EA4JPXQPVQDPGEA3YVFPXV","revision":1,"status":"applied"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) } - -- Expected -+ Received - - { - "http": 200, -- "result": "rejected", -- "stored": null, -+ "result": "applied", -+ "stored": "confirmed", - } - - ❯ tests/e2e/20-sync-defects.e2e.ts:86:7 - 84| }, - 85| describeResponse(response), - 86| ).toEqual({ http: 200, result: 'rejected', stored: null }); - | ^ - 87| }); - 88| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-B] устройство не может утвердить табель (status=approved отклоняется) -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JR4CST4PE643FC043K9","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"01M3EA4JR43V65BMVJVX5DHSV0","revision":1,"status":"applied"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null } - -- Expected -+ Received - - { -- "result": "rejected", -- "stored": null, -+ "result": "applied", -+ "stored": "approved", - } - - ❯ tests/e2e/20-sync-defects.e2e.ts:109:7 - 107| { result: response.body?.results?.[0]?.status, stored: stored[0]… - 108| describeResponse(response), - 109| ).toEqual({ result: 'rejected', stored: null }); - | ^ - 110| }); - 111| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200) -AssertionError: HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 500 - - ❯ tests/e2e/20-sync-defects.e2e.ts:120:57 - 118| body: { cursor: null }, - 119| }); - 120| expect(response.status, describeResponse(response)).toBe(200); - | ^ - 121| const types = new Set( - 122| (response.body.changes as Array<{ entity_type: string }>).map((c… - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично -AssertionError: HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 500 - - ❯ pullAll tests/e2e/20-sync-defects.e2e.ts:51:57 - 49| body: { cursor: next, limit: 100 }, - 50| }); - 51| expect(response.status, describeResponse(response)).toBe(200); - | ^ - 52| changes.push(...(response.body.changes as Array<{ entity_type: str… - 53| next = response.body.next_cursor as string; - ❯ tests/e2e/20-sync-defects.e2e.ts:130:25 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull -AssertionError: expected false to be true // Object.is equality - -- Expected -+ Received - -- true -+ false - - ❯ tests/e2e/20-sync-defects.e2e.ts:151:95 - 149| expect(patch.status, describeResponse(patch)).toBe(200); - 150| const { changes } = await pullAll(device, cursor); - 151| expect(changes.some((c) => c.entity_type === 'employee' && c.entit… - | ^ - 152| true, - 153| ); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-E] отметка уволенного сотрудника через sync отклоняется -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JXD7TMSBAMMAK6HMXK2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality - -Expected: "rejected" -Received: "applied" - - ❯ tests/e2e/20-sync-defects.e2e.ts:171:77 - 169| }), - 170| ]); - 171| expect(response.body?.results?.[0]?.status, describeResponse(respo… - | ^ - 172| }); - 173| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JYH12S10KQ4NWN232FM","status":"accepted"}},{"idempotency_key":"e2e-01M3EA4JYFDXJXPH923SG1E832","command_type":"attendance_event","status":"applied","resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) } - -- Expected -+ Received - - { -- "foreign": "rejected", -- "ownOrgUnit": "01M3EA4JXPPT6RXP11RKV1VY20", -+ "foreign": "applied", -+ "ownOrgUnit": null, - } - - ❯ tests/e2e/20-sync-defects.e2e.ts:202:7 - 200| }, - 201| describeResponse(response), - 202| ).toEqual({ ownOrgUnit: unitA!.id, foreign: 'rejected' }); - | ^ - 203| }); - 204| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500) -AssertionError: HTTP 500 {"statusCode":500,"code":"22007","error":"Internal Server Error","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] } - -- Expected -+ Received - - { -- "http": 200, -- "statuses": [ -- "applied", -- "rejected", -- ], -+ "http": 500, -+ "statuses": [], - } - - ❯ tests/e2e/20-sync-defects.e2e.ts:225:7 - 223| }, - 224| describeResponse(response), - 225| ).toEqual({ http: 200, statuses: ['applied', 'rejected'] }); - | ^ - 226| }); - 227| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403) -AssertionError: HTTP 201 {"device":{"id":"01M3EA4JZKVD04KCMNCGGW1EAH","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-5J7EDPFQV6","name":"E2E-CSRF-терминал-34e01a","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.935Z","created_by":"01M3E…: expected 201 to be 403 // Object.is equality - -- Expected -+ Received - -- 403 -+ 201 - - ❯ tests/e2e/20-sync-defects.e2e.ts:236:57 - 234| body: { device_code: `E2E-${randomUlid().slice(-10)}`, name: syn… - 235| }); - 236| expect(response.status, describeResponse(response)).toBe(403); - | ^ - 237| }); - 238| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401) -AssertionError: HTTP 201 {"device":{"id":"01M3EA4JZWQF4S3SXWCX77J9ST","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-KS5GF18F83","name":"E2E-Анонимный терминал-75d36d","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.940Z","created_by":"…: expected 201 to be 401 // Object.is equality - -- Expected -+ Received - -- 401 -+ 201 - - ❯ tests/e2e/20-sync-defects.e2e.ts:247:57 - 245| }, - 246| }); - 247| expect(response.status, describeResponse(response)).toBe(401); - | ^ - 248| }); - 249| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4K0NB5RS8GACHWC7N2C2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality - -Expected: "rejected" -Received: "applied" - - ❯ tests/e2e/20-sync-defects.e2e.ts:260:77 - 258| }), - 259| ]); - 260| expect(response.body?.results?.[0]?.status, describeResponse(respo… - | ^ - 261| }); - 262| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400) -AssertionError: HTTP 200 {"acknowledged":true,"cursor":"cur_999999999_fd163ccb01a6","acknowledged_at":"2026-09-26T07:33:38.972Z"}: expected 200 to be 400 // Object.is equality - -- Expected -+ Received - -- 400 -+ 200 - - ❯ tests/e2e/20-sync-defects.e2e.ts:275:57 - 273| body: { cursor: `cur_${seq}_${hash}` }, - 274| }); - 275| expect(response.status, describeResponse(response)).toBe(400); - | ^ - 276| }); - 277| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-01] менеджер точки A запускает расчёт для точки B → 403 -AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:94:22 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-02] менеджер точки отправляет пакет на согласование → 403 -AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:105:22 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:118:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-04] бухгалтер пытается подписать пакет → 403 -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:133:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-05] до подписи директора в ledger нет начислений и выплат -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:141:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:148:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:173:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:195:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:213:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена» -AssertionError: C3: HTTP 404 {"message":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 404 - - ❯ tests/e2e/30-owner-decisions.e2e.ts:241:66 - 239| token: ctx().terminalToken, - 240| }); - 241| expect(response.status, `C3: ${describeResponse(response)}`).toBe(… - | ^ - 242| expect(response.body).toMatchObject({ registration_allowed: false,… - 243| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-11] согласие отозвано → статус для терминала меняется -AssertionError: C3 PUT biometric-consent: HTTP 404 {"message":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 404 - - ❯ tests/e2e/30-owner-decisions.e2e.ts:255:86 - 253| api('GET', `/terminal/employees/${employee!.id}/enrollment`, { t… - 254| const granted = await setConsent('granted'); - 255| expect(granted.status, `C3 PUT biometric-consent: ${describeRespon… - | ^ - 256| const before = await enrollment(); - 257| const revoked = await setConsent('revoked'); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/38]⎯ - - FAIL tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение} -AssertionError: переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal [] - -- Expected -+ Received - -- [] -+ [ -+ "STANDALONE_MANAGER_TOKEN", -+ "STANDALONE_TERMINAL_TOKEN", -+ "STANDALONE_TENANT_ID", -+ "STANDALONE_ACTOR_ID", -+ "STANDALONE_TERMINAL_ACTOR_ID", -+ "VAPID_PUBLIC_KEY", -+ "VAPID_PRIVATE_KEY", -+ "VAPID_SUBJECT", -+ "POSTGRES_APP_PASSWORD", -+ "HTTPS_PFX_PASSPHRASE", -+ "POSTGRES_MIGRATION_PASSWORD", -+ "POSTGRES_APP_PASSWORD", -+ "POSTGRES_MIGRATION_PASSWORD", -+ "POSTGRES_MIGRATION_PASSWORD", -+ ] - - ❯ tests/e2e/40-compose-pilot.e2e.ts:34:87 - 32| expect(interpolations.length).toBeGreaterThan(0); - 33| const optional = interpolations.filter((inner) => !/^[A-Z0-9_]+:\?… - 34| expect(optional, 'переменные без :? — пустое значение молча попадё… - | ^ - 35| }); - 36| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/38]⎯ - - FAIL tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-2] ни один сервис не запускается с NODE_ENV=development -AssertionError: expected [ 'app' ] to deeply equal [] - -- Expected -+ Received - -- [] -+ [ -+ "app", -+ ] - - ❯ tests/e2e/40-compose-pilot.e2e.ts:41:23 - 39| (service) => environmentOf(service).NODE_ENV === 'development', - 40| ); - 41| expect(offenders).toEqual([]); - | ^ - 42| }); - 43| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[38/38]⎯ - - - Test Files 4 failed | 1 passed (5) - Tests 38 failed | 9 passed (47) - Start at 14:33:32 - Duration 7.22s (tests 95%, import 3%, transform 2%) - -JSON report written to /workspace/krona-staff/tests/e2e/evidence/e2e-results.json - -[run-e2e] vitest exit=1 -| ID | Цвет | Зелёных/всего | Вердикт | -|---|---|---|---| -| CTRL | GREEN | 2/2 | зелёный | -| F10 | RED | 0/1 | красный (известный дефект) | -| F2 | RED | 0/1 | красный (известный дефект) | -| F3 | RED | 0/1 | красный (известный дефект) | -| F4 | RED | 0/1 | красный (известный дефект) | -| F7 | RED | 0/1 | красный (известный дефект) | -| HARNESS | GREEN | 5/5 | зелёный (позитивный контроль) | -| N1 | RED | 0/1 | красный (известный дефект) | -| N10 | RED | 0/1 | красный (известный дефект) | -| N11 | RED | 0/1 | красный (известный дефект) | -| N12 | RED | 0/1 | красный (известный дефект) | -| N2 | RED | 0/1 | красный (известный дефект) | -| N3 | RED | 0/1 | красный (известный дефект) | -| N4 | RED | 0/1 | красный (известный дефект) | -| N9 | RED | 0/1 | красный (известный дефект) | -| OWN-01 | RED | 0/1 | красный (известный дефект) | -| OWN-02 | RED | 0/1 | красный (известный дефект) | -| OWN-03 | RED | 0/1 | красный (известный дефект) | -| OWN-04 | RED | 0/1 | красный (известный дефект) | -| OWN-05 | RED | 0/1 | красный (известный дефект) | -| OWN-06 | RED | 0/1 | красный (известный дефект) | -| OWN-07 | RED | 0/1 | красный (известный дефект) | -| OWN-08 | RED | 0/1 | красный (известный дефект) | -| OWN-09 | RED | 0/1 | красный (известный дефект) | -| OWN-10 | RED | 0/1 | красный (известный дефект) | -| OWN-11 | RED | 0/1 | красный (известный дефект) | -| PILOT-1 | RED | 0/1 | красный (известный дефект) | -| PILOT-2 | RED | 0/1 | красный (известный дефект) | -| PILOT-3 | GREEN | 1/1 | зелёный | -| SYNC-A | RED | 0/1 | красный (известный дефект) | -| SYNC-B | RED | 0/1 | красный (известный дефект) | -| SYNC-C | RED | 0/1 | красный (известный дефект) | -| SYNC-C0 | RED | 0/1 | красный (известный дефект) | -| SYNC-D | RED | 0/1 | красный (известный дефект) | -| SYNC-E | RED | 0/1 | красный (известный дефект) | -| SYNC-F | RED | 0/1 | красный (известный дефект) | -| SYNC-G | RED | 0/1 | красный (известный дефект) | -| SYNC-H | RED | 0/1 | красный (известный дефект) | -| SYNC-I | RED | 0/1 | красный (известный дефект) | -| SYNC-J | RED | 0/1 | красный (известный дефект) | -| SYNC-K | RED | 0/1 | красный (известный дефект) | -| SYNC-L | GREEN | 1/1 | зелёный | - -[run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты -::: [e2e] OK -=== итог: status=1 -ci-local exit=1 diff --git a/tests/e2e/evidence/e2e-results.json b/tests/e2e/evidence/e2e-results.json deleted file mode 100644 index 096268b..0000000 --- a/tests/e2e/evidence/e2e-results.json +++ /dev/null @@ -1,669 +0,0 @@ -{ - "numTotalTestSuites": 10, - "numPassedTestSuites": 2, - "numFailedTestSuites": 8, - "numPendingTestSuites": 0, - "numTotalTests": 47, - "numPassedTests": 9, - "numFailedTests": 38, - "numPendingTests": 0, - "numTodoTests": 0, - "snapshot": { - "added": 0, - "failure": false, - "filesAdded": 0, - "filesRemoved": 0, - "filesRemovedList": [], - "filesUnmatched": 0, - "filesUpdated": 0, - "matched": 0, - "total": 0, - "unchecked": 0, - "uncheckedKeysByFile": [], - "unmatched": 0, - "updated": 0, - "didUpdate": false - }, - "startTime": 1790408012144, - "success": false, - "testResults": [ - { - "assertionResults": [ - { - "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], - "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] сервер отвечает live/ready (ready проверяет БД)", - "status": "passed", - "title": "[HARNESS] сервер отвечает live/ready (ready проверяет БД)", - "duration": 32.192098, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], - "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER", - "status": "passed", - "title": "[HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER", - "duration": 14.342552000000012, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], - "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] миграции применены мигратором, app-роль не видит schema_migrations", - "status": "passed", - "title": "[HARNESS] миграции применены мигратором, app-роль не видит schema_migrations", - "duration": 14.26604900000001, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], - "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200", - "status": "passed", - "title": "[HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200", - "duration": 13.863121000000007, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], - "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] терминал: отметка сотрудника из импорта принимается (201)", - "status": "passed", - "title": "[HARNESS] терминал: отметка сотрудника из импорта принимается (201)", - "duration": 24.62379200000001, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], - "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя", - "status": "passed", - "title": "[CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя", - "duration": 23.691180000000003, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], - "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [CTRL] уволенный сотрудник теряет доступ (401)", - "status": "passed", - "title": "[CTRL] уволенный сотрудник теряет доступ (401)", - "duration": 23.254977999999994, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - } - ], - "startTime": 1790408019083, - "endTime": 1790408019229.255, - "status": "passed", - "message": "", - "name": "/workspace/krona-staff/tests/e2e/00-harness.e2e.ts" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [N1] менеджер создаёт сотрудника через POST /employees → 201", - "status": "failed", - "title": "[N1] менеджер создаёт сотрудника через POST /employees → 201", - "duration": 38.316193, - "failureMessages": [ - "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42P08\",\"error\":\"Internal Server Error\",\"message\":\"inconsistent types deduced for parameter $2\"}: expected 500 to be 201 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:55:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка", - "status": "failed", - "title": "[N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка", - "duration": 110.697531, - "failureMessages": [ - "AssertionError: подтверждение смены: HTTP 500 {\"statusCode\":500,\"code\":\"23502\",\"error\":\"Internal Server Error\",\"message\":\"null value in column \\\"occurred_at\\\" of relation \\\"staff_outbox\\\" violates not-null constraint\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:73:81\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [N4] пересекающиеся расчёты не начисляют одну смену дважды", - "status": "failed", - "title": "[N4] пересекающиеся расчёты не начисляют одну смену дважды", - "duration": 66.33918700000004, - "failureMessages": [ - "AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {\"statusCode\":500,\"code\":\"23502\",\"error\":\"Internal Server Error\",\"message\":\"null value in column \\\"occurred_at\\\" of relation \\\"staff_outbox\\\" violates not-null constraint\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:104:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1", - "status": "failed", - "title": "[N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1", - "duration": 2544.330582, - "failureMessages": [ - "AssertionError: подписка: HTTP 201 {\"id\":\"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5\",\"endpoint\":\"https://127.0.0.1:36027/e2e-internal-admin\"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:161:9\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику", - "status": "failed", - "title": "[N9] чужой push-endpoint нельзя перепривязать к другому сотруднику", - "duration": 44.48753099999976, - "failureMessages": [ - "AssertionError: HTTP 201 {\"id\":\"01M3EA4J0JSPFRDF22J6E2CEY1\",\"endpoint\":\"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf\"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:191:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400)", - "status": "failed", - "title": "[N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400)", - "duration": 31.35817700000007, - "failureMessages": [ - "AssertionError: HTTP 200 {\"id\":\"01M3EA4J1PHXWHFMAMYYVRMK3E\",\"employee_id\":\"01M3EA4J151B1H9D5AKAR29AN9\",\"org_unit_id\":null,\"pay_rule_id\":\"01M3EA4FCDRQSS6V8H5Q6XS615\",\"pay_rule_code\":\"hourly\",\"pay_rule_name\":\"Почасовая (стажёр, дополнительный сотрудник)\",\"rate_minor\":12345,\"percent_bp\":0,\"guarantee_minor\":0,\"pool_weight_bp\":0… | HTTP 200 {\"id\":\"01M3EA4J1PHXWHFMAMYYVRMK3E\",\"employee_id\":\"01M3EA4J151B1H9D5AKAR29AN9\",\"org_unit_id\":null,\"pay_rule_id\":\"01M3EA4FCDRQSS6V8H5Q6XS615\",\"pay_rule_code\":\"hourly\",\"pay_rule_name\":\"Почасовая (стажёр, дополнительный сотрудник)\",\"rate_minor\":9007199254740991,\"percent_bp\":0,\"guarantee_minor\":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:215:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [N10] терминальный токен не читает справочники профессий и точек (403)", - "status": "failed", - "title": "[N10] терминальный токен не читает справочники профессий и точек (403)", - "duration": 4.364047000000028, - "failureMessages": [ - "AssertionError: expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:224:70\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)", - "status": "failed", - "title": "[F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)", - "duration": 19.630533999999898, - "failureMessages": [ - "AssertionError: expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:237:85\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [F3] cookie сессии не содержит сырой токен и отзывается при выходе", - "status": "failed", - "title": "[F3] cookie сессии не содержит сырой токен и отзывается при выходе", - "duration": 8.088321000000178, - "failureMessages": [ - "AssertionError: expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:255:91\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [F10] мутация по cookie без Origin отклоняется (CSRF, 403)", - "status": "failed", - "title": "[F10] мутация по cookie без Origin отклоняется (CSRF, 403)", - "duration": 5.457843000000139, - "failureMessages": [ - "AssertionError: HTTP 201 {\"id\":\"01M3EA4J31CEM99Y9708PNVE90\",\"code\":\"profession-01m3ea4j31cem99y9708pnve90\",\"name\":\"E2E-CSRF-профессия-c30803\",\"status\":\"active\"}: expected 201 to be 403 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:269:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [F7] повтор Idempotency-Key с другим телом не создаёт второе событие", - "status": "failed", - "title": "[F7] повтор Idempotency-Key с другим телом не создаёт второе событие", - "duration": 31.478251999999884, - "failureMessages": [ - "AssertionError: expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:288:75\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [N11] импорт с неверным kind начисления → 400, а не 500", - "status": "failed", - "title": "[N11] импорт с неверным kind начисления → 400, а не 500", - "duration": 24.907294000000093, - "failureMessages": [ - "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"23514\",\"error\":\"Internal Server Error\",\"message\":\"new row for relation \\\"staff_payroll_ledger\\\" violates check constraint \\\"staff_payroll_ledger_kind_check\\\"\"}: expected 500 to be 400 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:311:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Основной API на реальной PostgreSQL"], - "fullName": "Основной API на реальной PostgreSQL [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)", - "status": "failed", - "title": "[F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)", - "duration": 75.38818200000014, - "failureMessages": [ - "AssertionError: статусы: 401: expected false to be true // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:324:84\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - } - ], - "startTime": 1790408015147, - "endTime": 1790408018151.3882, - "status": "failed", - "message": "", - "name": "/workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)", - "status": "failed", - "title": "[SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)", - "duration": 86.95440500000001, - "failureMessages": [ - "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JPXC3E39GZMHFH33H92\",\"command_type\":\"upsert_work_session\",\"status\":\"applied\",\"result\":{\"id\":\"01M3EA4JPXQPVQDPGEA3YVFPXV\",\"revision\":1,\"status\":\"applied\"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:86:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-B] устройство не может утвердить табель (status=approved отклоняется)", - "status": "failed", - "title": "[SYNC-B] устройство не может утвердить табель (status=approved отклоняется)", - "duration": 32.361658000000006, - "failureMessages": [ - "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JR4CST4PE643FC043K9\",\"command_type\":\"upsert_timesheet_entry\",\"status\":\"applied\",\"result\":{\"id\":\"01M3EA4JR43V65BMVJVX5DHSV0\",\"revision\":1,\"status\":\"applied\"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:109:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200)", - "status": "failed", - "title": "[SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200)", - "duration": 39.13565999999997, - "failureMessages": [ - "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42703\",\"error\":\"Internal Server Error\",\"message\":\"column \\\"status\\\" does not exist\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:120:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично", - "status": "failed", - "title": "[SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично", - "duration": 54.852048000000025, - "failureMessages": [ - "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42703\",\"error\":\"Internal Server Error\",\"message\":\"column \\\"status\\\" does not exist\"}: expected 500 to be 200 // Object.is equality\n at pullAll (/workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:51:57)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:130:25\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull", - "status": "failed", - "title": "[SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull", - "duration": 40.97763200000003, - "failureMessages": [ - "AssertionError: expected false to be true // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:151:95\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-E] отметка уволенного сотрудника через sync отклоняется", - "status": "failed", - "title": "[SYNC-E] отметка уволенного сотрудника через sync отклоняется", - "duration": 23.937388999999996, - "failureMessages": [ - "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4JXD7TMSBAMMAK6HMXK2\",\"status\":\"accepted\"}}]}: expected 'applied' to be 'rejected' // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:171:77\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется", - "status": "failed", - "title": "[SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется", - "duration": 42.41749800000002, - "failureMessages": [ - "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4JYH12S10KQ4NWN232FM\",\"status\":\"accepted\"}},{\"idempotency_key\":\"e2e-01M3EA4JYFDXJXPH923SG1E832\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:202:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)", - "status": "failed", - "title": "[SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)", - "duration": 20.59652299999999, - "failureMessages": [ - "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"22007\",\"error\":\"Internal Server Error\",\"message\":\"invalid input syntax for type timestamp with time zone: \\\"e2e-not-a-timestamp\\\"\"}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:225:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)", - "status": "failed", - "title": "[SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)", - "duration": 9.081312000000025, - "failureMessages": [ - "AssertionError: HTTP 201 {\"device\":{\"id\":\"01M3EA4JZKVD04KCMNCGGW1EAH\",\"tenant_id\":\"01M3EA4DJNEY3HRCYSBSX43XW0\",\"device_code\":\"E2E-5J7EDPFQV6\",\"name\":\"E2E-CSRF-терминал-34e01a\",\"token_hint\":\"kstaff_dev_01M3E\",\"status\":\"active\",\"allowed_scopes\":[\"attendance:sync\"],\"registered_at\":\"2026-09-26T07:33:38.935Z\",\"created_by\":\"01M3E…: expected 201 to be 403 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:236:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)", - "status": "failed", - "title": "[SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)", - "duration": 6.548922000000005, - "failureMessages": [ - "AssertionError: HTTP 201 {\"device\":{\"id\":\"01M3EA4JZWQF4S3SXWCX77J9ST\",\"tenant_id\":\"01M3EA4DJNEY3HRCYSBSX43XW0\",\"device_code\":\"E2E-KS5GF18F83\",\"name\":\"E2E-Анонимный терминал-75d36d\",\"token_hint\":\"kstaff_dev_01M3E\",\"status\":\"active\",\"allowed_scopes\":[\"attendance:sync\"],\"registered_at\":\"2026-09-26T07:33:38.940Z\",\"created_by\":\"…: expected 201 to be 401 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:247:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events", - "status": "failed", - "title": "[SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events", - "duration": 23.565251999999987, - "failureMessages": [ - "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4K0NB5RS8GACHWC7N2C2\",\"status\":\"accepted\"}}]}: expected 'applied' to be 'rejected' // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:260:77\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400)", - "status": "failed", - "title": "[SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400)", - "duration": 6.953785000000039, - "failureMessages": [ - "AssertionError: HTTP 200 {\"acknowledged\":true,\"cursor\":\"cur_999999999_fd163ccb01a6\",\"acknowledged_at\":\"2026-09-26T07:33:38.972Z\"}: expected 200 to be 400 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:275:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], - "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль", - "status": "passed", - "title": "[SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль", - "duration": 8.451247999999964, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - } - ], - "startTime": 1790408018587, - "endTime": 1790408018982.4512, - "status": "failed", - "message": "", - "name": "/workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-01] менеджер точки A запускает расчёт для точки B → 403", - "status": "failed", - "title": "[OWN-01] менеджер точки A запускает расчёт для точки B → 403", - "duration": 109.84663699999999, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:94:22\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-02] менеджер точки отправляет пакет на согласование → 403", - "status": "failed", - "title": "[OWN-02] менеджер точки отправляет пакет на согласование → 403", - "duration": 64.021771, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:105:22\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление", - "status": "failed", - "title": "[OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление", - "duration": 1.5183850000000234, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:118:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-04] бухгалтер пытается подписать пакет → 403", - "status": "failed", - "title": "[OWN-04] бухгалтер пытается подписать пакет → 403", - "duration": 1.8508840000000077, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:133:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-05] до подписи директора в ledger нет начислений и выплат", - "status": "failed", - "title": "[OWN-05] до подписи директора в ledger нет начислений и выплат", - "duration": 1.9114280000000008, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:141:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы", - "status": "failed", - "title": "[OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы", - "duration": 1.5373430000000212, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:148:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру", - "status": "failed", - "title": "[OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру", - "duration": 1.4993349999999737, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:173:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён", - "status": "failed", - "title": "[OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён", - "duration": 2.188139000000035, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:195:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B", - "status": "failed", - "title": "[OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B", - "duration": 2.2691649999999868, - "failureMessages": [ - "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:213:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»", - "status": "failed", - "title": "[OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»", - "duration": 15.068132999999989, - "failureMessages": [ - "AssertionError: C3: HTTP 404 {\"message\":\"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:241:66\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], - "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-11] согласие отозвано → статус для терминала меняется", - "status": "failed", - "title": "[OWN-11] согласие отозвано → статус для терминала меняется", - "duration": 14.774637000000041, - "failureMessages": [ - "AssertionError: C3 PUT biometric-consent: HTTP 404 {\"message\":\"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:255:86\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - } - ], - "startTime": 1790408018262, - "endTime": 1790408018478.7747, - "status": "failed", - "message": "", - "name": "/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["deploy/pilot/compose.yaml"], - "fullName": "deploy/pilot/compose.yaml [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}", - "status": "failed", - "title": "[PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}", - "duration": 5.8893739999999895, - "failureMessages": [ - "AssertionError: переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal []\n at /workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts:34:87\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:1628:35\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:26\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3319:20\n at new Promise ()\n at runWithCancel (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3314:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3299:20\n at new Promise ()\n at runWithTimeout (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3257:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3876:64" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["deploy/pilot/compose.yaml"], - "fullName": "deploy/pilot/compose.yaml [PILOT-2] ни один сервис не запускается с NODE_ENV=development", - "status": "failed", - "title": "[PILOT-2] ни один сервис не запускается с NODE_ENV=development", - "duration": 1.0336859999999888, - "failureMessages": [ - "AssertionError: expected [ 'app' ] to deeply equal []\n at /workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts:41:23\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:1628:35\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:26\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3319:20\n at new Promise ()\n at runWithCancel (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3314:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3299:20\n at new Promise ()\n at runWithTimeout (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3257:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3876:64" - ], - "meta": {}, - "tags": [], - "benchmarks": [] - }, - { - "ancestorTitles": ["deploy/pilot/compose.yaml"], - "fullName": "deploy/pilot/compose.yaml [PILOT-3] у сервиса app нет учётных данных мигратора", - "status": "passed", - "title": "[PILOT-3] у сервиса app нет учётных данных мигратора", - "duration": 0.5442440000000062, - "failureMessages": [], - "meta": {}, - "tags": [], - "benchmarks": [] - } - ], - "startTime": 1790408019346, - "endTime": 1790408019353.5442, - "status": "failed", - "message": "", - "name": "/workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts" - } - ] -} diff --git a/tests/e2e/evidence/e2e-run.txt b/tests/e2e/evidence/e2e-run.txt deleted file mode 100644 index 8742401..0000000 --- a/tests/e2e/evidence/e2e-run.txt +++ /dev/null @@ -1,941 +0,0 @@ -$ npx vitest run --config tests/e2e/vitest.e2e.config.ts --reporter=verbose --reporter=json --outputFile.json=/workspace/krona-staff/tests/e2e/evidence/e2e-results.json - - RUN v5.0.1 /workspace/krona-staff - -[e2e] provision: -provisioned database=krona_staff_e2e server_version=17.11 -role=krona_migrator super=false createrole=false createdb=false bypassrls=false -role=krona_staff_app super=false createrole=false createdb=false bypassrls=false -[e2e] migrations (roundtrip) as krona_migrator: -== migrate up (1) -applied 0001_infrastructure.up.sql -applied 0002_security_hardening.up.sql -applied 0003_app_role_privileges.up.sql -applied 0004_revoke_broad_default_privileges.up.sql -applied 0005_attendance_portal.up.sql -applied 0006_payroll_foundation.up.sql -applied 0007_work_session_trace.up.sql -applied 0008_employee_access.up.sql -applied 0009_professions.up.sql -applied 0010_employee_push_notifications.up.sql -applied 0011_offline_sync_backend.up.sql -== rollback all (applied now: 11) -rolled back 0011_offline_sync_backend.down.sql -rolled back 0010_employee_push_notifications.down.sql -rolled back 0009_professions.down.sql -rolled back 0008_employee_access.down.sql -rolled back 0007_work_session_trace.down.sql -rolled back 0006_payroll_foundation.down.sql -rolled back 0005_attendance_portal.down.sql -rolled back 0004_revoke_broad_default_privileges.down.sql -rolled back 0003_app_role_privileges.down.sql -rolled back 0002_security_hardening.down.sql -rolled back 0001_infrastructure.down.sql -no migration to roll back -== rolled back 11 migrations -== migrate up (2) -applied 0001_infrastructure.up.sql -applied 0002_security_hardening.up.sql -applied 0003_app_role_privileges.up.sql -applied 0004_revoke_broad_default_privileges.up.sql -applied 0005_attendance_portal.up.sql -applied 0006_payroll_foundation.up.sql -applied 0007_work_session_trace.up.sql -applied 0008_employee_access.up.sql -applied 0009_professions.up.sql -applied 0010_employee_push_notifications.up.sql -applied 0011_offline_sync_backend.up.sql -== migrate up (3, must be no-op) -== roundtrip OK: rolledBack=11 reapplied=11 -[e2e] server secured ready at http://127.0.0.1:35389 (log: tests/e2e/evidence/server-secured.txt) -[e2e] server no-tokens ready at http://127.0.0.1:33821 (log: tests/e2e/evidence/server-no-tokens.txt) -[e2e] server rate-limit ready at http://127.0.0.1:36299 (log: tests/e2e/evidence/server-rate-limit.txt) - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N1] менеджер создаёт сотрудника через POST /employees → 201 38ms - → HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка 111ms - → подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N4] пересекающиеся расчёты не начисляют одну смену дважды 66ms - → подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1 2544ms - → подписка: HTTP 201 {"id":"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5","endpoint":"https://127.0.0.1:36027/e2e-internal-admin"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику 44ms - → HTTP 201 {"id":"01M3EA4J0JSPFRDF22J6E2CEY1","endpoint":"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400) 31ms - → HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":12345,"percent_bp":0,"guarantee_minor":0,"pool_weight_bp":0… | HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":9007199254740991,"percent_bp":0,"guarantee_minor":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N10] терминальный токен не читает справочники профессий и точек (403) 4ms - → expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401) 20ms - → expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F3] cookie сессии не содержит сырой токен и отзывается при выходе 8ms - → expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F10] мутация по cookie без Origin отклоняется (CSRF, 403) 5ms - → HTTP 201 {"id":"01M3EA4J31CEM99Y9708PNVE90","code":"profession-01m3ea4j31cem99y9708pnve90","name":"E2E-CSRF-профессия-c30803","status":"active"}: expected 201 to be 403 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F7] повтор Idempotency-Key с другим телом не создаёт второе событие 31ms - → expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false } - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N11] импорт с неверным kind начисления → 400, а не 500 25ms - → HTTP 500 {"statusCode":500,"code":"23514","error":"Internal Server Error","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""}: expected 500 to be 400 // Object.is equality - × tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток) 75ms - → статусы: 401: expected false to be true // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-01] менеджер точки A запускает расчёт для точки B → 403 110ms - → C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-02] менеджер точки отправляет пакет на согласование → 403 64ms - → C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-04] бухгалтер пытается подписать пакет → 403 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-05] до подписи директора в ledger нет начислений и выплат 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру 1ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B 2ms - → C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена» 15ms - → C3: HTTP 404 {"message":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality - × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-11] согласие отозвано → статус для терминала меняется 15ms - → C3 PUT biometric-consent: HTTP 404 {"message":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется) 87ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JPXC3E39GZMHFH33H92","command_type":"upsert_work_session","status":"applied","result":{"id":"01M3EA4JPXQPVQDPGEA3YVFPXV","revision":1,"status":"applied"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) } - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-B] устройство не может утвердить табель (status=approved отклоняется) 32ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JR4CST4PE643FC043K9","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"01M3EA4JR43V65BMVJVX5DHSV0","revision":1,"status":"applied"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null } - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200) 39ms - → HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично 55ms - → HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull 41ms - → expected false to be true // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-E] отметка уволенного сотрудника через sync отклоняется 24ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JXD7TMSBAMMAK6HMXK2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется 42ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JYH12S10KQ4NWN232FM","status":"accepted"}},{"idempotency_key":"e2e-01M3EA4JYFDXJXPH923SG1E832","command_type":"attendance_event","status":"applied","resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) } - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500) 21ms - → HTTP 500 {"statusCode":500,"code":"22007","error":"Internal Server Error","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] } - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403) 9ms - → HTTP 201 {"device":{"id":"01M3EA4JZKVD04KCMNCGGW1EAH","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-5J7EDPFQV6","name":"E2E-CSRF-терминал-34e01a","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.935Z","created_by":"01M3E…: expected 201 to be 403 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401) 7ms - → HTTP 201 {"device":{"id":"01M3EA4JZWQF4S3SXWCX77J9ST","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-KS5GF18F83","name":"E2E-Анонимный терминал-75d36d","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.940Z","created_by":"…: expected 201 to be 401 // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events 24ms - → HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4K0NB5RS8GACHWC7N2C2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality - × tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400) 7ms - → HTTP 200 {"acknowledged":true,"cursor":"cur_999999999_fd163ccb01a6","acknowledged_at":"2026-09-26T07:33:38.972Z"}: expected 200 to be 400 // Object.is equality - ✓ tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль 8ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] сервер отвечает live/ready (ready проверяет БД) 32ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER 14ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] миграции применены мигратором, app-роль не видит schema_migrations 14ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200 14ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [HARNESS] терминал: отметка сотрудника из импорта принимается (201) 25ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя 24ms - ✓ tests/e2e/00-harness.e2e.ts > HARNESS: реальный сервер + PostgreSQL 17 > [CTRL] уволенный сотрудник теряет доступ (401) 23ms - × tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение} 6ms - → переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal [] - × tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-2] ни один сервис не запускается с NODE_ENV=development 1ms - → expected [ 'app' ] to deeply equal [] - ✓ tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-3] у сервиса app нет учётных данных мигратора 1ms - -⎯⎯⎯⎯⎯⎯ Failed Tests 38 ⎯⎯⎯⎯⎯⎯⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N1] менеджер создаёт сотрудника через POST /employees → 201 -AssertionError: HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 500 - - ❯ tests/e2e/10-core-defects.e2e.ts:55:57 - 53| }, - 54| }); - 55| expect(response.status, describeResponse(response)).toBe(201); - | ^ - 56| const rows = await dbQuery('SELECT id FROM staff_employees WHERE p… - 57| number, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка -AssertionError: подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 500 - - ❯ tests/e2e/10-core-defects.e2e.ts:73:81 - 71| body: { status: 'confirmed' }, - 72| }); - 73| expect(confirm.status, `подтверждение смены: ${describeResponse(co… - | ^ - 74| - 75| const calculate = await api('POST', '/payroll/calculate', { - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N4] пересекающиеся расчёты не начисляют одну смену дважды -AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"}: expected 500 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 500 - - ❯ tests/e2e/10-core-defects.e2e.ts:104:7 - 102| confirm.status, - 103| `подтверждение смены (предусловие, см. N2): ${describeResponse(c… - 104| ).toBe(200); - | ^ - 105| - 106| const month = monthOf(day); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1 -AssertionError: подписка: HTTP 201 {"id":"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5","endpoint":"https://127.0.0.1:36027/e2e-internal-admin"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) } - -- Expected -+ Received - - { -- "connections": 0, -- "status": toSatisfy<[Function anonymous]>, -+ "connections": 1, -+ "status": 201, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:161:9 - 159| { status: subscribe.status, connections }, - 160| `подписка: ${describeResponse(subscribe)}`, - 161| ).toEqual({ - | ^ - 162| status: expect.toSatisfy((s: number) => s === 400 || s === 422… - 163| connections: 0, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику -AssertionError: HTTP 201 {"id":"01M3EA4J0JSPFRDF22J6E2CEY1","endpoint":"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) } - -- Expected -+ Received - - { - "owner": [ -- "01M3EA4HZSY982GYTPDAVP0Z0Q", -+ "01M3EA4HZTSZ12MKP3SV134FKS", - ], -- "status": toSatisfy<[Function anonymous]>, -+ "status": 201, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:191:7 - 189| { status: second.status, owner: owner.map((row) => row.employee_… - 190| describeResponse(second), - 191| ).toEqual({ - | ^ - 192| status: expect.toSatisfy((s: number) => s === 409 || s === 403), - 193| owner: [employeeA!.id], - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400) -AssertionError: HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":12345,"percent_bp":0,"guarantee_minor":0,"pool_weight_bp":0… | HTTP 200 {"id":"01M3EA4J1PHXWHFMAMYYVRMK3E","employee_id":"01M3EA4J151B1H9D5AKAR29AN9","org_unit_id":null,"pay_rule_id":"01M3EA4FCDRQSS6V8H5Q6XS615","pay_rule_code":"hourly","pay_rule_name":"Почасовая (стажёр, дополнительный сотрудник)","rate_minor":9007199254740991,"percent_bp":0,"guarantee_minor":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 } - -- Expected -+ Received - - { -- "extra": 400, -- "huge": 400, -+ "extra": 200, -+ "huge": 200, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:215:7 - 213| { extra: extra.status, huge: huge.status }, - 214| `${describeResponse(extra)} | ${describeResponse(huge)}`, - 215| ).toEqual({ - | ^ - 216| extra: 400, - 217| huge: 400, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N10] терминальный токен не читает справочники профессий и точек (403) -AssertionError: expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 } - -- Expected -+ Received - - { -- "professions": 403, -- "units": 403, -+ "professions": 200, -+ "units": 200, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:224:70 - 222| const professions = await api('GET', '/professions', { token: ctx(… - 223| const units = await api('GET', '/org-units', { token: ctx().termin… - 224| expect({ professions: professions.status, units: units.status }).t… - | ^ - 225| professions: 403, - 226| units: 403, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401) -AssertionError: expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) } - -- Expected -+ Received - - { -- "payroll": 401, -- "portal": 401, -- "write": 401, -+ "payroll": 200, -+ "portal": 200, -+ "write": 201, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:237:85 - 235| body: { name: synthetic('Профессия') }, - 236| }); - 237| expect({ portal: portal.status, payroll: payroll.status, write: wr… - | ^ - 238| portal: 401, - 239| payroll: 401, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F3] cookie сессии не содержит сырой токен и отзывается при выходе -AssertionError: expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) } - -- Expected -+ Received - - { -- "afterLogout": 401, -- "rawTokenInCookie": false, -+ "afterLogout": 200, -+ "rawTokenInCookie": true, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:255:91 - 253| expect(logout.status).toBe(204); - 254| const reuse = await api('GET', '/portal', { headers: { cookie } }); - 255| expect({ rawTokenInCookie: value === ctx().managerToken, afterLogo… - | ^ - 256| rawTokenInCookie: false, - 257| afterLogout: 401, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F10] мутация по cookie без Origin отклоняется (CSRF, 403) -AssertionError: HTTP 201 {"id":"01M3EA4J31CEM99Y9708PNVE90","code":"profession-01m3ea4j31cem99y9708pnve90","name":"E2E-CSRF-профессия-c30803","status":"active"}: expected 201 to be 403 // Object.is equality - -- Expected -+ Received - -- 403 -+ 201 - - ❯ tests/e2e/10-core-defects.e2e.ts:269:57 - 267| body: { name: synthetic('CSRF-профессия') }, - 268| }); - 269| expect(response.status, describeResponse(response)).toBe(403); - | ^ - 270| }); - 271| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F7] повтор Idempotency-Key с другим телом не создаёт второе событие -AssertionError: expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false } - -- Expected -+ Received - - { - "first": 201, -- "secondCreated": false, -+ "secondCreated": true, - } - - ❯ tests/e2e/10-core-defects.e2e.ts:288:75 - 286| const first = await send(`e2e-${randomUlid()}`); - 287| const second = await send(`e2e-${randomUlid()}`); - 288| expect({ first: first.status, secondCreated: second.status === 201… - | ^ - 289| first: 201, - 290| secondCreated: false, - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [N11] импорт с неверным kind начисления → 400, а не 500 -AssertionError: HTTP 500 {"statusCode":500,"code":"23514","error":"Internal Server Error","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""}: expected 500 to be 400 // Object.is equality - -- Expected -+ Received - -- 400 -+ 500 - - ❯ tests/e2e/10-core-defects.e2e.ts:311:57 - 309| }, - 310| }); - 311| expect(response.status, describeResponse(response)).toBe(400); - | ^ - 312| }); - 313| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/38]⎯ - - FAIL tests/e2e/10-core-defects.e2e.ts > Основной API на реальной PostgreSQL > [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток) -AssertionError: статусы: 401: expected false to be true // Object.is equality - -- Expected -+ Received - -- true -+ false - - ❯ tests/e2e/10-core-defects.e2e.ts:324:84 - 322| if (response.status === 429) break; - 323| } - 324| expect(statuses.includes(429), `статусы: ${[...new Set(statuses)].… - | ^ - 325| }); - 326| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется) -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JPXC3E39GZMHFH33H92","command_type":"upsert_work_session","status":"applied","result":{"id":"01M3EA4JPXQPVQDPGEA3YVFPXV","revision":1,"status":"applied"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) } - -- Expected -+ Received - - { - "http": 200, -- "result": "rejected", -- "stored": null, -+ "result": "applied", -+ "stored": "confirmed", - } - - ❯ tests/e2e/20-sync-defects.e2e.ts:86:7 - 84| }, - 85| describeResponse(response), - 86| ).toEqual({ http: 200, result: 'rejected', stored: null }); - | ^ - 87| }); - 88| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-B] устройство не может утвердить табель (status=approved отклоняется) -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JR4CST4PE643FC043K9","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"01M3EA4JR43V65BMVJVX5DHSV0","revision":1,"status":"applied"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null } - -- Expected -+ Received - - { -- "result": "rejected", -- "stored": null, -+ "result": "applied", -+ "stored": "approved", - } - - ❯ tests/e2e/20-sync-defects.e2e.ts:109:7 - 107| { result: response.body?.results?.[0]?.status, stored: stored[0]… - 108| describeResponse(response), - 109| ).toEqual({ result: 'rejected', stored: null }); - | ^ - 110| }); - 111| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200) -AssertionError: HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 500 - - ❯ tests/e2e/20-sync-defects.e2e.ts:120:57 - 118| body: { cursor: null }, - 119| }); - 120| expect(response.status, describeResponse(response)).toBe(200); - | ^ - 121| const types = new Set( - 122| (response.body.changes as Array<{ entity_type: string }>).map((c… - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично -AssertionError: HTTP 500 {"statusCode":500,"code":"42703","error":"Internal Server Error","message":"column \"status\" does not exist"}: expected 500 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 500 - - ❯ pullAll tests/e2e/20-sync-defects.e2e.ts:51:57 - 49| body: { cursor: next, limit: 100 }, - 50| }); - 51| expect(response.status, describeResponse(response)).toBe(200); - | ^ - 52| changes.push(...(response.body.changes as Array<{ entity_type: str… - 53| next = response.body.next_cursor as string; - ❯ tests/e2e/20-sync-defects.e2e.ts:130:25 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull -AssertionError: expected false to be true // Object.is equality - -- Expected -+ Received - -- true -+ false - - ❯ tests/e2e/20-sync-defects.e2e.ts:151:95 - 149| expect(patch.status, describeResponse(patch)).toBe(200); - 150| const { changes } = await pullAll(device, cursor); - 151| expect(changes.some((c) => c.entity_type === 'employee' && c.entit… - | ^ - 152| true, - 153| ); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-E] отметка уволенного сотрудника через sync отклоняется -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JXD7TMSBAMMAK6HMXK2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality - -Expected: "rejected" -Received: "applied" - - ❯ tests/e2e/20-sync-defects.e2e.ts:171:77 - 169| }), - 170| ]); - 171| expect(response.body?.results?.[0]?.status, describeResponse(respo… - | ^ - 172| }); - 173| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4JYH12S10KQ4NWN232FM","status":"accepted"}},{"idempotency_key":"e2e-01M3EA4JYFDXJXPH923SG1E832","command_type":"attendance_event","status":"applied","resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) } - -- Expected -+ Received - - { -- "foreign": "rejected", -- "ownOrgUnit": "01M3EA4JXPPT6RXP11RKV1VY20", -+ "foreign": "applied", -+ "ownOrgUnit": null, - } - - ❯ tests/e2e/20-sync-defects.e2e.ts:202:7 - 200| }, - 201| describeResponse(response), - 202| ).toEqual({ ownOrgUnit: unitA!.id, foreign: 'rejected' }); - | ^ - 203| }); - 204| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500) -AssertionError: HTTP 500 {"statusCode":500,"code":"22007","error":"Internal Server Error","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] } - -- Expected -+ Received - - { -- "http": 200, -- "statuses": [ -- "applied", -- "rejected", -- ], -+ "http": 500, -+ "statuses": [], - } - - ❯ tests/e2e/20-sync-defects.e2e.ts:225:7 - 223| }, - 224| describeResponse(response), - 225| ).toEqual({ http: 200, statuses: ['applied', 'rejected'] }); - | ^ - 226| }); - 227| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403) -AssertionError: HTTP 201 {"device":{"id":"01M3EA4JZKVD04KCMNCGGW1EAH","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-5J7EDPFQV6","name":"E2E-CSRF-терминал-34e01a","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.935Z","created_by":"01M3E…: expected 201 to be 403 // Object.is equality - -- Expected -+ Received - -- 403 -+ 201 - - ❯ tests/e2e/20-sync-defects.e2e.ts:236:57 - 234| body: { device_code: `E2E-${randomUlid().slice(-10)}`, name: syn… - 235| }); - 236| expect(response.status, describeResponse(response)).toBe(403); - | ^ - 237| }); - 238| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401) -AssertionError: HTTP 201 {"device":{"id":"01M3EA4JZWQF4S3SXWCX77J9ST","tenant_id":"01M3EA4DJNEY3HRCYSBSX43XW0","device_code":"E2E-KS5GF18F83","name":"E2E-Анонимный терминал-75d36d","token_hint":"kstaff_dev_01M3E","status":"active","allowed_scopes":["attendance:sync"],"registered_at":"2026-09-26T07:33:38.940Z","created_by":"…: expected 201 to be 401 // Object.is equality - -- Expected -+ Received - -- 401 -+ 201 - - ❯ tests/e2e/20-sync-defects.e2e.ts:247:57 - 245| }, - 246| }); - 247| expect(response.status, describeResponse(response)).toBe(401); - | ^ - 248| }); - 249| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events -AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K","command_type":"attendance_event","status":"applied","result":{"event_id":"01M3EA4K0NB5RS8GACHWC7N2C2","status":"accepted"}}]}: expected 'applied' to be 'rejected' // Object.is equality - -Expected: "rejected" -Received: "applied" - - ❯ tests/e2e/20-sync-defects.e2e.ts:260:77 - 258| }), - 259| ]); - 260| expect(response.body?.results?.[0]?.status, describeResponse(respo… - | ^ - 261| }); - 262| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/38]⎯ - - FAIL tests/e2e/20-sync-defects.e2e.ts > Офлайн-синхронизация на реальной PostgreSQL > [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400) -AssertionError: HTTP 200 {"acknowledged":true,"cursor":"cur_999999999_fd163ccb01a6","acknowledged_at":"2026-09-26T07:33:38.972Z"}: expected 200 to be 400 // Object.is equality - -- Expected -+ Received - -- 400 -+ 200 - - ❯ tests/e2e/20-sync-defects.e2e.ts:275:57 - 273| body: { cursor: `cur_${seq}_${hash}` }, - 274| }); - 275| expect(response.status, describeResponse(response)).toBe(400); - | ^ - 276| }); - 277| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-01] менеджер точки A запускает расчёт для точки B → 403 -AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:94:22 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-02] менеджер точки отправляет пакет на согласование → 403 -AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:105:22 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:118:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-04] бухгалтер пытается подписать пакет → 403 -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:133:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-05] до подписи директора в ledger нет начислений и выплат -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:141:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:148:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:173:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:195:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B -AssertionError: C1 POST /access-grants (accountant): HTTP 404 {"message":"Route POST:/api/v1/staff/access-grants not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is equality - -- Expected -+ Received - -- 201 -+ 404 - - ❯ grant tests/e2e/30-owner-decisions.e2e.ts:28:94 - 26| body: { role, org_unit_ids: orgUnitIds, display_name: synthetic(ro… - 27| }); - 28| expect(response.status, `C1 POST /access-grants (${role}): ${describ… - | ^ - 29| 201, - 30| ); - ❯ tests/e2e/30-owner-decisions.e2e.ts:213:24 - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена» -AssertionError: C3: HTTP 404 {"message":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 404 - - ❯ tests/e2e/30-owner-decisions.e2e.ts:241:66 - 239| token: ctx().terminalToken, - 240| }); - 241| expect(response.status, `C3: ${describeResponse(response)}`).toBe(… - | ^ - 242| expect(response.body).toMatchObject({ registration_allowed: false,… - 243| }); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/38]⎯ - - FAIL tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [OWN-11] согласие отозвано → статус для терминала меняется -AssertionError: C3 PUT biometric-consent: HTTP 404 {"message":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found","error":"Not Found","statusCode":404}: expected 404 to be 200 // Object.is equality - -- Expected -+ Received - -- 200 -+ 404 - - ❯ tests/e2e/30-owner-decisions.e2e.ts:255:86 - 253| api('GET', `/terminal/employees/${employee!.id}/enrollment`, { t… - 254| const granted = await setConsent('granted'); - 255| expect(granted.status, `C3 PUT biometric-consent: ${describeRespon… - | ^ - 256| const before = await enrollment(); - 257| const revoked = await setConsent('revoked'); - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/38]⎯ - - FAIL tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение} -AssertionError: переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal [] - -- Expected -+ Received - -- [] -+ [ -+ "STANDALONE_MANAGER_TOKEN", -+ "STANDALONE_TERMINAL_TOKEN", -+ "STANDALONE_TENANT_ID", -+ "STANDALONE_ACTOR_ID", -+ "STANDALONE_TERMINAL_ACTOR_ID", -+ "VAPID_PUBLIC_KEY", -+ "VAPID_PRIVATE_KEY", -+ "VAPID_SUBJECT", -+ "POSTGRES_APP_PASSWORD", -+ "HTTPS_PFX_PASSPHRASE", -+ "POSTGRES_MIGRATION_PASSWORD", -+ "POSTGRES_APP_PASSWORD", -+ "POSTGRES_MIGRATION_PASSWORD", -+ "POSTGRES_MIGRATION_PASSWORD", -+ ] - - ❯ tests/e2e/40-compose-pilot.e2e.ts:34:87 - 32| expect(interpolations.length).toBeGreaterThan(0); - 33| const optional = interpolations.filter((inner) => !/^[A-Z0-9_]+:\?… - 34| expect(optional, 'переменные без :? — пустое значение молча попадё… - | ^ - 35| }); - 36| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/38]⎯ - - FAIL tests/e2e/40-compose-pilot.e2e.ts > deploy/pilot/compose.yaml > [PILOT-2] ни один сервис не запускается с NODE_ENV=development -AssertionError: expected [ 'app' ] to deeply equal [] - -- Expected -+ Received - -- [] -+ [ -+ "app", -+ ] - - ❯ tests/e2e/40-compose-pilot.e2e.ts:41:23 - 39| (service) => environmentOf(service).NODE_ENV === 'development', - 40| ); - 41| expect(offenders).toEqual([]); - | ^ - 42| }); - 43| - -⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[38/38]⎯ - - - Test Files 4 failed | 1 passed (5) - Tests 38 failed | 9 passed (47) - Start at 14:33:32 - Duration 7.22s (tests 95%, import 3%, transform 2%) - -JSON report written to /workspace/krona-staff/tests/e2e/evidence/e2e-results.json diff --git a/tests/e2e/evidence/e2e-table.md b/tests/e2e/evidence/e2e-table.md deleted file mode 100644 index bbfceb0..0000000 --- a/tests/e2e/evidence/e2e-table.md +++ /dev/null @@ -1,44 +0,0 @@ -| ID | Цвет | Зелёных/всего | Вердикт | -| ------- | ----- | ------------- | ----------------------------- | -| CTRL | GREEN | 2/2 | зелёный | -| F10 | RED | 0/1 | красный (известный дефект) | -| F2 | RED | 0/1 | красный (известный дефект) | -| F3 | RED | 0/1 | красный (известный дефект) | -| F4 | RED | 0/1 | красный (известный дефект) | -| F7 | RED | 0/1 | красный (известный дефект) | -| HARNESS | GREEN | 5/5 | зелёный (позитивный контроль) | -| N1 | RED | 0/1 | красный (известный дефект) | -| N10 | RED | 0/1 | красный (известный дефект) | -| N11 | RED | 0/1 | красный (известный дефект) | -| N12 | RED | 0/1 | красный (известный дефект) | -| N2 | RED | 0/1 | красный (известный дефект) | -| N3 | RED | 0/1 | красный (известный дефект) | -| N4 | RED | 0/1 | красный (известный дефект) | -| N9 | RED | 0/1 | красный (известный дефект) | -| OWN-01 | RED | 0/1 | красный (известный дефект) | -| OWN-02 | RED | 0/1 | красный (известный дефект) | -| OWN-03 | RED | 0/1 | красный (известный дефект) | -| OWN-04 | RED | 0/1 | красный (известный дефект) | -| OWN-05 | RED | 0/1 | красный (известный дефект) | -| OWN-06 | RED | 0/1 | красный (известный дефект) | -| OWN-07 | RED | 0/1 | красный (известный дефект) | -| OWN-08 | RED | 0/1 | красный (известный дефект) | -| OWN-09 | RED | 0/1 | красный (известный дефект) | -| OWN-10 | RED | 0/1 | красный (известный дефект) | -| OWN-11 | RED | 0/1 | красный (известный дефект) | -| PILOT-1 | RED | 0/1 | красный (известный дефект) | -| PILOT-2 | RED | 0/1 | красный (известный дефект) | -| PILOT-3 | GREEN | 1/1 | зелёный | -| SYNC-A | RED | 0/1 | красный (известный дефект) | -| SYNC-B | RED | 0/1 | красный (известный дефект) | -| SYNC-C | RED | 0/1 | красный (известный дефект) | -| SYNC-C0 | RED | 0/1 | красный (известный дефект) | -| SYNC-D | RED | 0/1 | красный (известный дефект) | -| SYNC-E | RED | 0/1 | красный (известный дефект) | -| SYNC-F | RED | 0/1 | красный (известный дефект) | -| SYNC-G | RED | 0/1 | красный (известный дефект) | -| SYNC-H | RED | 0/1 | красный (известный дефект) | -| SYNC-I | RED | 0/1 | красный (известный дефект) | -| SYNC-J | RED | 0/1 | красный (известный дефект) | -| SYNC-K | RED | 0/1 | красный (известный дефект) | -| SYNC-L | GREEN | 1/1 | зелёный | diff --git a/tests/e2e/evidence/server-n13-as-is.txt b/tests/e2e/evidence/server-n13-as-is.txt deleted file mode 100644 index fee55ab..0000000 --- a/tests/e2e/evidence/server-n13-as-is.txt +++ /dev/null @@ -1,425 +0,0 @@ -{"level":50,"time":1790407963311,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMRD8CMNHSB5ASJMFBS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963325,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMWG288RAXX5MB0GAME","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963331,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMSF3VNWBQZ79WKKNNG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963338,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMXA0R6KVNMAZ62PAP6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963345,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WN61YD42TVX52CPV29Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963352,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WN0ZPN48QJQF30N7F84","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963359,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMZEPFZW4MD43ACVP7A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963367,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WN2AXFW9XX343GSAYSW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963374,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WN4MZ157N86APJGC2W5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963381,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WMV8PP6Y9KPJTRXMV3B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963412,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR5S56NK6Z7EHTXF0AX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963420,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR9TTXP41YVMF089FDK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963426,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR6BTDQAYWCVJ544482","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963432,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR93N9FS6NJY47Z5K8T","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963441,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR6VE5SZ9XVT27NETH8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963446,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR7ZW2HA8GW7X04F070","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963452,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR7H2A888DND2A80V6D","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963458,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR8E3C5SSTS1EZ28S0S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963464,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR8NK7NJQFVBXZT7NR3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963470,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WR5QXAPDRTA7CT5WMDG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963500,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTW3GAAN5JX70CNESXB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963506,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WV0FZFTXVMET1EBJZRY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963513,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTXJJZPWPTVB1R6CCMT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963520,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WV0PNJ2MF2VVDHCGW3C","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963532,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTZJPMY0BR5888AQP04","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963537,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTZWYG3FW751JS6A98B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963543,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTY0WE4H6HATS4ZXQS7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963549,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTXTTXH6FDW0K9FHXNN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963554,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTY6460861YTBDC8JEJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963562,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WTWVZVQK74PWS4YEYSA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963592,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXTQ1MQGD6ZGT6Z6NEN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963600,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXWTA8NVDQMKDZNC4JB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963606,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXV4877JVGAKE8QEMH9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963613,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXVEJG0SDHWEA8JRHQQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963620,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXYC8F53J2JYPW9GYEN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963625,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXY5QK5STGXYV8A5N72","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963632,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXWEXYB2JJRB97TS6V6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963638,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXX4RZG8AT10ZR3949K","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963643,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXXW5QCG2EN36ZABAWF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963649,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2WXW5386STRFC2ZSVTFB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963674,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0DR50W08E0TW1CJDP3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963680,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0ETN4VJ6E5S1XMJSRM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963686,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0F7CNQDM7KCBYWW10Q","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963691,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0FT5MZ86G8XCBYGVT0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963696,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0ES5PFCH22EDNXSRVA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963701,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0G5JEFCJWAZ1672ZB2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963708,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0F93X9X184JZ0DTAPM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963715,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0HG5RBXRHGAWM9YEKE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963721,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0HYAKNA5F7N1TM31GR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963726,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X0G79BPG9S4WS477MEE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963789,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2XBGTKEMYHTVFRFT1Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963797,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X306DVB68DF24PN3AXY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963803,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2YKSQR2EQPRAY1185F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963809,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2X8HCENQG9T653YZ7H","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963815,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X34BVPQDV95ZRJTEG8C","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963821,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2ZY9M3A1EG0PM5M1YM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963828,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2YARTZ4F6WVQKG8JTT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963834,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X33NXYG4RXTQVYM7B7M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963841,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X3074X883NVBKAEPBH7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963847,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X2ZBS9GGH585FQHC600","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963855,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X35PRRSCHX485RYE00R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963861,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X36TW0RQ6GCT38D0RGA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963869,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X30RSHEHPT6TKT4RA0A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963876,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X35GSGZSGZ2QB53EZE9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963882,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X37GYFQ44242WDJ925M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963888,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X47XAAP290ZPSD1B2MY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963893,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X310PWZXZM12NDZJ05X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963899,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X46M8YRPTZGA8W30TAK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963907,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X48EW7RG3Q5P1PFGCDV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963913,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X38E3GA8N20AABDZVD5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963919,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X3EQT9RSV7QYR4ZRWGF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963925,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X3F3M3N6VJN4XGE3Y8A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963932,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X49R4AWV6GZFZB9SDAJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963938,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X32DFS3V6T25XBS1JCH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963945,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X37AMJ23S5QXZTS3WPN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963978,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9TE8DMMHGT71KQTWVE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963984,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Y9EJQTH6B7482Q943","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963990,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9WGREC82MJZ9MP87X2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407963996,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9X6KVXK4P7QGAHGZ3B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964001,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9W1QH7Q0HHNHE596PK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964007,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9YRT3B6CJVGC8XBH8A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964014,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Z5G7KWKJWKYFRYGW3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964025,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9X87S66PMVGPNT11B1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964031,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0VEPEMTCAQXWAY20C","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964037,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0S7Z7GSVN27FK0RRF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964043,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0QVVZFPZNRMESZDMW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964050,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9VDX2TF8XD2B0RV2JZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964057,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9VB432D0EN7PY9F1KB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964062,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0ZD9KQHRZJ57YYG09","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964068,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0ZNA8N42MS6Q8VAM0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964074,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA014GN6FM8F9EVNHFC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964079,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA08CJPQ4PF92ZZE8ZC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964085,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Z4KDSDAW5VTJ5493V","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964091,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA0PJEE6F4YVYAHKQVP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964097,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Z1XN8TG716AZE7EWJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964102,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA124E0FG1PFD1K6YVY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964107,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA1VKFBCRDYMP91AZF3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964112,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2X9Z3M0CW5407VQTF7ED","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964117,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA1EMVC43JRJ8BPK3Q1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964124,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XA1K9ZY3FB1Q2618QY4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964156,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFCB9SC9W9T63A1ZQ5B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964164,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFE2FA7V3NSD66BX231","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964170,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFFMWQ79R656KA6K3E1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964175,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFD1F3VSSC4Z4WN0N6Z","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964181,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFF61E76M61MEJ1VP02","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964187,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFERN16DRFNQGE1G33S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964193,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFG8VZSY2YJZZC6DSSY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964198,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFD0XTA0YHQQCY5C49A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964205,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFHVPRN3C754PSQJQZ7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964210,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFH5057G981ES6EPYCZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964216,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJR26DNEYQ8ZGCNQCF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964222,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJQQ05FYYQT4XNDFVZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964228,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFFJ6PKRNTQ0DWNB3RX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964233,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJ6RZPSD7RAAVK9SZ4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964239,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJ5PHMG859R0C9SB1F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964244,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFGBZADJY58BPVKXE29","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964249,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFHNM49XG13DKEKW0NH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964255,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFK75NJ8KA408MT2D56","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964265,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJTAZWFKVJG5B71M63","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964271,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFKDC5FQ3M1GQVNFNDR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964276,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFHJ4CK5H9DW9P1XGXA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964281,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFKYCE0GHBHP5ZCMYPT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964287,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFHW9D8GKFZ9Y3J4S8V","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964292,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFJRVBQT6YZA8NA146A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964297,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XFKX8CPRJ5VA8C185RT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964328,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMRN73PCR6ATE3H1PVC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964335,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMTCCQBRNQ0T67Y6HGX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964341,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMVMVYAT2SJNK43ECSF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964348,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMV3JJWYSX7GC1FFW2E","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964354,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMSZAHD6SBFGKJJKA8X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964360,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMREK8AD51VMJDQF4KT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964366,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMVADWS7XGPX2B8CDQC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964372,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMWDCPQFT4PNJ0G4ZXP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964377,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMTXCH6GJVT8060GJAP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964384,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMX7WQP1JKA12FHD7R8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964390,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMX9NSEYD5PJHQWAGTP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964395,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMS8NZVBMKQTCPEHAFP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964401,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMWCNAJ3MGDNPG76951","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964407,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMYXAWTSH7TBPT2JDGT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964412,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXH1VP5ZTG3S1XXZZ4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964418,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXEQWXR2NKENBZ5BQM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964423,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXR374KPSXPF4B6QJG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964429,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMYKTMWJ3EH8GPN92M0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964435,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXJN79QTBAJT3TV9ES","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964440,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMXFDPGG6QZZ4EPAMHC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964445,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMX4Q7BNE2TCVGSSB3J","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964451,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMY0M84WZKHJT2HKSV3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964457,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMS76BPHAXCSCCKY5P2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964462,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMWEKXMJHX51CMRA10F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964467,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XMY50VMYKXWGDXR46TV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964500,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT24NB574XWFWN98SR8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964506,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT4JXC06KKSZX77M0PZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964513,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT30G1V2198SRDW0K8C","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964520,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT4EP2GNZDRE640NBS1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964526,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT5SVJBGQ569N278Y90","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964531,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT6Q8JKVKKPX13K68YJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964536,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT2V7TW2N9SFGNZJZG4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964543,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT6W7MXW2P1A0V4P9D6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964550,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT43JQA5ZSJ04J6DTY9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964555,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT2D0WVR5QFAYPVN9MH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964562,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT5T50RW8M7KAM0GNVQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964569,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT3ZEXZPBCXNEX6C4CF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964575,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7MA1HN042QAAHPFVD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964581,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT6YGPWV3TRSDZGYFMM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964587,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7R2CZ98J7QYCQ2XZ3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964593,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT61N79MRYCW30M2B7S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964599,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7JQCTPF8JT72JW5RY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964605,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT78QB837WH5WDZJW50","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964610,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7H54YZ1B3DXS9M8FB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964615,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT62KADS90EG49V9CEZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964621,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT6G2FBNE7KCYVD8WTS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964627,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT70P57ECHSJVCNGFWZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964633,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT76C11XPFH99V7HK2S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964639,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7938D4BK129G6Y00D","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964647,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XT7TXS05R23GAT1QTCK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964680,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZRYDQ1RFA9J9ASAS2N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964685,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZW50956C67KTT2DH41","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964699,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZVQN75QWJ1S2GNM24R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964706,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZSBD9WTJ2PRTRY54BS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964711,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZT8AK3CVEQMKV55DDW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964717,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZV5CTRB1PZTAM3FW9Z","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964723,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZTYTSWG20Q5KAE44E5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964728,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXHQC3BAEAG3MGDQMY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964734,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZSXY7HT6BHVS3EES82","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964740,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZX9GTC764YTCMWGXBG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964747,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZVE55P7BR7M1Z07H7E","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964754,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXTE7D1QEDW8XF8H7R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964759,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZW4WSK4XGS1R4TFRJN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964764,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXYZSQJAWM9W564ACQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964771,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXTPQWVM1YET03ZQJP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964777,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZX9X1EF4AXG4GM2KX0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964783,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZYE18WNB3Y3NYF4QVF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964789,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZZ0THT610YYWWJMWES","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964794,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZYBB8W0KX81ZWY3A5R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964800,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0KWTYH51GYGY8RTQ7E","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964807,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZXDMGP4AQPM597JHRV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964812,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0KQWYY6WRGMXRQ21D0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964818,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZY5G9X4RQNA006SNW7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964824,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZYMW881NSMWDX6EBSH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964830,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MQZ86WVEJBX4EG2A2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964837,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0M4WRW53H1BKJGHJ5Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964842,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MHNPHR49YZ2TV788K","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964848,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0KVTE5TKV6CXYC6QDC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964854,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MJG1GT81JW3YHPPTF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964860,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MTTPWRDMNXRPD8HHP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964865,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0KZSVSCQHYJES12M7Z","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964871,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZY1S5ESWG25P982Q57","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964877,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZY2JS5D989YRNRXA67","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964883,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2XZZB80CSCCHNK1GNCE5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964889,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NGVGYA7HPR5VTFPPF","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964895,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NZZ5H29M3NDBP95AZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964901,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NX2W04XPC2AZW8E2T","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964908,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MW9QD684TRVF69NZ2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964914,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0N70Q70HT5DC9AVCRE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964921,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NFH191EAHW8N5KTKE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964926,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PD8CR9M02RK2ATYDE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964931,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0MWCWGC4GKYRGZGJZJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964936,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PZCC413TQ6MP0TRQP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964941,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NQNSEWMBR0486JNWC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964947,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0NSX46DV7P73B3TRC8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964954,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PDBEBK3HRPSAXN7VK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964959,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0N6HNP1C8BRD0W42C0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964965,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PK43FJ929JGG54YQN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964970,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0P7DA2KYH6JNJ2PDA5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407964976,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Y0PF7R7DFRVSW8T5FS3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965016,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA36BF3P24RJ9SKX34B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965022,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA39KYMA48Z3TPB7NAK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965028,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA6H6JQG2Q1E1RMXV6R","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965034,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA7CF5MCMDY4KDR39QP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965039,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8CQ0RSW12TSMDAFF4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965045,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA4CJR8K7R1M3M82TWR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965052,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA4TQX8RF6TV0RSQ1ZY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965057,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA5VXDVTAT12PEQBQSC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965063,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA92667DT1DH6R4R01P","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965068,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA658K4GZEPZSVWW7QX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965074,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA7306DGWX7K1PCE5T4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965080,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA9TMM1QFMJD91YQPTB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965086,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8FRY47X3P22M5D1WE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965092,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8TZFG6Q5CK8G54D92","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965098,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8SGGAD06FT56WY073","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965103,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA9JHF39K08JB7XWCZE","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965109,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA92D1CFHEF6M838NHD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965116,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA9SB4ESYZTSJW4X3Q9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965122,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAA9SDTX0MX796MCRZN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965127,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAAZS5377NVG34RXACC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965133,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA9PDT48B3Q203S4Z2D","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965139,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAAHYZADFD8JTGF3SN2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965144,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA963VJ505CRYSF95ME","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965150,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA8V97B41TV9RKCC3Z0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965156,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABVSDB8N0X3XK28Y2N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965161,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABW4PJ30ZBP8DBB4QM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965168,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAA4YWNQSGSSG8RYE7M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965173,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA56JJYYK1FE7ZY3AZK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965178,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAACHJVKGK5WJPQPRKN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965184,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABWE5RVMA0V67YY7FX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965190,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABKQP0TA9C5E4E204X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965196,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABTBEY78C36RB8X6FZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965201,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YA911BQMZPGY9XW6N7F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965212,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAA4FKWGCWBWFY56T0G","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965217,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YACT1NJ7DWZWM4PS80Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965222,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAB3MNS49K6K991YMWH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965227,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAB66GP4FE1Y8HAX0YH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965233,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YABHD4GQP7WPG5CRNGT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965238,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YACMR0RPCXY9XKF29B1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965244,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YACRBTBTZ6KYS2BEWA3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965250,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAC0Z83WPN3KK1KZ2G2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965255,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADH3FCP66EKN1XA0RR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965260,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADETCSN2DP6FYK619W","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965267,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAB3D9P3RQ54E5QXFG6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965273,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YACSSAWH4ERMM10WZHW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965279,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADRPT6D69QPQ9HZWQV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965284,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAC6RKR8DN5HPMEMWST","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965289,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADC8XHDDZB7TK5EW1Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965293,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YADRQN6ABZ07BKN25ZB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965299,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YAC9PRJ21A4R4HSKXQM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965332,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM3VZYNCDHRJ08BZ28F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965339,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM40WYDVMMMWEGF4VSD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965344,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM74YTH1R30R204S0P3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965351,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM7Y4NEM06JZG6H35HY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965356,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM5S6C3846JGCYM5HYA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965362,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM6T4MCTCZ9MNGHQFNA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965369,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM5XMP4GN9VB69XSVHB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965375,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM6ZE3NNVGG4Z6A8R8Q","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965381,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM891SXA4N2QNNK6R35","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965388,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM5J46VAB4K9E73RM5P","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965393,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM3NS8JH2NWPZPS7PZ9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965398,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM8JFPSGEDXNC05RMKC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965405,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM8GX0V7Q1NEQ7YK578","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965413,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM8WQJZJSXSN389JHC5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965418,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM7XYZKDFAGVS68ZCBY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965424,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM893G0FFHQZ9X6MXS4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965429,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM7PEFVY2D2AYT8M7P4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965435,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM97EGNADPKJE3FR0ME","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965444,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM4K8Z8HK0X02B8J655","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965452,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM89ZK5BV2MW0CAE22X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965458,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM87054EXYKYXE97R2Y","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965463,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM96PDVFN59EEVCPQ4T","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965469,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM91NZKEGSZXN27XS84","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965475,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM91TEDCZDKWYPBH0JQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965480,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM8AFRQCKHSD0CJDNH5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965486,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9N3CR0TJ46B21PQSC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965491,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9KZFZDCQDCR3J2A7G","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965497,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMA3XRG2ASSZF2BV7KH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965502,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMATNGRG9XT01VDMCCK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965507,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMAFHHD3SASE6YBGNKK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965512,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMA3TJFJGYWYNNYE5H6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965518,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9Z758WF96P9N779RY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965524,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9N3A0FT5NVX8JRXKR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965529,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB5MQMFJ00Y7RJWD81","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965535,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB4BPY4P0PHY108ZNR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965541,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMAPXXA6PJRJ7EJ3M74","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965547,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBT3ETTERG26CMV8XJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965553,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMAXFZT6X42PM7MC8TB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965558,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB0YBKZ6DHKCW3KVFJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965565,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMAPMFTVDSD87TBB91F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965570,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBDEBD7ZND56AH840S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965575,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBM779ZE2DBH05NSE7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965581,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBNZD3PT75A3BRFV26","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965587,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YM9BW06B1N3A3R2EHP9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965592,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMBWCFPNNC7RK170JGS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965597,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMA3Z5S0ZZGAMFM7WJ2","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965602,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMCKW5GH6X625Q9P45X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965608,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMCN8K7AJPPVZXSF6CT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965613,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB93JCRFF379W6DQBH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965618,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YMB603133XQGGPJ09HN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965654,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY42AZZHP2CSM5QD51H","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965659,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY6705R9KDCPDYVDEYN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965665,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY5S8RAFHE0M86NQDZ4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965670,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY671H84ETCJJHV69K7","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965681,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY7WTHBKGDDMQZBN4GB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965686,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8585N9VH1J3JAB2CP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965691,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY6EGZSAXYDSFXDT16J","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965698,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY7D8FJRNS3Y4VQNFAA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965704,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8RNBEJTP1K5EXSKX0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965710,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY7K36Y1Y37JX8QT5VM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965716,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9MXW9KK63JP34P5X9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965722,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9YZZ1Z4X86SC2F23N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965727,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9Q01D5WDCJGCSGX7M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965732,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8Z5P3ED5PER21T0CZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965737,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY94NDXTWXCP20SV5A1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965744,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY98Z1E61C98CWDH9YQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965750,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9ZM69E4EPBT6KWD4Z","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965756,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8NNQS3740ZFJVQSCW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965762,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY8ADPJD91SS7WN1CZR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965767,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9ZC9KFDW94X09XG0M","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965772,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYAVWKDQ9RSHVHRYAPG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965778,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY9BCZCEG858SEYZWPJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965783,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY4MGKKB4E8GWZ8X1C4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965790,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYARPAGF7XA9FC72QV6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965795,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYA7FB841BF8109WC2V","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965801,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YY5M47QR5JPYYMGKJYK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965805,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBZJHPY029DF3975G0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965812,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBAWPS1WP6W8W99PWS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965817,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYAB65BX5WE894WBV9X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965823,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBV62PPKJ5C57GY4E9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965829,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBTZP7ZYDSKRBXC0Q1","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965835,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBBKA6ZYBE5X3ARFBX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965840,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYAF600TEZ7EWNBW0HR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965845,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYANH6A95DXQKQW3E4J","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965853,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYA890DXAQ252EGN38A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965860,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYC6PMCBC8HX7HCRQ7A","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965866,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCCES2JMHHGEM2PPAN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965872,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYB24AMATY82EAEJ1FK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965877,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCNK1T6GVG2Y81SEW8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965883,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYAFR6S5V4TDR9M01Z4","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965889,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBY6G844P4EZBK70F8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965893,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCN7X755NRRWH7Q0VC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965899,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBTVRDTM1XKPR1FH61","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965903,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYB759SZTK1707Y6CVM","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965909,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYBY443NXAGQ0TQ7KVX","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965915,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCC0ECBBQT0FKPMPD3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965921,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCCTRMMZJ6X8SVGTZ0","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965927,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYC981T139JP60STH3D","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965934,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYCT20MN11WTC7TXND3","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965940,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2YYC8SKBX1ACPZ0X3ANT","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965979,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z82PF421QGEA433F0J5","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43656},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965984,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z853ZC384RKZ3GRCPBK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43740},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965990,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z84SZDS35KT0F0TFEXY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43726},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407965995,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z878Y4W6AXHC44H4M48","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43774},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966001,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z85449RSNZNCCXBA5SR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43728},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966007,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z84VST39574Z9TTNSAW","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43696},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966012,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z86RSGEJB76S19ZJYTH","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43748},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966018,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87YAM0E2W3WRXH4A2T","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966024,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87MBW2KWDGAE4MAAAC","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43792},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966030,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z839DCTZQCDDF2G1TQP","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43668},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966036,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z866R1TF6A0V8SW5SXR","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43760},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966043,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z86VJE6A4R6HR1MZ1QN","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43768},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966049,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87BN3E8614Q3NZZME8","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43812},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966054,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87GPC9G8MAGDK8DHJV","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43788},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966060,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z889N4HRHA1N8HJ5DQG","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43848},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966068,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z87GCARD3FJ10KXR424","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43828},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966075,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z883G5TQ5CJGZTCK5D9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43834},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966080,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z83J7K3GC393YWPSN0X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43684},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966088,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z84SDHESVNJ58ZYYF1B","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43710},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966093,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8852W9KKHP616R5G2N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43872},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966099,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z88NJ8SCF82A7YMHKHD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43844},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966106,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z88C6A6J21GZTC139JD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43850},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966112,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z893ZQDZDQ85VXRY5VK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43886},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966119,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89R8297RXNR7QRGKEZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43892},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966126,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8AS1QPV0M8860CCP91","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43944},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966131,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89SHYVET82FT28W07F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43882},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966136,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8AA65NVS2PQ1GAXG98","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43918},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966142,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z88KYARSKGTTPR5A99N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43862},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966152,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89AK2EGF0THM2QR8H9","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43916},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966158,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8BA9NNV6THDDTGCCMK","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44014},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966163,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89S9V69EEQBAMEED5N","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43906},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966168,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8ANH9J60334K44XNPJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43962},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966174,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8AQKJF1XN2NDDS864X","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43928},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966179,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8BDSMZMSPDB566DDBZ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44022},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966185,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8ASEVQMQ1R6GX92NND","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43978},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966190,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8B9ERJNWRZRS6419CQ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44032},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966195,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8B0QQD0RRQQTSN8P63","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44034},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966200,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8BVZ6YGQ3ZT67BXB04","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44042},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966206,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z89TKFEQ4H2SKGCQRGD","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43894},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966210,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8C3PPTDCAXG4FW46DY","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44090},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966215,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8B6WA84WC71GWYP20G","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44008},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966225,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8A319FY032CNA3VPTB","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43992},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966230,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8CV5X8CCSJNWK9ACXS","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44120},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966235,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8C07SAMHFQXX12J01F","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44102},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966240,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8CR9E6TXJ4S0V0CJNA","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44128},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966245,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8A08N2PFP6K7CC94Y6","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":43948},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966251,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8BMXA4GBCV9DTRSN93","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44070},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966260,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8C2Q0D58VJCBEQDQ46","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44080},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966265,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8CAPNAAFC9Z5H5D6BJ","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44112},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":50,"time":1790407966271,"pid":1686260,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA2Z8B7J6KW3JPGG1NMT0S","req":{"method":"POST","url":"/api/v1/staff/payroll/calculate","host":"127.0.0.1:42341","remoteAddress":"127.0.0.1","remotePort":44054},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async calculatePayrollPeriod (/workspace/krona-staff/src/domain/payroll/service.ts:770:3)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:687:24)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} diff --git a/tests/e2e/evidence/server-n13-n2-bypass.txt b/tests/e2e/evidence/server-n13-n2-bypass.txt deleted file mode 100644 index e69de29..0000000 diff --git a/tests/e2e/evidence/server-no-tokens.txt b/tests/e2e/evidence/server-no-tokens.txt deleted file mode 100644 index a0429e7..0000000 --- a/tests/e2e/evidence/server-no-tokens.txt +++ /dev/null @@ -1,11 +0,0 @@ -{"level":30,"time":1790408014423,"pid":1688835,"hostname":"grok-bot-vm-420973429","msg":"Server listening at http://127.0.0.1:33821"} -{"level":30,"time":1790408014470,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4EM59MB3QYQ7QG56R4Q6","req":{"method":"GET","url":"/api/v1/staff/ready","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":43800},"msg":"incoming request"} -{"level":30,"time":1790408014485,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4EM59MB3QYQ7QG56R4Q6","res":{"statusCode":200},"responseTime":15.399766999999997,"msg":"request completed"} -{"level":30,"time":1790408017988,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J24H0CNE1DPZ87J7PY6","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":41914},"msg":"incoming request"} -{"level":30,"time":1790408017995,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J24H0CNE1DPZ87J7PY6","res":{"statusCode":200},"responseTime":7.126036999999997,"msg":"request completed"} -{"level":30,"time":1790408017997,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2CSDE96DCZ4X0TSJ1E","req":{"method":"GET","url":"/api/v1/staff/payroll","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":41916},"msg":"incoming request"} -{"level":30,"time":1790408018000,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2CSDE96DCZ4X0TSJ1E","res":{"statusCode":200},"responseTime":3.394659000000047,"msg":"request completed"} -{"level":30,"time":1790408018001,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2HH1VC67KYM9CGFM3R","req":{"method":"POST","url":"/api/v1/staff/professions","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":41914},"msg":"incoming request"} -{"level":30,"time":1790408018006,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2HH1VC67KYM9CGFM3R","res":{"statusCode":201},"responseTime":4.0853070000002845,"msg":"request completed"} -{"level":30,"time":1790408018939,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZTH0S49N5WD7NP5DXV","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:33821","remoteAddress":"127.0.0.1","remotePort":41926},"msg":"incoming request"} -{"level":30,"time":1790408018943,"pid":1688835,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZTH0S49N5WD7NP5DXV","res":{"statusCode":201},"responseTime":4.126679999999396,"msg":"request completed"} diff --git a/tests/e2e/evidence/server-rate-limit.txt b/tests/e2e/evidence/server-rate-limit.txt deleted file mode 100644 index 4bdfa60..0000000 --- a/tests/e2e/evidence/server-rate-limit.txt +++ /dev/null @@ -1,93 +0,0 @@ -{"level":30,"time":1790408014985,"pid":1688859,"hostname":"grok-bot-vm-420973429","msg":"Server listening at http://127.0.0.1:36299"} -{"level":30,"time":1790408014994,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F4HH3VG14PERD1YSY9Y","req":{"method":"GET","url":"/api/v1/staff/ready","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":38380},"msg":"incoming request"} -{"level":30,"time":1790408015008,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F4HH3VG14PERD1YSY9Y","res":{"statusCode":200},"responseTime":13.205045999999982,"msg":"request completed"} -{"level":30,"time":1790408018078,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4YV0JF6R2376AEHJPT","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018085,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4YV0JF6R2376AEHJPT","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018088,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4YV0JF6R2376AEHJPT","res":{"statusCode":401},"responseTime":10.026388999999654,"msg":"request completed"} -{"level":30,"time":1790408018090,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5AY86FT8CXCVMZBCVE","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018092,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5AY86FT8CXCVMZBCVE","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018093,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5AY86FT8CXCVMZBCVE","res":{"statusCode":401},"responseTime":3.1223180000001776,"msg":"request completed"} -{"level":30,"time":1790408018094,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5EVV7MG8NSJEN3BEHE","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018095,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5EVV7MG8NSJEN3BEHE","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018095,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5EVV7MG8NSJEN3BEHE","res":{"statusCode":401},"responseTime":1.5804190000003473,"msg":"request completed"} -{"level":30,"time":1790408018096,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5GS3DNBZVF696K10GB","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018097,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5GS3DNBZVF696K10GB","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018098,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5GS3DNBZVF696K10GB","res":{"statusCode":401},"responseTime":1.4676269999999931,"msg":"request completed"} -{"level":30,"time":1790408018099,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5J8T6KXH5TFHHSCHVF","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018100,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5J8T6KXH5TFHHSCHVF","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018100,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5J8T6KXH5TFHHSCHVF","res":{"statusCode":401},"responseTime":1.386855000000196,"msg":"request completed"} -{"level":30,"time":1790408018101,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5NP6FY0C583X92CP43","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018102,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5NP6FY0C583X92CP43","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018102,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5NP6FY0C583X92CP43","res":{"statusCode":401},"responseTime":1.2076160000001437,"msg":"request completed"} -{"level":30,"time":1790408018103,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5Q5TRCA85QYA3H0VYQ","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018104,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5Q5TRCA85QYA3H0VYQ","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018104,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5Q5TRCA85QYA3H0VYQ","res":{"statusCode":401},"responseTime":1.1122859999995853,"msg":"request completed"} -{"level":30,"time":1790408018105,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5SA4BPNWS2DED9PXYB","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018107,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5SA4BPNWS2DED9PXYB","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018107,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5SA4BPNWS2DED9PXYB","res":{"statusCode":401},"responseTime":1.8221369999996568,"msg":"request completed"} -{"level":30,"time":1790408018108,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5WVAX2TGTKMNXF5TMG","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018110,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5WVAX2TGTKMNXF5TMG","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018110,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5WVAX2TGTKMNXF5TMG","res":{"statusCode":401},"responseTime":1.6929129999998622,"msg":"request completed"} -{"level":30,"time":1790408018111,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5ZJ0TBAM6HCKDG31ST","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018112,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5ZJ0TBAM6HCKDG31ST","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018112,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J5ZJ0TBAM6HCKDG31ST","res":{"statusCode":401},"responseTime":1.3584950000004028,"msg":"request completed"} -{"level":30,"time":1790408018113,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J61SAXX1SBMMF6K7MW7","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018114,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J61SAXX1SBMMF6K7MW7","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018115,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J61SAXX1SBMMF6K7MW7","res":{"statusCode":401},"responseTime":1.17779500000006,"msg":"request completed"} -{"level":30,"time":1790408018116,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J64PXWG5P4DSGFA9VDQ","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018117,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J64PXWG5P4DSGFA9VDQ","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018117,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J64PXWG5P4DSGFA9VDQ","res":{"statusCode":401},"responseTime":1.2440259999998489,"msg":"request completed"} -{"level":30,"time":1790408018118,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J665CYSPZZM1V2R18JN","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018119,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J665CYSPZZM1V2R18JN","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018120,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J665CYSPZZM1V2R18JN","res":{"statusCode":401},"responseTime":1.6543000000001484,"msg":"request completed"} -{"level":30,"time":1790408018120,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J681X6JYH17BSE6KS7T","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018121,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J681X6JYH17BSE6KS7T","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018121,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J681X6JYH17BSE6KS7T","res":{"statusCode":401},"responseTime":0.9558520000000499,"msg":"request completed"} -{"level":30,"time":1790408018122,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6AZB9EF2ZWRM58K33X","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018124,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6AZB9EF2ZWRM58K33X","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018124,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6AZB9EF2ZWRM58K33X","res":{"statusCode":401},"responseTime":1.3041690000000017,"msg":"request completed"} -{"level":30,"time":1790408018125,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6DANVFJ43ANCSWN2AD","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018126,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6DANVFJ43ANCSWN2AD","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018126,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6DANVFJ43ANCSWN2AD","res":{"statusCode":401},"responseTime":1.0975260000000162,"msg":"request completed"} -{"level":30,"time":1790408018127,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6FB5G9XGHEX6J2DQD9","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018128,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6FB5G9XGHEX6J2DQD9","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018128,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6FB5G9XGHEX6J2DQD9","res":{"statusCode":401},"responseTime":0.9584480000003168,"msg":"request completed"} -{"level":30,"time":1790408018129,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6HN1B0FT6JSM29WA43","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018129,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6HN1B0FT6JSM29WA43","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018130,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6HN1B0FT6JSM29WA43","res":{"statusCode":401},"responseTime":0.8860890000000836,"msg":"request completed"} -{"level":30,"time":1790408018130,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6JYZVQY0HTDDS7J417","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018131,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6JYZVQY0HTDDS7J417","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018131,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6JYZVQY0HTDDS7J417","res":{"statusCode":401},"responseTime":1.0295750000000226,"msg":"request completed"} -{"level":30,"time":1790408018132,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6MATZ7QY0BR7V8AW72","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018133,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6MATZ7QY0BR7V8AW72","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018133,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6MATZ7QY0BR7V8AW72","res":{"statusCode":401},"responseTime":0.9096939999999449,"msg":"request completed"} -{"level":30,"time":1790408018134,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6PDK66S783WHQ51ASV","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018135,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6PDK66S783WHQ51ASV","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018135,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6PDK66S783WHQ51ASV","res":{"statusCode":401},"responseTime":0.9012949999996636,"msg":"request completed"} -{"level":30,"time":1790408018136,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6R8EVAMEACB5RG5PMT","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018137,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6R8EVAMEACB5RG5PMT","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018137,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6R8EVAMEACB5RG5PMT","res":{"statusCode":401},"responseTime":0.97691500000019,"msg":"request completed"} -{"level":30,"time":1790408018137,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6S4NWEJWJSHW2QW0H1","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018138,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6S4NWEJWJSHW2QW0H1","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018139,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6S4NWEJWJSHW2QW0H1","res":{"statusCode":401},"responseTime":1.0356249999999818,"msg":"request completed"} -{"level":30,"time":1790408018139,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6V5MVSWERJFSE4H8S1","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018140,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6V5MVSWERJFSE4H8S1","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018140,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6V5MVSWERJFSE4H8S1","res":{"statusCode":401},"responseTime":0.9596630000000914,"msg":"request completed"} -{"level":30,"time":1790408018141,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6X3SS6P42S0J20JY43","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018142,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6X3SS6P42S0J20JY43","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018142,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6X3SS6P42S0J20JY43","res":{"statusCode":401},"responseTime":0.8438820000001215,"msg":"request completed"} -{"level":30,"time":1790408018143,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6ZGJ3J8AZ6CADNGANJ","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018144,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6ZGJ3J8AZ6CADNGANJ","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018144,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J6ZGJ3J8AZ6CADNGANJ","res":{"statusCode":401},"responseTime":1.0216669999999795,"msg":"request completed"} -{"level":30,"time":1790408018145,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J70HW4EQGVGGWZBSN09","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018146,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J70HW4EQGVGGWZBSN09","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018146,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J70HW4EQGVGGWZBSN09","res":{"statusCode":401},"responseTime":1.648689000000104,"msg":"request completed"} -{"level":30,"time":1790408018147,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J73XM8Q0YNRJ914G8W1","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018148,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J73XM8Q0YNRJ914G8W1","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018148,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J73XM8Q0YNRJ914G8W1","res":{"statusCode":401},"responseTime":0.967511000000286,"msg":"request completed"} -{"level":30,"time":1790408018149,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J74SQB99XZJCVDXJNMT","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34810},"msg":"incoming request"} -{"level":30,"time":1790408018149,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J74SQB99XZJCVDXJNMT","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018149,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J74SQB99XZJCVDXJNMT","res":{"statusCode":401},"responseTime":0.8698090000002594,"msg":"request completed"} -{"level":30,"time":1790408018150,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J76XMMPD5PD7AKCYR2N","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:36299","remoteAddress":"127.0.0.1","remotePort":34822},"msg":"incoming request"} -{"level":30,"time":1790408018151,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J76XMMPD5PD7AKCYR2N","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:253:23)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408018151,"pid":1688859,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J76XMMPD5PD7AKCYR2N","res":{"statusCode":401},"responseTime":1.0111910000000535,"msg":"request completed"} diff --git a/tests/e2e/evidence/server-secured.txt b/tests/e2e/evidence/server-secured.txt deleted file mode 100644 index 88cfa2e..0000000 --- a/tests/e2e/evidence/server-secured.txt +++ /dev/null @@ -1,279 +0,0 @@ -{"level":30,"time":1790408013912,"pid":1688811,"hostname":"grok-bot-vm-420973429","msg":"Server listening at http://127.0.0.1:35389"} -{"level":30,"time":1790408013941,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4E3M5MJKAGV50FFXN9SZ","req":{"method":"GET","url":"/api/v1/staff/ready","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41352},"msg":"incoming request"} -{"level":30,"time":1790408013957,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4E3M5MJKAGV50FFXN9SZ","res":{"statusCode":200},"responseTime":16.484744000000035,"msg":"request completed"} -{"level":30,"time":1790408015166,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F9X4201XC0AAD6DNBP5","req":{"method":"POST","url":"/api/v1/staff/employees","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":50,"time":1790408015172,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F9X4201XC0AAD6DNBP5","req":{"method":"POST","url":"/api/v1/staff/employees","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"inconsistent types deduced for parameter $2","stack":"error: inconsistent types deduced for parameter $2\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/portal.ts:465:25)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/portal.ts:461:24)","length":155,"name":"error","severity":"ERROR","code":"42P08","detail":"text versus character varying","position":"150","file":"parse_param.c","line":"219","routine":"variable_coerce_param_hook"},"msg":"inconsistent types deduced for parameter $2"} -{"level":30,"time":1790408015177,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4F9X4201XC0AAD6DNBP5","res":{"statusCode":500},"responseTime":11.21852100000001,"msg":"request completed"} -{"level":30,"time":1790408015188,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FAMNJX2833KF1T4TTXN","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408015205,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FAMNJX2833KF1T4TTXN","res":{"statusCode":202},"responseTime":17.02252499999986,"msg":"request completed"} -{"level":30,"time":1790408015223,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FBQJSK6DGCRM59J8R5P","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015232,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FBQJSK6DGCRM59J8R5P","res":{"statusCode":202},"responseTime":9.666789000000108,"msg":"request completed"} -{"level":30,"time":1790408015242,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCAV488NV3PYX6F3FJA","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015247,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCAV488NV3PYX6F3FJA","res":{"statusCode":200},"responseTime":4.858270000000175,"msg":"request completed"} -{"level":30,"time":1790408015249,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCGJF6Z76CTR188VGCN","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4FBZ4PJA3W2WDRQSRQSA/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408015257,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCGJF6Z76CTR188VGCN","res":{"statusCode":200},"responseTime":8.3228059999999,"msg":"request completed"} -{"level":30,"time":1790408015259,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCVQ0FHFZTP5RX5VGFS","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015262,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCVQ0FHFZTP5RX5VGFS","res":{"statusCode":201},"responseTime":3.2303699999999935,"msg":"request completed"} -{"level":30,"time":1790408015264,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCZJ2ZQZ454GQVQ000V","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408015272,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FCZJ2ZQZ454GQVQ000V","res":{"statusCode":201},"responseTime":8.185108000000128,"msg":"request completed"} -{"level":30,"time":1790408015273,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FD9GB296ZS3YK71ZE6D","req":{"method":"POST","url":"/api/v1/staff/work-sessions/reconcile","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015279,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FD9GB296ZS3YK71ZE6D","res":{"statusCode":200},"responseTime":6.122667999999976,"msg":"request completed"} -{"level":30,"time":1790408015289,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FDSCE1FXX9KMABVM5TM","req":{"method":"PATCH","url":"/api/v1/staff/work-sessions/01M3EA4FDDGG7NT2PNT26E1QKB","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":50,"time":1790408015293,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FDSCE1FXX9KMABVM5TM","req":{"method":"PATCH","url":"/api/v1/staff/work-sessions/01M3EA4FDDGG7NT2PNT26E1QKB","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/portal.ts:1145:13)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/portal.ts:1053:23)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":30,"time":1790408015294,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FDSCE1FXX9KMABVM5TM","res":{"statusCode":500},"responseTime":4.745336999999836,"msg":"request completed"} -{"level":30,"time":1790408015297,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FE18FJJN9394Y3N6BJ5","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408015304,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FE18FJJN9394Y3N6BJ5","res":{"statusCode":202},"responseTime":6.942637999999988,"msg":"request completed"} -{"level":30,"time":1790408015313,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FEH4RF0G7FDCFWZYRG2","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015320,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FEH4RF0G7FDCFWZYRG2","res":{"statusCode":202},"responseTime":6.775562000000036,"msg":"request completed"} -{"level":30,"time":1790408015329,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FF1VZ350VV5QWXTG0CR","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015333,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FF1VZ350VV5QWXTG0CR","res":{"statusCode":200},"responseTime":3.717247000000043,"msg":"request completed"} -{"level":30,"time":1790408015334,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FF6VREYSW25ACQZKRG3","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4FEQWG7KW934X22C56ZR/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408015340,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FF6VREYSW25ACQZKRG3","res":{"statusCode":200},"responseTime":6.012408999999934,"msg":"request completed"} -{"level":30,"time":1790408015341,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFDF0DKJ2W7ZPPDR4DV","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015344,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFDF0DKJ2W7ZPPDR4DV","res":{"statusCode":201},"responseTime":2.4532470000001467,"msg":"request completed"} -{"level":30,"time":1790408015345,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFHKWR6VMNF2WQKGBWZ","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408015346,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFHKWR6VMNF2WQKGBWZ","res":{"statusCode":201},"responseTime":1.5671030000000883,"msg":"request completed"} -{"level":30,"time":1790408015347,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFKMGVXC8YMD6PFV6W2","req":{"method":"POST","url":"/api/v1/staff/work-sessions/reconcile","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015350,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFKMGVXC8YMD6PFV6W2","res":{"statusCode":200},"responseTime":3.180074999999988,"msg":"request completed"} -{"level":30,"time":1790408015358,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFYESE8NJFN70MAFRPV","req":{"method":"PATCH","url":"/api/v1/staff/work-sessions/01M3EA4FFN6TXZWFAV7AD8W931","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":50,"time":1790408015361,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFYESE8NJFN70MAFRPV","req":{"method":"PATCH","url":"/api/v1/staff/work-sessions/01M3EA4FFN6TXZWFAV7AD8W931","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint","stack":"error: null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/portal.ts:1145:13)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/portal.ts:1053:23)","length":188,"name":"error","severity":"ERROR","code":"23502","schema":"public","table":"staff_outbox","column":"occurred_at","file":"execMain.c","line":"2022","routine":"ExecConstraints"},"msg":"null value in column \"occurred_at\" of relation \"staff_outbox\" violates not-null constraint"} -{"level":30,"time":1790408015361,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FFYESE8NJFN70MAFRPV","res":{"statusCode":500},"responseTime":2.768146999999999,"msg":"request completed"} -{"level":30,"time":1790408015363,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FG37GZKF5QXE421K1NS","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408015374,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FG37GZKF5QXE421K1NS","res":{"statusCode":202},"responseTime":10.611540999999988,"msg":"request completed"} -{"level":30,"time":1790408015383,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FGQ28S5QBWAQDRD3ENC","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4FGC5Y20677SW81GPFB2/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015387,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FGQ28S5QBWAQDRD3ENC","res":{"statusCode":200},"responseTime":4.416566000000103,"msg":"request completed"} -{"level":30,"time":1790408015392,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FH06VNHJY4EBW5EE2XX","req":{"method":"POST","url":"/api/v1/staff/push/subscriptions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408015397,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FH06VNHJY4EBW5EE2XX","res":{"statusCode":201},"responseTime":4.635773999999856,"msg":"request completed"} -{"level":30,"time":1790408015398,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FH57Y74WHQVGP02939Q","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408015401,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4FH57Y74WHQVGP02939Q","res":{"statusCode":201},"responseTime":2.8056480000000192,"msg":"request completed"} -{"level":30,"time":1790408017908,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4HZMM5H00GW47QM8H57P","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408017915,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4HZMM5H00GW47QM8H57P","res":{"statusCode":202},"responseTime":6.821124000000054,"msg":"request completed"} -{"level":30,"time":1790408017927,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J070MWKRVC3R9SEXHZZ","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4HZSY982GYTPDAVP0Z0Q/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408017932,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J070MWKRVC3R9SEXHZZ","res":{"statusCode":200},"responseTime":4.815638999999464,"msg":"request completed"} -{"level":30,"time":1790408017933,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0D6X5ZRVMAHE2KHFP0","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4HZTSZ12MKP3SV134FKS/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408017935,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0D6X5ZRVMAHE2KHFP0","res":{"statusCode":200},"responseTime":2.3987600000000384,"msg":"request completed"} -{"level":30,"time":1790408017936,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0GAPK6MYZKS6CEP69P","req":{"method":"POST","url":"/api/v1/staff/push/subscriptions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408017938,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0GAPK6MYZKS6CEP69P","res":{"statusCode":201},"responseTime":1.9624579999999696,"msg":"request completed"} -{"level":30,"time":1790408017939,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0K1RMKPTCT5QNAGV7A","req":{"method":"POST","url":"/api/v1/staff/push/subscriptions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408017941,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J0K1RMKPTCT5QNAGV7A","res":{"statusCode":201},"responseTime":2.340323000000353,"msg":"request completed"} -{"level":30,"time":1790408017952,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J10VK1XV0ZMVF812CYW","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408017958,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J10VK1XV0ZMVF812CYW","res":{"statusCode":202},"responseTime":5.686529999999948,"msg":"request completed"} -{"level":30,"time":1790408017965,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1DG7KEQN92H5D256PE","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408017970,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1DG7KEQN92H5D256PE","res":{"statusCode":200},"responseTime":4.494719000000259,"msg":"request completed"} -{"level":30,"time":1790408017971,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1KMHYPJ01JH6Z2WEQK","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4J151B1H9D5AKAR29AN9/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408017976,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1KMHYPJ01JH6Z2WEQK","res":{"statusCode":200},"responseTime":5.194629999999961,"msg":"request completed"} -{"level":30,"time":1790408017977,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1S0SNJZ8H7X0K9F7T1","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4J151B1H9D5AKAR29AN9/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408017981,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1S0SNJZ8H7X0K9F7T1","res":{"statusCode":200},"responseTime":4.459873999999218,"msg":"request completed"} -{"level":30,"time":1790408017983,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1ZDTDW66WF28KDYB4W","req":{"method":"GET","url":"/api/v1/staff/professions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408017984,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J1ZDTDW66WF28KDYB4W","res":{"statusCode":200},"responseTime":1.0135330000002796,"msg":"request completed"} -{"level":30,"time":1790408017985,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J208WKMDXHJERS4H6MT","req":{"method":"GET","url":"/api/v1/staff/org-units","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408017986,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J208WKMDXHJERS4H6MT","res":{"statusCode":200},"responseTime":1.3112160000000586,"msg":"request completed"} -{"level":30,"time":1790408018007,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2Q3T2JSPF95TG96N6P","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408018008,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2Q3T2JSPF95TG96N6P","res":{"statusCode":200},"responseTime":0.6348109999998996,"msg":"request completed"} -{"level":30,"time":1790408018009,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2SK303DG80T5VC5DDC","req":{"method":"DELETE","url":"/api/v1/staff/session","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408018009,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2SK303DG80T5VC5DDC","res":{"statusCode":204},"responseTime":0.33697699999993347,"msg":"request completed"} -{"level":30,"time":1790408018010,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2S1XNED469T2N44WFY","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408018013,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2S1XNED469T2N44WFY","res":{"statusCode":200},"responseTime":3.6036009999997987,"msg":"request completed"} -{"level":30,"time":1790408018015,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2Z7TW54HTHRM9B7PFS","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408018016,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J2Z7TW54HTHRM9B7PFS","res":{"statusCode":200},"responseTime":0.40848600000026636,"msg":"request completed"} -{"level":30,"time":1790408018017,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J31AWQFE866QK3R19T8","req":{"method":"POST","url":"/api/v1/staff/professions","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408018019,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J31AWQFE866QK3R19T8","res":{"statusCode":201},"responseTime":2.3794800000005125,"msg":"request completed"} -{"level":30,"time":1790408018021,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J35B5NNN9AVW7EH7XVR","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408018027,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J35B5NNN9AVW7EH7XVR","res":{"statusCode":202},"responseTime":6.364180999999917,"msg":"request completed"} -{"level":30,"time":1790408018037,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J3NFJ32S6B487DGQF3F","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408018040,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J3NFJ32S6B487DGQF3F","res":{"statusCode":201},"responseTime":3.285291999999572,"msg":"request completed"} -{"level":30,"time":1790408018041,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J3S918GM99F9BXZKYHD","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41370},"msg":"incoming request"} -{"level":30,"time":1790408018051,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J3S918GM99F9BXZKYHD","res":{"statusCode":201},"responseTime":9.325840999999855,"msg":"request completed"} -{"level":30,"time":1790408018052,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J44HBZG5R6A7238SHNC","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":30,"time":1790408018059,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J44HBZG5R6A7238SHNC","res":{"statusCode":202},"responseTime":6.6378679999997985,"msg":"request completed"} -{"level":30,"time":1790408018068,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4MJ6D7YHY7NJP8XW6B","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"msg":"incoming request"} -{"level":50,"time":1790408018073,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4MJ6D7YHY7NJP8XW6B","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":41366},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\"","stack":"error: new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\"\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/operations.ts:1033:13)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/operations.ts:813:22)","length":229,"name":"error","severity":"ERROR","code":"23514","schema":"public","table":"staff_payroll_ledger","constraint":"staff_payroll_ledger_kind_check","file":"execMain.c","line":"2074","routine":"ExecConstraints"},"msg":"new row for relation \"staff_payroll_ledger\" violates check constraint \"staff_payroll_ledger_kind_check\""} -{"level":30,"time":1790408018076,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4J4MJ6D7YHY7NJP8XW6B","res":{"statusCode":500},"responseTime":7.259319999999207,"msg":"request completed"} -{"level":30,"time":1790408018281,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JB912NAAC419Y02QPGD","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018289,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JB912NAAC419Y02QPGD","res":{"statusCode":202},"responseTime":7.542034999999487,"msg":"request completed"} -{"level":30,"time":1790408018310,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JC6JJ5PE5S4M8MJAPYQ","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018323,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JC6JJ5PE5S4M8MJAPYQ","res":{"statusCode":202},"responseTime":12.457030999999915,"msg":"request completed"} -{"level":30,"time":1790408018333,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JCXCHJFD211C4GCEFKB","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018338,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JCXCHJFD211C4GCEFKB","res":{"statusCode":200},"responseTime":4.526701000000685,"msg":"request completed"} -{"level":30,"time":1790408018340,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JD4NWCFKZRS9ENNQ1RR","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4JCJZDWYMA296ZFPY4DF/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018346,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JD4NWCFKZRS9ENNQ1RR","res":{"statusCode":200},"responseTime":5.515754999999444,"msg":"request completed"} -{"level":30,"time":1790408018348,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDC28B95P2KDW019QM5","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018350,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDC28B95P2KDW019QM5","res":{"statusCode":201},"responseTime":1.652274000000034,"msg":"request completed"} -{"level":30,"time":1790408018351,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDFHP41V6MX75HC8BA2","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018353,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDFHP41V6MX75HC8BA2","res":{"statusCode":201},"responseTime":1.7120279999999184,"msg":"request completed"} -{"level":30,"time":1790408018354,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDJP8QC0RWYNJG3BAWE","req":{"method":"POST","url":"/api/v1/staff/work-sessions/reconcile","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018357,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDJP8QC0RWYNJG3BAWE","res":{"statusCode":200},"responseTime":3.009777999999642,"msg":"request completed"} -{"level":30,"time":1790408018366,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDY7YVS8NFMK6B159M9","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018367,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDY7YVS8NFMK6B159M9","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018367,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JDY7YVS8NFMK6B159M9","res":{"statusCode":404},"responseTime":0.45273399999950925,"msg":"request completed"} -{"level":30,"time":1790408018373,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JE5C72SJMQT011VRYK0","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018380,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JE5C72SJMQT011VRYK0","res":{"statusCode":202},"responseTime":6.309143000000404,"msg":"request completed"} -{"level":30,"time":1790408018391,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JEQ53Q7Q75D8JNWM330","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018395,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JEQ53Q7Q75D8JNWM330","res":{"statusCode":202},"responseTime":4.627241999999569,"msg":"request completed"} -{"level":30,"time":1790408018403,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JF35G4F1KTESX0J64QY","req":{"method":"GET","url":"/api/v1/staff/pay-rules","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018406,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JF35G4F1KTESX0J64QY","res":{"statusCode":200},"responseTime":2.5201289999995424,"msg":"request completed"} -{"level":30,"time":1790408018407,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JF75GCM7BPRQ93RQXGY","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4JETWGVJMHFN7Q38N6ZH/pay-assignment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018410,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JF75GCM7BPRQ93RQXGY","res":{"statusCode":200},"responseTime":3.6298900000001595,"msg":"request completed"} -{"level":30,"time":1790408018412,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFB7RG1HJWMFPP628P1","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018413,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFB7RG1HJWMFPP628P1","res":{"statusCode":201},"responseTime":1.662560000000667,"msg":"request completed"} -{"level":30,"time":1790408018414,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFEEZ33FSBQR5V8S3XG","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018422,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFEEZ33FSBQR5V8S3XG","res":{"statusCode":201},"responseTime":7.868167999999969,"msg":"request completed"} -{"level":30,"time":1790408018423,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFQ185WPASH3T84B2KY","req":{"method":"POST","url":"/api/v1/staff/work-sessions/reconcile","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018427,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JFQ185WPASH3T84B2KY","res":{"statusCode":200},"responseTime":3.232307000000219,"msg":"request completed"} -{"level":30,"time":1790408018435,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG3C73K6MDYG5QKZBX4","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018435,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG3C73K6MDYG5QKZBX4","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018435,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG3C73K6MDYG5QKZBX4","res":{"statusCode":404},"responseTime":0.33230400000047666,"msg":"request completed"} -{"level":30,"time":1790408018437,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG57J9AN9YWDETCP3FJ","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018437,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG57J9AN9YWDETCP3FJ","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018437,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG57J9AN9YWDETCP3FJ","res":{"statusCode":404},"responseTime":0.2454699999998411,"msg":"request completed"} -{"level":30,"time":1790408018438,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG6X163QEGB6N85AM9P","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018439,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG6X163QEGB6N85AM9P","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018439,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG6X163QEGB6N85AM9P","res":{"statusCode":404},"responseTime":0.2565549999999348,"msg":"request completed"} -{"level":30,"time":1790408018440,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG8B5RZ5V4K0GB12G8X","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018441,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG8B5RZ5V4K0GB12G8X","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018441,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JG8B5RZ5V4K0GB12G8X","res":{"statusCode":404},"responseTime":0.28928499999983615,"msg":"request completed"} -{"level":30,"time":1790408018442,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGAE9ZP2T630SJGVMDD","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018442,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGAE9ZP2T630SJGVMDD","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018443,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGAE9ZP2T630SJGVMDD","res":{"statusCode":404},"responseTime":0.2572410000002492,"msg":"request completed"} -{"level":30,"time":1790408018444,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGCQ53FE88AQGRDBRZG","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018444,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGCQ53FE88AQGRDBRZG","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018444,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGCQ53FE88AQGRDBRZG","res":{"statusCode":404},"responseTime":0.2509200000004057,"msg":"request completed"} -{"level":30,"time":1790408018445,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGDK389KPYPC2PXWXYA","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018446,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGDK389KPYPC2PXWXYA","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018446,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGDK389KPYPC2PXWXYA","res":{"statusCode":404},"responseTime":0.2959399999999732,"msg":"request completed"} -{"level":30,"time":1790408018448,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGGYYTDWN5DQXM5JY5P","req":{"method":"POST","url":"/api/v1/staff/access-grants","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018448,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGGYYTDWN5DQXM5JY5P","msg":"Route POST:/api/v1/staff/access-grants not found"} -{"level":30,"time":1790408018448,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGGYYTDWN5DQXM5JY5P","res":{"statusCode":404},"responseTime":0.39974900000015623,"msg":"request completed"} -{"level":30,"time":1790408018450,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGJS6D7CH512HB9HZTM","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018455,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGJS6D7CH512HB9HZTM","res":{"statusCode":202},"responseTime":4.826310999999805,"msg":"request completed"} -{"level":30,"time":1790408018463,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGZ01CBTK1YMAHJRB18","req":{"method":"GET","url":"/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018463,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGZ01CBTK1YMAHJRB18","msg":"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found"} -{"level":30,"time":1790408018463,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JGZ01CBTK1YMAHJRB18","res":{"statusCode":404},"responseTime":0.3378870000005918,"msg":"request completed"} -{"level":30,"time":1790408018465,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JH1A0MMMC9Y5FHG5JR3","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35782},"msg":"incoming request"} -{"level":30,"time":1790408018470,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JH1A0MMMC9Y5FHG5JR3","res":{"statusCode":202},"responseTime":5.273951000000125,"msg":"request completed"} -{"level":30,"time":1790408018478,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JHE1Z7JVRT7FTV70AXY","req":{"method":"PUT","url":"/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35778},"msg":"incoming request"} -{"level":30,"time":1790408018478,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JHE1Z7JVRT7FTV70AXY","msg":"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found"} -{"level":30,"time":1790408018478,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JHE1Z7JVRT7FTV70AXY","res":{"statusCode":404},"responseTime":0.304058000000623,"msg":"request completed"} -{"level":30,"time":1790408018606,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JNE3G43KVT3QY8K1AEW","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018612,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JNE3G43KVT3QY8K1AEW","res":{"statusCode":202},"responseTime":6.345726999999897,"msg":"request completed"} -{"level":30,"time":1790408018632,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JP8Q2M2Y2BDPFWA68K7","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018637,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JP8Q2M2Y2BDPFWA68K7","res":{"statusCode":202},"responseTime":4.942963999999847,"msg":"request completed"} -{"level":30,"time":1790408018647,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JPQHAWFX6VEZQRJADJ4","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018650,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JPQHAWFX6VEZQRJADJ4","res":{"statusCode":201},"responseTime":2.9649260000005597,"msg":"request completed"} -{"level":30,"time":1790408018654,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JPYKMHN8AV2XRK1ZT9C","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018660,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JPYKMHN8AV2XRK1ZT9C","res":{"statusCode":200},"responseTime":5.449781000000257,"msg":"request completed"} -{"level":30,"time":1790408018675,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JQKCR13BT1AW47A8GYY","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018681,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JQKCR13BT1AW47A8GYY","res":{"statusCode":202},"responseTime":5.823410999999396,"msg":"request completed"} -{"level":30,"time":1790408018690,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JR2M60V60HT7JY4DVYZ","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018691,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JR2M60V60HT7JY4DVYZ","res":{"statusCode":201},"responseTime":1.3205479999996896,"msg":"request completed"} -{"level":30,"time":1790408018693,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JR5F9GRXENA9023DH3Q","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018697,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JR5F9GRXENA9023DH3Q","res":{"statusCode":200},"responseTime":3.8750069999996413,"msg":"request completed"} -{"level":30,"time":1790408018707,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JRKGVB9KFM4GW8JCCRS","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018712,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JRKGVB9KFM4GW8JCCRS","res":{"statusCode":202},"responseTime":4.9716669999997976,"msg":"request completed"} -{"level":30,"time":1790408018722,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JS290GZAPS7A6Z5YFZZ","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018727,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JS290GZAPS7A6Z5YFZZ","res":{"statusCode":202},"responseTime":5.085656000000199,"msg":"request completed"} -{"level":30,"time":1790408018736,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSG89R09EJQ2CDW87CW","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018738,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSG89R09EJQ2CDW87CW","res":{"statusCode":201},"responseTime":1.3734510000003866,"msg":"request completed"} -{"level":30,"time":1790408018739,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSKMK02GDMP23FZ2DZR","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":50,"time":1790408018743,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSKMK02GDMP23FZ2DZR","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"column \"status\" does not exist","stack":"error: column \"status\" does not exist\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/domain/sync/service.ts:389:24)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/sync.ts:306:28)","length":106,"name":"error","severity":"ERROR","code":"42703","position":"24","file":"parse_relation.c","line":"3716","routine":"errorMissingColumn"},"msg":"column \"status\" does not exist"} -{"level":30,"time":1790408018744,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSKMK02GDMP23FZ2DZR","res":{"statusCode":500},"responseTime":4.648181000000477,"msg":"request completed"} -{"level":30,"time":1790408018747,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSVD8C9S834XPRJQTD2","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018785,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JSVD8C9S834XPRJQTD2","res":{"statusCode":202},"responseTime":37.420500999999604,"msg":"request completed"} -{"level":30,"time":1790408018793,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JV9WNV36C6MKDW979R6","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018796,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JV9WNV36C6MKDW979R6","res":{"statusCode":201},"responseTime":2.075665000000299,"msg":"request completed"} -{"level":30,"time":1790408018797,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVDPWZPXAZ8HFFNX7AB","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":50,"time":1790408018799,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVDPWZPXAZ8HFFNX7AB","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"column \"status\" does not exist","stack":"error: column \"status\" does not exist\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async (/workspace/krona-staff/src/domain/sync/service.ts:389:24)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/sync.ts:306:28)","length":106,"name":"error","severity":"ERROR","code":"42703","position":"24","file":"parse_relation.c","line":"3716","routine":"errorMissingColumn"},"msg":"column \"status\" does not exist"} -{"level":30,"time":1790408018799,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVDPWZPXAZ8HFFNX7AB","res":{"statusCode":500},"responseTime":2.661884999999529,"msg":"request completed"} -{"level":30,"time":1790408018801,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVHZF6TQCPQ6PWDKPCP","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018813,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVHZF6TQCPQ6PWDKPCP","res":{"statusCode":201},"responseTime":12.522825000000012,"msg":"request completed"} -{"level":30,"time":1790408018814,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVYMVC1M9CPBB2A3R39","req":{"method":"GET","url":"/api/v1/staff/sync/status","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018817,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JVYMVC1M9CPBB2A3R39","res":{"statusCode":200},"responseTime":2.794176000000334,"msg":"request completed"} -{"level":30,"time":1790408018818,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JW2EXB5S1H9YVT9GK45","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018823,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JW2EXB5S1H9YVT9GK45","res":{"statusCode":202},"responseTime":4.881444999999985,"msg":"request completed"} -{"level":30,"time":1790408018834,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWJVPG8V84QAPCEE014","req":{"method":"PATCH","url":"/api/v1/staff/employees/01M3EA4JW60F9X6AEXP33M4MDQ","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018836,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWJVPG8V84QAPCEE014","res":{"statusCode":200},"responseTime":2.368786999999429,"msg":"request completed"} -{"level":30,"time":1790408018837,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWNGP1EJHDT3VJRAMN4","req":{"method":"POST","url":"/api/v1/staff/sync/pull","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018840,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWNGP1EJHDT3VJRAMN4","res":{"statusCode":200},"responseTime":2.5322159999996074,"msg":"request completed"} -{"level":30,"time":1790408018842,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWTMTYJ05Y0GV6PQS6B","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018846,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JWTMTYJ05Y0GV6PQS6B","res":{"statusCode":202},"responseTime":4.6687080000001515,"msg":"request completed"} -{"level":30,"time":1790408018853,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JX5JMS8NPRX3DHT88ZC","req":{"method":"PATCH","url":"/api/v1/staff/employees/01M3EA4JWYGKJW3S3SQW7QMCF1","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018857,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JX5JMS8NPRX3DHT88ZC","res":{"statusCode":200},"responseTime":3.251942999999301,"msg":"request completed"} -{"level":30,"time":1790408018857,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JX9M65W8D65RMHR6D9Y","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018859,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JX9M65W8D65RMHR6D9Y","res":{"statusCode":201},"responseTime":1.2874750000000859,"msg":"request completed"} -{"level":30,"time":1790408018860,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXC3004KR4378VKCH5G","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018863,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXC3004KR4378VKCH5G","res":{"statusCode":200},"responseTime":3.7642430000005334,"msg":"request completed"} -{"level":30,"time":1790408018866,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXJBJV3807BHBFN5S1J","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018871,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXJBJV3807BHBFN5S1J","res":{"statusCode":202},"responseTime":5.396490000000085,"msg":"request completed"} -{"level":30,"time":1790408018879,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXZX0ABKYVBY9ZTNTH9","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018885,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JXZX0ABKYVBY9ZTNTH9","res":{"statusCode":202},"responseTime":5.91953199999989,"msg":"request completed"} -{"level":30,"time":1790408018893,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYDQA2MT149ZXET8XDC","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018895,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYDQA2MT149ZXET8XDC","res":{"statusCode":201},"responseTime":1.6295439999994414,"msg":"request completed"} -{"level":30,"time":1790408018896,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYGEHZECWTJNPV5CJVK","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018899,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYGEHZECWTJNPV5CJVK","res":{"statusCode":200},"responseTime":3.3800209999999424,"msg":"request completed"} -{"level":30,"time":1790408018908,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYWF1Z6Y8YFD24BMCNK","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018913,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JYWF1Z6Y8YFD24BMCNK","res":{"statusCode":202},"responseTime":4.775786000000153,"msg":"request completed"} -{"level":30,"time":1790408018920,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZ8P6JQC0MCXERDQG8A","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018922,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZ8P6JQC0MCXERDQG8A","res":{"statusCode":201},"responseTime":1.5908949999993638,"msg":"request completed"} -{"level":30,"time":1790408018923,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZBFX4VJZTS4YKEPZRK","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":50,"time":1790408018926,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZBFX4VJZTS4YKEPZRK","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"res":{"statusCode":500},"err":{"type":"DatabaseError","message":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\"","stack":"error: invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\"\n at /workspace/krona-staff/node_modules/pg/lib/client.js:694:17\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async SyncService.executeCommand (/workspace/krona-staff/src/domain/sync/service.ts:755:9)\n at async (/workspace/krona-staff/src/domain/sync/service.ts:701:33)\n at async Database.tenantTransaction (/workspace/krona-staff/src/infrastructure/database.ts:30:22)\n at async Object. (/workspace/krona-staff/src/sync.ts:390:25)","length":180,"name":"error","severity":"ERROR","code":"22007","where":"unnamed portal parameter $6 = '...'","file":"datetime.c","line":"4140","routine":"DateTimeParseError"},"msg":"invalid input syntax for type timestamp with time zone: \"e2e-not-a-timestamp\""} -{"level":30,"time":1790408018927,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZBFX4VJZTS4YKEPZRK","res":{"statusCode":500},"responseTime":3.56025099999988,"msg":"request completed"} -{"level":30,"time":1790408018929,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZHQDMJQN1239C4STY6","req":{"method":"POST","url":"/api/v1/staff/session","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018929,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZHQDMJQN1239C4STY6","res":{"statusCode":200},"responseTime":0.275908999999956,"msg":"request completed"} -{"level":30,"time":1790408018931,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZKAZRYGPJS1C4JH86J","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018936,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4JZKAZRYGPJS1C4JH86J","res":{"statusCode":201},"responseTime":5.502994999999828,"msg":"request completed"} -{"level":30,"time":1790408018944,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K00QZ7RA4HCX365PH9C","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018952,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K00QZ7RA4HCX365PH9C","res":{"statusCode":202},"responseTime":7.422302000000855,"msg":"request completed"} -{"level":30,"time":1790408018960,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0GZZ935P4K7N775AKH","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018961,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0GZZ935P4K7N775AKH","res":{"statusCode":201},"responseTime":1.3733540000002904,"msg":"request completed"} -{"level":30,"time":1790408018962,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0J9ZACFMJQKXWB42BF","req":{"method":"POST","url":"/api/v1/staff/sync/push","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018966,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0J9ZACFMJQKXWB42BF","res":{"statusCode":200},"responseTime":4.033708999999362,"msg":"request completed"} -{"level":30,"time":1790408018968,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0R231R31H7Y82XKEFW","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018969,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0R231R31H7Y82XKEFW","res":{"statusCode":201},"responseTime":1.091668000000027,"msg":"request completed"} -{"level":30,"time":1790408018971,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0VXYZRT371QPNE7KZA","req":{"method":"POST","url":"/api/v1/staff/sync/ack","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018973,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0VXYZRT371QPNE7KZA","res":{"statusCode":200},"responseTime":2.2560160000002725,"msg":"request completed"} -{"level":30,"time":1790408018975,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0ZTN3QWGTMYH903DYA","req":{"method":"POST","url":"/api/v1/staff/sync/devices","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018976,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K0ZTN3QWGTMYH903DYA","res":{"statusCode":201},"responseTime":1.3257619999994859,"msg":"request completed"} -{"level":30,"time":1790408018977,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K111C5QFY8DC05HAMNK","req":{"method":"POST","url":"/api/v1/staff/sync/devices/01M3EA4K0ZYSXA5WW5PZG2TNS5/revoke","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35806},"msg":"incoming request"} -{"level":30,"time":1790408018980,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K111C5QFY8DC05HAMNK","res":{"statusCode":200},"responseTime":2.1610540000001492,"msg":"request completed"} -{"level":30,"time":1790408018981,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K15V20PHSJGB9EQP4WN","req":{"method":"GET","url":"/api/v1/staff/sync/status","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35792},"msg":"incoming request"} -{"level":30,"time":1790408018982,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K15V20PHSJGB9EQP4WN","res":{"statusCode":403},"err":{"type":"ForbiddenError","message":"Устройство отозвано","stack":"ForbiddenError: Устройство отозвано\n at Object.forbidden (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:33:12)\n at handleSyncError (/workspace/krona-staff/src/sync.ts:443:39)\n at Object. (/workspace/krona-staff/src/sync.ts:249:9)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)","status":403,"statusCode":403,"expose":true},"msg":"Устройство отозвано"} -{"level":30,"time":1790408018982,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K15V20PHSJGB9EQP4WN","res":{"statusCode":403},"responseTime":1.4805010000000038,"msg":"request completed"} -{"level":30,"time":1790408019100,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K4VD2Y9VX05D0YVHRPQ","req":{"method":"GET","url":"/api/v1/staff/live","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019100,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K4VD2Y9VX05D0YVHRPQ","res":{"statusCode":200},"responseTime":0.3551319999996849,"msg":"request completed"} -{"level":30,"time":1790408019106,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K52MQKWRNJHJ052QT1C","req":{"method":"GET","url":"/api/v1/staff/ready","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} -{"level":30,"time":1790408019113,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K52MQKWRNJHJ052QT1C","res":{"statusCode":200},"responseTime":7.321270999999797,"msg":"request completed"} -{"level":30,"time":1790408019144,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K68VG1ZD7J17S2G4TZV","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019145,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K68VG1ZD7J17S2G4TZV","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:280:21)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408019145,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K68VG1ZD7J17S2G4TZV","res":{"statusCode":401},"responseTime":0.6766259999994872,"msg":"request completed"} -{"level":30,"time":1790408019147,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6BA91KQ3B0K2DV1R8Z","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} -{"level":30,"time":1790408019149,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6BA91KQ3B0K2DV1R8Z","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:280:21)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408019149,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6BA91KQ3B0K2DV1R8Z","res":{"statusCode":401},"responseTime":2.714422000000013,"msg":"request completed"} -{"level":30,"time":1790408019151,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6FC17V38828NK5AWDH","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019156,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6FC17V38828NK5AWDH","res":{"statusCode":200},"responseTime":5.406590999999935,"msg":"request completed"} -{"level":30,"time":1790408019161,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6SBM3C4B20HGWAFBMZ","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} -{"level":30,"time":1790408019168,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K6SBM3C4B20HGWAFBMZ","res":{"statusCode":202},"responseTime":7.204690999999912,"msg":"request completed"} -{"level":30,"time":1790408019178,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7AC5R9N6168RDHC6ZK","req":{"method":"POST","url":"/api/v1/staff/attendance/events","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019181,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7AC5R9N6168RDHC6ZK","res":{"statusCode":201},"responseTime":2.922958000000108,"msg":"request completed"} -{"level":30,"time":1790408019183,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7FA1GFE2QZ11B20ZRS","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} -{"level":30,"time":1790408019189,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7FA1GFE2QZ11B20ZRS","res":{"statusCode":202},"responseTime":5.149693999999727,"msg":"request completed"} -{"level":30,"time":1790408019196,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7WVTQDXRJXTNYDGR89","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4K7MJGQJ2T2YKG46NF7B/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019199,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K7WVTQDXRJXTNYDGR89","res":{"statusCode":200},"responseTime":2.3117400000001,"msg":"request completed"} -{"level":30,"time":1790408019200,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K80FDTYG9ES87Q9ZQ7W","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} -{"level":30,"time":1790408019200,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K80FDTYG9ES87Q9ZQ7W","res":{"statusCode":403},"err":{"type":"ForbiddenError","message":"Недостаточно прав для просмотра посещаемости.","stack":"ForbiddenError: Недостаточно прав для просмотра посещаемости.\n at Object.forbidden (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:33:12)\n at _Reply.sensibleForbidden [as forbidden] (/workspace/krona-staff/node_modules/@fastify/sensible/index.js:55:44)\n at Object. (/workspace/krona-staff/src/portal.ts:283:20)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)","status":403,"statusCode":403,"expose":true},"msg":"Недостаточно прав для просмотра посещаемости."} -{"level":30,"time":1790408019201,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K80FDTYG9ES87Q9ZQ7W","res":{"statusCode":403},"responseTime":0.48845000000073924,"msg":"request completed"} -{"level":30,"time":1790408019202,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K810TRXD0SQ27W7YDGR","req":{"method":"POST","url":"/api/v1/staff/employees","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019202,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K810TRXD0SQ27W7YDGR","res":{"statusCode":403},"err":{"type":"ForbiddenError","message":"Недостаточно прав для этой операции.","stack":"ForbiddenError: Недостаточно прав для этой операции.\n at Object.forbidden (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:33:12)\n at requirePermission (/workspace/krona-staff/src/portal.ts:1383:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:454:23)","status":403,"statusCode":403,"expose":true},"msg":"Недостаточно прав для этой операции."} -{"level":30,"time":1790408019202,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K810TRXD0SQ27W7YDGR","res":{"statusCode":403},"responseTime":0.5087550000007468,"msg":"request completed"} -{"level":30,"time":1790408019203,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8324R3A78MXKWG5GN2","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} -{"level":30,"time":1790408019205,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8324R3A78MXKWG5GN2","res":{"statusCode":200},"responseTime":2.2520119999999224,"msg":"request completed"} -{"level":30,"time":1790408019207,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K87MB5BVVM753W72HHZ","req":{"method":"POST","url":"/api/v1/staff/imports/owner-workbook","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019212,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K87MB5BVVM753W72HHZ","res":{"statusCode":202},"responseTime":5.460973000000195,"msg":"request completed"} -{"level":30,"time":1790408019220,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8M7PQ0714YSD1M4CQP","req":{"method":"POST","url":"/api/v1/staff/employees/01M3EA4K8BXTNNKH3PQYXZJNBE/access-token","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019222,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8M7PQ0714YSD1M4CQP","res":{"statusCode":200},"responseTime":1.5780409999997573,"msg":"request completed"} -{"level":30,"time":1790408019222,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8P75YVNTFTC53C6RE4","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} -{"level":30,"time":1790408019225,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8P75YVNTFTC53C6RE4","res":{"statusCode":200},"responseTime":2.076332000000548,"msg":"request completed"} -{"level":30,"time":1790408019225,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8S1H145G1H6N733Y63","req":{"method":"PATCH","url":"/api/v1/staff/employees/01M3EA4K8BXTNNKH3PQYXZJNBE","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35820},"msg":"incoming request"} -{"level":30,"time":1790408019227,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8S1H145G1H6N733Y63","res":{"statusCode":200},"responseTime":1.5953489999992598,"msg":"request completed"} -{"level":30,"time":1790408019228,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8WFVAZS9JJ3Y48JK1Z","req":{"method":"GET","url":"/api/v1/staff/portal","host":"127.0.0.1:35389","remoteAddress":"127.0.0.1","remotePort":35824},"msg":"incoming request"} -{"level":30,"time":1790408019228,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8WFVAZS9JJ3Y48JK1Z","res":{"statusCode":401},"err":{"type":"UnauthorizedError","message":"Требуется действующий ключ доступа.","stack":"UnauthorizedError: Требуется действующий ключ доступа.\n at Object.unauthorized (/workspace/krona-staff/node_modules/@fastify/sensible/lib/httpErrors.js:25:12)\n at resolveToken (/workspace/krona-staff/src/portal.ts:1337:37)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async Object. (/workspace/krona-staff/src/portal.ts:280:21)","status":401,"statusCode":401,"expose":true},"msg":"Требуется действующий ключ доступа."} -{"level":30,"time":1790408019229,"pid":1688811,"hostname":"grok-bot-vm-420973429","reqId":"01M3EA4K8WFVAZS9JJ3Y48JK1Z","res":{"statusCode":401},"responseTime":0.9479200000005221,"msg":"request completed"} diff --git a/tests/e2e/evidence/n13-race.txt b/tests/e2e/report-evidence/n13-race.txt similarity index 100% rename from tests/e2e/evidence/n13-race.txt rename to tests/e2e/report-evidence/n13-race.txt diff --git a/tests/e2e/evidence/n5-after.txt b/tests/e2e/report-evidence/n5-after.txt similarity index 100% rename from tests/e2e/evidence/n5-after.txt rename to tests/e2e/report-evidence/n5-after.txt diff --git a/tests/e2e/evidence/n5-before.txt b/tests/e2e/report-evidence/n5-before.txt similarity index 100% rename from tests/e2e/evidence/n5-before.txt rename to tests/e2e/report-evidence/n5-before.txt From 27499da19120cd1f0719b1634f275af486e4f266 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:20:47 +0700 Subject: [PATCH 15/28] =?UTF-8?q?ci:=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=20windows,=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=D0=B0=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9,=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=8F=D0=B2=D0=B8=D1=82=D1=81=D1=8F=20=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: владелец требует проверку запуска стенда на Windows 11, но Windows-раннера у git.ochenstarik.ru сейчас нет. Задача без подходящего раннера висела бы в очереди и держала статус прогона «в ожидании», поэтому она выключена по умолчанию и включается переменной репозитория KRONA_WINDOWS_RUNNER=true. Что: npm ci, тест запуска без .cmd-обёрток (node vitest.mjs, без npx), а при заданном секрете WINDOWS_E2E_PG_ADMIN_URL — полный run-e2e с выгрузкой evidence артефактом. actionlint (метки docker, docker-host, windows) — 0 замечаний. Сама задача ни разу не запускалась — не проверено. --- .forgejo/workflows/ci.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index ebf9011..1e0cfd7 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -102,6 +102,36 @@ jobs: retention-days: 14 if-no-files-found: warn + # Windows 11 (проект разрабатывается под Windows). Windows-раннера у сервера пока + # НЕТ, поэтому задача включается только переменной репозитория + # KRONA_WINDOWS_RUNNER=true (иначе пропускается и не висит в очереди). + # Раннер: forgejo-runner в режиме host с меткой `windows`, Node 22+. + # e2e на Windows идёт, только если задан секрет WINDOWS_E2E_PG_ADMIN_URL + # (bootstrap-админ локальной PostgreSQL 17 на раннере). НЕ ПРОВЕРЕНО: не запускалась. + windows: + if: vars.KRONA_WINDOWS_RUNNER == 'true' + runs-on: windows + env: + E2E_PG_ADMIN_URL: ${{ secrets.WINDOWS_E2E_PG_ADMIN_URL }} + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: { node-version: 22, cache: npm } + - run: npm ci + - name: spawn without .cmd wrappers + run: node node_modules/vitest/vitest.mjs run tests/e2e/harness/node-commands.test.ts + - name: e2e on Windows (needs local PostgreSQL 17) + if: env.E2E_PG_ADMIN_URL != '' + run: node scripts/test/run-e2e.mjs + - name: upload Windows e2e evidence + if: always() && env.E2E_PG_ADMIN_URL != '' + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: e2e-evidence-windows + path: tests/e2e/evidence/ + retention-days: 14 + if-no-files-found: warn + # docker build требует Docker daemon, которого нет в контейнере метки `docker`. # Нужен раннер с меткой `docker-host` (хост с доступом к Docker). Пока такого # раннера нет, задача ждёт в очереди и не блокирует verify/format/e2e. From 0453168d70009491eea095a5d6a857514eafc3d6 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:21:22 +0700 Subject: [PATCH 16/28] =?UTF-8?q?test(e2e):=20=D0=B4=D0=B2=D0=BE=D0=B9?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20ID=20=C2=AB=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D1=86/=D0=BC=D0=BE=D0=B9=C2=BB=20=D0=B2=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=D1=85=20=D1=81=D1=86?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B5=D0=B2=20=D0=B8=20known-def?= =?UTF-8?q?ects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: аудит владельца (docs/audit/2026-09-26/AUDIT.md) стал основным реестром дефектов; без сопоставления исполнители и приёмка говорят о разных ID для одной ошибки (TASK-GROK-2 §2). Что: теги переименованы по таблице владельца ([K3/N2], [K13/SYNC-A], [S5/SYNC-C], [D6/OWN-01], [K17/OWN-10] и т. д.), ключи known-defects.json — так же; N9–N12, F7, F10 остаются одиночными, как в таблице. Сверх таблицы, по тексту AUDIT.md: K1/SYNC-I (анонимный доступ без токенов — это K1 на /sync), K1/PILOT-1 (подстановки без :? в пилотном compose прямо названы в K1), K2/PILOT-2 (NODE_ENV=development в пилоте — суть K2). SYNC-C0, SYNC-K, OWN-03..06/08/09, PILOT-3 ID владельца не имеют. run-e2e принимает «/» в теге. Прогон: 38 red / 9 green, храповик OK — те же сценарии, новые имена. --- scripts/test/run-e2e.mjs | 2 +- tests/e2e/10-core-defects.e2e.ts | 14 ++++---- tests/e2e/20-sync-defects.e2e.ts | 20 ++++++------ tests/e2e/30-owner-decisions.e2e.ts | 10 +++--- tests/e2e/40-compose-pilot.e2e.ts | 4 +-- tests/e2e/known-defects.json | 50 ++++++++++++++--------------- 6 files changed, 50 insertions(+), 50 deletions(-) diff --git a/scripts/test/run-e2e.mjs b/scripts/test/run-e2e.mjs index 2fe8f68..1db7fab 100644 --- a/scripts/test/run-e2e.mjs +++ b/scripts/test/run-e2e.mjs @@ -59,7 +59,7 @@ const known = strict const byId = new Map(); for (const file of results.testResults) { for (const test of file.assertionResults) { - const id = /^\[([A-Z0-9-]+)\]/.exec(test.title)?.[1] ?? 'UNTAGGED'; + const id = /^\[([A-Z0-9/-]+)\]/.exec(test.title)?.[1] ?? 'UNTAGGED'; const entry = byId.get(id) ?? { passed: 0, failed: 0, tests: [] }; if (test.status === 'passed') entry.passed += 1; else if (test.status === 'failed') entry.failed += 1; diff --git a/tests/e2e/10-core-defects.e2e.ts b/tests/e2e/10-core-defects.e2e.ts index d2d8d74..f01cb91 100644 --- a/tests/e2e/10-core-defects.e2e.ts +++ b/tests/e2e/10-core-defects.e2e.ts @@ -42,7 +42,7 @@ async function accrualsFor(employeeId: string) { } describe('Основной API на реальной PostgreSQL', () => { - it('[N1] менеджер создаёт сотрудника через POST /employees → 201', async () => { + it('[K4/N1] менеджер создаёт сотрудника через POST /employees → 201', async () => { const number = `E2E-${randomUlid().slice(-8)}`; const response = await api('POST', '/employees', { token: ctx().managerToken, @@ -59,7 +59,7 @@ describe('Основной API на реальной PostgreSQL', () => { expect(rows).toHaveLength(1); }); - it('[N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка', async () => { + it('[K3/N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка', async () => { const [unit] = await createOrgUnits(1); const [employee] = await importEmployees(1); await assignHourly(employee!.id, unit!.id); @@ -88,7 +88,7 @@ describe('Основной API на реальной PostgreSQL', () => { expect(total).toBe(BigInt(8 * SYNTHETIC_RATE_MINOR)); }); - it('[N4] пересекающиеся расчёты не начисляют одну смену дважды', async () => { + it('[K5/N4] пересекающиеся расчёты не начисляют одну смену дважды', async () => { const [unit] = await createOrgUnits(1); const [employee] = await importEmployees(1); await assignHourly(employee!.id, unit!.id); @@ -136,7 +136,7 @@ describe('Основной API на реальной PostgreSQL', () => { ); }); - it('[N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1', async () => { + it('[K12/N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1', async () => { const [employee] = await importEmployees(1); const employeeToken = await issueEmployeeToken(employee!.id); let connections = 0; @@ -227,7 +227,7 @@ describe('Основной API на реальной PostgreSQL', () => { }); }); - it('[F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)', async () => { + it('[K1/F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)', async () => { const portal = await api('GET', '/portal', { base: 'open' }); const payroll = await api('GET', '/payroll', { base: 'open' }); const write = await api('POST', '/professions', { @@ -241,7 +241,7 @@ describe('Основной API на реальной PostgreSQL', () => { }); }); - it('[F3] cookie сессии не содержит сырой токен и отзывается при выходе', async () => { + it('[K10/F3] cookie сессии не содержит сырой токен и отзывается при выходе', async () => { const login = await api('POST', '/session', { body: { access_token: ctx().managerToken } }); expect(login.status, describeResponse(login)).toBe(200); const setCookie = login.headers.get('set-cookie') ?? ''; @@ -311,7 +311,7 @@ describe('Основной API на реальной PostgreSQL', () => { expect(response.status, describeResponse(response)).toBe(400); }); - it('[F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)', async () => { + it('[K11/F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)', async () => { const statuses: number[] = []; for (let attempt = 0; attempt < 30; attempt += 1) { const response = await api('POST', '/session', { diff --git a/tests/e2e/20-sync-defects.e2e.ts b/tests/e2e/20-sync-defects.e2e.ts index 3758c80..14e10d8 100644 --- a/tests/e2e/20-sync-defects.e2e.ts +++ b/tests/e2e/20-sync-defects.e2e.ts @@ -57,7 +57,7 @@ async function pullAll(device: Device, cursor: string | null = null) { } describe('Офлайн-синхронизация на реальной PostgreSQL', () => { - it('[SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)', async () => { + it('[K13/SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)', async () => { const [unit] = await createOrgUnits(1); const [employee] = await importEmployees(1); const device = await registerDevice(unit!.id); @@ -86,7 +86,7 @@ describe('Офлайн-синхронизация на реальной PostgreS ).toEqual({ http: 200, result: 'rejected', stored: null }); }); - it('[SYNC-B] устройство не может утвердить табель (status=approved отклоняется)', async () => { + it('[K13/SYNC-B] устройство не может утвердить табель (status=approved отклоняется)', async () => { const [employee] = await importEmployees(1); const device = await registerDevice(); const entryId = randomUlid(); @@ -124,7 +124,7 @@ describe('Офлайн-синхронизация на реальной PostgreS expect(types.has('employee') && types.has('org_unit')).toBe(true); }); - it('[SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично', async () => { + it('[S5/SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично', async () => { const employees = await importEmployees(120); const device = await registerDevice(); const { changes } = await pullAll(device, null); @@ -135,7 +135,7 @@ describe('Офлайн-синхронизация на реальной PostgreS expect(missing, `не доставлено сотрудников: ${missing} из ${employees.length}`).toBe(0); }); - it('[SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull', async () => { + it('[S5/SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull', async () => { const device = await registerDevice(); // Курсор берём из /sync/status, чтобы сценарий не зависел от начальной загрузки (SYNC-C0). const status = await api('GET', '/sync/status', { token: device.token }); @@ -153,7 +153,7 @@ describe('Офлайн-синхронизация на реальной PostgreS ); }); - it('[SYNC-E] отметка уволенного сотрудника через sync отклоняется', async () => { + it('[S4/SYNC-E] отметка уволенного сотрудника через sync отклоняется', async () => { const [employee] = await importEmployees(1); const dismiss = await api('PATCH', `/employees/${employee!.id}`, { token: ctx().managerToken, @@ -171,7 +171,7 @@ describe('Офлайн-синхронизация на реальной PostgreS expect(response.body?.results?.[0]?.status, describeResponse(response)).toBe('rejected'); }); - it('[SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется', async () => { + it('[S4/SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется', async () => { const [unitA, unitB] = await createOrgUnits(2); const [employee] = await importEmployees(1); const device = await registerDevice(unitA!.id); @@ -202,7 +202,7 @@ describe('Офлайн-синхронизация на реальной PostgreS ).toEqual({ ownOrgUnit: unitA!.id, foreign: 'rejected' }); }); - it('[SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)', async () => { + it('[S3/SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)', async () => { const [employee] = await importEmployees(1); const device = await registerDevice(); const good = command('attendance_event', { @@ -225,7 +225,7 @@ describe('Офлайн-синхронизация на реальной PostgreS ).toEqual({ http: 200, statuses: ['applied', 'rejected'] }); }); - it('[SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)', async () => { + it('[S8/SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)', async () => { const login = await api('POST', '/session', { body: { access_token: ctx().managerToken } }); const cookie = /(__Host-krona_staff_session=[^;]*)/.exec(login.headers.get('set-cookie') ?? '')?.[1] ?? ''; @@ -236,7 +236,7 @@ describe('Офлайн-синхронизация на реальной PostgreS expect(response.status, describeResponse(response)).toBe(403); }); - it('[SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)', async () => { + it('[K1/SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)', async () => { const response = await api('POST', '/sync/devices', { base: 'open', body: { @@ -247,7 +247,7 @@ describe('Офлайн-синхронизация на реальной PostgreS expect(response.status, describeResponse(response)).toBe(401); }); - it('[SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events', async () => { + it('[S2/SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events', async () => { const [employee] = await importEmployees(1); const device = await registerDevice(); const response = await push(device, [ diff --git a/tests/e2e/30-owner-decisions.e2e.ts b/tests/e2e/30-owner-decisions.e2e.ts index 18292b0..2912a63 100644 --- a/tests/e2e/30-owner-decisions.e2e.ts +++ b/tests/e2e/30-owner-decisions.e2e.ts @@ -89,7 +89,7 @@ async function ledgerFor(employeeId: string) { } describe('Решения владельца: роли, пакеты зарплаты, согласие на биометрию', () => { - it('[OWN-01] менеджер точки A запускает расчёт для точки B → 403', async () => { + it('[D6/OWN-01] менеджер точки A запускает расчёт для точки B → 403', async () => { const w = await world(false); const managerA = await grant('point_manager', [w.unitA.id]); const batch = await createBatch(managerA, w.unitB.id, w.day); @@ -100,7 +100,7 @@ describe('Решения владельца: роли, пакеты зарпла expect({ batch: batch.status, legacy: legacy.status }).toEqual({ batch: 403, legacy: 403 }); }); - it('[OWN-02] менеджер точки отправляет пакет на согласование → 403', async () => { + it('[D6/OWN-02] менеджер точки отправляет пакет на согласование → 403', async () => { const w = await world(false); const managerA = await grant('point_manager', [w.unitA.id]); const created = await createBatch(managerA, w.unitA.id, w.day); @@ -169,7 +169,7 @@ describe('Решения владельца: роли, пакеты зарпла }).toEqual({ accrual: true, payout: true, editShift: 409, resubmit: 409 }); }); - it('[OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру', async () => { + it('[K19/OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру', async () => { const accountant = await grant('accountant'); const director = await grant('director'); const w = await world(); @@ -233,7 +233,7 @@ describe('Решения владельца: роли, пакеты зарпла }); }); - it('[OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»', async () => { + it('[K17/OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»', async () => { const [employee] = await importEmployees(1); const response = await api('GET', `/terminal/employees/${employee!.id}/enrollment`, { token: ctx().terminalToken, @@ -242,7 +242,7 @@ describe('Решения владельца: роли, пакеты зарпла expect(response.body).toMatchObject({ registration_allowed: false, reason: 'consent_missing' }); }); - it('[OWN-11] согласие отозвано → статус для терминала меняется', async () => { + it('[K17/OWN-11] согласие отозвано → статус для терминала меняется', async () => { const [employee] = await importEmployees(1); const setConsent = (status: 'granted' | 'revoked') => api('PUT', `/employees/${employee!.id}/biometric-consent`, { diff --git a/tests/e2e/40-compose-pilot.e2e.ts b/tests/e2e/40-compose-pilot.e2e.ts index 466662c..a196cf4 100644 --- a/tests/e2e/40-compose-pilot.e2e.ts +++ b/tests/e2e/40-compose-pilot.e2e.ts @@ -27,14 +27,14 @@ function environmentOf(service: string): Record { } describe('deploy/pilot/compose.yaml', () => { - it('[PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}', () => { + it('[K1/PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}', () => { const interpolations = [...raw.matchAll(/\$\{([^}]*)\}/g)].map((match) => match[1]!); expect(interpolations.length).toBeGreaterThan(0); const optional = interpolations.filter((inner) => !/^[A-Z0-9_]+:\?.+$/.test(inner)); expect(optional, 'переменные без :? — пустое значение молча попадёт в контейнер').toEqual([]); }); - it('[PILOT-2] ни один сервис не запускается с NODE_ENV=development', () => { + it('[K2/PILOT-2] ни один сервис не запускается с NODE_ENV=development', () => { const offenders = Object.keys(compose.services).filter( (service) => environmentOf(service).NODE_ENV === 'development', ); diff --git a/tests/e2e/known-defects.json b/tests/e2e/known-defects.json index b3c0cf8..4ec0e14 100644 --- a/tests/e2e/known-defects.json +++ b/tests/e2e/known-defects.json @@ -1,43 +1,43 @@ { - "comment": "ID сценариев, красный цвет которых сейчас ожидаем (открытые дефекты или ещё не реализованные решения владельца). Когда дефект исправлен и все тесты ID зелёные, scripts/test/run-e2e.mjs падает, пока ID не убран отсюда. Добавлять ID сюда можно только вместе с записью в REPORT.md.", + "comment": "ID сценариев, красный цвет которых сейчас ожидаем (открытые дефекты или ещё не реализованные решения владельца). Когда дефект исправлен и все тесты ID зелёные, scripts/test/run-e2e.mjs падает, пока ID не убран отсюда. Добавлять ID сюда можно только вместе с записью в REPORT.md. Ключи — двойные ID «владелец/мой» (docs/audit/2026-09-26/AUDIT.md и TASK-GROK-2 §2), для сценариев без ID владельца — мой ID.", "defects": { - "N1": "POST /employees: 42P08 inconsistent types for $2 на реальной PostgreSQL", - "N2": "подтверждение смены / расчёт / утверждение: staff_outbox.occurred_at NULL (23502)", - "N3": "SSRF через push-endpoint на внутренние адреса", - "N4": "двойное начисление при пересекающихся расчётах (сейчас блокирован N2)", + "K4/N1": "POST /employees: 42P08 inconsistent types for $2 на реальной PostgreSQL", + "K3/N2": "подтверждение смены / расчёт / утверждение: staff_outbox.occurred_at NULL (23502)", + "K12/N3": "SSRF через push-endpoint на внутренние адреса", + "K5/N4": "двойное начисление при пересекающихся расчётах (сейчас блокирован N2)", "N9": "перепривязка чужого push-endpoint", "N10": "справочники доступны терминалу", "N11": "импорт с неверным kind → 500", "N12": "pay-assignment без additionalProperties:false и верхних границ", - "F2": "standalone без токенов даёт права STANDALONE_ACCESS анониму", - "F3": "cookie = сырой токен, logout не отзывает", - "F4": "нет rate limit на вход", + "K1/F2": "standalone без токенов даёт права STANDALONE_ACCESS анониму", + "K10/F3": "cookie = сырой токен, logout не отзывает", + "K11/F4": "нет rate limit на вход", "F7": "Idempotency-Key не используется", "F10": "CSRF: мутации по cookie без Origin разрешены", - "SYNC-A": "устройство само подтверждает смену через upsert_work_session", - "SYNC-B": "устройство само утверждает табель через upsert_timesheet_entry", + "K13/SYNC-A": "устройство само подтверждает смену через upsert_work_session", + "K13/SYNC-B": "устройство само утверждает табель через upsert_timesheet_entry", "SYNC-C0": "начальная загрузка /sync/pull падает 500: column status does not exist (staff_org_units)", - "SYNC-C": "начальная загрузка обрезается на 100 сущностях (сейчас также блокирована SYNC-C0)", - "SYNC-D": "изменения из портала не пишутся в staff_sync_change_log", - "SYNC-E": "отметки уволенных сотрудников принимаются через sync", - "SYNC-F": "sync не сохраняет org_unit_id отметки и принимает чужую точку", - "SYNC-G": "одна битая команда роняет весь пакет (500)", - "SYNC-H": "регистрация устройства по cookie без проверки Origin", - "SYNC-I": "без токенов анонимно регистрируется устройство", - "SYNC-J": "sync принимает отметки вне окна времени", + "S5/SYNC-C": "начальная загрузка обрезается на 100 сущностях (сейчас также блокирована SYNC-C0)", + "S5/SYNC-D": "изменения из портала не пишутся в staff_sync_change_log", + "S4/SYNC-E": "отметки уволенных сотрудников принимаются через sync", + "S4/SYNC-F": "sync не сохраняет org_unit_id отметки и принимает чужую точку", + "S3/SYNC-G": "одна битая команда роняет весь пакет (500)", + "S8/SYNC-H": "регистрация устройства по cookie без проверки Origin", + "K1/SYNC-I": "без токенов анонимно регистрируется устройство", + "S2/SYNC-J": "sync принимает отметки вне окна времени", "SYNC-K": "ack принимает курсор больше выданного сервером", - "PILOT-1": "deploy/pilot/compose.yaml: 14 подстановок без :? (пустые токены/пароли молча проходят)", - "PILOT-2": "deploy/pilot/compose.yaml: app с NODE_ENV=development", - "OWN-01": "решение владельца: роли точки (этап 4 Codex)", - "OWN-02": "решение владельца: пакет отправляет только бухгалтер", + "K1/PILOT-1": "deploy/pilot/compose.yaml: 14 подстановок без :? (пустые токены/пароли молча проходят)", + "K2/PILOT-2": "deploy/pilot/compose.yaml: app с NODE_ENV=development", + "D6/OWN-01": "решение владельца: роли точки (этап 4 Codex)", + "D6/OWN-02": "решение владельца: пакет отправляет только бухгалтер", "OWN-03": "решение владельца: уведомления директорам", "OWN-04": "решение владельца: подписывает только директор", "OWN-05": "решение владельца: ledger пуст до подписи", "OWN-06": "решение владельца: подпись → ledger, неизменяемость", - "OWN-07": "решение владельца: изменение смены после отправки возвращает пакет", + "K19/OWN-07": "решение владельца: изменение смены после отправки возвращает пакет", "OWN-08": "решение владельца: возврат с комментарием", "OWN-09": "решение владельца: смена в чужой точке идёт в зарплату той точки", - "OWN-10": "решение владельца: нет согласия на биометрию → регистрация запрещена", - "OWN-11": "решение владельца: отзыв согласия меняет статус для терминала" + "K17/OWN-10": "решение владельца: нет согласия на биометрию → регистрация запрещена", + "K17/OWN-11": "решение владельца: отзыв согласия меняет статус для терминала" } } From ac8ab3cc02bb70479c876f8b1456b352874d802a Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:24:02 +0700 Subject: [PATCH 17/28] =?UTF-8?q?test(e2e):=20=D1=81=D1=86=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20K6=E2=80=93K9,=20S9,=20A4=20=D0=B8?= =?UTF-8?q?=20N12-DATE=20=D0=B8=D0=B7=20=D0=B0=D1=83=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=D0=B0=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BB=D1=8C=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: TASK-GROK-2 §3 — денежные дефекты K6–K9, S9, A4 и дата расчёта были в AUDIT.md, но не покрыты стендом; без красных сценариев исправления Codex нечем принимать. Что (tests/e2e/50-money-and-errors.e2e.ts, всё красное и внесено в known-defects.json): - K6/D5: отклонение смены из подписанной ведомости → 409 или сторно. Сейчас падает на предусловии: подтверждение смены 500 (K3). - K7/D2: две записи начисления за один день (две точки) и повторный импорт с другой суммой → итог = сумма по книге. Факт: 22200 вместо 33300. - K8/D1: после подписи меняется ставка, затем проверочный пересчёт (предполагаемый контракт C4 GET /payroll/runs/:id/verify). Блокирован K3. - K9/D3: официант по пресету waiter_upsell: params.shift_rate_minor не сохраняется (сам D3, до K3); далее начисление = оплата смены (после K3). - S9: удаление точки с устройством мигратором → 23502 вместо удаления или 23503 (публичного API удаления нет — так же, как в live-sync.mjs владельца). - A4: тела 500 не должны содержать SQLSTATE и текст PostgreSQL. - N12-DATE: month=2026-13 → 400 (факт 500, 22008); 2026-02-30 уже 400. Прогон run-e2e: 45 red / 9 green, храповик OK. --- tests/e2e/50-money-and-errors.e2e.ts | 287 +++++++++++++++++++++++++++ tests/e2e/known-defects.json | 9 +- 2 files changed, 295 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/50-money-and-errors.e2e.ts diff --git a/tests/e2e/50-money-and-errors.e2e.ts b/tests/e2e/50-money-and-errors.e2e.ts new file mode 100644 index 0000000..4093d81 --- /dev/null +++ b/tests/e2e/50-money-and-errors.e2e.ts @@ -0,0 +1,287 @@ +// Недостающие сценарии из аудита владельца (TASK-GROK-2 §3): денежная логика K6–K9, +// удаление точки с устройством (S9), утечка ошибок PostgreSQL (A4), дата расчёта (N12-DATE). +// Каждый тест проверяет ПРАВИЛЬНОЕ поведение: красный = открытый дефект. Где путь +// упирается в K3 (outbox без occurred_at), assert предусловия прямо называет K3. +/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */ +import pg from 'pg'; +import { describe, expect, it } from 'vitest'; +import { api, ctx, dbQuery, describeResponse, type ApiResponse } from './harness/client.js'; +import { randomUlid, synthetic } from './harness/context.js'; +import { + SYNTHETIC_RATE_MINOR, + assignHourly, + createOrgUnits, + daysAgo, + importEmployees, + isoDate, + workedShift, +} from './harness/fixtures.js'; + +const monthOf = (date: Date) => date.toISOString().slice(0, 7); + +async function ledgerTotal(employeeId: string, kinds = ['accrual', 'adjustment']) { + const rows = await dbQuery<{ total: string }>( + `SELECT COALESCE(SUM(amount_minor), 0)::text AS total FROM staff_payroll_ledger + WHERE employee_id = $1 AND kind = ANY($2::text[])`, + [employeeId, kinds], + ); + return BigInt(rows[0]!.total); +} + +async function confirmShift(sessionId: string) { + const confirm = await api('PATCH', `/work-sessions/${sessionId}`, { + token: ctx().managerToken, + body: { status: 'confirmed' }, + }); + expect( + confirm.status, + `подтверждение смены (предусловие; падает, пока открыт K3): ${describeResponse(confirm)}`, + ).toBe(200); +} + +/** Расчёт и утверждение (подпись) ведомости точки за месяц дня `day`. */ +async function calculateAndApprove(unitId: string, day: Date): Promise { + const calculate = await api('POST', '/payroll/calculate', { + token: ctx().managerToken, + body: { month: monthOf(day), org_unit_id: unitId }, + }); + expect(calculate.status, `расчёт (предусловие, K3): ${describeResponse(calculate)}`).toBe(200); + const runId = (calculate.body.run_id ?? calculate.body.id) as string; + const approve = await api('POST', `/payroll/runs/${runId}/approve`, { + token: ctx().managerToken, + }); + expect(approve.status, `утверждение (предусловие, K3): ${describeResponse(approve)}`).toBe(200); + return runId; +} + +async function payRuleId(code: string): Promise { + const response = await api('GET', '/pay-rules', { token: ctx().managerToken }); + expect(response.status, describeResponse(response)).toBe(200); + const rule = (response.body.pay_rules as Array<{ id: string; code: string }>).find( + (item) => item.code === code, + ); + expect(rule, `правило ${code} должно быть в пресете`).toBeTruthy(); + return rule!.id; +} + +/** Признаки ошибки PostgreSQL в теле ответа клиенту (SQLSTATE, имена отношений/столбцов). */ +function postgresLeak(response: ApiResponse): string[] { + const leaks: string[] = []; + const body = (response.body ?? {}) as Record; + if (typeof body.code === 'string' && /^[0-9A-Z]{5}$/.test(body.code)) { + leaks.push(`code=${body.code}`); + } + if ( + /relation "|column "|violates|constraint|syntax for type|deduced for parameter/i.test( + response.text, + ) + ) { + leaks.push(`text=${response.text.slice(0, 120)}`); + } + return leaks; +} + +describe('Деньги, S9, A4 и даты на реальной PostgreSQL', () => { + it('[K6/D5] отклонение смены из подписанной ведомости → 409 или сторно (начисление не остаётся)', async () => { + const [unit] = await createOrgUnits(1); + const [employee] = await importEmployees(1); + await assignHourly(employee!.id, unit!.id); + const day = daysAgo(4); + const sessionId = await workedShift(employee!.id, unit!.id, day, 8); + await confirmShift(sessionId); + await calculateAndApprove(unit!.id, day); + expect(await ledgerTotal(employee!.id)).toBe(BigInt(8 * SYNTHETIC_RATE_MINOR)); + + const reject = await api('PATCH', `/work-sessions/${sessionId}`, { + token: ctx().managerToken, + body: { status: 'rejected', correction_note: synthetic('отказ после подписи') }, + }); + if (reject.status === 409) return; // смена подписанной ведомости неизменяема — верно + expect(reject.status, describeResponse(reject)).toBe(200); + expect( + await ledgerTotal(employee!.id), + 'после отклонения оплаченной смены должно быть сторно: итог начислений 0', + ).toBe(0n); + }); + + it('[K7/D2] повторный импорт книги: итог в реестре равен сумме по книге (две точки в один день)', async () => { + const [employee] = await importEmployees(1); + const date = isoDate(daysAgo(5)); + const keyA = `xlsx:payroll:accrual:e2e-${randomUlid()}-unit-a`; + const keyB = `xlsx:payroll:accrual:e2e-${randomUlid()}-unit-b`; + const entry = (externalKey: string, amount: number) => ({ + external_key: externalKey, + employee_external_ref: employee!.external_ref, + business_date: date, + kind: 'accrual', + amount_minor: amount, + }); + const importBook = (amountA: number, amountB: number) => + api('POST', '/imports/owner-workbook', { + token: ctx().managerToken, + body: { + source_name: synthetic('import-book'), + payroll_entries: [entry(keyA, amountA), entry(keyB, amountB)], + }, + }); + + const first = await importBook(11_100, 22_200); + expect(first.status, describeResponse(first)).toBeLessThan(300); + const afterFirst = await ledgerTotal(employee!.id); + const second = await importBook(15_500, 22_200); + expect(second.status, describeResponse(second)).toBeLessThan(300); + const afterSecond = await ledgerTotal(employee!.id); + expect({ afterFirst, afterSecond }).toEqual({ + afterFirst: 33_300n, // 111,00 ₽ + 222,00 ₽ по книге + afterSecond: 37_700n, // 155,00 ₽ + 222,00 ₽ после исправления суммы точки A + }); + }); + + it('[K8/D1] подписанная ведомость воспроизводится после смены ставки (сумма та же)', async () => { + const [unit] = await createOrgUnits(1); + const [employee] = await importEmployees(1); + await assignHourly(employee!.id, unit!.id); + const day = daysAgo(6); + const sessionId = await workedShift(employee!.id, unit!.id, day, 8); + await confirmShift(sessionId); + const runId = await calculateAndApprove(unit!.id, day); + const signed = await api('GET', `/payroll/runs/${runId}`, { token: ctx().managerToken }); + expect(signed.status, describeResponse(signed)).toBe(200); + + // Меняем ставку «задним числом» (то же effective_from) после подписи. + const change = await api('PUT', `/employees/${employee!.id}/pay-assignment`, { + token: ctx().managerToken, + body: { + pay_rule_id: await payRuleId('hourly'), + org_unit_id: unit!.id, + rate_minor: SYNTHETIC_RATE_MINOR * 3, + effective_from: '2026-01-01', + }, + }); + expect(change.status, describeResponse(change)).toBe(200); + + // Предполагаемый контракт C4 (NOTES-FOR-EXECUTORS): пересчёт подписанной ведомости + // для проверки по снимку правил и ставок на момент подписи. + const verify = await api('GET', `/payroll/runs/${runId}/verify`, { + token: ctx().managerToken, + }); + expect(verify.status, `C4 verify: ${describeResponse(verify)}`).toBe(200); + expect({ + matches: verify.body.matches, + recalculated: String(verify.body.recalculated_total_minor), + }).toEqual({ matches: true, recalculated: String(8 * SYNTHETIC_RATE_MINOR) }); + }); + + it('[K9/D3] официант по пресету получает оплату смены из параметров пресета', async () => { + const [unit] = await createOrgUnits(1); + const [employee] = await importEmployees(1); + const shiftRate = 111_111; // синтетические 1 111,11 ₽ за смену + // Предполагаемый контракт: параметры пресета передаются объектом `params` + // (ключи — param_declarations правила). + const assign = await api('PUT', `/employees/${employee!.id}/pay-assignment`, { + token: ctx().managerToken, + body: { + pay_rule_id: await payRuleId('waiter_upsell'), + org_unit_id: unit!.id, + effective_from: '2026-01-01', + params: { + shift_rate_minor: shiftRate, + percent_bp: 0, + upsell_rate_minor: 0, + avg_check_target_minor: 99_999_999, + avg_check_bonus_minor: 0, + }, + }, + }); + expect(assign.status, describeResponse(assign)).toBe(200); + const saved = await api('GET', `/employees/${employee!.id}/pay-assignment`, { + token: ctx().managerToken, + }); + expect( + saved.body.params?.shift_rate_minor, + `параметр пресета должен сохраниться: ${describeResponse(saved)}`, + ).toBe(shiftRate); + + const day = daysAgo(7); + const sessionId = await workedShift(employee!.id, unit!.id, day, 8); + await confirmShift(sessionId); + await calculateAndApprove(unit!.id, day); + expect(await ledgerTotal(employee!.id)).toBe(BigInt(shiftRate)); + }); + + it('[S9] удаление точки с привязанным устройством: удалена или понятный отказ, не 23502', async () => { + const [unit] = await createOrgUnits(1); + const device = await api('POST', '/sync/devices', { + token: ctx().managerToken, + body: { + device_code: `E2E-${randomUlid().slice(-10)}`, + name: synthetic('Терминал S9'), + org_unit_id: unit!.id, + }, + }); + expect(device.status, describeResponse(device)).toBe(201); + // Публичного API удаления точки нет, поэтому удаляем так же, как аудит владельца: + // SQL-запросом владельца схемы (мигратор), в tenant-контексте (FORCE RLS). + const migrator = new pg.Client({ connectionString: ctx().migrationDatabaseUrl }); + await migrator.connect(); + let outcome = 'deleted'; + try { + await migrator.query('BEGIN'); + await migrator.query("SELECT set_config('app.tenant_id', $1, true)", [ctx().tenantId]); + await migrator.query('DELETE FROM staff_org_units WHERE id = $1', [unit!.id]); + await migrator.query('ROLLBACK'); + } catch (error) { + outcome = `${(error as { code?: string }).code} ${(error as Error).message}`; + await migrator.query('ROLLBACK').catch(() => undefined); + } finally { + await migrator.end(); + } + // Верно: удалено, либо отказ внешнего ключа 23503 (понятный запрет). + expect(outcome, 'удаление точки с устройством').toMatch(/^(deleted|23503 )/); + }); + + it('[A4] ответы 500 не содержат кода и текста ошибки PostgreSQL', async () => { + const [unit] = await createOrgUnits(1); + const probes: Array<[string, ApiResponse]> = [ + [ + 'POST /employees', + await api('POST', '/employees', { + token: ctx().managerToken, + body: { + personnel_number: `E2E-${randomUlid().slice(-8)}`, + display_name: synthetic('Сотрудник'), + position: 'E2E-должность', + }, + }), + ], + [ + 'POST /payroll/calculate month=2026-13', + await api('POST', '/payroll/calculate', { + token: ctx().managerToken, + body: { month: '2026-13', org_unit_id: unit!.id }, + }), + ], + ]; + const leaks = probes + .filter(([, response]) => response.status >= 500) + .map(([name, response]) => ({ name, leaks: postgresLeak(response) })) + .filter((item) => item.leaks.length > 0); + expect(leaks, 'тела 500 с деталями PostgreSQL').toEqual([]); + }); + + it('[N12-DATE] расчёт с несуществующей датой (month=2026-13, 2026-02-30) → 400', async () => { + const [unit] = await createOrgUnits(1); + const month = await api('POST', '/payroll/calculate', { + token: ctx().managerToken, + body: { month: '2026-13', org_unit_id: unit!.id }, + }); + const range = await api('POST', '/payroll/calculate', { + token: ctx().managerToken, + body: { from: '2026-02-01', to: '2026-02-30', org_unit_id: unit!.id }, + }); + expect( + { month: month.status, range: range.status }, + `${describeResponse(month)} | ${describeResponse(range)}`, + ).toEqual({ month: 400, range: 400 }); + }); +}); diff --git a/tests/e2e/known-defects.json b/tests/e2e/known-defects.json index 4ec0e14..1d0276c 100644 --- a/tests/e2e/known-defects.json +++ b/tests/e2e/known-defects.json @@ -38,6 +38,13 @@ "OWN-08": "решение владельца: возврат с комментарием", "OWN-09": "решение владельца: смена в чужой точке идёт в зарплату той точки", "K17/OWN-10": "решение владельца: нет согласия на биометрию → регистрация запрещена", - "K17/OWN-11": "решение владельца: отзыв согласия меняет статус для терминала" + "K17/OWN-11": "решение владельца: отзыв согласия меняет статус для терминала", + "K6/D5": "отклонение смены из подписанной ведомости: 200 без сторно (сейчас блокирован K3 на подтверждении)", + "K7/D2": "повторный импорт книги теряет суммы: две точки в один день → 222,00 вместо 333,00 ₽", + "K8/D1": "подписанная ведомость не воспроизводится после смены ставки; контракта verify нет (C4), сейчас блокирован K3", + "K9/D3": "параметры пресета официанта (shift_rate_minor и др.) не сохраняются", + "S9": "удаление точки с устройством: 23502 null value in column tenant_id (ON DELETE SET NULL на составном FK)", + "A4": "ответы 500 содержат SQLSTATE и текст PostgreSQL", + "N12-DATE": "month=2026-13 → 500 (22008) вместо 400" } } From 3475133b1031f34e951c2792ca88693abaf8cf1e Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:25:47 +0700 Subject: [PATCH 18/28] =?UTF-8?q?test(e2e):=20=D1=81=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=D1=83=D0=BC=D0=BC=D1=8B=20=D0=BA=D1=80=D0=B0=D1=82=D0=BD=D1=8B?= =?UTF-8?q?=20=D1=80=D1=83=D0=B1=D0=BB=D1=8E=20(=D1=83=D1=87=D1=91=D1=82?= =?UTF-8?q?=20=D0=BE=D0=BA=D1=80=D1=83=D0=B3=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=80=D0=B0=D1=81=D1=87=D1=91=D1=82=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: на ветке codex/fix-live-database цепочка подтверждение → расчёт → утверждение впервые дошла до конца, и K3/N2 остался красным не из-за дефекта, а из-за теста: 8 ч × 123,45 ₽ = 98760 коп., а расчёт округляет строку до rounding_unit_minor (по умолчанию 100 коп., service.ts:695) и начисляет 98800. Округление до рубля — настройка продукта, не дефект; тест не должен от него зависеть. Что: SYNTHETIC_RATE_MINOR 12345 → 12300 (123,00 ₽/ч), оплата смены официанта в K9 111111 → 111100. Суммы остаются заведомо синтетическими. --- tests/e2e/50-money-and-errors.e2e.ts | 2 +- tests/e2e/harness/fixtures.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/e2e/50-money-and-errors.e2e.ts b/tests/e2e/50-money-and-errors.e2e.ts index 4093d81..1932669 100644 --- a/tests/e2e/50-money-and-errors.e2e.ts +++ b/tests/e2e/50-money-and-errors.e2e.ts @@ -175,7 +175,7 @@ describe('Деньги, S9, A4 и даты на реальной PostgreSQL', () it('[K9/D3] официант по пресету получает оплату смены из параметров пресета', async () => { const [unit] = await createOrgUnits(1); const [employee] = await importEmployees(1); - const shiftRate = 111_111; // синтетические 1 111,11 ₽ за смену + const shiftRate = 111_100; // синтетические 1 111,00 ₽ за смену (кратно рублю, см. округление) // Предполагаемый контракт: параметры пресета передаются объектом `params` // (ключи — param_declarations правила). const assign = await api('PUT', `/employees/${employee!.id}/pay-assignment`, { diff --git a/tests/e2e/harness/fixtures.ts b/tests/e2e/harness/fixtures.ts index cafcd4f..a7d8bd7 100644 --- a/tests/e2e/harness/fixtures.ts +++ b/tests/e2e/harness/fixtures.ts @@ -138,8 +138,12 @@ export async function hourlyRuleId(): Promise { return hourly!.id; } -/** Синтетическая ставка 123,45 ₽/ч (заведомо не реальная сумма). */ -export const SYNTHETIC_RATE_MINOR = 12_345; +/** + * Синтетическая ставка 123,00 ₽/ч (заведомо не реальная сумма). Кратна рублю: расчёт + * округляет строку до rounding_unit_minor (по умолчанию 100 коп.), и 8 ч × ставка + * должны совпадать с начислением без учёта округления. + */ +export const SYNTHETIC_RATE_MINOR = 12_300; export async function assignHourly(employeeId: string, orgUnitId: string | null) { const response = await api('PUT', `/employees/${employeeId}/pay-assignment`, { From 51ad03ff659cc50192f8fb448e2ea472ec41f6c1 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:28:10 +0700 Subject: [PATCH 19/28] =?UTF-8?q?test(e2e):=20=D0=BF=D1=80=D0=B8=D1=91?= =?UTF-8?q?=D0=BC=D0=BA=D0=B0=20=D0=B2=D0=B5=D1=82=D0=BE=D0=BA=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9=20=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=82=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=81=20=D0=B4=D0=B2=D0=BE=D0=B9=D0=BD=D1=8B=D0=BC=D0=B8=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: TASK-GROK-2 §4 — исправления принимаются только по прогону стенда, «на слово ничего не принимать»; исполнителям нужны ID владельца и контракты для новых сценариев K8/K9. Что: - report-evidence/acceptance-*.txt: для antigravity/fix-reject-device-shifts (795bba0), codex/fix-format-baseline (fd1ec3d), codex/fix-live-database (ea68e12) — команда, итог vitest, таблица «ID — было — стало — вывод» против основной ветки f5ac179 с тем же стендом (worktree, без коммитов в их ветки). Итог: fix-live-database — K3/N2, K4/N1 зелёные, открылись K5 и K6 по существу; обе ветки Codex — SYNC-A/B зелёные, потому что «style»- коммит fd1ec3d содержит исправление Antigravity (после prettier 0 строк diff с её веткой) — записано как находка для ревью. - NOTES: таблица дефектов с двойными ID, строки K6–K9, S9, A4, N12-DATE, контракты C4 (verify подписанной ведомости) и C5 (params пресета), CI (windows, артефакт evidence), раздел приёмки. Ни одна ветка не влита в основную, поэтому known-defects.json не сокращён. --- tests/e2e/NOTES-FOR-EXECUTORS.md | 106 +++++++++++++----- ...e-antigravity-fix-reject-device-shifts.txt | 16 +++ .../acceptance-codex-fix-format-baseline.txt | 31 +++++ .../acceptance-codex-fix-live-database.txt | 30 +++++ 4 files changed, 155 insertions(+), 28 deletions(-) create mode 100644 tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt create mode 100644 tests/e2e/report-evidence/acceptance-codex-fix-format-baseline.txt create mode 100644 tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt diff --git a/tests/e2e/NOTES-FOR-EXECUTORS.md b/tests/e2e/NOTES-FOR-EXECUTORS.md index 321099e..58820a2 100644 --- a/tests/e2e/NOTES-FOR-EXECUTORS.md +++ b/tests/e2e/NOTES-FOR-EXECUTORS.md @@ -66,40 +66,65 @@ API пока нет, поэтому сценарии `tests/e2e/30-owner-decisio сервер хранит только факт согласия. Тот же флаг стоит отдать в `/sync/pull` (employee payload). Сейчас все OWN красные с `404 Route ... not found` (C1–C3 не реализованы); -OWN-03..09 дополнительно упрутся в N2 (подтверждение смены падает 500). +OWN-03..09 дополнительно упрутся в K3/N2 (подтверждение смены падает 500). + +ID в названиях тестов — двойные «владелец/мой» (`[K3/N2]`, `[D6/OWN-01]`, `[K17/OWN-10]`, +`[K19/OWN-07]`), по таблице TASK-GROK-2 §2 и AUDIT.md. + +### C4. Проверочный пересчёт подписанной ведомости (K8/D1) + +- `GET /payroll/runs/:id/verify` (право `staff:payroll:read`) → + `200 { "run_id", "stored_total_minor", "recalculated_total_minor", "matches": boolean }`. +- Пересчёт идёт по снимку версий правил, параметров и ставок, действовавших при подписи + (и ревизиям смен), а не по текущим значениям. После смены ставки `matches` остаётся `true`. + +### C5. Параметры пресета в назначении оплаты (K9/D3) + +- `PUT /employees/:id/pay-assignment` принимает `params: { : integer }`, ключи — из + `param_declarations` выбранного правила (например, `shift_rate_minor`, `percent_bp`, + `upsell_rate_minor`, `avg_check_target_minor`, `avg_check_bonus_minor` у `waiter_upsell`); + неизвестный ключ → 400. `GET .../pay-assignment` возвращает их в `params`. +- Старые поля `rate_minor`/`percent_bp`/`guarantee_minor` можно оставить как сокращения. ## 2. Дефекты продукта, найденные сценариями (все красные сейчас) Команда и фактический вывод — `tests/e2e/evidence/e2e-run.txt`; таблица — `tests/e2e/REPORT.md`. -| ID | Файл | Что исправить | -| -------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| N1 | `src/portal.ts` POST /employees | `42P08 inconsistent types deduced for parameter $2`: явные `$2::varchar(26)`, `$5::text` или отдельный запрос профессии | -| N2 | `src/portal.ts` PATCH /work-sessions, `src/domain/payroll/service.ts` calculate/approve | `staff_outbox.occurred_at` NULL (23502): передавать `occurred_at` или `DEFAULT now()` новой миграцией | -| N4 | `service.ts` | после N2 проверить: пересекающийся период не должен начислять смену повторно (409 или исключение уже начисленных смен) | -| N3 | push-подписки | allowlist push-сервисов / запрет приватных адресов, `redirect:'manual'`; сейчас сервер подключается к `127.0.0.1` | -| N9 | `push-dispatcher.ts` | `ON CONFLICT ... DO UPDATE SET employee_id` → 409 для чужого endpoint | -| N10 | GET /professions, /org-units | требовать право справочника; терминал сейчас получает 200 | -| N11 | импорт | валидировать `kind` и схему `items` → 400 вместо 500 (23514) | -| N12 | PUT pay-assignment | `additionalProperties:false`, верхние границы сумм | -| F2 | `config.ts`/`identity.ts` | standalone без токенов не должен выдавать права (процесс без токенов отдаёт 200 на /portal, /payroll, POST /professions) | -| F3 | POST/DELETE /session | в cookie — идентификатор сессии, а не сырой токен; logout отзывает сессию | -| F4 | вход | rate limit (тест ждёт 429 не позже 30 неверных попыток; идёт на отдельном процессе, чтобы лимит не мешал другим сценариям) | -| F7 | POST /attendance/events | использовать `Idempotency-Key` / `staff_idempotency_keys` | -| F10 | `assertSameOrigin` | мутации по cookie без `Origin` отклонять | -| SYNC-A/B | `src/domain/sync/service.ts` | устройство не должно выставлять `confirmed`/`approved` (сейчас `applied`) | -| SYNC-C0 | `pull()` bootstrap | `SELECT ... status FROM staff_org_units` — такого столбца нет → 500 на любой начальной загрузке | -| SYNC-C | `pull()` bootstrap | при `has_more=true` отдаётся `next_cursor=latest`, остаток после 100 сущностей теряется; нужен курсор снимка | -| SYNC-D | портал/импорт | изменения вне sync не пишутся в `staff_sync_change_log` → терминал не узнаёт о новых/изменённых сотрудниках | -| SYNC-E | `executeCommand` | проверять `status='active'` сотрудника | -| SYNC-F | `executeCommand` | сохранять `org_unit_id` в `staff_attendance_events`; payload не может переопределить точку устройства | -| SYNC-G | `push()` | ошибки БД одной команды → `rejected` для неё, а не 500 и откат всего пакета | -| SYNC-H | `/sync/devices` | `assertCookieMutationOrigin` как в портале | -| SYNC-I | `requireManagerContext` | без токенов не выдавать права (как F2) | -| SYNC-J | `executeCommand` | окно времени отметки как в POST /attendance/events (−180 дней … +5 мин) | -| SYNC-K | `acknowledge()` | отклонять курсор больше `MAX(cursor_seq)` | +| ID | Файл | Что исправить | +| ---------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| K4/N1 | `src/portal.ts` POST /employees | `42P08 inconsistent types deduced for parameter $2`: явные `$2::varchar(26)`, `$5::text` или отдельный запрос профессии | +| K3/N2 | `src/portal.ts` PATCH /work-sessions, `src/domain/payroll/service.ts` calculate/approve | `staff_outbox.occurred_at` NULL (23502): передавать `occurred_at` или `DEFAULT now()` новой миграцией | +| K5/N4 | `service.ts` | после N2 проверить: пересекающийся период не должен начислять смену повторно (409 или исключение уже начисленных смен) | +| K12/N3 | push-подписки | allowlist push-сервисов / запрет приватных адресов, `redirect:'manual'`; сейчас сервер подключается к `127.0.0.1` | +| N9 | `push-dispatcher.ts` | `ON CONFLICT ... DO UPDATE SET employee_id` → 409 для чужого endpoint | +| N10 | GET /professions, /org-units | требовать право справочника; терминал сейчас получает 200 | +| N11 | импорт | валидировать `kind` и схему `items` → 400 вместо 500 (23514) | +| N12 | PUT pay-assignment | `additionalProperties:false`, верхние границы сумм | +| N12-DATE | `POST /payroll/calculate` | `month=2026-13` → 500 `22008`; проверять месяц 01–12 → 400 (диапазон `2026-02-30` уже даёт 400) | +| K6/D5 | `portal.ts` PATCH /work-sessions | смена подписанной ведомости: `409`, либо сторно в ledger; сейчас (на fix-live-database) 200 и начисление остаётся | +| K7/D2 | `operations.ts` импорт `payroll_entries` | дельта по сумме всех записей дня, вставка по ключу: две точки за день → 222,00 вместо 333,00 ₽; считать дельту по ключу | +| K8/D1 | расчёт/подпись | снимок правил и ставок в подписанной ведомости; контракт проверки C4 (ниже) | +| K9/D3 | PUT pay-assignment | сохранять `params` по `param_declarations` правила (C5 ниже); сейчас `shift_rate_minor` официанта теряется | +| S9 | миграция 0011 FK устройств | `ON DELETE SET NULL` на составном `(tenant_id, org_unit_id)` обнуляет `tenant_id` → 23502; `SET NULL (org_unit_id)` или RESTRICT | +| A4 | обработчик ошибок | в теле 5xx нет SQLSTATE (`code`) и текста PostgreSQL; подробности только в лог | +| K1/F2 | `config.ts`/`identity.ts` | standalone без токенов не должен выдавать права (процесс без токенов отдаёт 200 на /portal, /payroll, POST /professions) | +| K10/F3 | POST/DELETE /session | в cookie — идентификатор сессии, а не сырой токен; logout отзывает сессию | +| K11/F4 | вход | rate limit (тест ждёт 429 не позже 30 неверных попыток; идёт на отдельном процессе, чтобы лимит не мешал другим сценариям) | +| F7 | POST /attendance/events | использовать `Idempotency-Key` / `staff_idempotency_keys` | +| F10 | `assertSameOrigin` | мутации по cookie без `Origin` отклонять | +| K13/SYNC-A, K13/SYNC-B | `src/domain/sync/service.ts` | устройство не должно выставлять `confirmed`/`approved` (сейчас `applied`) | +| SYNC-C0 | `pull()` bootstrap | `SELECT ... status FROM staff_org_units` — такого столбца нет → 500 на любой начальной загрузке | +| S5/SYNC-C | `pull()` bootstrap | при `has_more=true` отдаётся `next_cursor=latest`, остаток после 100 сущностей теряется; нужен курсор снимка | +| S5/SYNC-D | портал/импорт | изменения вне sync не пишутся в `staff_sync_change_log` → терминал не узнаёт о новых/изменённых сотрудниках | +| S4/SYNC-E | `executeCommand` | проверять `status='active'` сотрудника | +| S4/SYNC-F | `executeCommand` | сохранять `org_unit_id` в `staff_attendance_events`; payload не может переопределить точку устройства | +| S3/SYNC-G | `push()` | ошибки БД одной команды → `rejected` для неё, а не 500 и откат всего пакета | +| S8/SYNC-H | `/sync/devices` | `assertCookieMutationOrigin` как в портале | +| K1/SYNC-I | `requireManagerContext` | без токенов не выдавать права (как F2) | +| S2/SYNC-J | `executeCommand` | окно времени отметки как в POST /attendance/events (−180 дней … +5 мин) | +| SYNC-K | `acknowledge()` | отклонять курсор больше `MAX(cursor_seq)` | -## 3. deploy/ (PILOT-1, PILOT-2) — Codex +## 3. deploy/ (K1/PILOT-1, K2/PILOT-2) — Codex - PILOT-1: все подстановки в `deploy/pilot/compose.yaml` → `${VAR:?VAR is required}` (сейчас 14 без `:?`: пустой `STANDALONE_MANAGER_TOKEN` молча превращает pilot в F2). @@ -118,6 +143,11 @@ OWN-03..09 дополнительно упрутся в N2 (подтвержде - Задаче `docker-build` нужен раннер с меткой `docker-host` (Docker daemon). Без него задача ждёт в очереди; остальные задачи не блокируются. - `format` красная, пока не исправлен F14 (23 файла на замер 2026-09-26, в основном `src/`, `docs/`, `tests/unit/`). +- `format` станет зелёной после влития `codex/fix-format-baseline` (проверено на ветке). +- Задача `windows` выключена, пока нет раннера с меткой `windows`: включается переменной + репозитория `KRONA_WINDOWS_RUNNER=true`; для полного e2e нужен секрет + `WINDOWS_E2E_PG_ADMIN_URL` (локальная PostgreSQL 17 на раннере). +- `tests/e2e/evidence/` не хранится в git; в CI это артефакт `e2e-evidence`. - Реальный Forgejo-раннер мной не запускался (нет API-токена) — не проверено. ## 5. N13 (гонка первого расчёта) и утечка текста ошибок БД @@ -139,3 +169,23 @@ CONFLICT DO NOTHING` со своим `runId` → строки/UPDATE по нес - Ответы 500 содержат сырой текст ошибки PostgreSQL (например `null value in column "occurred_at" of relation "staff_outbox" ...`) — клиенту видна схема БД. Для 5xx отдавать нейтральное сообщение, подробности — только в лог. + +## 6. Приёмка веток исполнителей (2026-09-26) + +Подробно — `tests/e2e/REPORT.md` и `tests/e2e/report-evidence/acceptance-*.txt`. + +- `codex/fix-live-database` (ea68e12): K3/N2 и K4/N1 зелёные на живой PostgreSQL 17. + Дальше по цепочке открылись K5/N4 (196800 вместо 98400 — двойное начисление) и + K6/D5 (отклонение оплаченной смены: 200, начисление осталось). A4 частично: `POST /employees` + больше не 500, но `month=2026-13` по-прежнему отдаёт `code=22008` с текстом. +- `codex/fix-format-baseline` (fd1ec3d): `prettier --check .` чистый. **Но коммит «style» + содержит функциональное исправление Antigravity**: `src/domain/sync/service.ts` и + `tests/unit/sync.test.ts` после нормализации prettier совпадают с + `antigravity/fix-reject-device-shifts` (0 строк diff) и отличаются от 331e490 на 255/139 + строк. Изменение поведения стоит вынести в отдельный коммит с объяснением или влить + ветку Antigravity отдельно, иначе история смешивает темы (AGENTS.md). +- `antigravity/fix-reject-device-shifts` (795bba0): K13/SYNC-A и K13/SYNC-B зелёные, + остальное без изменений. Ветка основана на 778ba2d, а не на 331e490. +- Ни одна ветка не влита в основную (f5ac179), поэтому ID из `known-defects.json` не удалены. +- Суммы в тестах кратны рублю: расчёт округляет строку до `rounding_unit_minor` + (по умолчанию 100 коп.). Если округление должно быть другим — это решение продукта, не теста. diff --git a/tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt b/tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt new file mode 100644 index 0000000..14ba662 --- /dev/null +++ b/tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt @@ -0,0 +1,16 @@ +# Приёмка ветки antigravity/fix-reject-device-shifts @ 795bba0ce8eb2621a395c6bd794d075609c1a3eb (2026-09-26, UTC+7) +# Код продукта — ветка исполнителя (git worktree --detach origin/antigravity/fix-reject-device-shifts), поверх — tests/e2e и scripts/test из grok/e2e-harness @ 3475133 (без коммитов в ветку исполнителя). +# PostgreSQL 17.11, мигратор NOSUPERUSER, сервер под krona_staff_app. + +$ cd && E2E_MIGRATIONS=roundtrip E2E_DATABASE_NAME=krona_staff_acc node scripts/test/run-e2e.mjs +== roundtrip OK: rolledBack=11 reapplied=11 + Tests 43 failed | 11 passed (54) +| K13/SYNC-A | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K13/SYNC-B | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +exit=1 + +# Было (основная ветка f5ac179 + тот же стенд): Tests 45 failed | 9 passed (54) ; run-e2e OK +# Отличия по ID (compare по e2e-results.json, ULID/порты замаскированы): +| ID | было | стало | фактический вывод | +| K13/SYNC-A | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_work_session","status":"applied","result":{"id":"","revision":1,"status" / стало: passed | +| K13/SYNC-B | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"","revision":1,"stat / стало: passed | diff --git a/tests/e2e/report-evidence/acceptance-codex-fix-format-baseline.txt b/tests/e2e/report-evidence/acceptance-codex-fix-format-baseline.txt new file mode 100644 index 0000000..ee05cee --- /dev/null +++ b/tests/e2e/report-evidence/acceptance-codex-fix-format-baseline.txt @@ -0,0 +1,31 @@ +# Приёмка ветки codex/fix-format-baseline @ fd1ec3d8197c21afe15a8dc8101816c52226ebef (2026-09-26, UTC+7) +# Код продукта — ветка исполнителя (git worktree --detach origin/codex/fix-format-baseline), поверх — tests/e2e и scripts/test из grok/e2e-harness @ 3475133 (без коммитов в ветку исполнителя). +# PostgreSQL 17.11, мигратор NOSUPERUSER, сервер под krona_staff_app. + +$ cd && E2E_MIGRATIONS=roundtrip E2E_DATABASE_NAME=krona_staff_acc node scripts/test/run-e2e.mjs +== roundtrip OK: rolledBack=11 reapplied=11 + Tests 43 failed | 11 passed (54) +| K13/SYNC-A | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K13/SYNC-B | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +exit=1 + +# Было (основная ветка f5ac179 + тот же стенд): Tests 45 failed | 9 passed (54) ; run-e2e OK +# Отличия по ID (compare по e2e-results.json, ULID/порты замаскированы): +| ID | было | стало | фактический вывод | +| K13/SYNC-A | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_work_session","status":"applied","result":{"id":"","revision":1,"status" / стало: passed | +| K13/SYNC-B | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"","revision":1,"stat / стало: passed | + +# F14: форматирование ветки (оверлей tests/e2e/evidence удалён перед проверкой — в ветке исполнителя нет записи .gitignore для него) +$ node node_modules/prettier/bin/prettier.cjs --check . +Checking formatting... +All matched files use Prettier code style! +# Было (основная ветка f5ac179): [warn] Code style issues found in 23 files. + +# Находка: коммит fd1ec3d «style: establish repository formatting baseline» содержит не только форматирование. +# Сравнение после нормализации prettier (--config .prettierrc.json), число строк diff: +# src/domain/sync/service.ts 331e490 → fd1ec3d: 255; antigravity/fix-reject-device-shifts → fd1ec3d: 0 +# tests/unit/sync.test.ts 331e490 → fd1ec3d: 139; antigravity/fix-reject-device-shifts → fd1ec3d: 0 +# src/sync.ts, src/domain/sync/cursor.ts: antigravity → fd1ec3d: 0 +# То есть в «style»-коммит вошло функциональное исправление Antigravity (отклонение +# upsert_work_session/upsert_timesheet_entry, COMMAND_NOT_SUPPORTED) — поэтому K13/SYNC-A/B +# зелёные и на этой ветке. Для ревью это смешение тем: изменение поведения скрыто в форматировании. diff --git a/tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt b/tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt new file mode 100644 index 0000000..9673dfa --- /dev/null +++ b/tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt @@ -0,0 +1,30 @@ +# Приёмка ветки codex/fix-live-database @ ea68e123506cc29276514f67b1dda7cef77057df (2026-09-26, UTC+7) +# Код продукта — ветка исполнителя (git worktree --detach origin/codex/fix-live-database), поверх — tests/e2e и scripts/test из grok/e2e-harness @ 3475133 (без коммитов в ветку исполнителя). +# PostgreSQL 17.11, мигратор NOSUPERUSER, сервер под krona_staff_app. + +$ cd && E2E_MIGRATIONS=roundtrip E2E_DATABASE_NAME=krona_staff_acc node scripts/test/run-e2e.mjs +== roundtrip OK: rolledBack=11 reapplied=11 + Tests 41 failed | 13 passed (54) +| K13/SYNC-A | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K13/SYNC-B | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K3/N2 | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K4/N1 | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +exit=1 + +# Было (основная ветка f5ac179 + тот же стенд): Tests 45 failed | 9 passed (54) ; run-e2e OK +# Отличия по ID (compare по e2e-results.json, ULID/порты замаскированы): +| ID | было | стало | фактический вывод | +| A4 | RED | RED | было: AssertionError: тела 500 с деталями PostgreSQL: expected [ …(2) ] to deeply equal [] / стало: AssertionError: тела 500 с деталями PostgreSQL: expected [ { …(2) } ] to deeply equal [] | +| K13/SYNC-A | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_work_session","status":"applied","result":{"id":"","revision":1,"status" / стало: passed | +| K13/SYNC-B | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"","revision":1,"stat / стало: passed | +| K3/N2 | RED | GREEN | было: AssertionError: подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation / стало: passed | +| K4/N1 | RED | GREEN | было: AssertionError: HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 / стало: passed | +| K5/N4 | RED | RED | было: AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occ / стало: AssertionError: смена должна быть начислена ровно один раз: expected 196800n to be 98400n // Object.is equality | +| K6/D5 | RED | RED | было: AssertionError: подтверждение смены (предусловие; падает, пока открыт K3): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value / стало: AssertionError: после отклонения оплаченной смены должно быть сторно: итог начислений 0: expected 98400n to be 0n // Object.is equality | +| K8/D1 | RED | RED | было: AssertionError: подтверждение смены (предусловие; падает, пока открыт K3): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value / стало: AssertionError: C4 verify: HTTP 404 {"message":"Route GET:/api/v1/staff/payroll/runs//verify not found","error":"Not Found","statusCode":404}: expected 404 to be 20 | + +# F14: форматирование ветки (оверлей tests/e2e/evidence удалён перед проверкой — в ветке исполнителя нет записи .gitignore для него) +$ node node_modules/prettier/bin/prettier.cjs --check . +Checking formatting... +All matched files use Prettier code style! +# Было (основная ветка f5ac179): [warn] Code style issues found in 23 files. From 33daae3593b306a8c0e93d7ed85de721ecf98fa8 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:29:36 +0700 Subject: [PATCH 20/28] =?UTF-8?q?docs(e2e):=20REPORT.md=20=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B3=D0=BE=20=D0=BA=D1=80=D1=83=D0=B3=D0=B0?= =?UTF-8?q?=20=E2=80=94=20=D0=B4=D0=B2=D0=BE=D0=B9=D0=BD=D1=8B=D0=B5=20ID,?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC=D0=BA=D0=B0=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=BA,=20Windows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: PR в Forgejo создаётся без API, описание изменений и доказательства живут в репозитории; владелец просил обновлённый отчёт с таблицей «ID владельца / мой ID — цвет — фактический вывод» и приёмочными таблицами по веткам исполнителей (TASK-GROK-2, раздел «Отчёт»). Что: что изменилось в круге 2, таблица по всем ID на f5ac179 (45 red / 9 green, храповик OK), приёмка fix-live-database (K3, K4 зелёные; K5, K6 подтверждены по существу), fix-format-baseline (F14 зелёный; находка — «style»-коммит содержит исправление Antigravity), fix-reject-device-shifts (K13 зелёный), статус Windows (не проверено: нет раннера), CI, N5, N13, список «не проверено». Ссылки на evidence ведут в report-evidence/. --- tests/e2e/REPORT.md | 378 +++++++++++++++++++++++--------------------- 1 file changed, 201 insertions(+), 177 deletions(-) diff --git a/tests/e2e/REPORT.md b/tests/e2e/REPORT.md index 455a996..6a2ae00 100644 --- a/tests/e2e/REPORT.md +++ b/tests/e2e/REPORT.md @@ -1,225 +1,249 @@ # PR: e2e-стенд на реальной PostgreSQL 17 и независимая приёмка (grok/e2e-harness) -База: `codex/bootstrap-platform-foundation` @ `778ba2d`. Сравнение: +База: `codex/bootstrap-platform-foundation` @ `f5ac179` (содержит `331e490`). Ветка перебазирована +без конфликтов. Сравнение: Изменены только `tests/e2e/**`, `tests/integration/tenant-isolation.test.ts`, -`.forgejo/workflows/ci.yml`, `scripts/test/**`. `src/`, `apps/`, `migrations/`, `deploy/`, -`package.json` не тронуты. Всё, что требует правки продукта, — в +`.forgejo/workflows/ci.yml`, `scripts/test/**` и одна строка в корневом `.gitignore` +(`tests/e2e/evidence/`, по требованию TASK-GROK-2 §1). `src/`, `apps/`, `migrations/`, +`deploy/`, `package.json` не тронуты. Всё, что требует правки продукта, — в [`NOTES-FOR-EXECUTORS.md`](NOTES-FOR-EXECUTORS.md). ## Зачем -156 зелёных тестов на поддельной БД не заметили, что создание сотрудника, -подтверждение смены и расчёт зарплаты на реальной PostgreSQL падают всегда. Этот PR -добавляет стенд, где реальный сервер (`tsx src/server.ts`) работает с реальной -PostgreSQL 17 под ролью приложения без привилегий, миграции применяет мигратор без -SUPERUSER, а все токены и пароли случайные (`crypto.randomBytes`). Каждый сценарий -проверяет **правильное** поведение, поэтому красный цвет означает открытый дефект. +156 зелёных тестов на поддельной БД не заметили, что создание сотрудника, подтверждение +смены и расчёт зарплаты на реальной PostgreSQL падают всегда. Стенд запускает реальный сервер +под ролью приложения без привилегий на реальной PostgreSQL 17, миграции применяет мигратор без +SUPERUSER, все токены и пароли случайные (`crypto.randomBytes`). Каждый сценарий проверяет +**правильное** поведение: красный = открытый дефект. -## Источник ID +## Что изменилось во втором круге (TASK-GROK-2) -Файлы владельца (`AUDIT.md`, `live-audit.mjs`, `live-sync.mjs`) до конца работы в -`/workspace/uploads/krona-staff-owner/` не появились. Сценарии написаны по моему -аудиту `2026-09-26_full-project-audit_grok_3e20544.md` (ID `F*`/`N*`) и по коду. ID владельца -K1, K3, K4, K5, K6, K10, K11, K12, S1, S2, S9, A4 **не сопоставлены — не проверено**. -Синхронизация помечена `SYNC-*` (мои ID, вероятно пересекаются с S1–S9 владельца). -Когда файлы владельца будут доступны, достаточно переименовать теги в названиях -тестов (например `[K3/N1]`) и ключи в `known-defects.json`. - -## Коммиты - -| SHA | Что | -| --------- | ------------------------------------------------------------------------------------- | -| `29fefc1` | `scripts/test/provision-pg.mjs`, `migrate-roundtrip.mjs`: роли как в pilot, roundtrip | -| `88fc749` | N5: очистка tenant-isolation ролью мигратора | -| `d7e9008` | prettier для tenant-isolation.test.ts | -| `cf7f6f4` | стенд e2e: global-setup, клиент, фикстуры, храповик `run-e2e.mjs` | -| `518494d` | сценарии основного API (N1–N4, N9–N12, F2–F4, F7, F10) | -| `32ced4b` | сценарии `/sync/*` (SYNC-A…L) | -| `9bdfb66` | форматирование сгенерированных evidence | -| `f59be3a` | CI: PostgreSQL 17, роли, roundtrip, e2e, docker-build отдельно, SHA-пины | -| `a19c06b` | проверка `deploy/pilot/compose.yaml` (PILOT-1..3) | -| `1e325a6` | сценарии решений владельца (OWN-01..11) + заметки исполнителям | -| `3388b90` | N13: гонка первого расчёта (скрипт и замер) | -| (этот) | REPORT.md и свежие evidence | +| Пункт | Что сделано | +| ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| §1 | Запуск без `.cmd`-обёрток: `scripts/test/node-commands.mjs` — всегда `process.execPath` + JS-точка входа из `require.resolve` (`vitest.mjs`, `prettier.cjs`); сервер — один процесс `node --import tsx src/server.ts` (без дочернего процесса CLI tsx, чтобы `kill()` под Windows не оставлял сироту). Проверка на Linux — `tests/e2e/harness/node-commands.test.ts` (в `npm test`) | +| §1 | `tests/e2e/evidence/` убран из git и добавлен в `.gitignore`; в CI — артефакт `e2e-evidence`. Разовые доказательства (N5, N13, приёмка) — в `tests/e2e/report-evidence/`, скрипты туда не пишут | +| §1 | Задача `windows` в CI (включается переменной `KRONA_WINDOWS_RUNNER=true`, раннера пока нет) | +| §1 | Перебазирование на `f5ac179` — без конфликтов | +| §2 | Двойные ID `[владелец/мой]` в названиях тестов и ключах `known-defects.json` | +| §3 | Новые сценарии `[K6/D5]`, `[K7/D2]`, `[K8/D1]`, `[K9/D3]`, `[S9]`, `[A4]`, `[N12-DATE]` (`tests/e2e/50-money-and-errors.e2e.ts`), все красные и в `known-defects.json` | +| §4 | Приёмка `antigravity/fix-reject-device-shifts`, `codex/fix-format-baseline`, `codex/fix-live-database` — таблицы ниже | +| — | Синтетическая ставка 123,45 → 123,00 ₽/ч: расчёт округляет строку до рубля (`rounding_unit_minor`), тест не должен зависеть от округления (выяснилось на fix-live-database) | ## Как запустить ```sh -# PostgreSQL 17, bootstrap-админ нужен только для создания ролей и БД -export E2E_PG_ADMIN_URL=postgres://:@127.0.0.1:55433/postgres -node scripts/test/run-e2e.mjs # храповик known-defects (как в CI) -node scripts/test/run-e2e.mjs --no-known-defects # строго: любой красный = exit 1 -E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs -./scripts/test/ci-local.sh # локальный эквивалент всех задач CI +export E2E_PG_ADMIN_URL=postgres://:@127.0.0.1:55433/postgres # только создание ролей и БД +E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs # храповик known-defects (как в CI) +node scripts/test/run-e2e.mjs --no-known-defects # строго: любой красный = exit 1 +./scripts/test/ci-local.sh # локальный эквивалент verify/format/e2e (bash) ``` -Роли (`provision-pg.mjs`): `krona_migrator` — NOSUPERUSER NOCREATEDB NOCREATEROLE, -владелец БД и схемы `public`; `krona_staff_app` — NOSUPERUSER NOBYPASSRLS, права выдают -миграции 0003/0004. Пароли случайные, пишутся в env-файл 0600 во временном каталоге, -который удаляется после запуска. +## Таблица по ID (основная ветка f5ac179 + этот стенд) -## Таблица green/red по ID - -Команда: `E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs` (в составе -`./scripts/test/ci-local.sh`), 2026-09-26 14:33 (UTC+7), PostgreSQL 17.11. Фактический вывод: -[`evidence/e2e-run.txt`](evidence/e2e-run.txt), [`evidence/ci-local.txt`](evidence/ci-local.txt), -JSON — [`evidence/e2e-results.json`](evidence/e2e-results.json), логи серверов — `evidence/server-*.txt`. +Команда: `./scripts/test/ci-local.sh` (внутри `E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs`), +2026-09-26 ~15:28 (UTC+7), PostgreSQL 17.11: ```text - Test Files 4 failed | 1 passed (5) - Tests 38 failed | 9 passed (47) +== roundtrip OK: rolledBack=11 reapplied=11 + Test Files 5 failed | 1 passed (6) + Tests 45 failed | 9 passed (54) [run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты ``` -| ID | Цвет | Что проверяется (правильное поведение) | Фактически (из вывода) | -| ------------ | ----- | -------------------------------------------------------------------- | ----------------------------------------------------------------- | -| HARNESS (×5) | GREEN | live/ready, PG17, app-роль без SUPERUSER/BYPASSRLS, токены, терминал | 5/5 passed | -| CTRL (×2) | GREEN | RBAC терминала/сотрудника, уволенный теряет доступ | 2/2 passed | -| N1 | RED | POST /employees → 201 | 500 `42P08 inconsistent types deduced for parameter $2` | -| N2 | RED | подтверждение смены, расчёт, утверждение → 200 | 500 `23502 null value in column "occurred_at" of "staff_outbox"` | -| N4 | RED | пересекающиеся расчёты не начисляют смену дважды | блокирован N2 (500 23502 на предусловии) — сам N4 **не проверен** | -| N3 | RED | push на внутренний адрес отклоняется, соединений нет | 201 и 1 входящее соединение на 127.0.0.1 | -| N9 | RED | чужой push-endpoint не перепривязывается | 201 | -| N10 | RED | терминал не читает справочники (403) | professions 200, org-units 200 | -| N11 | RED | импорт с неверным kind → 400 | 500 `23514` check constraint staff_payroll_ledger | -| N12 | RED | лишние поля/нереальные суммы → 400 | 200 | -| F2 | RED | процесс без токенов не даёт прав анониму (401) | /portal 200, /payroll 200, POST /professions 201 | -| F3 | RED | cookie без сырого токена, logout отзывает | `rawTokenInCookie: true` | -| F4 | RED | 429 не позже 30 неверных входов | все 401, 429 нет | -| F7 | RED | повтор Idempotency-Key с другим телом не создаёт событие | второе событие создано (201) | -| F10 | RED | мутация по cookie без Origin → 403 | 201 | -| SYNC-A | RED | устройство не подтверждает смену | `applied` | -| SYNC-B | RED | устройство не утверждает табель | `applied` | -| SYNC-C0 | RED | bootstrap pull без курсора → 200 | 500 `42703 column "status" does not exist` (новая находка) | -| SYNC-C | RED | bootstrap >100 сущностей постранично без потерь | 500 42703 (блокирован SYNC-C0) | -| SYNC-D | RED | изменения из портала видны в инкрементальном pull | изменения нет | -| SYNC-E | RED | отметка уволенного через sync отклоняется | `applied` | -| SYNC-F | RED | точка устройства сохраняется, чужая точка в payload не принимается | `applied`, точка не сохранена | -| SYNC-G | RED | битая команда отклоняется по отдельности | 500 `22007` на весь пакет | -| SYNC-H | RED | регистрация устройства по cookie с чужим Origin → 403 | 201 | -| SYNC-I | RED | без токенов анонимно устройство не регистрируется | 201 | -| SYNC-J | RED | отметка 2001 года через sync отклоняется | `applied` | -| SYNC-K | RED | ack курсора из будущего → 400 | 200 | -| SYNC-L | GREEN | отозванное устройство не синхронизируется (403) | 403 (позитивный контроль) | -| OWN-01 | RED | менеджер точки A считает зарплату точки B → 403 | 404 `Route POST:/api/v1/staff/access-grants not found` (нет API) | -| OWN-02 | RED | менеджер отправляет пакет на согласование → 403 | 404 access-grants (нет API) | -| OWN-03 | RED | бухгалтер отправляет пакет → успех, каждому директору 1 уведомление | 404 access-grants (нет API) | -| OWN-04 | RED | бухгалтер подписывает пакет → 403 | 404 access-grants (нет API) | -| OWN-05 | RED | до подписи в ledger нет начислений/выплат | 404 access-grants (нет API) | -| OWN-06 | RED | подпись директора → ledger, пакет и смены неизменяемы | 404 access-grants (нет API) | -| OWN-07 | RED | смена изменена после отправки → 409, пакет у бухгалтера | 404 access-grants (нет API) | -| OWN-08 | RED | возврат с комментарием → пакет у бухгалтера, комментарий сохранён | 404 access-grants (нет API) | -| OWN-09 | RED | смена сотрудника A в точке B → в расчёт точки B | 404 access-grants (нет API) | -| OWN-10 | RED | без согласия на биометрию → терминалу «регистрация запрещена» | 404 `GET .../terminal/employees/:id/enrollment` (нет API) | -| OWN-11 | RED | согласие отозвано → статус для терминала меняется | 404 `PUT .../biometric-consent` (нет API) | -| PILOT-1 | RED | все подстановки в pilot compose — `${VAR:?}` | 14 переменных без `:?` (первая — `STANDALONE_MANAGER_TOKEN`) | -| PILOT-2 | RED | нет `NODE_ENV=development` | сервис `app` | -| PILOT-3 | GREEN | у `app` нет кредов мигратора | passed | -| N13 | — | гонка первого расчёта (скрипт, не vitest) | см. ниже: как есть 15/15 → 500 (N2); с обходом N2 — 0/30 гонок | -| N5 | GREEN | tenant-isolation на живой БД | до: FAIL; после: 2/2 прогона exit=0 (см. ниже) | +| ID владельца / мой | Цвет | Фактический вывод (первая строка assert) | +| ---------------------------- | ----- | ------------------------------------------------------------------------------------------------- | +| HARNESS (×5), CTRL (×2) | GREEN | 7/7 passed — стенд и позитивные контроли | +| K1/F2 | RED | `{ portal: 200, payroll: 200, write: 201 }` вместо 401 | +| K1/SYNC-I | RED | анонимная регистрация устройства `HTTP 201` | +| K1/PILOT-1 | RED | 14 подстановок без `:?` (первая `STANDALONE_MANAGER_TOKEN`) | +| K2/PILOT-2 | RED | `NODE_ENV=development` у сервиса `app` | +| K3/N2 | RED | подтверждение смены `HTTP 500 code 23502 null value in column "occurred_at" of "staff_outbox"` | +| K4/N1 | RED | `HTTP 500 code 42P08 inconsistent types deduced for parameter $2` | +| K5/N4 | RED | блокирован K3 (500 на подтверждении) | +| K6/D5 | RED | блокирован K3 (500 на подтверждении) | +| K7/D2 | RED | `afterFirst: 22200, afterSecond: 22200` вместо `33300, 37700` | +| K8/D1 | RED | блокирован K3 (500 на подтверждении) | +| K9/D3 | RED | `params.shift_rate_minor` не сохранён (`HTTP 200`, в `params` нет ключа) | +| K10/F3 | RED | `rawTokenInCookie: true` | +| K11/F4 | RED | все попытки `401`, 429 нет | +| K12/N3 | RED | подписка на `https://127.0.0.1:` `HTTP 201`, 1 входящее соединение | +| K13/SYNC-A, K13/SYNC-B | RED | `upsert_work_session` / `upsert_timesheet_entry` → `status: applied` | +| K17/OWN-10, K17/OWN-11 | RED | `404 Route GET .../terminal/employees/:id/enrollment` / `PUT .../biometric-consent` (нет API, C3) | +| K19/OWN-07 | RED | `404 Route POST /access-grants` (нет API, C1/C2) | +| D6/OWN-01, D6/OWN-02 | RED | `404 Route POST /access-grants` (нет API, C1) | +| OWN-03..06, OWN-08, OWN-09 | RED | `404 Route POST /access-grants` (нет API, C1/C2) | +| S2/SYNC-J | RED | отметка 2001 года → `status: applied` | +| S3/SYNC-G | RED | `HTTP 500 code 22007` на весь пакет | +| S4/SYNC-E | RED | отметка уволенного → `applied` | +| S4/SYNC-F | RED | `{ ownOrgUnit: null, foreign: "applied" }` | +| S5/SYNC-C | RED | `HTTP 500 code 42703 column "status" does not exist` (блокирован SYNC-C0) | +| S5/SYNC-D | RED | изменение из портала не видно в инкрементальном pull | +| S8/SYNC-H | RED | регистрация устройства по cookie с чужим Origin `HTTP 201` | +| S9 | RED | удаление точки с устройством: `23502 null value in column "tenant_id"` | +| A4 | RED | 2 тела 500 с SQLSTATE/текстом PostgreSQL (`POST /employees` 42P08, `month=2026-13` 22008) | +| N9 | RED | чужой push-endpoint перепривязан `HTTP 201` | +| N10 | RED | терминал: `{ professions: 200, units: 200 }` | +| N11 | RED | импорт с неверным kind `HTTP 500 code 23514` | +| N12 | RED | лишнее поле и нереальная сумма → `HTTP 200` | +| N12-DATE | RED | `month=2026-13` → `HTTP 500 code 22008`; `2026-02-30` уже 400 | +| F7 | RED | повтор Idempotency-Key создал второе событие | +| F10 | RED | мутация по cookie без Origin `HTTP 201` | +| SYNC-C0 (нет ID у владельца) | RED | bootstrap pull `HTTP 500 code 42703 column "status" does not exist` | +| SYNC-K (нет ID у владельца) | RED | ack курсора из будущего `HTTP 200` | +| SYNC-L | GREEN | отозванное устройство получает 403 (позитивный контроль) | +| PILOT-3 | GREEN | у `app` нет учётных данных мигратора | +| N5 (tenant-isolation) | GREEN | в `npm run check` с тестовой БД: `Test Files 20 passed (20)`, `Tests 196 passed (196)` | +| N13 (скрипт, не vitest) | — | не воспроизведено: 0 из 30 попыток при 10/25/50 (обход K3 в одноразовой БД), см. ниже | -Предполагаемые контракты для OWN-01..11 (C1 роли точки/бухгалтера/директора, C2 пакет -зарплаты и согласование, C3 согласие на биометрию) описаны в `NOTES-FOR-EXECUTORS.md` §1. +Сверх таблицы TASK-GROK-2 §2 (по тексту AUDIT.md): K1/SYNC-I (анонимный доступ без токенов на +`/sync`), K1/PILOT-1 (подстановки без `:?` названы в K1), K2/PILOT-2 (development в пилоте — суть K2). -### Механизм для красных сценариев (храповик) +## Приёмка веток исполнителей (TASK-GROK-2 §4) -Выбран список `tests/e2e/known-defects.json` и одна задача `e2e`, а не отдельная -задача «allowed to fail». Причины: задача с `continue-on-error` зеленеет при любом -сбое, включая сломанный стенд, а храповик различает три случая: (1) стенд сломан -(`[HARNESS]`/`[CTRL]` красные или тест без ID) → exit 1; (2) новый красный ID не из -списка (регрессия) → exit 1; (3) ID из списка стал зелёным → exit 1 с просьбой -вычеркнуть его (исправление фиксируется, откат снова станет красным). Строгий режим -`--no-known-defects` показывает полную картину. +Способ: `git worktree add --detach origin/<ветка>`, поверх — `tests/e2e/` и `scripts/test/` +из этой ветки (в ветки исполнителей ничего не коммитилось), затем +`E2E_MIGRATIONS=roundtrip E2E_DATABASE_NAME=krona_staff_acc node scripts/test/run-e2e.mjs`. +«Было» — основная ветка `f5ac179` с тем же стендом (45 red / 9 green, храповик OK). Полные таблицы — +`tests/e2e/report-evidence/acceptance-*.txt`. Ни одна ветка не влита в основную +(`git merge-base --is-ancestor` → нет), поэтому `known-defects.json` не сокращён. -## N5: tenant-isolation до/после - -До (база 778ba2d, `DATABASE_TEST_URL` = роль приложения), [`evidence/n5-before.txt`](evidence/n5-before.txt): +### `codex/fix-live-database` @ ea68e12 ```text - FAIL tests/integration/tenant-isolation.test.ts > PostgreSQL tenant isolation -error: permission denied for table staff_employees - ❯ tests/integration/tenant-isolation.test.ts:40:7 - Test Files 1 failed (1) - Tests 1 passed (1) -exit=1 +== roundtrip OK: rolledBack=11 reapplied=11 + Tests 41 failed | 13 passed (54) +| K13/SYNC-A | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K13/SYNC-B | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K3/N2 | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K4/N1 | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | ``` -После (очистка соединением мигратора `DATABASE_TEST_MIGRATION_URL`, с -`app.tenant_id` из-за FORCE RLS, до и после теста), [`evidence/n5-after.txt`](evidence/n5-after.txt): +| ID | Было | Стало | Доказательство | +| ---------- | ---- | ----- | ------------------------------------------------------------------------------------------------------------ | +| K3/N2 | RED | GREEN | было: подтверждение смены `500 23502 occurred_at`; стало: passed (8 ч × 123,00 ₽ = 98400 в ledger) | +| K4/N1 | RED | GREEN | было: `500 42P08`; стало: passed (201, сотрудник в БД) | +| K13/SYNC-A | RED | GREEN | было: `upsert_work_session → applied`; стало: passed (см. находку по fd1ec3d) | +| K13/SYNC-B | RED | GREEN | было: `upsert_timesheet_entry → applied`; стало: passed | +| K5/N4 | RED | RED | было: блокирован K3; стало: `смена должна быть начислена ровно один раз: expected 196800n to be 98400n` | +| K6/D5 | RED | RED | было: блокирован K3; стало: `после отклонения оплаченной смены должно быть сторно: expected 98400n to be 0n` | +| K8/D1 | RED | RED | было: блокирован K3; стало: `C4 verify: HTTP 404 Route GET .../payroll/runs/:id/verify not found` | +| A4 | RED | RED | было: 2 утечки; стало: 1 — `POST /payroll/calculate month=2026-13` → `code=22008` | +| F14 | RED | GREEN | `prettier --check .` → `All matched files use Prettier code style!` (без оверлея evidence) | + +Вердикт: K3 и K4 исправлены (подтверждено на живой PostgreSQL 17, миграции roundtrip). После влития +убрать `K3/N2`, `K4/N1` из `known-defects.json`. Цепочка расчёта теперь доходит до денежных дефектов: +K5 и K6 подтверждены по существу. + +### `codex/fix-format-baseline` @ fd1ec3d ```text -== run 1 ... Test Files 1 passed (1) Tests 1 passed (1) exit=0 -== run 2 ... Test Files 1 passed (1) Tests 1 passed (1) exit=0 + Tests 43 failed | 11 passed (54) +| K13/SYNC-A | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K13/SYNC-B | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +$ node node_modules/prettier/bin/prettier.cjs --check . +All matched files use Prettier code style! ``` -Полный `npm run check` с тестовой БД (задача verify в `ci-local.sh`): -`Test Files 19 passed (19)`, `Tests 188 passed (188)`. +| ID | Было | Стало | Доказательство | +| ---------- | -------------- | ----- | ------------------------------------------------- | +| F14 | RED (23 файла) | GREEN | `All matched files use Prettier code style!` | +| K13/SYNC-A | RED | GREEN | было: `applied`; стало: passed | +| K13/SYNC-B | RED | GREEN | было: `applied`; стало: passed | +| остальные | без изменений | — | compare по `e2e-results.json`: других отличий нет | + +**Находка:** «style»-коммит `fd1ec3d` содержит функциональное исправление Antigravity. +После нормализации prettier `src/domain/sync/service.ts` отличается от `331e490` на 255 строк diff +и совпадает с `antigravity/fix-reject-device-shifts` (0 строк); `tests/unit/sync.test.ts` — 139 и 0. +Изменение поведения скрыто в коммите форматирования — смешение тем (AGENTS.md). + +### `antigravity/fix-reject-device-shifts` @ 795bba0 + +```text + Tests 43 failed | 11 passed (54) +| K13/SYNC-A | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K13/SYNC-B | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +``` + +| ID | Было | Стало | Доказательство | +| ---------- | ---- | ----- | ------------------------------------------------------- | +| K13/SYNC-A | RED | GREEN | было: `upsert_work_session → applied`; стало: passed | +| K13/SYNC-B | RED | GREEN | было: `upsert_timesheet_entry → applied`; стало: passed | +| остальные | — | — | других отличий нет | + +Вердикт: K13 исправлен. Ветка основана на `778ba2d`, не на `331e490`. Убрать `K13/SYNC-A`, +`K13/SYNC-B` отдельным коммитом после влития (и после исправления очистки в +`sync-rejection.test.ts`, TASK-GROK-2 §4.1). + +## Windows + +- Запуск стенда переписан без `npx` и `node_modules/.bin` (раньше `spawn('npx')` и + `spawn('.../.bin/tsx')` падали на Windows с `ENOENT`). Проверка на Linux: + `tests/e2e/harness/node-commands.test.ts` — 8 тестов: команды начинаются с `process.execPath`, + без `.cmd`/`.bin`/`npx`, файлы существуют; под `win32` дочерний процесс получает + `SystemRoot`/`TEMP`, секреты родителя не наследуются. +- **Реальный запуск на Windows 11 — не проверено**: Windows-раннера у git.ochenstarik.ru нет. + В CI добавлена задача `windows` (`runs-on: windows`), включаемая переменной + `KRONA_WINDOWS_RUNNER=true`; для полного e2e нужен секрет `WINDOWS_E2E_PG_ADMIN_URL`. +- `scripts/test/ci-local.sh` — bash, на Windows не предназначен (под Windows запускать + `node scripts/test/run-e2e.mjs`). + +## Evidence вне git + +```text +$ E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs # (повторный прогон) +[run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты +$ git status --porcelain + # (пусто) +``` + +## N5 (tenant-isolation) + +До (`778ba2d`, очистка ролью приложения) — [`report-evidence/n5-before.txt`](report-evidence/n5-before.txt): +`error: permission denied for table staff_employees`, `exit=1`. После (очистка ролью мигратора с +`app.tenant_id`) — [`report-evidence/n5-after.txt`](report-evidence/n5-after.txt): 2 прогона, `exit=0`. +На `f5ac179`: `npm run check` с тестовой БД — `Test Files 20 passed (20)`, `Tests 196 passed (196)`. ## CI (`.forgejo/workflows/ci.yml`) -- `verify`: сервис `postgres:17-alpine@sha256:18cfe3ef…` (bootstrap-пользователь только - для provision), роли как в pilot (мигратор без SUPERUSER, app без BYPASSRLS), - миграции `up → откат всех 11 → up → up (no-op)`, `npm run check` с - `DATABASE_TEST_URL`/`DATABASE_TEST_MIGRATION_URL` (tenant-isolation реально - выполняется), `npm audit --audit-level=high`. -- `format`: отдельно, чтобы F14 (23 файла вне моих путей) не маскировал остальное. -- `e2e`: тот же сервис PostgreSQL 17, `E2E_MIGRATIONS=roundtrip`, храповик. -- `docker-build`: отдельная задача на метке `docker-host`, `needs: verify`, только push. -- Все actions закреплены SHA (F13): `actions/checkout@11d5960a… # v4.4.0`, - `actions/setup-node@49933ea5… # v4.4.0` (SHA получены `git ls-remote`, совпадают на - github.com и code.forgejo.org). +- `verify`: `postgres:17-alpine@sha256:…`, роли как в pilot (мигратор NOSUPERUSER, app NOBYPASSRLS), + миграции `up → откат всех 11 → up → up`, `npm run check` с тестовой БД, `npm audit`. +- `format`: отдельно (F14 красный до влития `codex/fix-format-baseline`). +- `e2e`: PostgreSQL 17, `E2E_MIGRATIONS=roundtrip`, храповик; evidence — артефакт `e2e-evidence` + (`actions/upload-artifact@ea165f8… # v4.6.2`, Forgejo 9.0.3). +- `windows`: выключена без раннера (см. выше). `docker-build`: метка `docker-host`, `needs: verify`, только push. +- Все actions закреплены SHA (F13), SHA совпадают на github.com и code.forgejo.org. -Валидация: `actionlint -config-file actionlint.yaml .forgejo/workflows/ci.yml` (1.7.12, -метки `docker`, `docker-host`) → 0 замечаний, exit 0. Локальный эквивалент -`./scripts/test/ci-local.sh` ([`evidence/ci-local.txt`](evidence/ci-local.txt)): +Механизм красных сценариев — храповик `known-defects.json`, а не «allowed to fail»: сломанный стенд, +новый красный ID или исправленный, но не вычеркнутый ID делают задачу `e2e` красной. + +Валидация: `actionlint -config-file actionlint.yaml .forgejo/workflows/ci.yml` (1.7.12, метки +`docker`, `docker-host`, `windows`) → 0 замечаний. Локально `./scripts/test/ci-local.sh`: ```text -::: [migrate-roundtrip] OK (== roundtrip OK: rolledBack=11 reapplied=11) -::: [check] OK (Test Files 19 passed, Tests 188 passed) -::: [audit] OK (found 0 vulnerabilities) -::: [format-check] FAIL exit=1 (Code style issues found in 23 files — F14) -::: [e2e] OK (храповик: все красные — известные дефекты) -=== итог: status=1 (только из-за format) +::: [migrate-roundtrip] OK (== roundtrip OK: rolledBack=11 reapplied=11) +::: [check] OK (Test Files 20 passed (20), Tests 196 passed (196)) +::: [audit] OK (found 0 vulnerabilities) +::: [format-check] FAIL (Code style issues found in 23 files — F14) +::: [e2e] OK (Tests 45 failed | 9 passed (54), храповик OK) ``` -## Проверка pilot compose (PILOT-1..3) +## N13 (гонка первого расчёта) -`tests/e2e/40-compose-pilot.e2e.ts` читает `deploy/pilot/compose.yaml` (только чтение). -Положен в `tests/e2e/`, а не рядом с существующим тестом корневого compose -(`tests/unit/deployment.test.ts`), потому что `tests/unit/` вне разрешённых путей. -Результат: PILOT-1 RED (14 подстановок без `:?`), PILOT-2 RED (`NODE_ENV: development` в -`app`; конфликт с запретом standalone в production в `config.ts` описан в заметках), -PILOT-3 GREEN. - -## N13: гонка первого расчёта - -`node scripts/test/n13-race.mjs` — 10/25/50 параллельных первых `POST /payroll/calculate`, -5 попыток на размер, каждая попытка на новой точке. Вывод: [`evidence/n13-race.txt`](evidence/n13-race.txt). - -```text -[n13] ИТОГ mode=as-is sessions=false: попыток 15, некорректных 15 (все 500: N2, occurred_at) -[n13] ИТОГ mode=n2-bypass sessions=false: попыток 15, некорректных 0 (200×N, 1 run_id, 1 расчёт) -[n13] ИТОГ mode=n2-bypass sessions=true: попыток 15, некорректных 0 (с подтверждённой сменой, db_lines=1) -``` - -`n2-bypass` — диагностика: в одноразовой БД скрипта мигратор ставит -`DEFAULT now()` для `staff_outbox.occurred_at`; продукт и миграции не меняются. -Вердикт: **гонка не воспроизведена (0 из 30 попыток при 10/25/50)**, совпадает с -«N13 not reproduced» владельца. Вероятная причина (из кода, отдельно не проверено): -upsert `ensureDefaultPayRules` в начале расчёта случайно сериализует расчёты одного -тенанта. Окно в коде остаётся — рекомендация в заметках §5. +`node scripts/test/n13-race.mjs` (10/25/50 параллельных первых расчётов × 5 попыток) — +[`report-evidence/n13-race.txt`](report-evidence/n13-race.txt): как есть 15/15 → 500 (K3); с обходом K3 +в одноразовой БД — 0 некорректных из 30 (с подтверждённой сменой и без). Не воспроизведено, как и у +владельца; вероятная причина (гипотеза по коду) — upsert `ensureDefaultPayRules` сериализует расчёты +тенанта. Прогон до перебазирования, на `778ba2d`. ## Не проверено -- Реальный Forgejo-раннер: workflow не запускался на сервере (нет API-токена, задачи - выполнены локально эквивалентным скриптом). Раннера с меткой `docker-host` может не быть. -- `docker build` не запускался (на этой машине нет Docker). -- Windows-only: DPAPI, ACL каталога данных, установщик, WinUI, реальный named pipe — - не проверено; см. тесты Codex в `apps/KronaStaffTerminal.Tests`. -- Сопоставление с ID владельца K1/K3/K4/K5/K6/K10/K11/K12, S1/S2/S9, A4 и сверка с его - `live-audit.mjs`/`live-sync.mjs` — файлов нет. -- N4 и SYNC-C по существу: блокированы N2 и SYNC-C0 соответственно. -- OWN-01..11 проверяют предполагаемый контракт; реальный контракт Codex может отличаться. +- Реальный Forgejo-раннер (workflow выполнялся только локальным эквивалентом), `docker build`. +- Запуск на Windows 11 (раннера нет); Windows-only: DPAPI, ACL каталога данных, установщик, WinUI, + named pipe — см. тесты Codex в `apps/KronaStaffTerminal.Tests`. +- OWN-01..11, K8 (C4) и K9 (C5) проверяют предполагаемые контракты из NOTES. +- K5/N4, K6/D5, K8/D1 на основной ветке блокированы K3; по существу проверены только на + `codex/fix-live-database`. +- S9 проверен удалением SQL-запросом мигратора (публичного API удаления точки нет). - Причина невоспроизводимости N13 — гипотеза по коду. From ba59a48ffd6a6db6d9ad66f2b20a15aa5d5abb90 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 15:30:40 +0700 Subject: [PATCH 21/28] =?UTF-8?q?test(e2e):=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D1=91=D0=BC=D0=BA=D0=B8=20=D0=BD=D0=B0=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D1=91=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=82=D0=BA=D0=B0=D1=85=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: во время приёмки обе ветки обновили force-push (codex/fix-live-database ea68e12 → b289dd6, antigravity/fix-reject-device-shifts 795bba0 → 1df2019, теперь на f5ac179). Вердикт по старому SHA не должен выдаваться за вердикт по новому — «на слово ничего не принимать». Что: повторный прогон стенда на новых HEAD, результат дописан в report-evidence/acceptance-*.txt, REPORT.md и NOTES. Итог тот же: fix-live-database 41 red / 13 green (K3, K4, K13 зелёные), fix-reject-device-shifts 43 red / 11 green (K13 зелёный). --- tests/e2e/NOTES-FOR-EXECUTORS.md | 6 +++--- tests/e2e/REPORT.md | 13 ++++++++++--- ...e-antigravity-fix-reject-device-shifts.txt | 11 +++++++++++ .../acceptance-codex-fix-live-database.txt | 19 +++++++++++++++++++ 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/tests/e2e/NOTES-FOR-EXECUTORS.md b/tests/e2e/NOTES-FOR-EXECUTORS.md index 58820a2..10b1a46 100644 --- a/tests/e2e/NOTES-FOR-EXECUTORS.md +++ b/tests/e2e/NOTES-FOR-EXECUTORS.md @@ -174,7 +174,7 @@ CONFLICT DO NOTHING` со своим `runId` → строки/UPDATE по нес Подробно — `tests/e2e/REPORT.md` и `tests/e2e/report-evidence/acceptance-*.txt`. -- `codex/fix-live-database` (ea68e12): K3/N2 и K4/N1 зелёные на живой PostgreSQL 17. +- `codex/fix-live-database` (ea68e12, перепроверено на b289dd6): K3/N2 и K4/N1 зелёные на живой PostgreSQL 17. Дальше по цепочке открылись K5/N4 (196800 вместо 98400 — двойное начисление) и K6/D5 (отклонение оплаченной смены: 200, начисление осталось). A4 частично: `POST /employees` больше не 500, но `month=2026-13` по-прежнему отдаёт `code=22008` с текстом. @@ -184,8 +184,8 @@ CONFLICT DO NOTHING` со своим `runId` → строки/UPDATE по нес `antigravity/fix-reject-device-shifts` (0 строк diff) и отличаются от 331e490 на 255/139 строк. Изменение поведения стоит вынести в отдельный коммит с объяснением или влить ветку Antigravity отдельно, иначе история смешивает темы (AGENTS.md). -- `antigravity/fix-reject-device-shifts` (795bba0): K13/SYNC-A и K13/SYNC-B зелёные, - остальное без изменений. Ветка основана на 778ba2d, а не на 331e490. +- `antigravity/fix-reject-device-shifts` (795bba0, перепроверено на 1df2019 — уже на f5ac179): + K13/SYNC-A и K13/SYNC-B зелёные, остальное без изменений. - Ни одна ветка не влита в основную (f5ac179), поэтому ID из `known-defects.json` не удалены. - Суммы в тестах кратны рублю: расчёт округляет строку до `rounding_unit_minor` (по умолчанию 100 коп.). Если округление должно быть другим — это решение продукта, не теста. diff --git a/tests/e2e/REPORT.md b/tests/e2e/REPORT.md index 6a2ae00..d2e8f07 100644 --- a/tests/e2e/REPORT.md +++ b/tests/e2e/REPORT.md @@ -109,7 +109,7 @@ node scripts/test/run-e2e.mjs --no-known-defects # строго: люб `tests/e2e/report-evidence/acceptance-*.txt`. Ни одна ветка не влита в основную (`git merge-base --is-ancestor` → нет), поэтому `known-defects.json` не сокращён. -### `codex/fix-live-database` @ ea68e12 +### `codex/fix-live-database` @ ea68e12, перепроверено на b289dd6 ```text == roundtrip OK: rolledBack=11 reapplied=11 @@ -132,6 +132,10 @@ node scripts/test/run-e2e.mjs --no-known-defects # строго: люб | A4 | RED | RED | было: 2 утечки; стало: 1 — `POST /payroll/calculate month=2026-13` → `code=22008` | | F14 | RED | GREEN | `prettier --check .` → `All matched files use Prettier code style!` (без оверлея evidence) | +Ветку обновили force-push во время приёмки (`ea68e12` → `b289dd6`, изменён только +`tests/integration/live-postgres-remediation.test.ts`); повторный прогон на `b289dd6` дал те же +41 red / 13 green и ту же таблицу. + Вердикт: K3 и K4 исправлены (подтверждено на живой PostgreSQL 17, миграции roundtrip). После влития убрать `K3/N2`, `K4/N1` из `known-defects.json`. Цепочка расчёта теперь доходит до денежных дефектов: K5 и K6 подтверждены по существу. @@ -158,7 +162,7 @@ All matched files use Prettier code style! и совпадает с `antigravity/fix-reject-device-shifts` (0 строк); `tests/unit/sync.test.ts` — 139 и 0. Изменение поведения скрыто в коммите форматирования — смешение тем (AGENTS.md). -### `antigravity/fix-reject-device-shifts` @ 795bba0 +### `antigravity/fix-reject-device-shifts` @ 795bba0, перепроверено на 1df2019 ```text Tests 43 failed | 11 passed (54) @@ -172,7 +176,10 @@ All matched files use Prettier code style! | K13/SYNC-B | RED | GREEN | было: `upsert_timesheet_entry → applied`; стало: passed | | остальные | — | — | других отличий нет | -Вердикт: K13 исправлен. Ветка основана на `778ba2d`, не на `331e490`. Убрать `K13/SYNC-A`, +Ветку перебазировали на `f5ac179` во время приёмки (`795bba0` → `1df2019`); повторный прогон +на `1df2019`: те же 43 red / 11 green, отличия только K13/SYNC-A/B. + +Вердикт: K13 исправлен. Убрать `K13/SYNC-A`, `K13/SYNC-B` отдельным коммитом после влития (и после исправления очистки в `sync-rejection.test.ts`, TASK-GROK-2 §4.1). diff --git a/tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt b/tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt index 14ba662..6c5b90c 100644 --- a/tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt +++ b/tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt @@ -14,3 +14,14 @@ exit=1 | ID | было | стало | фактический вывод | | K13/SYNC-A | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_work_session","status":"applied","result":{"id":"","revision":1,"status" / стало: passed | | K13/SYNC-B | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"","revision":1,"stat / стало: passed | + +# Перепроверка: ветку обновили force-push во время приёмки; новый HEAD 1df2019cb89cad69e2c86608dd3b43e18275e97c (2026-09-26 ~15:40 UTC+7) +$ cd && E2E_MIGRATIONS=roundtrip E2E_DATABASE_NAME=krona_staff_acc node scripts/test/run-e2e.mjs +== roundtrip OK: rolledBack=11 reapplied=11 + Tests 43 failed | 11 passed (54) +| K13/SYNC-A | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K13/SYNC-B | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +exit=1 +| ID | было | стало | фактический вывод | +| K13/SYNC-A | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_work_session","status":"applied","result":{"id":"","revision":1,"status" / стало: passed | +| K13/SYNC-B | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"","revision":1,"stat / стало: passed | diff --git a/tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt b/tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt index 9673dfa..952cbe8 100644 --- a/tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt +++ b/tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt @@ -28,3 +28,22 @@ $ node node_modules/prettier/bin/prettier.cjs --check . Checking formatting... All matched files use Prettier code style! # Было (основная ветка f5ac179): [warn] Code style issues found in 23 files. + +# Перепроверка: ветку обновили force-push во время приёмки; новый HEAD b289dd6d63b8f5bcd7c03a88c07200e2e4a704bc (2026-09-26 ~15:40 UTC+7) +$ cd && E2E_MIGRATIONS=roundtrip E2E_DATABASE_NAME=krona_staff_acc node scripts/test/run-e2e.mjs +== roundtrip OK: rolledBack=11 reapplied=11 + Tests 41 failed | 13 passed (54) +| K13/SYNC-A | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K13/SYNC-B | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K3/N2 | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +| K4/N1 | GREEN | 1/1 | зелёный — ИСПРАВЛЕН, уберите из known-defects.json | +exit=1 +| ID | было | стало | фактический вывод | +| A4 | RED | RED | было: AssertionError: тела 500 с деталями PostgreSQL: expected [ …(2) ] to deeply equal [] / стало: AssertionError: тела 500 с деталями PostgreSQL: expected [ { …(2) } ] to deeply equal [] | +| K13/SYNC-A | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_work_session","status":"applied","result":{"id":"","revision":1,"status" / стало: passed | +| K13/SYNC-B | RED | GREEN | было: AssertionError: HTTP 200 {"results":[{"idempotency_key":"e2e-","command_type":"upsert_timesheet_entry","status":"applied","result":{"id":"","revision":1,"stat / стало: passed | +| K3/N2 | RED | GREEN | было: AssertionError: подтверждение смены: HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occurred_at\" of relation / стало: passed | +| K4/N1 | RED | GREEN | было: AssertionError: HTTP 500 {"statusCode":500,"code":"42P08","error":"Internal Server Error","message":"inconsistent types deduced for parameter $2"}: expected 500 to be 201 / стало: passed | +| K5/N4 | RED | RED | было: AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value in column \"occ / стало: AssertionError: смена должна быть начислена ровно один раз: expected 196800n to be 98400n // Object.is equality | +| K6/D5 | RED | RED | было: AssertionError: подтверждение смены (предусловие; падает, пока открыт K3): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value / стало: AssertionError: после отклонения оплаченной смены должно быть сторно: итог начислений 0: expected 98400n to be 0n // Object.is equality | +| K8/D1 | RED | RED | было: AssertionError: подтверждение смены (предусловие; падает, пока открыт K3): HTTP 500 {"statusCode":500,"code":"23502","error":"Internal Server Error","message":"null value / стало: AssertionError: C4 verify: HTTP 404 {"message":"Route GET:/api/v1/staff/payroll/runs//verify not found","error":"Not Found","statusCode":404}: expected 404 to be 20 | From aa7f5f8bbd27ce57caca1a254fdeeb7ef01aebb6 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 16:01:19 +0700 Subject: [PATCH 22/28] =?UTF-8?q?test(e2e):=20=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=B5=20=D1=80=D0=BE=D0=BB=D0=B8=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20E2E=5FMIGRATOR=5FURL/E2E=5FAPP=5FURL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: TASK-GROK-3 п.1 — на общем кластере (параллельные прогоны приёмки, чужой стенд) пересоздание ролей krona_migrator/krona_staff_app со случайными паролями ломает соседей. Если заданы оба URL, global-setup не вызывает provision и не требует E2E_PG_ADMIN_URL; по умолчанию поведение прежнее. provision-pg получил --roles keep: пересоздать только БД, не меняя паролей (нужно accept-branch для отдельной БД на ветку). ctx.adminDatabaseUrl (E2E_DB_ADMIN_URL или E2E_PG_ADMIN_URL + БД стенда) — только для PILOT-REHOME. Проверено: run-e2e с E2E_MIGRATOR_URL/E2E_APP_URL без E2E_PG_ADMIN_URL — 45 failed | 9 passed, как на основе; повторный прогон на уже мигрированной БД — то же. --- scripts/test/provision-pg.mjs | 42 ++++++++++++++++------- tests/e2e/harness/context.ts | 2 ++ tests/e2e/harness/global-setup.ts | 57 +++++++++++++++++++++++++++---- 3 files changed, 82 insertions(+), 19 deletions(-) diff --git a/scripts/test/provision-pg.mjs b/scripts/test/provision-pg.mjs index 2db7ae5..95e79b2 100644 --- a/scripts/test/provision-pg.mjs +++ b/scripts/test/provision-pg.mjs @@ -14,9 +14,13 @@ for (let i = 2; i < process.argv.length; i += 2) args.set(process.argv[i], proce const adminUrl = process.env.E2E_PG_ADMIN_URL; const envFile = args.get('--out'); const database = args.get('--db') ?? 'krona_staff_e2e'; -if (!adminUrl || !envFile) { +// --roles keep: роли уже созданы (например, предыдущим вызовом accept-branch) — пароли НЕ меняются, +// только пересоздаётся БД. Нужно, чтобы параллельные/последовательные стенды не ломали друг другу пароли. +const keepRoles = args.get('--roles') === 'keep'; +if (!adminUrl || (!envFile && !keepRoles)) { console.error( - 'Usage: E2E_PG_ADMIN_URL=... node scripts/test/provision-pg.mjs --out [--db name]', + 'Usage: E2E_PG_ADMIN_URL=... node scripts/test/provision-pg.mjs --out [--db name]\n' + + ' E2E_PG_ADMIN_URL=... node scripts/test/provision-pg.mjs --roles keep --db name', ); process.exit(2); } @@ -31,7 +35,14 @@ export async function provision() { }); await admin.connect(); try { - await admin.query(` + if (keepRoles) { + const existing = await admin.query( + `SELECT count(*)::int AS n FROM pg_roles WHERE rolname IN ('krona_migrator','krona_staff_app')`, + ); + if (existing.rows[0].n !== 2) + throw new Error('--roles keep: роли krona_migrator/krona_staff_app не созданы'); + } else { + await admin.query(` DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'krona_migrator') THEN CREATE ROLE krona_migrator LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS; @@ -40,16 +51,17 @@ export async function provision() { CREATE ROLE krona_staff_app LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT NOBYPASSRLS; END IF; END $$`); - const alterMigrator = await admin.query( - "SELECT format('ALTER ROLE krona_migrator WITH LOGIN PASSWORD %L NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS', $1::text) AS sql", - [migratorPassword], - ); - await admin.query(alterMigrator.rows[0].sql); - const alterApp = await admin.query( - "SELECT format('ALTER ROLE krona_staff_app WITH LOGIN PASSWORD %L NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT NOBYPASSRLS', $1::text) AS sql", - [appPassword], - ); - await admin.query(alterApp.rows[0].sql); + const alterMigrator = await admin.query( + "SELECT format('ALTER ROLE krona_migrator WITH LOGIN PASSWORD %L NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS', $1::text) AS sql", + [migratorPassword], + ); + await admin.query(alterMigrator.rows[0].sql); + const alterApp = await admin.query( + "SELECT format('ALTER ROLE krona_staff_app WITH LOGIN PASSWORD %L NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT NOBYPASSRLS', $1::text) AS sql", + [appPassword], + ); + await admin.query(alterApp.rows[0].sql); + } await admin.query( `SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()`, [database], @@ -73,6 +85,10 @@ export async function provision() { } finally { await dbAdmin.end(); } + if (keepRoles) { + console.log(`recreated database=${database} (roles kept, passwords unchanged)`); + return; + } const base = new URL(adminUrl); const url = (user, password) => { const u = new URL(base.toString()); diff --git a/tests/e2e/harness/context.ts b/tests/e2e/harness/context.ts index 8e9dfcc..05aa696 100644 --- a/tests/e2e/harness/context.ts +++ b/tests/e2e/harness/context.ts @@ -11,6 +11,8 @@ export interface E2EContext { terminalActorId: string; appDatabaseUrl: string; migrationDatabaseUrl: string; + /** Админ (владелец кластера) в БД стенда; null, если не передан. Только для PILOT-REHOME. */ + adminDatabaseUrl: string | null; } declare module 'vitest' { diff --git a/tests/e2e/harness/global-setup.ts b/tests/e2e/harness/global-setup.ts index 55ca631..7cb6361 100644 --- a/tests/e2e/harness/global-setup.ts +++ b/tests/e2e/harness/global-setup.ts @@ -103,12 +103,47 @@ async function startServer(name: string, env: Record): Promise { + const result = new URL(url); + result.pathname = `/${database}`; + return result.toString(); + }; + const presetMigrator = process.env.E2E_MIGRATOR_URL; + const presetApp = process.env.E2E_APP_URL; + if (presetMigrator && presetApp) { + const database = new URL(presetApp).pathname.slice(1); + console.log( + `[e2e] роли заданы E2E_MIGRATOR_URL/E2E_APP_URL: provision пропущен, БД ${database}`, + ); + return { + migrationUrl: presetMigrator, + appUrl: presetApp, + adminDatabaseUrl: + process.env.E2E_DB_ADMIN_URL ?? (adminUrl ? withDatabase(adminUrl, database) : null), + }; + } + if (presetMigrator || presetApp) { + throw new Error('E2E_MIGRATOR_URL и E2E_APP_URL задаются только вместе'); + } if (!adminUrl) { throw new Error( - 'E2E_PG_ADMIN_URL не задан: нужен bootstrap-админ PostgreSQL 17 (только для создания ролей и БД)', + 'E2E_PG_ADMIN_URL не задан: нужен bootstrap-админ PostgreSQL 17 (только для создания ролей и БД) ' + + 'или готовые роли в E2E_MIGRATOR_URL + E2E_APP_URL', ); } const database = process.env.E2E_DATABASE_NAME ?? 'krona_staff_e2e'; @@ -121,10 +156,19 @@ export default async function setup(project: TestProject) { ); const dbEnv = parseEnvFile(envFile); rmSync(secretsDir, { recursive: true, force: true }); - const migrationUrl = dbEnv.DATABASE_MIGRATION_URL; - const appUrl = dbEnv.DATABASE_URL; - if (!migrationUrl || !appUrl) throw new Error('provision did not produce connection URLs'); + if (!dbEnv.DATABASE_MIGRATION_URL || !dbEnv.DATABASE_URL) { + throw new Error('provision did not produce connection URLs'); + } + return { + migrationUrl: dbEnv.DATABASE_MIGRATION_URL, + appUrl: dbEnv.DATABASE_URL, + adminDatabaseUrl: process.env.E2E_DB_ADMIN_URL ?? withDatabase(adminUrl, database), + }; +} +export default async function setup(project: TestProject) { + mkdirSync(evidenceDir, { recursive: true }); + const { migrationUrl, appUrl, adminDatabaseUrl } = resolveDatabase(); const migrationMode = process.env.E2E_MIGRATIONS ?? 'up'; runNode( ['scripts/test/migrate-roundtrip.mjs', migrationMode === 'roundtrip' ? 'roundtrip' : 'up'], @@ -176,6 +220,7 @@ export default async function setup(project: TestProject) { terminalActorId, appDatabaseUrl: appUrl, migrationDatabaseUrl: migrationUrl, + adminDatabaseUrl, }; project.provide('e2e', context); From 644ea7c6cb950b46efb4a6ca3efaff4987332ebe Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 16:06:59 +0700 Subject: [PATCH 23/28] =?UTF-8?q?test(accept):=20scripts/test/accept-branc?= =?UTF-8?q?h.mjs=20=E2=80=94=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=D0=B5=D1=82=D0=BE=D0=BA=20=D0=BE=D0=B4=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: TASK-GROK-3 п.1–2 — приёмка вручную пропускала красные интеграционные тесты (ошибка в beforeAll/afterAll даёт «Tests 2 passed» при «Test Files 1 failed») и конфликты между ветками. Скрипт: worktree на ветку + оверлей текущего стенда, npm run check, каждый tests/integration/*.test.ts на свежей мигрированной БД (красный по строке Test Files), e2e и разница с основой по ID, попарный git merge-tree --write-tree, проверка «форматирование без поведения» (merge-base → prettier с конфигом основы → сравнение, плюс совпадение лишних строк с другими ветками). Роли создаются один раз, дальше --roles keep; с E2E_MIGRATOR_URL/E2E_APP_URL роли не трогаются вовсе. Проверено: на 1df2019 + 8baad55 + 513cdff вывод совпал с ожиданиями владельца (created_by / Called end on pool more than once при Tests 2 passed / SYNC-C0 зелёный / конфликты в src/domain/sync/service.ts); синтетическая prettier-only ветка — «ТОЛЬКО ФОРМАТИРОВАНИЕ». --- scripts/test/accept-branch.mjs | 669 +++++++++++++++++++++++++++++++++ 1 file changed, 669 insertions(+) create mode 100644 scripts/test/accept-branch.mjs diff --git a/scripts/test/accept-branch.mjs b/scripts/test/accept-branch.mjs new file mode 100644 index 0000000..6dc935b --- /dev/null +++ b/scripts/test/accept-branch.mjs @@ -0,0 +1,669 @@ +#!/usr/bin/env node +// Приёмка веток исполнителей одной командой (TASK-GROK-3 п.1–2). +// +// node scripts/test/accept-branch.mjs [опции] <ветка> [<ветка>…] +// +// Для основы (--base) и каждой ветки: +// 1. git worktree в $ACCEPT_ROOT (по умолчанию ../krona-staff-acceptance), detached HEAD; +// node_modules — symlink на текущий репозиторий, если package-lock.json совпадает, иначе npm ci; +// 2. оверлей ТЕКУЩЕГО стенда: tests/e2e/** и scripts/test/** из этого checkout +// (tests/integration, src, миграции — версии ветки, не трогаются); +// 3. `npm run check` без переменных БД; +// 4. КАЖДЫЙ tests/integration/*.test.ts отдельно на свежей мигрированной БД PostgreSQL; +// красный — по строке `Test Files` (ловит ошибки beforeAll/afterAll, при которых +// `Tests N passed`), плюс ненулевой exit; +// 5. e2e (scripts/test/run-e2e.mjs, миграции roundtrip) и сравнение с основой по ID сценария; +// 6. попарно `git merge-tree --write-tree` — все ветки между собой и с основой; +// 7. «форматирование без поведения» для веток с `format` в имени и для --format-check <ветка>: +// версия файла из merge-base → prettier (конфиг основы) → сравнение с версией ветки. +// Итог — markdown в stdout (и в --out). Логи — в tests/e2e/evidence/accept/<время>/. +// +// БД: по умолчанию E2E_PG_ADMIN_URL (bootstrap-админ) один раз создаёт роли со случайными +// паролями, дальше только пересоздаёт БД `krona_acc_it`/`krona_acc_e2e` (provision-pg --roles keep). +// Если заданы E2E_MIGRATOR_URL и E2E_APP_URL — роли не создаются и пароли не меняются, +// все прогоны идут последовательно в БД из этих URL со сбросом через откат всех миграций. +// +// Опции: --base (origin/codex/bootstrap-platform-foundation), --format-check +// (повторяемая; ветка проверяется только на формат, без worktree), --skip-check, +// --skip-integration, --skip-e2e, --out <файл.md>. +// Ветка задаётся как `origin/<имя>`, `<имя>` (ищется origin/<имя>, затем локальный ref) или SHA. +import { spawn, spawnSync } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { + cpSync, + existsSync, + mkdirSync, + mkdtempSync, + readFileSync, + readdirSync, + rmSync, + symlinkSync, + writeFileSync, +} from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import * as prettier from 'prettier'; + +const repoRoot = path.resolve(import.meta.dirname, '../..'); +const acceptRoot = path.resolve( + process.env.ACCEPT_ROOT ?? path.join(repoRoot, '..', 'krona-staff-acceptance'), +); + +// ---------- аргументы ---------- +const argv = process.argv.slice(2); +const opts = { + base: 'origin/codex/bootstrap-platform-foundation', + formatOnly: [], + skipCheck: false, + skipIntegration: false, + skipE2e: false, + out: null, + branches: [], +}; +for (let i = 0; i < argv.length; i += 1) { + const arg = argv[i]; + if (arg === '--base') opts.base = argv[++i]; + else if (arg === '--format-check') opts.formatOnly.push(argv[++i]); + else if (arg === '--skip-check') opts.skipCheck = true; + else if (arg === '--skip-integration') opts.skipIntegration = true; + else if (arg === '--skip-e2e') opts.skipE2e = true; + else if (arg === '--out') opts.out = argv[++i]; + else if (arg === '-h' || arg === '--help') { + console.log(readFileSync(new URL(import.meta.url), 'utf8').split('\nimport ')[0]); + process.exit(0); + } else if (arg.startsWith('--')) { + console.error(`неизвестная опция ${arg}`); + process.exit(2); + } else opts.branches.push(arg); +} +if (opts.branches.length === 0 && opts.formatOnly.length === 0) { + console.error('Usage: node scripts/test/accept-branch.mjs [--base ref] […]'); + process.exit(2); +} + +// ---------- утилиты ---------- +const stamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19); +const logDir = path.join(repoRoot, 'tests/e2e/evidence/accept', stamp); +mkdirSync(logDir, { recursive: true }); +const progress = (msg) => process.stderr.write(`[accept] ${msg}\n`); +const stripAnsi = (s) => s.replace(/\x1b\[[0-9;]*m/g, ''); + +function git(args, { cwd = repoRoot, allowFail = false } = {}) { + const r = spawnSync('git', args, { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 }); + if (r.status !== 0 && !allowFail) { + throw new Error(`git ${args.join(' ')} → exit ${r.status}: ${r.stderr}`); + } + return { code: r.status, out: r.stdout, err: r.stderr }; +} + +function run(command, args, { cwd, env, logFile, timeoutMs = 20 * 60_000 }) { + return new Promise((resolve) => { + const child = spawn(command, args, { cwd, env }); + let out = ''; + const timer = setTimeout(() => { + out += `\n[accept] TIMEOUT ${timeoutMs} ms — процесс убит\n`; + child.kill('SIGKILL'); + }, timeoutMs); + for (const stream of [child.stdout, child.stderr]) { + stream.on('data', (chunk) => { + out += chunk.toString(); + }); + } + child.on('close', (code) => { + clearTimeout(timer); + const clean = stripAnsi(out); + if (logFile) writeFileSync(logFile, `$ ${[command, ...args].join(' ')}\n${redact(clean)}`); + resolve({ code: code ?? 1, out: clean }); + }); + }); +} + +/** Пароли в URL не должны попасть в логи/отчёт. */ +function redact(text) { + return text.replace(/(postgres(?:ql)?:\/\/[^:\s/]+:)[^@\s]+@/g, '$1***@'); +} + +/** Окружение без переменных БД и секретов стенда. */ +function cleanEnv(extra = {}) { + const env = {}; + for (const [key, value] of Object.entries(process.env)) { + if (/^(DATABASE_|E2E_|TEST_DATABASE|POSTGRES_|KRONA_)/.test(key)) continue; + env[key] = value; + } + return { ...env, NO_COLOR: '1', FORCE_COLOR: '0', ...extra }; +} + +function resolveRef(name) { + const candidates = name.startsWith('origin/') ? [name] : [`origin/${name}`, name]; + for (const candidate of candidates) { + const r = git(['rev-parse', '--verify', '--quiet', `${candidate}^{commit}`], { + allowFail: true, + }); + if (r.code === 0) return { name, ref: candidate, sha: r.out.trim() }; + } + throw new Error(`ветка ${name} не найдена (ни origin/${name}, ни локально)`); +} + +const slugOf = (name) => + name + .replace(/^origin\//, '') + .replace(/[^A-Za-z0-9._-]+/g, '-') + .slice(0, 80); +const short = (sha) => sha.slice(0, 7); + +function firstError(text) { + const lines = text.split('\n'); + const patterns = [ + /((?:[A-Za-z]+Error|error): .+)$/, + /(AssertionError.+)$/, + /(Error: .+)$/, + /(FAIL .+)$/, + ]; + for (const pattern of patterns) { + for (const line of lines) { + const m = pattern.exec(line.trim()); + if (m) return m[1].replace(/\|/g, '\\|').slice(0, 180); + } + } + return ''; +} + +// ---------- БД ---------- +const presetMigrator = process.env.E2E_MIGRATOR_URL; +const presetApp = process.env.E2E_APP_URL; +const adminUrl = process.env.E2E_PG_ADMIN_URL; +const dbMode = presetMigrator && presetApp ? 'preset' : 'admin'; +let roleUrls = null; + +function withDatabase(url, database) { + const u = new URL(url); + u.pathname = `/${database}`; + return u.toString(); +} + +async function prepareRoles() { + if (dbMode === 'preset') { + roleUrls = { migrator: presetMigrator, app: presetApp }; + return 'роли из E2E_MIGRATOR_URL/E2E_APP_URL (не пересоздавались)'; + } + if (!adminUrl) { + throw new Error('нужен E2E_PG_ADMIN_URL или пара E2E_MIGRATOR_URL + E2E_APP_URL'); + } + const dir = mkdtempSync(path.join(tmpdir(), 'krona-accept-')); + const envFile = path.join(dir, 'db.env'); + const r = await run( + process.execPath, + ['scripts/test/provision-pg.mjs', '--out', envFile, '--db', 'krona_acc_roles'], + { cwd: repoRoot, env: { ...cleanEnv(), E2E_PG_ADMIN_URL: adminUrl } }, + ); + if (r.code !== 0) throw new Error(`provision: ${r.out}`); + const env = Object.fromEntries( + readFileSync(envFile, 'utf8') + .split('\n') + .filter((l) => l.includes('=')) + .map((l) => [l.slice(0, l.indexOf('=')), l.slice(l.indexOf('=') + 1)]), + ); + rmSync(dir, { recursive: true, force: true }); + roleUrls = { migrator: env.DATABASE_MIGRATION_URL, app: env.DATABASE_URL }; + return 'роли созданы один раз через E2E_PG_ADMIN_URL (provision-pg), дальше --roles keep'; +} + +/** Чистая БД: в admin-режиме пересоздаётся, в preset — одна и та же (сброс откатом миграций). */ +async function freshDatabase(name) { + if (dbMode === 'preset') return { ...roleUrls, reset: 'roundtrip' }; + const r = await run( + process.execPath, + ['scripts/test/provision-pg.mjs', '--roles', 'keep', '--db', name], + { cwd: repoRoot, env: { ...cleanEnv(), E2E_PG_ADMIN_URL: adminUrl } }, + ); + if (r.code !== 0) throw new Error(`provision --roles keep ${name}: ${r.out}`); + return { + migrator: withDatabase(roleUrls.migrator, name), + app: withDatabase(roleUrls.app, name), + admin: withDatabase(adminUrl, name), + reset: 'up', + }; +} + +// ---------- worktree ---------- +const repoLockHash = createHash('sha256') + .update(readFileSync(path.join(repoRoot, 'package-lock.json'))) + .digest('hex'); + +async function prepareWorktree(target) { + const dir = path.join(acceptRoot, `wt-${slugOf(target.name)}`); + mkdirSync(acceptRoot, { recursive: true }); + const registered = git(['worktree', 'list', '--porcelain']) + .out.split('\n') + .some((l) => l === `worktree ${dir}`); + if (registered) git(['worktree', 'remove', '--force', dir]); + else if (existsSync(dir)) throw new Error(`${dir} существует, но не является worktree`); + git(['worktree', 'add', '--detach', '--force', dir, target.sha]); + const lock = git(['show', `${target.sha}:package-lock.json`]).out; + const lockSame = createHash('sha256').update(lock).digest('hex') === repoLockHash; + if (lockSame) { + symlinkSync(path.join(repoRoot, 'node_modules'), path.join(dir, 'node_modules'), 'dir'); + } else { + progress(`${target.name}: package-lock.json отличается — npm ci`); + const r = await run('npm', ['ci', '--no-audit', '--no-fund'], { + cwd: dir, + env: cleanEnv(), + logFile: path.join(logDir, `${slugOf(target.name)}-npm-ci.txt`), + }); + if (r.code !== 0) throw new Error(`${target.name}: npm ci exit ${r.code}`); + } + // Оверлей стенда: tests/e2e/** (без evidence) и scripts/test/**. + const overlayTouched = git([ + 'diff', + '--name-only', + `${opts.baseTarget.sha}...${target.sha}`, + '--', + 'tests/e2e', + 'scripts/test', + ]).out.trim(); + for (const rel of ['tests/e2e', 'scripts/test']) { + rmSync(path.join(dir, rel), { recursive: true, force: true }); + cpSync(path.join(repoRoot, rel), path.join(dir, rel), { + recursive: true, + filter: (src) => !src.includes(`${path.sep}tests${path.sep}e2e${path.sep}evidence`), + }); + } + return { + dir, + deps: lockSame ? 'symlink' : 'npm ci', + overlayTouched: overlayTouched ? overlayTouched.split('\n') : [], + }; +} + +// ---------- шаги ---------- +async function stepCheck(target, wt) { + progress(`${target.name}: npm run check`); + const r = await run('npm', ['run', 'check'], { + cwd: wt.dir, + env: cleanEnv(), + logFile: path.join(logDir, `${slugOf(target.name)}-check.txt`), + }); + const tests = /Tests\s+(.+)$/m.exec(r.out)?.[1]?.trim() ?? ''; + return { ok: r.code === 0, code: r.code, tests, error: r.code === 0 ? '' : firstError(r.out) }; +} + +async function migrate(wt, db, logFile) { + const r = await run(process.execPath, ['scripts/test/migrate-roundtrip.mjs', db.reset], { + cwd: wt.dir, + env: cleanEnv({ DATABASE_MIGRATION_URL: db.migrator }), + logFile, + }); + return r; +} + +async function stepIntegration(target, wt) { + const dir = path.join(wt.dir, 'tests/integration'); + const files = existsSync(dir) + ? readdirSync(dir) + .filter((f) => f.endsWith('.test.ts')) + .sort() + : []; + const results = []; + for (const file of files) { + progress(`${target.name}: integration ${file}`); + const slug = `${slugOf(target.name)}-it-${file.replace(/\.test\.ts$/, '')}`; + const db = await freshDatabase('krona_acc_it'); + const m = await migrate(wt, db, path.join(logDir, `${slug}-migrate.txt`)); + if (m.code !== 0) { + results.push({ + file, + ok: false, + files: '', + tests: '', + error: `миграции: ${firstError(m.out)}`, + }); + continue; + } + const r = await run( + process.execPath, + [path.join(wt.dir, 'node_modules/vitest/vitest.mjs'), 'run', `tests/integration/${file}`], + { + cwd: wt.dir, + env: cleanEnv({ + DATABASE_TEST_URL: db.app, + DATABASE_TEST_MIGRATION_URL: db.migrator, + DATABASE_MIGRATION_URL: db.migrator, + }), + logFile: path.join(logDir, `${slug}.txt`), + }, + ); + const filesLine = /Test Files\s+(.+)$/m.exec(r.out)?.[1]?.trim() ?? '(нет строки Test Files)'; + const testsLine = /^\s*Tests\s+(.+)$/m.exec(r.out)?.[1]?.trim() ?? ''; + const ok = r.code === 0 && /\bpassed\b/.test(filesLine) && !/failed/.test(filesLine); + results.push({ + file, + ok, + files: filesLine, + tests: testsLine, + error: ok ? '' : firstError(r.out), + }); + } + return results; +} + +function loadE2e(file) { + const map = new Map(); + for (const f of JSON.parse(readFileSync(file, 'utf8')).testResults) { + for (const t of f.assertionResults) { + const id = /^\[([A-Z0-9/-]+)\]/.exec(t.title)?.[1] ?? 'UNTAGGED'; + const e = map.get(id) ?? { pass: 0, fail: 0, msg: '' }; + if (t.status === 'passed') e.pass += 1; + else if (t.status === 'failed') { + e.fail += 1; + e.msg ||= stripAnsi(t.failureMessages?.[0] ?? '') + .split('\n')[0] + .replace(/\s+/g, ' ') + .replace(/\|/g, '\\|') + .slice(0, 160); + } + map.set(id, e); + } + } + return map; +} + +async function stepE2e(target, wt) { + progress(`${target.name}: e2e`); + const db = await freshDatabase('krona_acc_e2e'); + const slug = slugOf(target.name); + const env = cleanEnv({ + E2E_MIGRATOR_URL: db.migrator, + E2E_APP_URL: db.app, + E2E_MIGRATIONS: 'roundtrip', + ...(db.admin ? { E2E_DB_ADMIN_URL: db.admin } : {}), + }); + const r = await run(process.execPath, ['scripts/test/run-e2e.mjs'], { + cwd: wt.dir, + env, + logFile: path.join(logDir, `${slug}-e2e.txt`), + }); + const jsonPath = path.join(wt.dir, 'tests/e2e/evidence/e2e-results.json'); + if (!existsSync(jsonPath)) + return { ok: false, code: r.code, map: null, error: firstError(r.out) }; + cpSync(jsonPath, path.join(logDir, `${slug}-e2e-results.json`)); + const map = loadE2e(jsonPath); + const red = [...map.values()].filter((e) => e.fail > 0).length; + const verdict = /\[run-e2e\] (OK|FAIL)[^\n]*/.exec(r.out)?.[0] ?? ''; + return { ok: r.code === 0, code: r.code, map, red, green: map.size - red, verdict }; +} + +function diffE2e(baseMap, map) { + const color = (e) => (e ? (e.fail ? 'RED' : 'GREEN') : 'нет'); + const turnedGreen = []; + const turnedRed = []; + const other = []; + for (const id of [...new Set([...baseMap.keys(), ...map.keys()])].sort()) { + const a = color(baseMap.get(id)); + const b = color(map.get(id)); + if (a === b) continue; + if (a === 'RED' && b === 'GREEN') turnedGreen.push(id); + else if (a === 'GREEN' && b === 'RED') turnedRed.push(`${id} (${map.get(id).msg})`); + else other.push(`${id}: ${a}→${b}`); + } + return { turnedGreen, turnedRed, other }; +} + +function mergeTree(a, b) { + const r = git(['merge-tree', '--write-tree', '--name-only', '--no-messages', a.sha, b.sha], { + allowFail: true, + }); + if (r.code === 0) return { status: 'чисто', files: [] }; + if (r.code === 1) { + const files = r.out.split('\n').slice(1).filter(Boolean); + return { status: 'КОНФЛИКТ', files }; + } + return { status: `ошибка git (exit ${r.code})`, files: [r.err.trim()] }; +} + +// ---------- форматирование без поведения ---------- +async function prettierConfigFor(file) { + const anchor = path.join(opts.baseWorktree ?? repoRoot, file); + const config = (await prettier.resolveConfig(anchor)) ?? {}; + const info = await prettier.getFileInfo(anchor, { + ignorePath: path.join(opts.baseWorktree ?? repoRoot, '.prettierignore'), + }); + return { config, info }; +} + +async function normalize(content, file) { + const { config, info } = await prettierConfigFor(file); + if (info.ignored || !info.inferredParser) return content; + return prettier.format(content, { ...config, filepath: file }); +} + +function showFile(sha, file) { + const r = git(['show', `${sha}:${file}`], { allowFail: true }); + return r.code === 0 ? r.out : null; +} + +function changedLines(before, after) { + const dir = mkdtempSync(path.join(tmpdir(), 'krona-fmt-')); + writeFileSync(path.join(dir, 'a'), before); + writeFileSync(path.join(dir, 'b'), after); + const r = git(['diff', '--no-index', '-U0', '--no-color', 'a', 'b'], { + cwd: dir, + allowFail: true, + }); + rmSync(dir, { recursive: true, force: true }); + return r.out + .split('\n') + .filter((l) => /^[+-]/.test(l) && !/^(\+\+\+|---) /.test(l)) + .map((l) => `${l[0]}${l.slice(1).trim()}`) + .filter((l) => l.length > 1); +} + +async function formatCheck(target, others) { + const mergeBase = git(['merge-base', opts.baseTarget.sha, target.sha]).out.trim(); + const changes = git(['diff', '--name-status', '--no-renames', mergeBase, target.sha]) + .out.trim() + .split('\n') + .filter(Boolean) + .map((l) => ({ status: l[0], file: l.split('\t')[1] })); + const rows = []; + for (const { status, file } of changes) { + const touchesConfig = /(^|\/)\.prettier(rc|ignore)|prettier\.config\./.test(file); + if (status === 'D') { + rows.push({ file, verdict: 'удалён', lines: 0, same: [] }); + continue; + } + const after = showFile(target.sha, file); + const before = status === 'A' ? null : showFile(mergeBase, file); + if (before === null) { + rows.push({ file, verdict: 'новый файл', lines: 0, same: [] }); + continue; + } + const formatted = await normalize(before, file); + if (formatted === after && !touchesConfig) continue; // чистое форматирование + const lines = changedLines(formatted, after); + const same = []; + for (const other of others) { + const otherContent = showFile(other.sha, file); + if (otherContent === null) continue; + const otherMergeBase = git(['merge-base', opts.baseTarget.sha, other.sha]).out.trim(); + const otherBase = showFile(otherMergeBase, file) ?? ''; + const otherLines = new Set( + changedLines(await normalize(otherBase, file), await normalize(otherContent, file)), + ); + const matched = lines.filter((l) => otherLines.has(l)).length; + if (matched > 0) same.push(`${other.name}: ${matched}/${lines.length}`); + } + rows.push({ + file, + verdict: touchesConfig ? 'меняет конфиг prettier' : 'не совпадает с prettier(база)', + lines: lines.length, + same, + }); + } + return { mergeBase, files: changes.length, rows }; +} + +// ---------- main ---------- +opts.baseTarget = resolveRef(opts.base); +const targets = opts.branches.map(resolveRef); +const formatTargets = [ + ...targets.filter((t) => /format/i.test(t.name)), + ...opts.formatOnly.map(resolveRef), +]; +const harnessHead = git(['rev-parse', '--short', 'HEAD']).out.trim(); +const harnessDirty = git(['status', '--porcelain', '--', 'tests/e2e', 'scripts/test']).out.trim() + ? ' (+ незакоммиченные изменения стенда)' + : ''; + +const needRuns = !(opts.skipCheck && opts.skipIntegration && opts.skipE2e) && targets.length > 0; +let dbNote = 'не использовалась'; +if (needRuns && !(opts.skipIntegration && opts.skipE2e)) dbNote = await prepareRoles(); + +const results = new Map(); +const all = [opts.baseTarget, ...targets]; +for (const target of all) { + const res = { target }; + results.set(target, res); + if (!needRuns && target !== opts.baseTarget) continue; + try { + const wt = await prepareWorktree(target); + res.wt = wt; + if (target === opts.baseTarget) opts.baseWorktree = wt.dir; + if (!needRuns) continue; + if (!opts.skipCheck) res.check = await stepCheck(target, wt); + if (!opts.skipIntegration) res.integration = await stepIntegration(target, wt); + if (!opts.skipE2e) res.e2e = await stepE2e(target, wt); + } catch (error) { + res.fatal = redact(String(error?.message ?? error)).slice(0, 300); + progress(`${target.name}: ${res.fatal}`); + } +} + +const formatResults = []; +for (const target of formatTargets) { + progress(`${target.name}: проверка форматирования`); + const others = targets.filter((t) => t !== target && !/format/i.test(t.name)); + formatResults.push({ target, ...(await formatCheck(target, others)) }); +} + +// ---------- markdown ---------- +const md = []; +const baseRes = results.get(opts.baseTarget); +md.push(`## accept-branch — ${new Date().toISOString().slice(0, 16).replace('T', ' ')} UTC`); +md.push(''); +md.push( + `База: \`${opts.baseTarget.ref}\` = ${short(opts.baseTarget.sha)}; стенд (оверлей tests/e2e, scripts/test): ${harnessHead}${harnessDirty}; БД: ${dbNote}. Логи: \`${path.relative(repoRoot, logDir)}/\`.`, +); +md.push(''); +if (needRuns) { + md.push('### Сводка'); + md.push(''); + md.push( + '| Ветка | SHA | npm run check | integration (красные файлы) | e2e red/green | e2e: стало зелёным | e2e: стало красным |', + ); + md.push('|---|---|---|---|---|---|---|'); + for (const res of results.values()) { + const t = res.target; + const isBase = t === opts.baseTarget; + const name = isBase ? `${t.ref} (база)` : t.ref; + if (res.fatal) { + md.push(`| ${name} | ${short(t.sha)} | ОШИБКА: ${res.fatal} | | | | |`); + continue; + } + const check = res.check + ? res.check.ok + ? `OK (${res.check.tests})` + : `FAIL exit=${res.check.code}: ${res.check.error}` + : 'не запускался'; + const reds = res.integration?.filter((r) => !r.ok).map((r) => r.file) ?? []; + const integration = res.integration + ? `${res.integration.length - reds.length}/${res.integration.length} зелёных${reds.length ? `; FAIL: ${reds.join(', ')}` : ''}` + : 'не запускались'; + let e2e = 'не запускался'; + let green = ''; + let red = ''; + if (res.e2e?.map) { + e2e = `${res.e2e.red}/${res.e2e.green}`; + if (!isBase && baseRes.e2e?.map) { + const d = diffE2e(baseRes.e2e.map, res.e2e.map); + green = d.turnedGreen.join(', ') || '—'; + red = [...d.turnedRed, ...d.other].join('; ') || '—'; + } + } else if (res.e2e) e2e = `стенд не поднялся: ${res.e2e.error}`; + if (isBase) { + green = 'n/a'; + red = 'n/a'; + } + md.push( + `| ${name} | ${short(t.sha)} | ${check} | ${integration} | ${e2e} | ${green} | ${red} |`, + ); + } + md.push(''); + if ( + results.values().next().value.integration || + targets.some((t) => results.get(t).integration) + ) { + md.push('### Интеграционные тесты (каждый файл отдельно, свежая БД)'); + md.push(''); + md.push('| Ветка | Файл | Итог | Test Files | Tests | Первая ошибка |'); + md.push('|---|---|---|---|---|---|'); + for (const res of results.values()) { + for (const r of res.integration ?? []) { + md.push( + `| ${res.target.ref} | ${r.file} | ${r.ok ? 'OK' : 'FAIL'} | ${r.files} | ${r.tests} | ${r.error} |`, + ); + } + } + md.push(''); + } + const overlayNotes = [...results.values()].filter((r) => r.wt?.overlayTouched.length); + if (overlayNotes.length) { + md.push('Внимание: ветка меняла файлы стенда, при приёмке они заменены оверлеем:'); + for (const r of overlayNotes) md.push(`- ${r.target.ref}: ${r.wt.overlayTouched.join(', ')}`); + md.push(''); + } + const npmCi = [...results.values()].filter((r) => r.wt?.deps === 'npm ci'); + if (npmCi.length) + md.push(`npm ci (lock отличается): ${npmCi.map((r) => r.target.ref).join(', ')}\n`); +} + +if (targets.length > 0) { + md.push('### Попарные слияния (`git merge-tree --write-tree`)'); + md.push(''); + md.push('| Ветка A | Ветка B | Результат | Конфликтные файлы |'); + md.push('|---|---|---|---|'); + const pairs = []; + for (const t of targets) pairs.push([opts.baseTarget, t]); + for (let i = 0; i < targets.length; i += 1) { + for (let j = i + 1; j < targets.length; j += 1) pairs.push([targets[i], targets[j]]); + } + for (const [a, b] of pairs) { + const r = mergeTree(a, b); + md.push(`| ${a.ref} | ${b.ref} | ${r.status} | ${r.files.join(', ')} |`); + } + md.push(''); +} + +if (formatResults.length) { + md.push('### Форматирование без поведения'); + md.push(''); + for (const f of formatResults) { + const verdict = f.rows.length === 0 ? 'ТОЛЬКО ФОРМАТИРОВАНИЕ' : 'ЕСТЬ ИЗМЕНЕНИЯ СВЕРХ PRETTIER'; + md.push( + `**${f.target.ref}** (${short(f.target.sha)}), merge-base ${short(f.mergeBase)}, изменено файлов: ${f.files} — ${verdict}`, + ); + md.push(''); + if (f.rows.length) { + md.push('| Файл | Почему | Строк сверх prettier | Эти же строки в ветке |'); + md.push('|---|---|---|---|'); + for (const r of f.rows) { + md.push(`| ${r.file} | ${r.verdict} | ${r.lines} | ${r.same.join('; ') || '—'} |`); + } + md.push(''); + } + } +} + +const text = redact(md.join('\n')); +writeFileSync(path.join(logDir, 'summary.md'), text); +if (opts.out) writeFileSync(opts.out, text); +console.log(text); From 87f85751d0611f0bc91e0f8856a0f24b6442a126 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 16:10:07 +0700 Subject: [PATCH 24/28] =?UTF-8?q?fix(e2e):=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D1=81=D0=B5=D0=BA=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=20evidence=20=D0=BF=D1=80=D0=BE=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=B0=D0=B5=D1=82=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: accept-branch.mjs пишет логи в tests/e2e/evidence/accept/<время>/, и run-e2e падал на readFileSync(каталог) с EISDIR после таблицы результатов. Проверяются только файлы верхнего уровня (как и раньше); логи accept-branch редактируются самим скриптом (пароли в URL → ***). --- scripts/test/run-e2e.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/test/run-e2e.mjs b/scripts/test/run-e2e.mjs index 1db7fab..d202643 100644 --- a/scripts/test/run-e2e.mjs +++ b/scripts/test/run-e2e.mjs @@ -77,7 +77,10 @@ const secretPatterns = [ /kstaff_dev_[0-9A-Z]{26}_[0-9a-f]{16,}/, /postgres:\/\/[^\s:@]+:[^\s@]+@/, ]; -for (const name of readdirSync(evidence)) { +// Только файлы верхнего уровня: в подкаталогах (accept/ от accept-branch.mjs) свои логи с редакцией. +for (const entry of readdirSync(evidence, { withFileTypes: true })) { + if (!entry.isFile()) continue; + const name = entry.name; const content = readFileSync(path.join(evidence, name), 'utf8'); for (const pattern of secretPatterns) { if (pattern.test(content)) From d7b235248a89d9c35cd3df5e0bc0fea35df89e04 Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 16:10:07 +0700 Subject: [PATCH 25/28] =?UTF-8?q?test(e2e):=20PILOT-REHOME=20=E2=80=94=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D1=91=D0=BC=D0=BA=D0=B0=20=D0=B1=D1=83=D0=B4?= =?UTF-8?q?=D1=83=D1=89=D0=B5=D0=B3=D0=BE=20scripts/rehome-tenant.mjs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: TASK-GROK-3 п.5 / TASK-CODEX-2 п.2.2 — данные пилота живут под заглушкой 01J00000000000000000000000, перенос на 01M2R6AC5652NPT3MG34DKN4ZP нельзя проверить руками. [PILOT-REHOME-SEED] (должен быть зелёным): таблицы с tenant_id берутся из information_schema, в каждую сеется 2+ строки заглушки и постороннего арендатора; новая таблица без сида → красный. [PILOT-REHOME]: --dry-run печатает те же числа и ничего не меняет; перенос админом БД; под заглушкой 0 строк, счётчики и SUM(amount_minor) ledger совпадают, посторонний не тронут, запись в staff_audit_log нового арендатора, krona_staff_app видит тех же сотрудников под новым tenant и никого под старым, UPDATE staff_payroll_ledger отклоняется, повторный запуск отказывает. Пока скрипта нет — красный с понятным сообщением, ID в known-defects.json. Сценарий проверен временным эталоном (не коммитился): зелёный; мутации без аудита / без отказа на повтор / с пропущенной таблицей / с записью в dry-run — красные (report-evidence/round3-pilot-rehome.txt). client.ts: dbQueryAs(tenant, …) — запрос ролью приложения под заданным арендатором. --- tests/e2e/60-pilot-rehome.e2e.ts | 543 ++++++++++++++++++ tests/e2e/harness/client.ts | 14 +- tests/e2e/known-defects.json | 3 +- .../report-evidence/round3-pilot-rehome.txt | 37 ++ 4 files changed, 593 insertions(+), 4 deletions(-) create mode 100644 tests/e2e/60-pilot-rehome.e2e.ts create mode 100644 tests/e2e/report-evidence/round3-pilot-rehome.txt diff --git a/tests/e2e/60-pilot-rehome.e2e.ts b/tests/e2e/60-pilot-rehome.e2e.ts new file mode 100644 index 0000000..a0d839f --- /dev/null +++ b/tests/e2e/60-pilot-rehome.e2e.ts @@ -0,0 +1,543 @@ +// PILOT-REHOME (TASK-GROK-3 п.5): приёмочный сценарий для будущего scripts/rehome-tenant.mjs +// (TASK-CODEX-2 п.2.2) — перенос данных пилота с заглушки арендатора на настоящий tenant. +// Предполагаемый контракт (NOTES-FOR-EXECUTORS.md, C6): +// DATABASE_ADMIN_URL=<админ БД> node scripts/rehome-tenant.mjs --from --to [--dry-run] [--json] +// --json печатает (последней строкой) {"tables":{"<таблица>":<строк>},"ledger_amount_minor_sum":<число>}. +// Таблицы берутся из information_schema.columns (column_name = 'tenant_id'), а не списком вручную: +// новая таблица без сида делает красным [PILOT-REHOME-SEED], чтобы перенос не забыл её. +import { spawnSync } from 'node:child_process'; +import { createHash, randomBytes } from 'node:crypto'; +import { existsSync } from 'node:fs'; +import path from 'node:path'; +import pg from 'pg'; +import { describe, expect, it } from 'vitest'; +import { ctx, dbQueryAs } from './harness/client.js'; +import { randomUlid } from './harness/context.js'; +import { baseEnv } from '../../scripts/test/node-commands.mjs'; + +const repoRoot = path.resolve(import.meta.dirname, '../..'); +const scriptPath = path.join(repoRoot, 'scripts/rehome-tenant.mjs'); +const STUB = '01J00000000000000000000000'; +const TARGET = '01M2R6AC5652NPT3MG34DKN4ZP'; +const FOREIGN = randomUlid(); + +type RehomeReport = { tables?: Record; ledger_amount_minor_sum?: number | string }; +type Snapshot = { counts: Record; ledgerSum: string }; + +async function withMigrator( + tenant: string, + fn: (client: pg.Client) => Promise, + userId?: string, + connectionString = ctx().migrationDatabaseUrl, +): Promise { + const client = new pg.Client({ connectionString }); + await client.connect(); + try { + await client.query('BEGIN'); + await client.query("SELECT set_config('app.tenant_id', $1, true)", [tenant]); + // Политики INSERT журнала аудита, начислений, отметок и табеля требуют app.user_id = автор. + if (userId) await client.query("SELECT set_config('app.user_id', $1, true)", [userId]); + const result = await fn(client); + await client.query('COMMIT'); + return result; + } catch (error) { + await client.query('ROLLBACK').catch(() => undefined); + throw error; + } finally { + await client.end(); + } +} + +async function tenantTables(): Promise { + return withMigrator(STUB, async (client) => { + const result = await client.query<{ table_name: string }>( + `SELECT DISTINCT c.table_name FROM information_schema.columns c + JOIN information_schema.tables t USING (table_schema, table_name) + WHERE c.table_schema = 'public' AND c.column_name = 'tenant_id' AND t.table_type = 'BASE TABLE' + ORDER BY 1`, + ); + return result.rows.map((row) => row.table_name); + }); +} + +async function snapshot(tenant: string, tables: string[]): Promise { + return withMigrator(tenant, async (client) => { + const counts: Record = {}; + for (const table of tables) { + const result = await client.query<{ n: number }>( + `SELECT count(*)::int AS n FROM ${table} WHERE tenant_id = $1`, + [tenant], + ); + counts[table] = result.rows[0]!.n; + } + const sum = await client.query<{ s: string }>( + 'SELECT coalesce(sum(amount_minor), 0)::text AS s FROM staff_payroll_ledger WHERE tenant_id = $1', + [tenant], + ); + return { counts, ledgerSum: sum.rows[0]!.s }; + }); +} + +/** + * Удаляет строки арендатора из всех таблиц (дочерние раньше родительских — повторными проходами). + * У staff_payroll_ledger нет политики DELETE, поэтому под FORCE RLS мигратор его не очистит: + * при наличии админа БД чистит админ, иначе остаток ловит проверка ниже. + */ +async function purge(tenant: string, tables: string[]) { + const connection = ctx().adminDatabaseUrl ?? ctx().migrationDatabaseUrl; + await withMigrator( + tenant, + async (client) => { + let pending = [...tables]; + for (let pass = 0; pass < tables.length && pending.length > 0; pass += 1) { + const failed: string[] = []; + for (const table of pending) { + await client.query('SAVEPOINT purge'); + try { + await client.query(`DELETE FROM ${table} WHERE tenant_id = $1`, [tenant]); + await client.query('RELEASE SAVEPOINT purge'); + } catch { + await client.query('ROLLBACK TO SAVEPOINT purge'); + failed.push(table); + } + } + pending = failed; + } + if (pending.length) throw new Error(`не удалось очистить ${tenant}: ${pending.join(', ')}`); + }, + undefined, + connection, + ); + const left = Object.entries((await snapshot(tenant, tables)).counts).filter(([, n]) => n > 0); + if (left.length) { + throw new Error( + `после очистки у ${tenant} остались строки (нужен админ БД: E2E_DB_ADMIN_URL): ${left.map(([t, n]) => `${t}=${n}`).join(', ')}`, + ); + } +} + +const hex64 = () => randomBytes(32).toString('hex'); +const code = (prefix: string) => `${prefix}_${randomBytes(4).toString('hex')}`; + +/** + * Синтетические данные арендатора: по 2+ строки в каждой известной таблице с tenant_id. + * Возвращает id сотрудников и список засеянных таблиц. Пишет мигратор (владелец таблиц), + * FORCE RLS действует и на него, поэтому app.tenant_id выставлен в транзакции. + */ +async function seed(tenant: string) { + const ids = (n: number) => Array.from({ length: n }, () => randomUlid()); + const actor = randomUlid(); + const corr = () => randomUlid(); + const seeded = new Set(); + const employees = ids(3); + const amounts = [150_000n, 72_300n, -12_300n].map( + (base) => base + BigInt(randomBytes(2).readUInt16BE(0)), + ); + await withMigrator( + tenant, + async (client) => { + const q = async (table: string, sql: string, params: unknown[]) => { + await client.query(sql, params); + seeded.add(table); + }; + const [ou1, ou2] = ids(2); + for (const [i, ou] of [ou1, ou2].entries()) { + await q( + 'staff_org_units', + 'INSERT INTO staff_org_units (id, tenant_id, code, name) VALUES ($1,$2,$3,$4)', + [ou, tenant, `rehome-${i}-${randomBytes(3).toString('hex')}`, `Точка ${i + 1}`], + ); + } + const professions = ids(2); + for (const [i, id] of professions.entries()) { + await q( + 'staff_professions', + 'INSERT INTO staff_professions (id, tenant_id, code, name) VALUES ($1,$2,$3,$4)', + [id, tenant, code('prof'), `Профессия ${i}-${randomBytes(3).toString('hex')}`], + ); + } + for (const [i, id] of employees.entries()) { + await q( + 'staff_employees', + 'INSERT INTO staff_employees (id, tenant_id, personnel_number, display_name, primary_org_unit_id, profession_id) VALUES ($1,$2,$3,$4,$5,$6)', + [ + id, + tenant, + `R-${randomBytes(4).toString('hex')}`, + `Сотрудник ${i + 1}`, + i % 2 ? ou2 : ou1, + professions[i % 2], + ], + ); + } + const metricKeys = [code('metric'), code('metric')]; + for (const key of metricKeys) { + await q( + 'staff_metric_definitions', + 'INSERT INTO staff_metric_definitions (id, tenant_id, key, label) VALUES ($1,$2,$3,$4)', + [randomUlid(), tenant, key, `Метрика ${key}`], + ); + } + for (const [i, key] of metricKeys.entries()) { + await q( + 'staff_daily_metrics', + 'INSERT INTO staff_daily_metrics (id, tenant_id, org_unit_id, business_date, metric_key, value, recorded_by) VALUES ($1,$2,$3,$4,$5,$6,$7)', + [randomUlid(), tenant, ou1, `2026-09-0${i + 1}`, key, 1000 + i, actor], + ); + } + for (const [i, ou] of [ou1, ou2].entries()) { + await q( + 'staff_org_unit_terms', + 'INSERT INTO staff_org_unit_terms (id, tenant_id, org_unit_id, effective_from, created_by) VALUES ($1,$2,$3,$4,$5)', + [randomUlid(), tenant, ou, `2026-0${i + 1}-01`, actor], + ); + } + const rules = ids(2); + for (const [i, id] of rules.entries()) { + await q( + 'staff_pay_rules', + 'INSERT INTO staff_pay_rules (id, tenant_id, code, version, name, rule, effective_from, created_by) VALUES ($1,$2,$3,1,$4,$5,$6,$7)', + [ + id, + tenant, + code('rule'), + `Правило ${i}`, + JSON.stringify({ kind: 'hourly', rate_minor: 12_300 }), + '2026-01-01', + actor, + ], + ); + } + for (const [i, emp] of employees.slice(0, 2).entries()) { + await q( + 'staff_pay_assignments', + 'INSERT INTO staff_pay_assignments (id, tenant_id, employee_id, pay_rule_id, effective_from, created_by) VALUES ($1,$2,$3,$4,$5,$6)', + [randomUlid(), tenant, emp, rules[i], '2026-01-01', actor], + ); + } + for (const [i, emp] of employees.slice(0, 2).entries()) { + await q( + 'staff_attendance_events', + 'INSERT INTO staff_attendance_events (id, tenant_id, employee_id, event_type, source, source_event_id, occurred_at, actor_id, correlation_id) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)', + [ + randomUlid(), + tenant, + emp, + i ? 'check_out' : 'check_in', + 'terminal', + `src-${randomBytes(6).toString('hex')}`, + '2026-09-01T09:00:00Z', + actor, + corr(), + ], + ); + await q( + 'staff_work_sessions', + 'INSERT INTO staff_work_sessions (id, tenant_id, employee_id, org_unit_id, business_date) VALUES ($1,$2,$3,$4,$5)', + [randomUlid(), tenant, emp, ou1, '2026-09-01'], + ); + await q( + 'staff_timesheet_entries', + 'INSERT INTO staff_timesheet_entries (id, tenant_id, employee_id, work_date, updated_by) VALUES ($1,$2,$3,$4,$5)', + [randomUlid(), tenant, emp, '2026-09-01', actor], + ); + await q( + 'staff_work_items', + 'INSERT INTO staff_work_items (id, tenant_id, employee_id, org_unit_id, business_date, item_kind, created_by) VALUES ($1,$2,$3,$4,$5,$6,$7)', + [randomUlid(), tenant, emp, ou1, '2026-09-01', 'rehome_item', actor], + ); + } + const runs = ids(2); + for (const [i, run] of runs.entries()) { + await q( + 'staff_payroll_runs', + 'INSERT INTO staff_payroll_runs (id, tenant_id, period_start, period_end, created_by) VALUES ($1,$2,$3,$4,$5)', + [run, tenant, `2026-0${i + 7}-01`, `2026-0${i + 7}-28`, actor], + ); + await q( + 'staff_payroll_lines', + 'INSERT INTO staff_payroll_lines (id, tenant_id, run_id, employee_id, org_unit_id, business_date, pay_rule_id, rule_code) VALUES ($1,$2,$3,$4,$5,$6,$7,$8)', + [randomUlid(), tenant, run, employees[i], ou1, `2026-0${i + 7}-02`, rules[i], 'hourly'], + ); + await q( + 'staff_payouts', + 'INSERT INTO staff_payouts (id, tenant_id, employee_id, paid_on, amount_minor, created_by) VALUES ($1,$2,$3,$4,$5,$6)', + [randomUlid(), tenant, employees[i], `2026-0${i + 8}-05`, 50_000 + i, actor], + ); + } + for (const [i, amount] of amounts.entries()) { + await q( + 'staff_payroll_ledger', + 'INSERT INTO staff_payroll_ledger (id, tenant_id, employee_id, business_date, kind, amount_minor, ref_type, correlation_id, created_by) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)', + [ + randomUlid(), + tenant, + employees[i % 2], + '2026-09-01', + amount < 0n ? 'adjustment' : 'accrual', + amount.toString(), + 'manual', + corr(), + actor, + ], + ); + } + const outbox = ids(2); + for (const id of outbox) { + await q( + 'staff_outbox', + 'INSERT INTO staff_outbox (id, tenant_id, event_type, event_version, subject_type, subject_id, actor_type, actor_id, payload, correlation_id, occurred_at) VALUES ($1,$2,$3,1,$4,$5,$6,$7,$8,$9,now())', + [id, tenant, 'staff.rehome_seed', 'employee', employees[0], 'user', actor, '{}', corr()], + ); + } + for (let i = 0; i < 2; i += 1) { + await q( + 'staff_inbox', + 'INSERT INTO staff_inbox (event_id, tenant_id, event_type, event_version, correlation_id) VALUES ($1,$2,$3,1,$4)', + [randomUlid(), tenant, 'core.rehome_seed', corr()], + ); + await q( + 'staff_idempotency_keys', + "INSERT INTO staff_idempotency_keys (tenant_id, key, request_hash, expires_at) VALUES ($1,$2,$3, now() + interval '1 day')", + [tenant, `idem-${randomBytes(8).toString('hex')}`, hex64()], + ); + const endpoint = `https://push.example.test/${randomBytes(8).toString('hex')}`; + await q( + 'staff_push_subscriptions', + 'INSERT INTO staff_push_subscriptions (id, tenant_id, employee_id, endpoint, p256dh, auth) VALUES ($1,$2,$3,$4,$5,$6)', + [ + randomUlid(), + tenant, + employees[i], + endpoint, + randomBytes(16).toString('base64url'), + randomBytes(8).toString('base64url'), + ], + ); + await q( + 'staff_notification_deliveries', + 'INSERT INTO staff_notification_deliveries (id, tenant_id, employee_id, outbox_id, endpoint) VALUES ($1,$2,$3,$4,$5)', + [randomUlid(), tenant, employees[i], outbox[i], endpoint], + ); + await q( + 'staff_standalone_employee_access', + 'INSERT INTO staff_standalone_employee_access (id, tenant_id, employee_id, subject_id, token_hash, token_hint, created_by) VALUES ($1,$2,$3,$4,$5,$6,$7)', + [ + randomUlid(), + tenant, + employees[i], + randomUlid(), + createHash('sha256').update(randomBytes(32)).digest('hex'), + 'e2e…', + actor, + ], + ); + await q( + 'staff_sync_change_log', + 'INSERT INTO staff_sync_change_log (id, tenant_id, entity_type, entity_id, operation) VALUES ($1,$2,$3,$4,$5)', + [randomUlid(), tenant, 'employee', employees[i], 'upsert'], + ); + await q( + 'staff_audit_log', + 'INSERT INTO staff_audit_log (id, tenant_id, actor_id, action, entity_type, entity_id, correlation_id) VALUES ($1,$2,$3,$4,$5,$6,$7)', + [randomUlid(), tenant, actor, 'employee.seeded', 'employee', employees[i], corr()], + ); + } + const devices = ids(2); + for (const device of devices) { + await q( + 'staff_sync_devices', + 'INSERT INTO staff_sync_devices (id, tenant_id, device_code, name, token_hash, token_hint, created_by) VALUES ($1,$2,$3,$4,$5,$6,$7)', + [ + device, + tenant, + `dev-${randomBytes(4).toString('hex')}`, + 'Терминал', + hex64(), + 'kstaff…', + actor, + ], + ); + await q( + 'staff_sync_command_inbox', + 'INSERT INTO staff_sync_command_inbox (id, tenant_id, device_id, command_type, idempotency_key, correlation_id, status, created_at) VALUES ($1,$2,$3,$4,$5,$6,$7,now())', + [ + randomUlid(), + tenant, + device, + 'record_attendance', + `idem-${randomBytes(6).toString('hex')}`, + corr(), + 'applied', + ], + ); + await q( + 'staff_sync_device_checkpoints', + 'INSERT INTO staff_sync_device_checkpoints (device_id, tenant_id) VALUES ($1,$2)', + [device, tenant], + ); + } + }, + actor, + ); + return { employees, seeded }; +} + +function runRehome(args: string[], adminUrl: string) { + const result = spawnSync( + process.execPath, + [scriptPath, '--from', STUB, '--to', TARGET, ...args], + { + cwd: repoRoot, + env: { ...baseEnv(), DATABASE_ADMIN_URL: adminUrl }, + encoding: 'utf8', + timeout: 120_000, + }, + ); + const lines = (result.stdout ?? '').trim().split('\n'); + let report: RehomeReport | null = null; + for (const line of [...lines].reverse()) { + if (!line.trim().startsWith('{')) continue; + try { + report = JSON.parse(line) as RehomeReport; + break; + } catch { + // не JSON — ищем дальше + } + } + return { + status: result.status, + stdout: result.stdout ?? '', + stderr: result.stderr ?? '', + report, + }; +} + +const state: { + tables: string[]; + employees: string[]; + before?: { stub: Snapshot; foreign: Snapshot }; +} = { tables: [], employees: [] }; + +describe('PILOT-REHOME: перенос заглушки арендатора на настоящий tenant', () => { + it('[PILOT-REHOME-SEED] сиды покрывают все таблицы с tenant_id (список из information_schema)', async () => { + state.tables = await tenantTables(); + expect(state.tables.length).toBeGreaterThan(0); + await purge(STUB, state.tables); + await purge(TARGET, state.tables); + const stub = await seed(STUB); + const foreign = await seed(FOREIGN); + state.employees = stub.employees; + const unseeded = state.tables.filter((table) => !stub.seeded.has(table)); + expect( + unseeded, + `таблицы с tenant_id без сида в tests/e2e/60-pilot-rehome.e2e.ts — перенос арендатора их не проверит: ${unseeded.join(', ')}`, + ).toEqual([]); + const stubSnap = await snapshot(STUB, state.tables); + const foreignSnap = await snapshot(FOREIGN, state.tables); + const empty = state.tables.filter((t) => stubSnap.counts[t]! < 1 || foreignSnap.counts[t]! < 1); + expect(empty, `сид не виден через RLS: ${empty.join(', ')}`).toEqual([]); + expect(Object.values((await snapshot(TARGET, state.tables)).counts).every((n) => n === 0)).toBe( + true, + ); + expect(foreign.seeded.size).toBe(stub.seeded.size); + state.before = { stub: stubSnap, foreign: foreignSnap }; + }); + + it('[PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает', async () => { + const before = state.before; + expect(before, 'сид не выполнен (см. [PILOT-REHOME-SEED])').toBeDefined(); + if (!existsSync(scriptPath)) { + throw new Error( + 'scripts/rehome-tenant.mjs отсутствует (TASK-CODEX-2 п.2.2): перенос заглушки ' + + `${STUB} → ${TARGET} не реализован; контракт сценария — NOTES-FOR-EXECUTORS.md C6. ` + + `Засеяно таблиц: ${state.tables.length}, ledger SUM(amount_minor)=${before!.stub.ledgerSum}`, + ); + } + const adminUrl = ctx().adminDatabaseUrl; + if (!adminUrl) { + throw new Error('нет админа БД: задайте E2E_DB_ADMIN_URL или E2E_PG_ADMIN_URL'); + } + const expectedTables = Object.fromEntries( + Object.entries(before!.stub.counts).filter(([, n]) => n > 0), + ); + + // 1. --dry-run: печатает те же числа и ничего не меняет. + const dry = runRehome(['--dry-run', '--json'], adminUrl); + expect(dry.status, `dry-run exit: ${dry.stderr}`).toBe(0); + expect(dry.report, `dry-run без JSON-отчёта: ${dry.stdout}`).not.toBeNull(); + const dryTables = Object.fromEntries( + Object.entries(dry.report!.tables ?? {}).filter(([, n]) => Number(n) > 0), + ); + expect(dryTables).toEqual(expectedTables); + expect(String(dry.report!.ledger_amount_minor_sum)).toBe(before!.stub.ledgerSum); + expect(await snapshot(STUB, state.tables), '--dry-run изменил данные заглушки').toEqual( + before!.stub, + ); + expect(Object.values((await snapshot(TARGET, state.tables)).counts).every((n) => n === 0)).toBe( + true, + ); + + // 2. Перенос ролью администратора БД. + const real = runRehome(['--json'], adminUrl); + expect(real.status, `перенос exit: ${real.stderr}`).toBe(0); + const afterStub = await snapshot(STUB, state.tables); + const afterTarget = await snapshot(TARGET, state.tables); + const leftovers = state.tables.filter((t) => afterStub.counts[t] !== 0); + expect(leftovers, 'под заглушкой остались строки').toEqual([]); + for (const table of state.tables) { + const expected = before!.stub.counts[table]!; + if (table === 'staff_audit_log') + expect( + afterTarget.counts[table]!, + 'staff_audit_log: у нового арендатора нет новой записи о переносе', + ).toBeGreaterThan(expected); + else expect(afterTarget.counts[table], table).toBe(expected); + } + expect(afterTarget.ledgerSum).toBe(before!.stub.ledgerSum); + expect(await snapshot(FOREIGN, state.tables), 'посторонний арендатор изменён').toEqual( + before!.foreign, + ); + const distinct = await withMigrator(TARGET, async (client) => { + const found: string[] = []; + for (const table of state.tables) { + const r = await client.query<{ tenant_id: string }>( + `SELECT DISTINCT tenant_id FROM ${table} WHERE tenant_id IN ($1, $2)`, + [STUB, TARGET], + ); + found.push(...r.rows.map((row) => `${table}:${row.tenant_id}`)); + } + return found; + }); + expect(distinct.filter((d) => d.endsWith(STUB))).toEqual([]); + + // 3. Запись аудита у нового арендатора. + const audit = await dbQueryAs<{ action: string }>( + TARGET, + "SELECT action FROM staff_audit_log WHERE tenant_id = $1 AND action ILIKE '%rehome%'", + [TARGET], + ); + expect( + audit.length, + 'нет записи staff_audit_log о переносе у нового арендатора', + ).toBeGreaterThan(0); + + // 4. Роль приложения видит тех же сотрудников под новым tenant и ничего под старым. + const underTarget = await dbQueryAs<{ id: string }>( + TARGET, + 'SELECT id FROM staff_employees ORDER BY id', + ); + expect(underTarget.map((row) => row.id)).toEqual([...state.employees].sort()); + expect(await dbQueryAs(STUB, 'SELECT id FROM staff_employees')).toEqual([]); + + // 5. Журнал начислений по-прежнему append-only для приложения. + await expect( + dbQueryAs(TARGET, 'UPDATE staff_payroll_ledger SET amount_minor = amount_minor + 1'), + ).rejects.toThrow(/permission denied|append-only|read-only/i); + + // 6. Повторный запуск отказывает и ничего не меняет. + const again = runRehome(['--json'], adminUrl); + expect(again.status, 'повторный перенос должен отказать').not.toBe(0); + expect(await snapshot(TARGET, state.tables)).toEqual(afterTarget); + }); +}); diff --git a/tests/e2e/harness/client.ts b/tests/e2e/harness/client.ts index 78be9ba..2cded98 100644 --- a/tests/e2e/harness/client.ts +++ b/tests/e2e/harness/client.ts @@ -71,12 +71,20 @@ export async function dbQuery { - const context = ctx(); - const client = new pg.Client({ connectionString: context.appDatabaseUrl }); + return dbQueryAs(ctx().tenantId, sql, params); +} + +/** Запрос ролью приложения (krona_staff_app) под указанным арендатором (app.tenant_id). */ +export async function dbQueryAs>( + tenantId: string, + sql: string, + params: unknown[] = [], +): Promise { + const client = new pg.Client({ connectionString: ctx().appDatabaseUrl }); await client.connect(); try { await client.query('BEGIN'); - await client.query("SELECT set_config('app.tenant_id', $1, true)", [context.tenantId]); + await client.query("SELECT set_config('app.tenant_id', $1, true)", [tenantId]); const result = await client.query(sql, params); await client.query('COMMIT'); return result.rows; diff --git a/tests/e2e/known-defects.json b/tests/e2e/known-defects.json index 1d0276c..7fc1c9d 100644 --- a/tests/e2e/known-defects.json +++ b/tests/e2e/known-defects.json @@ -45,6 +45,7 @@ "K9/D3": "параметры пресета официанта (shift_rate_minor и др.) не сохраняются", "S9": "удаление точки с устройством: 23502 null value in column tenant_id (ON DELETE SET NULL на составном FK)", "A4": "ответы 500 содержат SQLSTATE и текст PostgreSQL", - "N12-DATE": "month=2026-13 → 500 (22008) вместо 400" + "N12-DATE": "month=2026-13 → 500 (22008) вместо 400", + "PILOT-REHOME": "нет scripts/rehome-tenant.mjs (TASK-CODEX-2 п.2.2): перенос заглушки 01J00000000000000000000000 на настоящий tenant не реализован" } } diff --git a/tests/e2e/report-evidence/round3-pilot-rehome.txt b/tests/e2e/report-evidence/round3-pilot-rehome.txt new file mode 100644 index 0000000..b0242d2 --- /dev/null +++ b/tests/e2e/report-evidence/round3-pilot-rehome.txt @@ -0,0 +1,37 @@ +# PILOT-REHOME: доказательство, что сценарий ловит ошибки переноса (TASK-GROK-3 п.5) +# Эталон — временный scripts/rehome-tenant.mjs (минимальный UPDATE tenant_id под session_replication_role=replica + запись аудита); +# он НЕ коммитился и удалён после прогона. Команда: node scripts/test/run-e2e.mjs (PG17, admin-режим). + +== эталон (reference), не коммитится + ✓ tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME-SEED] сиды покрывают все таблицы с tenant_id (список из information_schema) 176ms + ✓ tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 340ms + × tests/e2e/30-owner-decisions.e2e.ts > Решения владельца: роли, пакеты зарплаты, согласие на биометрию > [D6/OWN-01] менеджер точки A запускает расчёт для точки B → 403 111ms +== эталон (no-audit), не коммитится + ✓ tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME-SEED] сиды покрывают все таблицы с tenant_id (список из information_schema) 164ms + × tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 191ms + → staff_audit_log: у нового арендатора нет новой записи о переносе: expected 2 to be greater than 2 + FAIL tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает +== эталон (dry-writes), не коммитится + ✓ tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME-SEED] сиды покрывают все таблицы с tenant_id (список из information_schema) 182ms + × tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 88ms + → --dry-run изменил данные заглушки: expected { counts: { …(27) }, …(1) } to deeply equal { counts: { …(27) }, …(1) } + FAIL tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает +== без скрипта + ✓ tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME-SEED] сиды покрывают все таблицы с tenant_id (список из information_schema) 169ms + × tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 4ms + → scripts/rehome-tenant.mjs отсутствует (TASK-CODEX-2 п.2.2): перенос заглушки 01J00000000000000000000000 → 01M2R6AC5652NPT3MG34DKN4ZP не реализован; контракт сценария — NOTES-FOR-EXECUTORS.md C6. Засеяно таблиц: 27, ledger SUM(amount_minor)=313227 + FAIL tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает + +# Мутации эталона (первый прогон, до уточнения сообщений ассертов) +== мутация эталона: no-audit + × tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 196ms + → expected 2 to be greater than 2 +== мутация эталона: no-refuse + × tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 319ms + → повторный перенос должен отказать: expected +0 not to be +0 // Object.is equality +== мутация эталона: skip-table + × tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 195ms + → под заглушкой остались строки: expected [ 'staff_work_items' ] to deeply equal [] +== мутация эталона: dry-writes + × tests/e2e/60-pilot-rehome.e2e.ts > PILOT-REHOME: перенос заглушки арендатора на настоящий tenant > [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 91ms + → expected { counts: { …(27) }, …(1) } to deeply equal { counts: { …(27) }, …(1) } From 6f408bc0aa218f5a8f765f57a554a8a70797cd9c Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 16:16:23 +0700 Subject: [PATCH 26/28] =?UTF-8?q?test(accept):=20=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BE=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D0=91=D0=94=20=D0=B8=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B4=D0=B8=D0=BA=D1=82=20SKIP=20=D0=B4=D0=BB=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: live-postgres-remediation.test.ts (codex/fix-live-database) запускается только при DATABASE_TEST_ISOLATED=true, DATABASE_TEST_GUARD_TOKEN, таблице krona_staff_test_guard и имени БД krona_staff_audit_*; иначе весь файл пропускается, и первый прогон показал его как FAIL «1 skipped (1)», что неверно в обе стороны. В admin-режиме интеграционная БД одноразовая (krona_staff_audit_acc_it), поэтому предохранитель создаётся со случайным маркером — тест реально выполнился: 1 passed. В режиме E2E_MIGRATOR_URL/E2E_APP_URL изоляция не гарантирована, предохранитель не ставится, файл получает отдельный вердикт SKIP (ничего не проверил). --- scripts/test/accept-branch.mjs | 42 ++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/scripts/test/accept-branch.mjs b/scripts/test/accept-branch.mjs index 6dc935b..5a22339 100644 --- a/scripts/test/accept-branch.mjs +++ b/scripts/test/accept-branch.mjs @@ -19,7 +19,11 @@ // Итог — markdown в stdout (и в --out). Логи — в tests/e2e/evidence/accept/<время>/. // // БД: по умолчанию E2E_PG_ADMIN_URL (bootstrap-админ) один раз создаёт роли со случайными -// паролями, дальше только пересоздаёт БД `krona_acc_it`/`krona_acc_e2e` (provision-pg --roles keep). +// паролями, дальше только пересоздаёт БД `krona_staff_audit_acc_it`/`krona_acc_e2e` (provision-pg --roles keep). +// Интеграционная БД в этом режиме заведомо изолирована, поэтому для тестов с «предохранителем» +// (codex/fix-live-database: DATABASE_TEST_ISOLATED, DATABASE_TEST_GUARD_TOKEN, таблица +// krona_staff_test_guard, имя БД krona_staff_audit_*) он выставляется со случайным маркером. +// Файл, где все тесты пропущены, — отдельный вердикт SKIP (ничего не проверил). // Если заданы E2E_MIGRATOR_URL и E2E_APP_URL — роли не создаются и пароли не меняются, // все прогоны идут последовательно в БД из этих URL со сбросом через откат всех миграций. // @@ -28,7 +32,7 @@ // --skip-integration, --skip-e2e, --out <файл.md>. // Ветка задаётся как `origin/<имя>`, `<имя>` (ищется origin/<имя>, затем локальный ref) или SHA. import { spawn, spawnSync } from 'node:child_process'; -import { createHash } from 'node:crypto'; +import { createHash, randomBytes } from 'node:crypto'; import { cpSync, existsSync, @@ -42,6 +46,7 @@ import { } from 'node:fs'; import { tmpdir } from 'node:os'; import path from 'node:path'; +import pg from 'pg'; import * as prettier from 'prettier'; const repoRoot = path.resolve(import.meta.dirname, '../..'); @@ -296,6 +301,23 @@ async function migrate(wt, db, logFile) { return r; } +/** Предохранитель изолированной тестовой БД (соглашение теста codex/fix-live-database). */ +async function createGuard(db) { + const marker = randomBytes(16).toString('hex'); + const client = new pg.Client({ connectionString: db.migrator }); + await client.connect(); + try { + await client.query( + 'CREATE TABLE IF NOT EXISTS krona_staff_test_guard (marker text PRIMARY KEY)', + ); + await client.query('INSERT INTO krona_staff_test_guard (marker) VALUES ($1)', [marker]); + await client.query('GRANT SELECT ON krona_staff_test_guard TO krona_staff_app'); + } finally { + await client.end(); + } + return marker; +} + async function stepIntegration(target, wt) { const dir = path.join(wt.dir, 'tests/integration'); const files = existsSync(dir) @@ -307,8 +329,9 @@ async function stepIntegration(target, wt) { for (const file of files) { progress(`${target.name}: integration ${file}`); const slug = `${slugOf(target.name)}-it-${file.replace(/\.test\.ts$/, '')}`; - const db = await freshDatabase('krona_acc_it'); + const db = await freshDatabase('krona_staff_audit_acc_it'); const m = await migrate(wt, db, path.join(logDir, `${slug}-migrate.txt`)); + const guard = m.code === 0 && dbMode === 'admin' ? await createGuard(db) : null; if (m.code !== 0) { results.push({ file, @@ -328,6 +351,7 @@ async function stepIntegration(target, wt) { DATABASE_TEST_URL: db.app, DATABASE_TEST_MIGRATION_URL: db.migrator, DATABASE_MIGRATION_URL: db.migrator, + ...(guard ? { DATABASE_TEST_ISOLATED: 'true', DATABASE_TEST_GUARD_TOKEN: guard } : {}), }), logFile: path.join(logDir, `${slug}.txt`), }, @@ -335,12 +359,14 @@ async function stepIntegration(target, wt) { const filesLine = /Test Files\s+(.+)$/m.exec(r.out)?.[1]?.trim() ?? '(нет строки Test Files)'; const testsLine = /^\s*Tests\s+(.+)$/m.exec(r.out)?.[1]?.trim() ?? ''; const ok = r.code === 0 && /\bpassed\b/.test(filesLine) && !/failed/.test(filesLine); + const skipped = r.code === 0 && /skipped/.test(filesLine) && !/passed|failed/.test(filesLine); results.push({ file, ok, + skipped, files: filesLine, tests: testsLine, - error: ok ? '' : firstError(r.out), + error: ok || skipped ? '' : firstError(r.out), }); } return results; @@ -574,9 +600,11 @@ if (needRuns) { ? `OK (${res.check.tests})` : `FAIL exit=${res.check.code}: ${res.check.error}` : 'не запускался'; - const reds = res.integration?.filter((r) => !r.ok).map((r) => r.file) ?? []; + const reds = res.integration?.filter((r) => !r.ok && !r.skipped).map((r) => r.file) ?? []; + const skips = res.integration?.filter((r) => r.skipped).map((r) => r.file) ?? []; + const greens = (res.integration?.length ?? 0) - reds.length - skips.length; const integration = res.integration - ? `${res.integration.length - reds.length}/${res.integration.length} зелёных${reds.length ? `; FAIL: ${reds.join(', ')}` : ''}` + ? `${greens}/${res.integration.length} зелёных${reds.length ? `; FAIL: ${reds.join(', ')}` : ''}${skips.length ? `; SKIP (файл пропущен целиком): ${skips.join(', ')}` : ''}` : 'не запускались'; let e2e = 'не запускался'; let green = ''; @@ -609,7 +637,7 @@ if (needRuns) { for (const res of results.values()) { for (const r of res.integration ?? []) { md.push( - `| ${res.target.ref} | ${r.file} | ${r.ok ? 'OK' : 'FAIL'} | ${r.files} | ${r.tests} | ${r.error} |`, + `| ${res.target.ref} | ${r.file} | ${r.ok ? 'OK' : r.skipped ? 'SKIP' : 'FAIL'} | ${r.files} | ${r.tests} | ${r.error} |`, ); } } From 10ba0b440f20148ff6f3e01a3f8e02def1bdbadf Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 16:24:19 +0700 Subject: [PATCH 27/28] =?UTF-8?q?docs(e2e):=20=D0=B4=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D1=82=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=BA=D1=80=D1=83=D0=B3=D0=B0=203=20=E2=80=94=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=20accept-branch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: TASK-GROK-3 требует каждый вывод с командой и фактическим выводом. round3-accept-owner-shas.md — 1df2019/8baad55/513cdff: все ожидания владельца подтвердились; round3-accept-owner-branches-first.md — те же ветки по именам (Antigravity уже 6c5bf36); round3-format-proof.md — prettier-only ветка проходит, 513cdff ловится; round3-accept-all-open.md — все открытые codex/*, antigravity/* после fetch 16:16 NOVT; round3-combined-merge.md — локальная сборка основа+live-database+c0(+grok): конфликтов нет, интеграционные 7/7, храповик просит убрать ровно K3/N2, K4/N1, K13/SYNC-A, K13/SYNC-B, SYNC-C0; round3-preset-mode.md — режим E2E_MIGRATOR_URL/E2E_APP_URL (вердикт SKIP). Файлы прогнаны через prettier (иначе format:check в CI падает), содержимое таблиц не менялось. --- .../report-evidence/round3-accept-all-open.md | 140 ++++++++++++++++++ .../round3-accept-owner-branches-first.md | 57 +++++++ .../round3-accept-owner-shas.md | 57 +++++++ .../report-evidence/round3-combined-merge.md | 82 ++++++++++ .../report-evidence/round3-format-proof.md | 19 +++ .../e2e/report-evidence/round3-preset-mode.md | 26 ++++ 6 files changed, 381 insertions(+) create mode 100644 tests/e2e/report-evidence/round3-accept-all-open.md create mode 100644 tests/e2e/report-evidence/round3-accept-owner-branches-first.md create mode 100644 tests/e2e/report-evidence/round3-accept-owner-shas.md create mode 100644 tests/e2e/report-evidence/round3-combined-merge.md create mode 100644 tests/e2e/report-evidence/round3-format-proof.md create mode 100644 tests/e2e/report-evidence/round3-preset-mode.md diff --git a/tests/e2e/report-evidence/round3-accept-all-open.md b/tests/e2e/report-evidence/round3-accept-all-open.md new file mode 100644 index 0000000..2e8d470 --- /dev/null +++ b/tests/e2e/report-evidence/round3-accept-all-open.md @@ -0,0 +1,140 @@ +# Команда: node scripts/test/accept-branch.mjs $(все origin/codex/* и origin/antigravity/* кроме основы) — после git fetch в 16:16 NOVT + +## accept-branch — 2026-09-26 09:20 UTC + +База: `origin/codex/bootstrap-platform-foundation` = b0243d5; стенд (оверлей tests/e2e, scripts/test): 6f408bc; БД: роли созданы один раз через E2E_PG_ADMIN_URL (provision-pg), дальше --roles keep. Логи: `tests/e2e/evidence/accept/2026-09-26T09-16-26/`. + +### Сводка + +| Ветка | SHA | npm run check | integration (красные файлы) | e2e red/green | e2e: стало зелёным | e2e: стало красным | +| ------------------------------------------------- | ------- | -------------- | --------------------------- | ------------------------------------------- | ------------------ | ------------------------------- | +| origin/codex/bootstrap-platform-foundation (база) | b0243d5 | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | n/a | n/a | +| origin/antigravity/employee-notifications | 3e20544 | OK (164 passed | 1 skipped (165)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 49/2 | — | HARNESS (AssertionError: expected 10 to be greater than or equal to 11); PILOT-REHOME-SEED (error: relation "staff_sync_change_log" does not exist); SYNC-L (AssertionError: HTTP 404 {"message":"Route POST:/api/v1/staff/sync/devices not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is) | +| origin/antigravity/fix-reject-device-shifts | b283736 | OK (196 passed | 3 skipped (199)) | 4/5 зелёных; FAIL: tenant-isolation.test.ts | 44/7 | K13/SYNC-A, K13/SYNC-B | — | +| origin/antigravity/fix-sync-c0-bootstrap | 24cc18d | OK (197 passed | 5 skipped (202)) | 5/6 зелёных; FAIL: tenant-isolation.test.ts | 43/8 | K13/SYNC-A, K13/SYNC-B, SYNC-C0 | — | +| origin/antigravity/offline-sync-backend | 5ee7517 | OK (192 passed | 1 skipped (193)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | — | — | +| origin/codex/finance-calendar-dashboard | c08a7e6 | OK (113 passed | 1 skipped (114)) | 4/4 зелёных | 48/3 | A4, K4/N1 | CTRL (AssertionError: expected 200 to be 401 // Object.is equality); HARNESS (AssertionError: expected 8 to be greater than or equal to 11); PILOT-REHOME-SEED (error: relation "staff_professions" does not exist); SYNC-L (AssertionError: HTTP 404 {"message":"Route POST:/api/v1/staff/sync/devices not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is) | +| origin/codex/fix-format-baseline | a05777c | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | — | — | +| origin/codex/fix-live-database | 1573860 | OK (197 passed | 2 skipped (199)) | 4/5 зелёных; FAIL: tenant-isolation.test.ts | 44/7 | K3/N2, K4/N1 | — | +| origin/codex/frontend-library | 331e490 | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | — | — | +| origin/codex/security-finance-production | f74aa6d | OK (142 passed | 1 skipped (143)) | 4/4 зелёных | 49/2 | — | HARNESS (AssertionError: expected 9 to be greater than or equal to 11); PILOT-REHOME-SEED (error: relation "staff_push_subscriptions" does not exist); SYNC-L (AssertionError: HTTP 404 {"message":"Route POST:/api/v1/staff/sync/devices not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is) | +| origin/codex/server-web-production | 2f6b367 | OK (113 passed | 1 skipped (114)) | 4/4 зелёных | 49/2 | K4/N1 | CTRL (AssertionError: HTTP 404 {"message":"Route POST:/api/v1/staff/imports/owner-workbook not found","error":"Not Found","statusCode":404}: expected 404 to be less t); HARNESS (AssertionError: expected 7 to be greater than or equal to 11); PILOT-REHOME-SEED (error: relation "staff_professions" does not exist); SYNC-L (AssertionError: HTTP 404 {"message":"Route POST:/api/v1/staff/sync/devices not found","error":"Not Found","statusCode":404}: expected 404 to be 201 // Object.is) | + +### Интеграционные тесты (каждый файл отдельно, свежая БД) + +| Ветка | Файл | Итог | Test Files | Tests | Первая ошибка | +| ------------------------------------------- | --------------------------------- | ---- | ------------ | -------------- | -------------------------------------------------- | +| origin/codex/bootstrap-platform-foundation | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/bootstrap-platform-foundation | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/bootstrap-platform-foundation | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/bootstrap-platform-foundation | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/antigravity/employee-notifications | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/antigravity/employee-notifications | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/antigravity/employee-notifications | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/antigravity/employee-notifications | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/antigravity/fix-reject-device-shifts | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/antigravity/fix-reject-device-shifts | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/antigravity/fix-reject-device-shifts | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/antigravity/fix-reject-device-shifts | sync-rejection.test.ts | OK | 1 passed (1) | 2 passed (2) | | +| origin/antigravity/fix-reject-device-shifts | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/antigravity/fix-sync-c0-bootstrap | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/antigravity/fix-sync-c0-bootstrap | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/antigravity/fix-sync-c0-bootstrap | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/antigravity/fix-sync-c0-bootstrap | sync-bootstrap.test.ts | OK | 1 passed (1) | 2 passed (2) | | +| origin/antigravity/fix-sync-c0-bootstrap | sync-rejection.test.ts | OK | 1 passed (1) | 2 passed (2) | | +| origin/antigravity/fix-sync-c0-bootstrap | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/antigravity/offline-sync-backend | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/antigravity/offline-sync-backend | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/antigravity/offline-sync-backend | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/antigravity/offline-sync-backend | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/codex/finance-calendar-dashboard | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/finance-calendar-dashboard | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/finance-calendar-dashboard | portal.test.ts | OK | 1 passed (1) | 11 passed (11) | | +| origin/codex/finance-calendar-dashboard | tenant-isolation.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/fix-format-baseline | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/fix-format-baseline | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/fix-format-baseline | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/fix-format-baseline | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/codex/fix-live-database | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/fix-live-database | live-postgres-remediation.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/fix-live-database | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/fix-live-database | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/fix-live-database | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/codex/frontend-library | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/frontend-library | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/frontend-library | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/frontend-library | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/codex/security-finance-production | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/security-finance-production | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/security-finance-production | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/security-finance-production | tenant-isolation.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/server-web-production | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/server-web-production | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/server-web-production | portal.test.ts | OK | 1 passed (1) | 11 passed (11) | | +| origin/codex/server-web-production | tenant-isolation.test.ts | OK | 1 passed (1) | 1 passed (1) | | + +npm ci (lock отличается): origin/codex/finance-calendar-dashboard, origin/codex/security-finance-production, origin/codex/server-web-production + +### Попарные слияния (`git merge-tree --write-tree`) + +| Ветка A | Ветка B | Результат | Конфликтные файлы | +| ------------------------------------------- | ------------------------------------------- | --------- | ----------------- | +| origin/codex/bootstrap-platform-foundation | origin/antigravity/employee-notifications | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/antigravity/fix-reject-device-shifts | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/antigravity/fix-sync-c0-bootstrap | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/antigravity/offline-sync-backend | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/codex/finance-calendar-dashboard | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/codex/fix-format-baseline | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/codex/fix-live-database | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/codex/frontend-library | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/codex/security-finance-production | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/codex/server-web-production | чисто | | +| origin/antigravity/employee-notifications | origin/antigravity/fix-reject-device-shifts | чисто | | +| origin/antigravity/employee-notifications | origin/antigravity/fix-sync-c0-bootstrap | чисто | | +| origin/antigravity/employee-notifications | origin/antigravity/offline-sync-backend | чисто | | +| origin/antigravity/employee-notifications | origin/codex/finance-calendar-dashboard | чисто | | +| origin/antigravity/employee-notifications | origin/codex/fix-format-baseline | чисто | | +| origin/antigravity/employee-notifications | origin/codex/fix-live-database | чисто | | +| origin/antigravity/employee-notifications | origin/codex/frontend-library | чисто | | +| origin/antigravity/employee-notifications | origin/codex/security-finance-production | чисто | | +| origin/antigravity/employee-notifications | origin/codex/server-web-production | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/antigravity/fix-sync-c0-bootstrap | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/antigravity/offline-sync-backend | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/codex/finance-calendar-dashboard | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/codex/fix-format-baseline | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/codex/fix-live-database | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/codex/frontend-library | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/codex/security-finance-production | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/codex/server-web-production | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/antigravity/offline-sync-backend | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/finance-calendar-dashboard | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-format-baseline | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-live-database | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/frontend-library | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/security-finance-production | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/server-web-production | чисто | | +| origin/antigravity/offline-sync-backend | origin/codex/finance-calendar-dashboard | чисто | | +| origin/antigravity/offline-sync-backend | origin/codex/fix-format-baseline | чисто | | +| origin/antigravity/offline-sync-backend | origin/codex/fix-live-database | чисто | | +| origin/antigravity/offline-sync-backend | origin/codex/frontend-library | чисто | | +| origin/antigravity/offline-sync-backend | origin/codex/security-finance-production | чисто | | +| origin/antigravity/offline-sync-backend | origin/codex/server-web-production | чисто | | +| origin/codex/finance-calendar-dashboard | origin/codex/fix-format-baseline | чисто | | +| origin/codex/finance-calendar-dashboard | origin/codex/fix-live-database | чисто | | +| origin/codex/finance-calendar-dashboard | origin/codex/frontend-library | чисто | | +| origin/codex/finance-calendar-dashboard | origin/codex/security-finance-production | чисто | | +| origin/codex/finance-calendar-dashboard | origin/codex/server-web-production | чисто | | +| origin/codex/fix-format-baseline | origin/codex/fix-live-database | чисто | | +| origin/codex/fix-format-baseline | origin/codex/frontend-library | чисто | | +| origin/codex/fix-format-baseline | origin/codex/security-finance-production | чисто | | +| origin/codex/fix-format-baseline | origin/codex/server-web-production | чисто | | +| origin/codex/fix-live-database | origin/codex/frontend-library | чисто | | +| origin/codex/fix-live-database | origin/codex/security-finance-production | чисто | | +| origin/codex/fix-live-database | origin/codex/server-web-production | чисто | | +| origin/codex/frontend-library | origin/codex/security-finance-production | чисто | | +| origin/codex/frontend-library | origin/codex/server-web-production | чисто | | +| origin/codex/security-finance-production | origin/codex/server-web-production | чисто | | + +### Форматирование без поведения + +**origin/codex/fix-format-baseline** (a05777c), merge-base f5ac179, изменено файлов: 19 — ТОЛЬКО ФОРМАТИРОВАНИЕ diff --git a/tests/e2e/report-evidence/round3-accept-owner-branches-first.md b/tests/e2e/report-evidence/round3-accept-owner-branches-first.md new file mode 100644 index 0000000..1a50c71 --- /dev/null +++ b/tests/e2e/report-evidence/round3-accept-owner-branches-first.md @@ -0,0 +1,57 @@ +# Команда: node scripts/test/accept-branch.mjs antigravity/fix-reject-device-shifts antigravity/fix-sync-c0-bootstrap codex/fix-format-baseline (16:03 NOVT; ветка Antigravity к этому времени уже 6c5bf36; версия скрипта до вердикта SKIP) + +## accept-branch — 2026-09-26 09:04 UTC + +База: `origin/codex/bootstrap-platform-foundation` = b0243d5; стенд (оверлей tests/e2e, scripts/test): aa7f5f8 (+ незакоммиченные изменения стенда); БД: роли созданы один раз через E2E_PG_ADMIN_URL (provision-pg), дальше --roles keep. Логи: `tests/e2e/evidence/accept/2026-09-26T09-03-17/`. + +### Сводка + +| Ветка | SHA | npm run check | integration (красные файлы) | e2e red/green | e2e: стало зелёным | e2e: стало красным | +| ------------------------------------------------- | ------- | -------------- | --------------------------- | ------------------------------------------------------------------- | ------------------ | ---------------------- | +| origin/codex/bootstrap-platform-foundation (база) | b0243d5 | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 45/4 | n/a | n/a | +| origin/antigravity/fix-reject-device-shifts | 6c5bf36 | OK (196 passed | 3 skipped (199)) | 4/5 зелёных; FAIL: tenant-isolation.test.ts | 43/6 | K13/SYNC-A, K13/SYNC-B | — | +| origin/antigravity/fix-sync-c0-bootstrap | 8baad55 | OK (196 passed | 3 skipped (199)) | 3/5 зелёных; FAIL: sync-bootstrap.test.ts, tenant-isolation.test.ts | 44/5 | SYNC-C0 | — | +| origin/codex/fix-format-baseline | 513cdff | OK (196 passed | 1 skipped (197)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 43/6 | K13/SYNC-A, K13/SYNC-B | — | + +### Интеграционные тесты (каждый файл отдельно, свежая БД) + +| Ветка | Файл | Итог | Test Files | Tests | Первая ошибка | +| ------------------------------------------- | ------------------------ | ---- | ------------ | -------------- | -------------------------------------------------- | +| origin/codex/bootstrap-platform-foundation | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/bootstrap-platform-foundation | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/bootstrap-platform-foundation | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/bootstrap-platform-foundation | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/antigravity/fix-reject-device-shifts | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/antigravity/fix-reject-device-shifts | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/antigravity/fix-reject-device-shifts | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/antigravity/fix-reject-device-shifts | sync-rejection.test.ts | OK | 1 passed (1) | 2 passed (2) | | +| origin/antigravity/fix-reject-device-shifts | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/antigravity/fix-sync-c0-bootstrap | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/antigravity/fix-sync-c0-bootstrap | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/antigravity/fix-sync-c0-bootstrap | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/antigravity/fix-sync-c0-bootstrap | sync-bootstrap.test.ts | FAIL | 1 failed (1) | 2 passed (2) | Error: Called end on pool more than once | +| origin/antigravity/fix-sync-c0-bootstrap | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/codex/fix-format-baseline | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/fix-format-baseline | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/fix-format-baseline | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/fix-format-baseline | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | + +### Попарные слияния (`git merge-tree --write-tree`) + +| Ветка A | Ветка B | Результат | Конфликтные файлы | +| ------------------------------------------- | ------------------------------------------- | --------- | -------------------------- | +| origin/codex/bootstrap-platform-foundation | origin/antigravity/fix-reject-device-shifts | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/antigravity/fix-sync-c0-bootstrap | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/codex/fix-format-baseline | чисто | | +| origin/antigravity/fix-reject-device-shifts | origin/antigravity/fix-sync-c0-bootstrap | КОНФЛИКТ | src/domain/sync/service.ts | +| origin/antigravity/fix-reject-device-shifts | origin/codex/fix-format-baseline | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-format-baseline | КОНФЛИКТ | src/domain/sync/service.ts | + +### Форматирование без поведения + +**origin/codex/fix-format-baseline** (513cdff), merge-base f5ac179, изменено файлов: 24 — ЕСТЬ ИЗМЕНЕНИЯ СВЕРХ PRETTIER + +| Файл | Почему | Строк сверх prettier | Эти же строки в ветке | +| -------------------------- | ----------------------------- | -------------------- | ---------------------------------------------------------------------------------------- | +| src/domain/sync/service.ts | не совпадает с prettier(база) | 232 | antigravity/fix-reject-device-shifts: 232/232; antigravity/fix-sync-c0-bootstrap: 6/232 | +| tests/unit/sync.test.ts | не совпадает с prettier(база) | 130 | antigravity/fix-reject-device-shifts: 130/130; antigravity/fix-sync-c0-bootstrap: 12/130 | diff --git a/tests/e2e/report-evidence/round3-accept-owner-shas.md b/tests/e2e/report-evidence/round3-accept-owner-shas.md new file mode 100644 index 0000000..eba1c2d --- /dev/null +++ b/tests/e2e/report-evidence/round3-accept-owner-shas.md @@ -0,0 +1,57 @@ +# Команда: node scripts/test/accept-branch.mjs 1df2019 antigravity/fix-sync-c0-bootstrap codex/fix-format-baseline (SHA 1df2019 = прежняя голова antigravity/fix-reject-device-shifts; 8baad55, 513cdff — головы на момент прогона, 16:04 NOVT) + +## accept-branch — 2026-09-26 09:06 UTC + +База: `origin/codex/bootstrap-platform-foundation` = b0243d5; стенд (оверлей tests/e2e, scripts/test): aa7f5f8 (+ незакоммиченные изменения стенда); БД: роли созданы один раз через E2E_PG_ADMIN_URL (provision-pg), дальше --roles keep. Логи: `tests/e2e/evidence/accept/2026-09-26T09-05-12/`. + +### Сводка + +| Ветка | SHA | npm run check | integration (красные файлы) | e2e red/green | e2e: стало зелёным | e2e: стало красным | +| ------------------------------------------------- | ------- | -------------- | --------------------------- | ------------------------------------------------------------------- | ------------------ | ---------------------- | +| origin/codex/bootstrap-platform-foundation (база) | b0243d5 | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 45/4 | n/a | n/a | +| 1df2019 | 1df2019 | OK (196 passed | 3 skipped (199)) | 3/5 зелёных; FAIL: sync-rejection.test.ts, tenant-isolation.test.ts | 43/6 | K13/SYNC-A, K13/SYNC-B | — | +| origin/antigravity/fix-sync-c0-bootstrap | 8baad55 | OK (196 passed | 3 skipped (199)) | 3/5 зелёных; FAIL: sync-bootstrap.test.ts, tenant-isolation.test.ts | 44/5 | SYNC-C0 | — | +| origin/codex/fix-format-baseline | 513cdff | OK (196 passed | 1 skipped (197)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 43/6 | K13/SYNC-A, K13/SYNC-B | — | + +### Интеграционные тесты (каждый файл отдельно, свежая БД) + +| Ветка | Файл | Итог | Test Files | Tests | Первая ошибка | +| ------------------------------------------ | ------------------------ | ---- | ------------ | -------------- | ----------------------------------------------------------------------- | +| origin/codex/bootstrap-platform-foundation | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/bootstrap-platform-foundation | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/bootstrap-platform-foundation | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/bootstrap-platform-foundation | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| 1df2019 | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| 1df2019 | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| 1df2019 | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| 1df2019 | sync-rejection.test.ts | FAIL | 1 failed (1) | 2 skipped (2) | error: column "created_by" of relation "staff_employees" does not exist | +| 1df2019 | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/antigravity/fix-sync-c0-bootstrap | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/antigravity/fix-sync-c0-bootstrap | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/antigravity/fix-sync-c0-bootstrap | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/antigravity/fix-sync-c0-bootstrap | sync-bootstrap.test.ts | FAIL | 1 failed (1) | 2 passed (2) | Error: Called end on pool more than once | +| origin/antigravity/fix-sync-c0-bootstrap | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/codex/fix-format-baseline | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/fix-format-baseline | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/fix-format-baseline | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/fix-format-baseline | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | + +### Попарные слияния (`git merge-tree --write-tree`) + +| Ветка A | Ветка B | Результат | Конфликтные файлы | +| ------------------------------------------ | ---------------------------------------- | --------- | -------------------------- | +| origin/codex/bootstrap-platform-foundation | 1df2019 | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/antigravity/fix-sync-c0-bootstrap | чисто | | +| origin/codex/bootstrap-platform-foundation | origin/codex/fix-format-baseline | чисто | | +| 1df2019 | origin/antigravity/fix-sync-c0-bootstrap | КОНФЛИКТ | src/domain/sync/service.ts | +| 1df2019 | origin/codex/fix-format-baseline | чисто | | +| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-format-baseline | КОНФЛИКТ | src/domain/sync/service.ts | + +### Форматирование без поведения + +**origin/codex/fix-format-baseline** (513cdff), merge-base f5ac179, изменено файлов: 24 — ЕСТЬ ИЗМЕНЕНИЯ СВЕРХ PRETTIER + +| Файл | Почему | Строк сверх prettier | Эти же строки в ветке | +| -------------------------- | ----------------------------- | -------------------- | ----------------------------------------------------------- | +| src/domain/sync/service.ts | не совпадает с prettier(база) | 232 | 1df2019: 232/232; antigravity/fix-sync-c0-bootstrap: 6/232 | +| tests/unit/sync.test.ts | не совпадает с prettier(база) | 130 | 1df2019: 130/130; antigravity/fix-sync-c0-bootstrap: 12/130 | diff --git a/tests/e2e/report-evidence/round3-combined-merge.md b/tests/e2e/report-evidence/round3-combined-merge.md new file mode 100644 index 0000000..e4436e3 --- /dev/null +++ b/tests/e2e/report-evidence/round3-combined-merge.md @@ -0,0 +1,82 @@ +# Локальные ветки (не запушены): tmp/combined-round3 = b0243d5 + merge origin/codex/fix-live-database (1573860) + merge origin/antigravity/fix-sync-c0-bootstrap (24cc18d), без конфликтов; tmp/combined-round3-grok = то же + merge grok/e2e-harness (6f408bc). Команда: node scripts/test/accept-branch.mjs <ветка> + +## accept-branch — 2026-09-26 09:22 UTC + +База: `origin/codex/bootstrap-platform-foundation` = b0243d5; стенд (оверлей tests/e2e, scripts/test): 6f408bc; БД: роли созданы один раз через E2E_PG_ADMIN_URL (provision-pg), дальше --roles keep. Логи: `tests/e2e/evidence/accept/2026-09-26T09-22-01/`. + +### Сводка + +| Ветка | SHA | npm run check | integration (красные файлы) | e2e red/green | e2e: стало зелёным | e2e: стало красным | +| ------------------------------------------------- | ------- | -------------- | --------------------------- | ------------------------------------------- | ------------------ | --------------------------------------------- | +| origin/codex/bootstrap-platform-foundation (база) | b0243d5 | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | n/a | n/a | +| tmp/combined-round3 | 48128c8 | OK (199 passed | 6 skipped (205)) | 6/7 зелёных; FAIL: tenant-isolation.test.ts | 41/10 | K13/SYNC-A, K13/SYNC-B, K3/N2, K4/N1, SYNC-C0 | — | + +### Интеграционные тесты (каждый файл отдельно, свежая БД) + +| Ветка | Файл | Итог | Test Files | Tests | Первая ошибка | +| ------------------------------------------ | --------------------------------- | ---- | ------------ | -------------- | -------------------------------------------------- | +| origin/codex/bootstrap-platform-foundation | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/bootstrap-platform-foundation | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/bootstrap-platform-foundation | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/bootstrap-platform-foundation | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| tmp/combined-round3 | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| tmp/combined-round3 | live-postgres-remediation.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| tmp/combined-round3 | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| tmp/combined-round3 | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| tmp/combined-round3 | sync-bootstrap.test.ts | OK | 1 passed (1) | 2 passed (2) | | +| tmp/combined-round3 | sync-rejection.test.ts | OK | 1 passed (1) | 2 passed (2) | | +| tmp/combined-round3 | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | + +### Попарные слияния (`git merge-tree --write-tree`) + +| Ветка A | Ветка B | Результат | Конфликтные файлы | +| ------------------------------------------ | ------------------- | --------- | ----------------- | +| origin/codex/bootstrap-platform-foundation | tmp/combined-round3 | чисто | | + +--- + +## accept-branch — 2026-09-26 09:23 UTC + +База: `origin/codex/bootstrap-platform-foundation` = b0243d5; стенд (оверлей tests/e2e, scripts/test): 6f408bc; БД: роли созданы один раз через E2E_PG_ADMIN_URL (provision-pg), дальше --roles keep. Логи: `tests/e2e/evidence/accept/2026-09-26T09-23-04/`. + +### Сводка + +| Ветка | SHA | npm run check | integration (красные файлы) | e2e red/green | e2e: стало зелёным | e2e: стало красным | +| ------------------------------------------------- | ------- | -------------- | --------------------------- | ------------------------------------------- | ------------------ | --------------------------------------------- | +| origin/codex/bootstrap-platform-foundation (база) | b0243d5 | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | n/a | n/a | +| tmp/combined-round3-grok | e94415a | OK (199 passed | 6 skipped (205)) | 7/7 зелёных | 41/10 | K13/SYNC-A, K13/SYNC-B, K3/N2, K4/N1, SYNC-C0 | — | + +### Интеграционные тесты (каждый файл отдельно, свежая БД) + +| Ветка | Файл | Итог | Test Files | Tests | Первая ошибка | +| ------------------------------------------ | --------------------------------- | ---- | ------------ | -------------- | -------------------------------------------------- | +| origin/codex/bootstrap-platform-foundation | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/bootstrap-platform-foundation | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/bootstrap-platform-foundation | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/bootstrap-platform-foundation | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| tmp/combined-round3-grok | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| tmp/combined-round3-grok | live-postgres-remediation.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| tmp/combined-round3-grok | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| tmp/combined-round3-grok | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| tmp/combined-round3-grok | sync-bootstrap.test.ts | OK | 1 passed (1) | 2 passed (2) | | +| tmp/combined-round3-grok | sync-rejection.test.ts | OK | 1 passed (1) | 2 passed (2) | | +| tmp/combined-round3-grok | tenant-isolation.test.ts | OK | 1 passed (1) | 1 passed (1) | | + +Внимание: ветка меняла файлы стенда, при приёмке они заменены оверлеем: + +- tmp/combined-round3-grok: scripts/test/accept-branch.mjs, scripts/test/ci-local.sh, scripts/test/migrate-roundtrip.mjs, scripts/test/n13-race.mjs, scripts/test/node-commands.d.mts, scripts/test/node-commands.mjs, scripts/test/provision-pg.mjs, scripts/test/run-e2e.mjs, tests/e2e/00-harness.e2e.ts, tests/e2e/10-core-defects.e2e.ts, tests/e2e/20-sync-defects.e2e.ts, tests/e2e/30-owner-decisions.e2e.ts, tests/e2e/40-compose-pilot.e2e.ts, tests/e2e/50-money-and-errors.e2e.ts, tests/e2e/60-pilot-rehome.e2e.ts, tests/e2e/NOTES-FOR-EXECUTORS.md, tests/e2e/REPORT.md, tests/e2e/harness/client.ts, tests/e2e/harness/context.ts, tests/e2e/harness/fixtures.ts, tests/e2e/harness/global-setup.ts, tests/e2e/harness/node-commands.test.ts, tests/e2e/known-defects.json, tests/e2e/report-evidence/acceptance-antigravity-fix-reject-device-shifts.txt, tests/e2e/report-evidence/acceptance-codex-fix-format-baseline.txt, tests/e2e/report-evidence/acceptance-codex-fix-live-database.txt, tests/e2e/report-evidence/n13-race.txt, tests/e2e/report-evidence/n5-after.txt, tests/e2e/report-evidence/n5-before.txt, tests/e2e/report-evidence/round3-pilot-rehome.txt, tests/e2e/vitest.e2e.config.ts + +### Попарные слияния (`git merge-tree --write-tree`) + +| Ветка A | Ветка B | Результат | Конфликтные файлы | +| ------------------------------------------ | ------------------------ | --------- | ----------------- | +| origin/codex/bootstrap-platform-foundation | tmp/combined-round3-grok | чисто | | + +``` +[run-e2e] FAIL: +- K13/SYNC-A: дефект исправлен, обновите known-defects.json +- K13/SYNC-B: дефект исправлен, обновите known-defects.json +- K3/N2: дефект исправлен, обновите known-defects.json +- K4/N1: дефект исправлен, обновите known-defects.json +- SYNC-C0: дефект исправлен, обновите known-defects.json +``` diff --git a/tests/e2e/report-evidence/round3-format-proof.md b/tests/e2e/report-evidence/round3-format-proof.md new file mode 100644 index 0000000..65e1984 --- /dev/null +++ b/tests/e2e/report-evidence/round3-format-proof.md @@ -0,0 +1,19 @@ +# Команда: node scripts/test/accept-branch.mjs --format-check tmp/prettier-only-f5ac179 --format-check codex/fix-format-baseline (tmp/prettier-only-f5ac179 = c552d38: `prettier --write .` поверх f5ac179, локальная ветка, не запушена; 513cdff — прежняя голова codex/fix-format-baseline) + +[accept] tmp/prettier-only-f5ac179: проверка форматирования +[accept] codex/fix-format-baseline: проверка форматирования + +## accept-branch — 2026-09-26 09:03 UTC + +База: `origin/codex/bootstrap-platform-foundation` = b0243d5; стенд (оверлей tests/e2e, scripts/test): aa7f5f8 (+ незакоммиченные изменения стенда); БД: не использовалась. Логи: `tests/e2e/evidence/accept/2026-09-26T09-03-11/`. + +### Форматирование без поведения + +**tmp/prettier-only-f5ac179** (c552d38), merge-base f5ac179, изменено файлов: 24 — ТОЛЬКО ФОРМАТИРОВАНИЕ + +**origin/codex/fix-format-baseline** (513cdff), merge-base f5ac179, изменено файлов: 24 — ЕСТЬ ИЗМЕНЕНИЯ СВЕРХ PRETTIER + +| Файл | Почему | Строк сверх prettier | Эти же строки в ветке | +| -------------------------- | ----------------------------- | -------------------- | --------------------- | +| src/domain/sync/service.ts | не совпадает с prettier(база) | 232 | — | +| tests/unit/sync.test.ts | не совпадает с prettier(база) | 130 | — | diff --git a/tests/e2e/report-evidence/round3-preset-mode.md b/tests/e2e/report-evidence/round3-preset-mode.md new file mode 100644 index 0000000..95386e8 --- /dev/null +++ b/tests/e2e/report-evidence/round3-preset-mode.md @@ -0,0 +1,26 @@ +# Режим готовых ролей: E2E_MIGRATOR_URL/E2E_APP_URL заданы, E2E_PG_ADMIN_URL не задан. Команда: node scripts/test/accept-branch.mjs --skip-check codex/fix-live-database (8e955b0) + +База: `origin/codex/bootstrap-platform-foundation` = b0243d5; стенд (оверлей tests/e2e, scripts/test): d7b2352 (+ незакоммиченные изменения стенда); БД: роли из E2E_MIGRATOR_URL/E2E_APP_URL (не пересоздавались). Логи: `tests/e2e/evidence/accept/2026-09-26T09-15-44/`. + +### Сводка + +| Ветка | SHA | npm run check | integration (красные файлы) | e2e red/green | e2e: стало зелёным | e2e: стало красным | +| ------------------------------------------------- | ------- | ------------- | ------------------------------------------------------------------------------------------------------------ | ------------- | ------------------------------------ | ------------------ | +| origin/codex/bootstrap-platform-foundation (база) | b0243d5 | не запускался | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | n/a | n/a | +| origin/codex/fix-live-database | 8e955b0 | не запускался | 3/5 зелёных; FAIL: tenant-isolation.test.ts; SKIP (файл пропущен целиком): live-postgres-remediation.test.ts | 42/9 | K13/SYNC-A, K13/SYNC-B, K3/N2, K4/N1 | — | + +### Интеграционные тесты (каждый файл отдельно, свежая БД) + +| Ветка | Файл | Итог | Test Files | Tests | Первая ошибка | +| ------------------------------------------ | --------------------------------- | ---- | ------------- | -------------- | -------------------------------------------------- | +| origin/codex/bootstrap-platform-foundation | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/bootstrap-platform-foundation | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/bootstrap-platform-foundation | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/bootstrap-platform-foundation | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | +| origin/codex/fix-live-database | health.test.ts | OK | 1 passed (1) | 3 passed (3) | | +| origin/codex/fix-live-database | live-postgres-remediation.test.ts | SKIP | 1 skipped (1) | 1 skipped (1) | | +| origin/codex/fix-live-database | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | | +| origin/codex/fix-live-database | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | | +| origin/codex/fix-live-database | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees | + +### Попарные слияния (`git merge-tree --write-tree`) From 986843d8d429901d4d8a15a854ec462a46fb040f Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 16:25:47 +0700 Subject: [PATCH 28/28] =?UTF-8?q?docs(e2e):=20REPORT=20=D0=B8=20NOTES=20?= =?UTF-8?q?=E2=80=94=20=D0=BA=D1=80=D1=83=D0=B3=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: TASK-GROK-3 — отчёт с командами и фактическим выводом и новые находки для исполнителей. REPORT: раздел «Круг 3» (ожидания владельца на SHA из задания — все шесть совпали; проверка форматирования; все открытые ветки после fetch 16:16 NOVT — конфликтов нет; локальная сборка «после слияния» — храповик просит убрать ровно K3/N2, K4/N1, K13/SYNC-A, K13/SYNC-B, SYNC-C0; PILOT-REHOME), новые числа ci-local (46 red / 10 green), «Не проверено». NOTES: контракт C6 для scripts/rehome-tenant.mjs (с ограничениями схемы: RLS журнала, составные FK, app.user_id в политиках INSERT) и раздел 7: двойное закрытие пула в sync-bootstrap.test.ts, неописанный предохранитель live-postgres-remediation.test.ts, N5 в основе, FK outbox_id без tenant_id. --- tests/e2e/NOTES-FOR-EXECUTORS.md | 62 ++++++++++++++++ tests/e2e/REPORT.md | 123 ++++++++++++++++++++++++++++++- 2 files changed, 181 insertions(+), 4 deletions(-) diff --git a/tests/e2e/NOTES-FOR-EXECUTORS.md b/tests/e2e/NOTES-FOR-EXECUTORS.md index 10b1a46..5823ed3 100644 --- a/tests/e2e/NOTES-FOR-EXECUTORS.md +++ b/tests/e2e/NOTES-FOR-EXECUTORS.md @@ -86,6 +86,36 @@ ID в названиях тестов — двойные «владелец/мо неизвестный ключ → 400. `GET .../pay-assignment` возвращает их в `params`. - Старые поля `rate_minor`/`percent_bp`/`guarantee_minor` можно оставить как сокращения. +### C6. Перенос арендатора пилота (PILOT-REHOME, TASK-CODEX-2 п.2.2) + +Что проверяет `tests/e2e/60-pilot-rehome.e2e.ts` (`[PILOT-REHOME]`): + +- Запуск: `DATABASE_ADMIN_URL=<админ БД> node scripts/rehome-tenant.mjs --from 01J00000000000000000000000 --to 01M2R6AC5652NPT3MG34DKN4ZP [--dry-run] [--json]`. + Стенд передаёт `DATABASE_ADMIN_URL` суперпользователя в БД стенда (`E2E_DB_ADMIN_URL` или + `E2E_PG_ADMIN_URL` с именем БД). +- `--json`: последней строкой stdout — `{"tables":{"<таблица>":<строк у --from>},"ledger_amount_minor_sum":<число или строка>}`. + Таблицы с нулём можно не печатать. +- `--dry-run`: exit 0, те же числа, в БД ничего не меняется. +- Перенос: exit 0; под `--from` 0 строк во **всех** таблицах с `tenant_id` (список из + `information_schema.columns`, не вручную); у `--to` те же счётчики и та же + `SUM(amount_minor)` в `staff_payroll_ledger`; другие арендаторы не тронуты. +- В `staff_audit_log` у нового арендатора появляется запись с `action`, содержащим `rehome` + (например, `tenant.rehomed`, старый tenant — в `new_values`). +- После переноса `krona_staff_app` видит тех же сотрудников (те же `id`) под новым tenant и никого + под старым; `UPDATE staff_payroll_ledger` ролью приложения по-прежнему отклоняется. +- Повторный запуск (под `--from` пусто / у `--to` уже есть данные) — exit ≠ 0, ничего не меняет. + +Что нужно учесть (видно по схеме, `pg_policy`/`pg_constraint` на PG17): + +- У `staff_payroll_ledger` нет политики UPDATE/DELETE, у приложения нет права UPDATE, FORCE RLS + действует и на владельца: `krona_migrator` строки журнала не перенесёт. Нужна роль с обходом RLS + (суперпользователь/BYPASSRLS) — поэтому `DATABASE_ADMIN_URL`. +- Внешние ключи составные `(tenant_id, …)` и не DEFERRABLE: переносить родителя раньше детей + нельзя — нужен порядок, отложенные проверки или `session_replication_role = replica` в одной транзакции. +- Политики INSERT `staff_audit_log`, `staff_payroll_ledger`, `staff_attendance_events`, + `staff_timesheet_entries` требуют `actor_id/created_by/updated_by = current_setting('app.user_id')` — + для записи аудита без обхода RLS выставить `app.user_id`. + ## 2. Дефекты продукта, найденные сценариями (все красные сейчас) Команда и фактический вывод — `tests/e2e/evidence/e2e-run.txt`; таблица — `tests/e2e/REPORT.md`. @@ -189,3 +219,35 @@ CONFLICT DO NOTHING` со своим `runId` → строки/UPDATE по нес - Ни одна ветка не влита в основную (f5ac179), поэтому ID из `known-defects.json` не удалены. - Суммы в тестах кратны рублю: расчёт округляет строку до `rounding_unit_minor` (по умолчанию 100 коп.). Если округление должно быть другим — это решение продукта, не теста. + +## 7. Круг 3 (TASK-GROK-3, 2026-09-26) + +Команды и полный вывод — `tests/e2e/REPORT.md` («Круг 3») и `tests/e2e/report-evidence/round3-*.md`. +Приёмка одной командой: `node scripts/test/accept-branch.mjs <ветка>…` (нужен `E2E_PG_ADMIN_URL` +или готовые роли в `E2E_MIGRATOR_URL` + `E2E_APP_URL`). + +- **Antigravity, `sync-bootstrap.test.ts` (8baad55)**: `Error: Called end on pool more than once` при + `Tests 2 passed`. Причина: `app.close()` в тесте вызывает хук `onClose` → `database.close()` + (`src/app.ts:148`), затем `afterAll` закрывает тот же `Database` ещё раз. На текущей голове + `24cc18d` файл зелёный (`1 passed (1) | 2 passed (2)`). +- **Antigravity, `sync-rejection.test.ts` (1df2019)**: `column "created_by" of relation "staff_employees" +does not exist` в `beforeAll` (`Tests 2 skipped`). На `6c5bf36`/`b283736` исправлено. +- **Конфликты**: на прежних головах `1df2019 × 8baad55` и `8baad55 × 513cdff` конфликтовали в + `src/domain/sync/service.ts`; на текущих головах (fetch 16:16 NOVT) конфликтов нет ни в одной из 55 пар. +- **Codex, `codex/fix-format-baseline`**: на `513cdff` в `service.ts`/`sync.test.ts` было 232/130 строк сверх + prettier, все есть в `antigravity/fix-reject-device-shifts`; на `a05777c` — только форматирование (19 файлов). +- **Codex, `live-postgres-remediation.test.ts`**: выполняется только при `DATABASE_TEST_ISOLATED=true`, + `DATABASE_TEST_GUARD_TOKEN`, таблице `krona_staff_test_guard` с этим маркером и имени БД + `krona_staff_audit_*`. Соглашение нигде, кроме самого теста, не описано, и ни CI, ни + `scripts/test/*` его не выполняют — в `npm run check` файл всегда `skipped`. `accept-branch` ставит + предохранитель в одноразовой БД: `1 passed (1)`. Предложение: описать соглашение в README/AGENTS + и после слияния включить его в CI (могу сделать в своей зоне, `.forgejo/workflows/ci.yml`). +- **N5 до сих пор в основе**: `tenant-isolation.test.ts` красный на `b0243d5` и всех ветках от + `f5ac179` (`permission denied for table staff_employees`); исправление — в `grok/e2e-harness`. + Локальная сборка основа + fix-live-database + fix-sync-c0-bootstrap + grok/e2e-harness: + интеграционные 7/7, храповик просит убрать ровно K3/N2, K4/N1, K13/SYNC-A, K13/SYNC-B, SYNC-C0. +- **Схема (низкий приоритет)**: `staff_notification_deliveries.outbox_id → staff_outbox(id)` — единственный + внешний ключ без `tenant_id`; все остальные составные `(tenant_id, …)`. База не мешает доставке + ссылаться на событие outbox другого арендатора (RLS фильтрует чтение, но не ссылку). Предложение: + `UNIQUE (tenant_id, id)` на `staff_outbox` и FK `(tenant_id, outbox_id)`. +- **PILOT-REHOME**: скрипта нет → `[PILOT-REHOME]` красный; контракт — C6. diff --git a/tests/e2e/REPORT.md b/tests/e2e/REPORT.md index d2e8f07..7e3a8dd 100644 --- a/tests/e2e/REPORT.md +++ b/tests/e2e/REPORT.md @@ -31,6 +31,107 @@ SUPERUSER, все токены и пароли случайные (`crypto.rando | §4 | Приёмка `antigravity/fix-reject-device-shifts`, `codex/fix-format-baseline`, `codex/fix-live-database` — таблицы ниже | | — | Синтетическая ставка 123,45 → 123,00 ₽/ч: расчёт округляет строку до рубля (`rounding_unit_minor`), тест не должен зависеть от округления (выяснилось на fix-live-database) | +## Круг 3 (TASK-GROK-3) + +Ветка продолжена поверх `ba59a48` без переписывания истории (без rebase на `b0243d5`, без force-push). + +| Пункт | Что сделано | +| ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| п.1 | `scripts/test/accept-branch.mjs <ветка>…`: worktree на ветку в `../krona-staff-acceptance/` + оверлей текущего стенда (`tests/e2e/**`, `scripts/test/**`), `npm run check` без переменных БД, **каждый** `tests/integration/*.test.ts` отдельно на свежей мигрированной БД PG17 (красный — по строке `Test Files`, ловит ошибки `beforeAll/afterAll`; файл, где всё пропущено, — отдельный вердикт `SKIP`), e2e и разница с основой по ID, попарный `git merge-tree --write-tree` (все ветки между собой и с основой), итог в markdown. Логи — `tests/e2e/evidence/accept/<время>/` (пароли в URL заменены на `***`) | +| п.1 | Готовые роли: если заданы `E2E_MIGRATOR_URL` и `E2E_APP_URL`, `global-setup` и `accept-branch` роли не создают и пароли не меняют (БД — из URL, сброс откатом всех миграций). По умолчанию как раньше. `provision-pg.mjs --roles keep` пересоздаёт только БД: `accept-branch` создаёт роли один раз на прогон | +| п.1 | Предохранитель изолированной БД для `live-postgres-remediation.test.ts` (Codex): в admin-режиме интеграционная БД одноразовая (`krona_staff_audit_acc_it`), `krona_staff_test_guard` со случайным маркером, `DATABASE_TEST_ISOLATED=true` — без этого файл пропускается целиком | +| п.2 | «Форматирование без поведения» (для веток с `format` в имени и `--format-check <ветка>`): версия из merge-base → prettier (конфиг основы, API из `node_modules`) → сравнение с веткой; для лишних строк — сколько из них есть в других переданных ветках | +| п.3 | Прогон по всем открытым `codex/*`, `antigravity/*` — ниже | +| п.4 | Храповик **не тронут**: `origin/codex/bootstrap-platform-foundation` = `b0243d5` (только docs поверх `f5ac179`); `git merge-base --is-ancestor origin/<ветка> origin/codex/bootstrap-platform-foundation` — `NOT merged` для fix-live-database, fix-reject-device-shifts, fix-sync-c0-bootstrap, fix-format-baseline | +| п.5 | `[PILOT-REHOME-SEED]` (зелёный) и `[PILOT-REHOME]` (красный, в `known-defects.json`) — `tests/e2e/60-pilot-rehome.e2e.ts` | +| — | `run-e2e.mjs`: проверка секретов в `evidence/` больше не падает `EISDIR` на подкаталоге `accept/` | + +### п.1: ожидания владельца на SHA из задания + +Команда: `node scripts/test/accept-branch.mjs 1df2019 antigravity/fix-sync-c0-bootstrap codex/fix-format-baseline` +(16:04 NOVT; `1df2019` передан SHA, потому что ветка Antigravity к этому времени была перезаписана +на `6c5bf36`). Полный вывод — [`report-evidence/round3-accept-owner-shas.md`](report-evidence/round3-accept-owner-shas.md). + +| Ожидание владельца | Фактический вывод | +| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| sync-rejection.test.ts на 1df2019 FAIL `column "created_by" … does not exist` | `FAIL \| 1 failed (1) \| 2 skipped (2) \| error: column "created_by" of relation "staff_employees" does not exist` | +| sync-bootstrap.test.ts на 8baad55 FAIL `Called end on pool more than once` при `Tests 2 passed` | `FAIL \| 1 failed (1) \| 2 passed (2) \| Error: Called end on pool more than once` | +| SYNC-C0 зелёный на 8baad55 | e2e «стало зелёным»: `SYNC-C0` | +| AG reject + AG c0 — конфликт в src/domain/sync/service.ts | `1df2019 \| origin/antigravity/fix-sync-c0-bootstrap \| КОНФЛИКТ \| src/domain/sync/service.ts` | +| Codex format + AG c0 — конфликт | `origin/antigravity/fix-sync-c0-bootstrap \| origin/codex/fix-format-baseline \| КОНФЛИКТ \| src/domain/sync/service.ts` | +| Codex format + AG reject — чисто | `1df2019 \| origin/codex/fix-format-baseline \| чисто` | + +Все шесть совпали. На `6c5bf36` (первый прогон по именам веток, +[`round3-accept-owner-branches-first.md`](report-evidence/round3-accept-owner-branches-first.md)) +`sync-rejection.test.ts` уже зелёный (`1 passed (1) | 2 passed (2)`). + +### п.2: форматирование без поведения + +Команда: `node scripts/test/accept-branch.mjs --format-check tmp/prettier-only-f5ac179 --format-check codex/fix-format-baseline` +([`round3-format-proof.md`](report-evidence/round3-format-proof.md)). +`tmp/prettier-only-f5ac179` (`c552d38`) — локальная синтетическая ветка: `prettier --write .` поверх +`f5ac179`, 24 файла; **не запушена**. + +| Ветка | Результат | +| ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `tmp/prettier-only-f5ac179` (c552d38) | изменено файлов: 24 — ТОЛЬКО ФОРМАТИРОВАНИЕ | +| `codex/fix-format-baseline` (513cdff, прежняя голова) | ЕСТЬ ИЗМЕНЕНИЯ СВЕРХ PRETTIER: `src/domain/sync/service.ts` 232 строки, `tests/unit/sync.test.ts` 130 строк; в `antigravity/fix-reject-device-shifts` есть 232/232 и 130/130 этих строк | +| `codex/fix-format-baseline` (a05777c, текущая, 16:09 NOVT) | изменено файлов: 19 — ТОЛЬКО ФОРМАТИРОВАНИЕ | + +### п.3: все открытые ветки + +Команда: `node scripts/test/accept-branch.mjs <все origin/codex/* и origin/antigravity/* кроме основы>` +после `git fetch` в 16:16 NOVT, стенд `6f408bc`. Полный вывод (интеграционные тесты по файлам, 55 пар +merge-tree) — [`report-evidence/round3-accept-all-open.md`](report-evidence/round3-accept-all-open.md). +Основа `b0243d5`: check OK, integration 3/4 (FAIL tenant-isolation), e2e 46 red / 5 green. + +| Ветка | SHA | Влита в основу | check | integration | e2e red/green | Стало зелёным | Стало красным | +| ------------------------------------ | ------- | -------------------------- | ----- | --------------------------------------------------------- | ------------- | ------------------------------- | -------------------------------------------------------------------------- | +| antigravity/fix-reject-device-shifts | b283736 | нет (+1) | OK | 4/5, FAIL tenant-isolation | 44/7 | K13/SYNC-A, K13/SYNC-B | — | +| antigravity/fix-sync-c0-bootstrap | 24cc18d | нет (+3, включает b283736) | OK | 5/6, FAIL tenant-isolation | 43/8 | K13/SYNC-A, K13/SYNC-B, SYNC-C0 | — | +| codex/fix-format-baseline | a05777c | нет (+1, от f5ac179) | OK | 3/4, FAIL tenant-isolation | 46/5 | — | — | +| codex/fix-live-database | 1573860 | нет (+2, на a05777c) | OK | 4/5, FAIL tenant-isolation (live-postgres-remediation OK) | 44/7 | K3/N2, K4/N1 | — | +| antigravity/employee-notifications | 3e20544 | да (предок) | OK | 3/4 | 49/2 | — | HARNESS, PILOT-REHOME-SEED, SYNC-L (старый код: нет таблиц/маршрутов sync) | +| antigravity/offline-sync-backend | 5ee7517 | да (предок) | OK | 3/4 | 46/5 | — | — | +| codex/finance-calendar-dashboard | c08a7e6 | да (предок) | OK | 4/4 | 48/3 | A4, K4/N1 | CTRL, HARNESS, PILOT-REHOME-SEED, SYNC-L (старый код) | +| codex/frontend-library | 331e490 | да (предок) | OK | 3/4 | 46/5 | — | — | +| codex/security-finance-production | f74aa6d | да (предок) | OK | 4/4 | 49/2 | — | HARNESS, PILOT-REHOME-SEED, SYNC-L (старый код) | +| codex/server-web-production | 2f6b367 | да (предок) | OK | 4/4 | 49/2 | K4/N1 | CTRL, HARNESS, PILOT-REHOME-SEED, SYNC-L (старый код) | + +- `git merge-tree`: **конфликтов нет** ни в одной из 55 пар (Antigravity выстроил цепочку reject → c0, + Codex пересобрал format без sync). Шесть веток — предки основы (уже влиты), для них «стало + красным» означает только «код старше основы». +- `tenant-isolation.test.ts` красный на основе и всех ветках от `f5ac179` + (`error: permission denied for table staff_employees`) — это N5, исправление есть в + `grok/e2e-harness` (`ba59a48`), в основу ещё не влито. + +### Сборка «как будет после слияния» (локально, не запушено) + +`tmp/combined-round3` = `b0243d5` + merge `codex/fix-live-database` (1573860) + merge +`antigravity/fix-sync-c0-bootstrap` (24cc18d) — без конфликтов; `tmp/combined-round3-grok` = то же + +merge `grok/e2e-harness`. Вывод — [`round3-combined-merge.md`](report-evidence/round3-combined-merge.md). + +| Сборка | check | integration | e2e red/green | Стало зелёным | +| ------------------------------ | -------------------------- | -------------------------- | ------------- | --------------------------------------------- | +| combined-round3 (48128c8) | OK (199 passed, 6 skipped) | 6/7, FAIL tenant-isolation | 41/10 | K13/SYNC-A, K13/SYNC-B, K3/N2, K4/N1, SYNC-C0 | +| combined-round3-grok (e94415a) | OK (199 passed, 6 skipped) | **7/7** | 41/10 | то же | + +Храповик на `combined-round3-grok`: `[run-e2e] FAIL: K13/SYNC-A, K13/SYNC-B, K3/N2, K4/N1, SYNC-C0 — +дефект исправлен, обновите known-defects.json` — ровно список из TASK-GROK-3 п.4. Удалю их отдельным +коммитом, когда ветки действительно окажутся в основе. + +### п.5: PILOT-REHOME + +- `[PILOT-REHOME-SEED]` — **зелёный**: 27 таблиц с `tenant_id` из `information_schema.columns`, в каждую + 2+ строки заглушки `01J00000000000000000000000` и постороннего случайного арендатора (SQL мигратором, + `app.tenant_id`/`app.user_id` в транзакции); таблица без сида → красный со списком. +- `[PILOT-REHOME]` — **красный** (в `known-defects.json`): `scripts/rehome-tenant.mjs отсутствует +(TASK-CODEX-2 п.2.2): … Засеяно таблиц: 27, ledger SUM(amount_minor)=…`. +- Сценарий проверен временным эталоном скрипта (не коммитился, удалён): с ним зелёный; мутации + «без записи аудита», «без отказа на повтор», «пропущена таблица», «dry-run пишет» — красные + ([`report-evidence/round3-pilot-rehome.txt`](report-evidence/round3-pilot-rehome.txt)). +- Контракт, который проверяет сценарий, — `NOTES-FOR-EXECUTORS.md`, C6. + ## Как запустить ```sh @@ -38,20 +139,28 @@ export E2E_PG_ADMIN_URL=postgres://:@127.0.0.1:55433/postgres # т E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs # храповик known-defects (как в CI) node scripts/test/run-e2e.mjs --no-known-defects # строго: любой красный = exit 1 ./scripts/test/ci-local.sh # локальный эквивалент verify/format/e2e (bash) +node scripts/test/accept-branch.mjs <ветка> [<ветка>…] # приёмка веток (worktree, check, integration, e2e, merge-tree) +# роли уже есть (общий кластер): E2E_MIGRATOR_URL=… E2E_APP_URL=… — роли и пароли не трогаются ``` ## Таблица по ID (основная ветка f5ac179 + этот стенд) Команда: `./scripts/test/ci-local.sh` (внутри `E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs`), -2026-09-26 ~15:28 (UTC+7), PostgreSQL 17.11: +2026-09-26 ~16:25 (UTC+7), PostgreSQL 17.11, стенд круга 3: ```text -== roundtrip OK: rolledBack=11 reapplied=11 - Test Files 5 failed | 1 passed (6) - Tests 45 failed | 9 passed (54) +::: [check] with_db_env npm run check + Test Files 20 passed (20) + Tests 196 passed (196) +::: [format-check] FAIL exit=1 # 23 файла базовой линии основы, ни одного из tests/e2e, scripts/test, .forgejo + Test Files 6 failed | 1 passed (7) + Tests 46 failed | 10 passed (56) [run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты ``` +Круг 3 добавил `[PILOT-REHOME-SEED]` (GREEN) и `[PILOT-REHOME]` (RED, `scripts/rehome-tenant.mjs +отсутствует (TASK-CODEX-2 п.2.2)`); остальные строки таблицы — без изменений со второго круга. + | ID владельца / мой | Цвет | Фактический вывод (первая строка assert) | | ---------------------------- | ----- | ------------------------------------------------------------------------------------------------- | | HARNESS (×5), CTRL (×2) | GREEN | 7/7 passed — стенд и позитивные контроли | @@ -93,6 +202,8 @@ node scripts/test/run-e2e.mjs --no-known-defects # строго: люб | SYNC-C0 (нет ID у владельца) | RED | bootstrap pull `HTTP 500 code 42703 column "status" does not exist` | | SYNC-K (нет ID у владельца) | RED | ack курсора из будущего `HTTP 200` | | SYNC-L | GREEN | отозванное устройство получает 403 (позитивный контроль) | +| PILOT-REHOME-SEED | GREEN | 27 таблиц с `tenant_id` засеяны (заглушка + посторонний арендатор) | +| PILOT-REHOME | RED | `scripts/rehome-tenant.mjs отсутствует (TASK-CODEX-2 п.2.2)` | | PILOT-3 | GREEN | у `app` нет учётных данных мигратора | | N5 (tenant-isolation) | GREEN | в `npm run check` с тестовой БД: `Test Files 20 passed (20)`, `Tests 196 passed (196)` | | N13 (скрипт, не vitest) | — | не воспроизведено: 0 из 30 попыток при 10/25/50 (обход K3 в одноразовой БД), см. ниже | @@ -254,3 +365,7 @@ $ git status --porcelain `codex/fix-live-database`. - S9 проверен удалением SQL-запросом мигратора (публичного API удаления точки нет). - Причина невоспроизводимости N13 — гипотеза по коду. +- Круг 3: `scripts/rehome-tenant.mjs` не существует — `[PILOT-REHOME]` проверен только временным + эталоном; контракт C6 — предположение. `accept-branch` в CI не запускается (разовый инструмент + владельца/приёмщика). Режим `E2E_MIGRATOR_URL/E2E_APP_URL` проверен на том же локальном кластере + (роли созданы заранее `provision-pg`), на чужом кластере — не проверено.