@open-mercato/core 0.6.4-develop.4254.1.7a123d970c → 0.6.4-develop.4270.1.a614eb18e6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/core",
3
- "version": "0.6.4-develop.4254.1.7a123d970c",
3
+ "version": "0.6.4-develop.4270.1.a614eb18e6",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -243,16 +243,16 @@
243
243
  "zod": "^4.4.3"
244
244
  },
245
245
  "peerDependencies": {
246
- "@open-mercato/ai-assistant": "0.6.4-develop.4254.1.7a123d970c",
247
- "@open-mercato/shared": "0.6.4-develop.4254.1.7a123d970c",
248
- "@open-mercato/ui": "0.6.4-develop.4254.1.7a123d970c",
246
+ "@open-mercato/ai-assistant": "0.6.4-develop.4270.1.a614eb18e6",
247
+ "@open-mercato/shared": "0.6.4-develop.4270.1.a614eb18e6",
248
+ "@open-mercato/ui": "0.6.4-develop.4270.1.a614eb18e6",
249
249
  "react": "^19.0.0",
250
250
  "react-dom": "^19.0.0"
251
251
  },
252
252
  "devDependencies": {
253
- "@open-mercato/ai-assistant": "0.6.4-develop.4254.1.7a123d970c",
254
- "@open-mercato/shared": "0.6.4-develop.4254.1.7a123d970c",
255
- "@open-mercato/ui": "0.6.4-develop.4254.1.7a123d970c",
253
+ "@open-mercato/ai-assistant": "0.6.4-develop.4270.1.a614eb18e6",
254
+ "@open-mercato/shared": "0.6.4-develop.4270.1.a614eb18e6",
255
+ "@open-mercato/ui": "0.6.4-develop.4270.1.a614eb18e6",
256
256
  "@testing-library/dom": "^10.4.1",
257
257
  "@testing-library/jest-dom": "^6.9.1",
258
258
  "@testing-library/react": "^16.3.1",
@@ -173,6 +173,12 @@ export async function GET(req: Request): Promise<Response> {
173
173
  }
174
174
  portalConnections.add(connection)
175
175
 
176
+ // Flush an initial comment so the runtime sends the response headers and
177
+ // first body byte immediately, firing the browser EventSource `open`
178
+ // event without waiting for the first heartbeat (30s) or matching event.
179
+ // Comment lines (`:` prefix) are ignored by EventSource message parsing.
180
+ controller.enqueue(encoder.encode(': connected\n\n'))
181
+
176
182
  heartbeatTimer = setInterval(() => {
177
183
  try {
178
184
  controller.enqueue(encoder.encode(':heartbeat\n\n'))
@@ -261,9 +261,6 @@ export async function refreshCoverageSnapshot(
261
261
  if (tenantId !== null && hasTenant) baseQuery = baseQuery.where('b.tenant_id' as any, '=', tenantId)
262
262
  if (!withDeleted && hasDeleted) baseQuery = baseQuery.where('b.deleted_at' as any, 'is', null as any)
263
263
 
264
- const baseRow = await baseQuery.executeTakeFirst() as { count: unknown } | undefined
265
- const baseCount = toCount(baseRow?.count)
266
-
267
264
  let indexQuery = db
268
265
  .selectFrom('entity_indexes as ei' as any)
269
266
  .select(sql`count(*)`.as('count'))
@@ -272,13 +269,10 @@ export async function refreshCoverageSnapshot(
272
269
  if (tenantId !== null) indexQuery = indexQuery.where('ei.tenant_id' as any, '=', tenantId)
273
270
  if (!withDeleted) indexQuery = indexQuery.where('ei.deleted_at' as any, 'is', null as any)
274
271
 
275
- const indexRow = await indexQuery.executeTakeFirst() as { count: unknown } | undefined
276
- const indexCount = toCount(indexRow?.count)
272
+ const vectorCountPromise = (async (): Promise<number | undefined> => {
273
+ const hasVectorTable = await tableHasColumn(db, 'vector_search', 'entity_id')
274
+ if (!hasVectorTable || typeof tenantId !== 'string' || tenantId.length === 0) return undefined
277
275
 
278
- // Count vector entries directly from database
279
- let vectorCount: number | undefined
280
- const hasVectorTable = await tableHasColumn(db, 'vector_search', 'entity_id')
281
- if (hasVectorTable && typeof tenantId === 'string' && tenantId.length > 0) {
282
276
  try {
283
277
  let vectorQuery = db
284
278
  .selectFrom('vector_search' as any)
@@ -289,7 +283,7 @@ export async function refreshCoverageSnapshot(
289
283
  vectorQuery = vectorQuery.where('organization_id' as any, '=', organizationId)
290
284
  }
291
285
  const vectorRow = await vectorQuery.executeTakeFirst() as { count: unknown } | undefined
292
- vectorCount = toCount(vectorRow?.count)
286
+ return toCount(vectorRow?.count)
293
287
  } catch (err) {
294
288
  console.warn('[query_index] Failed to resolve vector count for coverage snapshot', {
295
289
  entityType,
@@ -297,9 +291,18 @@ export async function refreshCoverageSnapshot(
297
291
  organizationId,
298
292
  error: err instanceof Error ? err.message : err,
299
293
  })
300
- vectorCount = undefined
294
+ return undefined
301
295
  }
302
- }
296
+ })()
297
+
298
+ const [baseRow, indexRow, vectorCount] = await Promise.all([
299
+ baseQuery.executeTakeFirst() as Promise<{ count: unknown } | undefined>,
300
+ indexQuery.executeTakeFirst() as Promise<{ count: unknown } | undefined>,
301
+ vectorCountPromise,
302
+ ])
303
+
304
+ const baseCount = toCount(baseRow?.count)
305
+ const indexCount = toCount(indexRow?.count)
303
306
 
304
307
  await writeCoverageCounts(em, { entityType, tenantId, organizationId, withDeleted }, {
305
308
  baseCount,
@@ -1758,17 +1758,25 @@ export class HybridQueryEngine implements QueryEngine {
1758
1758
  withDeleted: boolean
1759
1759
  ): Promise<{ baseCount: number; indexedCount: number } | null> {
1760
1760
  try {
1761
- if (!this.isCoverageOptimizationEnabled()) {
1762
- await refreshCoverageSnapshot(this.em, {
1763
- entityType: entity, tenantId, organizationId, withDeleted,
1764
- })
1765
- }
1766
1761
  const db = this.getDb()
1767
- const row = await readCoverageSnapshot(db as any, {
1762
+ const scope = {
1768
1763
  entityType: entity, tenantId, organizationId, withDeleted,
1769
- })
1770
- if (!row) return null
1771
- return { baseCount: row.baseCount, indexedCount: row.indexedCount }
1764
+ }
1765
+ const row = await readCoverageSnapshot(db as any, scope)
1766
+ if (row && this.isCoverageSnapshotFresh(row)) {
1767
+ return { baseCount: row.baseCount, indexedCount: row.indexedCount }
1768
+ }
1769
+
1770
+ if (this.isCoverageOptimizationEnabled()) {
1771
+ this.scheduleCoverageRefresh(entity, tenantId, organizationId, withDeleted)
1772
+ if (!row) return null
1773
+ return { baseCount: row.baseCount, indexedCount: row.indexedCount }
1774
+ }
1775
+
1776
+ await refreshCoverageSnapshot(this.em, scope)
1777
+ const refreshed = await readCoverageSnapshot(db as any, scope)
1778
+ if (!refreshed) return null
1779
+ return { baseCount: refreshed.baseCount, indexedCount: refreshed.indexedCount }
1772
1780
  } catch (err) {
1773
1781
  if (this.isDebugVerbosity()) {
1774
1782
  this.debug('coverage:snapshot:read-error', {
@@ -1780,6 +1788,21 @@ export class HybridQueryEngine implements QueryEngine {
1780
1788
  }
1781
1789
  }
1782
1790
 
1791
+ private isCoverageSnapshotFresh(
1792
+ row: Awaited<ReturnType<typeof readCoverageSnapshot>>
1793
+ ): boolean {
1794
+ if (this.coverageStatsTtlMs <= 0) return false
1795
+ if (!row) return false
1796
+ const refreshedAt = row.refreshed_at instanceof Date
1797
+ ? row.refreshed_at
1798
+ : row.refreshed_at
1799
+ ? new Date(row.refreshed_at)
1800
+ : null
1801
+ const refreshedAtMs = refreshedAt?.getTime()
1802
+ if (!refreshedAtMs || !Number.isFinite(refreshedAtMs)) return false
1803
+ return Date.now() - refreshedAtMs <= this.coverageStatsTtlMs
1804
+ }
1805
+
1783
1806
  private scheduleAutoReindex(
1784
1807
  entity: string,
1785
1808
  opts: QueryOptions,
@@ -118,6 +118,14 @@
118
118
  "staff.audit.teams.create": "Team erstellen",
119
119
  "staff.audit.teams.delete": "Team löschen",
120
120
  "staff.audit.teams.update": "Team aktualisieren",
121
+ "staff.audit.timesheets.time_entries.create": "Zeiteintrag erstellen",
122
+ "staff.audit.timesheets.time_entries.delete": "Zeiteintrag löschen",
123
+ "staff.audit.timesheets.time_entries.update": "Zeiteintrag aktualisieren",
124
+ "staff.audit.timesheets.time_project_members.assign": "Zeitprojektmitglied zuweisen",
125
+ "staff.audit.timesheets.time_project_members.unassign": "Zeitprojektmitglied entfernen",
126
+ "staff.audit.timesheets.time_projects.create": "Zeitprojekt erstellen",
127
+ "staff.audit.timesheets.time_projects.delete": "Zeitprojekt löschen",
128
+ "staff.audit.timesheets.time_projects.update": "Zeitprojekt aktualisieren",
121
129
  "staff.availability.errors.organizationRequired": "Organisationskontext ist erforderlich.",
122
130
  "staff.availability.errors.unauthorized": "Nicht autorisiert",
123
131
  "staff.availability.errors.updateDateSpecific": "Datumsspezifische Verfügbarkeit konnte nicht gespeichert werden.",
@@ -202,6 +210,7 @@
202
210
  "staff.availabilityRuleSets.tabs.availability": "Verfügbarkeit",
203
211
  "staff.availabilityRuleSets.tabs.details": "Details",
204
212
  "staff.availabilityRuleSets.tabs.label": "Zeitplanbereiche",
213
+ "staff.errors.missingScope": "Mandanten- oder Organisationskontext fehlt.",
205
214
  "staff.errors.unauthorized": "Nicht autorisiert",
206
215
  "staff.leaveRequests.actions.accept": "Genehmigen",
207
216
  "staff.leaveRequests.actions.add": "Neuer Antrag",
@@ -413,6 +422,7 @@
413
422
  "staff.search.badge.team": "Team",
414
423
  "staff.search.badge.teamMember": "Teammitglied",
415
424
  "staff.search.badge.teamRole": "Teamrolle",
425
+ "staff.search.badge.timeProject": "Projekt",
416
426
  "staff.search.service.maxAttendees": "Max. {{count}}",
417
427
  "staff.search.status.active": "Aktiv",
418
428
  "staff.search.status.inactive": "Inaktiv",
@@ -918,13 +928,26 @@
918
928
  "staff.teams.tabs.details": "Details",
919
929
  "staff.teams.tabs.label": "Teamabschnitte",
920
930
  "staff.teams.tabs.members": "Teammitglieder",
931
+ "staff.timesheets.errors.bulkSave": "Zeiteinträge konnten nicht im Stapel gespeichert werden.",
921
932
  "staff.timesheets.errors.entryNotFound": "Zeiteintrag nicht gefunden, gelöscht oder Ihnen nicht zugeordnet.",
933
+ "staff.timesheets.errors.invalidBody": "Ungültiger Anfragetext.",
934
+ "staff.timesheets.errors.invalidProjectId": "Ungültige Projekt-ID.",
935
+ "staff.timesheets.errors.memberRequired": "Die ID des Zeitprojektmitglieds ist erforderlich.",
936
+ "staff.timesheets.errors.missingEntryId": "Eintrags-ID fehlt.",
937
+ "staff.timesheets.errors.myProjects": "Ihre Projekte konnten nicht geladen werden.",
938
+ "staff.timesheets.errors.noActiveSegment": "Für diesen Eintrag wurde kein aktives Timer-Segment gefunden.",
922
939
  "staff.timesheets.errors.noStaffMember": "Ihrem Konto ist kein Mitarbeiter zugeordnet.",
940
+ "staff.timesheets.errors.notAssigned": "Sie sind diesem Projekt nicht zugewiesen.",
923
941
  "staff.timesheets.errors.notOwner": "Sie können nur Ihre eigenen Zeiteinträge verwalten.",
924
942
  "staff.timesheets.errors.projectCodeDuplicate": "Ein Projekt mit diesem Code existiert bereits.",
925
943
  "staff.timesheets.errors.projectNotFound": "Zeitprojekt nicht gefunden oder nicht zugänglich.",
926
944
  "staff.timesheets.errors.projectsKpis": "Failed to load project KPIs.",
945
+ "staff.timesheets.errors.segmentCreate": "Zeiteintragssegment konnte nicht erstellt werden.",
927
946
  "staff.timesheets.errors.staffMemberNotFound": "Mitarbeiter nicht gefunden oder nicht zugänglich.",
947
+ "staff.timesheets.errors.timerAlreadyStarted": "Der Timer ist für diesen Eintrag bereits gestartet.",
948
+ "staff.timesheets.errors.timerStart": "Timer konnte nicht gestartet werden.",
949
+ "staff.timesheets.errors.timerStop": "Timer konnte nicht gestoppt werden.",
950
+ "staff.timesheets.errors.updateMyProject": "Projektsichtbarkeit konnte nicht aktualisiert werden.",
928
951
  "staff.timesheets.my.addRow.createProject": "Create a new project",
929
952
  "staff.timesheets.my.addRow.error": "Das Projekt konnte nicht hinzugefügt werden. Bitte erneut versuchen.",
930
953
  "staff.timesheets.my.addRow.noProjects": "No projects assigned",
@@ -118,6 +118,14 @@
118
118
  "staff.audit.teams.create": "Create team",
119
119
  "staff.audit.teams.delete": "Delete team",
120
120
  "staff.audit.teams.update": "Update team",
121
+ "staff.audit.timesheets.time_entries.create": "Create time entry",
122
+ "staff.audit.timesheets.time_entries.delete": "Delete time entry",
123
+ "staff.audit.timesheets.time_entries.update": "Update time entry",
124
+ "staff.audit.timesheets.time_project_members.assign": "Assign time project member",
125
+ "staff.audit.timesheets.time_project_members.unassign": "Unassign time project member",
126
+ "staff.audit.timesheets.time_projects.create": "Create time project",
127
+ "staff.audit.timesheets.time_projects.delete": "Delete time project",
128
+ "staff.audit.timesheets.time_projects.update": "Update time project",
121
129
  "staff.availability.errors.organizationRequired": "Organization context is required.",
122
130
  "staff.availability.errors.unauthorized": "Unauthorized",
123
131
  "staff.availability.errors.updateDateSpecific": "Failed to save date-specific availability.",
@@ -202,6 +210,7 @@
202
210
  "staff.availabilityRuleSets.tabs.availability": "Availability",
203
211
  "staff.availabilityRuleSets.tabs.details": "Details",
204
212
  "staff.availabilityRuleSets.tabs.label": "Schedule sections",
213
+ "staff.errors.missingScope": "Missing tenant or organization scope.",
205
214
  "staff.errors.unauthorized": "Unauthorized",
206
215
  "staff.leaveRequests.actions.accept": "Approve",
207
216
  "staff.leaveRequests.actions.add": "New request",
@@ -413,6 +422,7 @@
413
422
  "staff.search.badge.team": "Team",
414
423
  "staff.search.badge.teamMember": "Team member",
415
424
  "staff.search.badge.teamRole": "Team role",
425
+ "staff.search.badge.timeProject": "Project",
416
426
  "staff.search.service.maxAttendees": "Max {{count}}",
417
427
  "staff.search.status.active": "Active",
418
428
  "staff.search.status.inactive": "Inactive",
@@ -918,13 +928,26 @@
918
928
  "staff.teams.tabs.details": "Details",
919
929
  "staff.teams.tabs.label": "Team sections",
920
930
  "staff.teams.tabs.members": "Team members",
931
+ "staff.timesheets.errors.bulkSave": "Failed to bulk save time entries.",
921
932
  "staff.timesheets.errors.entryNotFound": "Time entry not found, deleted, or not owned by you.",
933
+ "staff.timesheets.errors.invalidBody": "Invalid request body.",
934
+ "staff.timesheets.errors.invalidProjectId": "Invalid project id.",
935
+ "staff.timesheets.errors.memberRequired": "Time project member id is required.",
936
+ "staff.timesheets.errors.missingEntryId": "Missing entry ID.",
937
+ "staff.timesheets.errors.myProjects": "Failed to load your projects.",
938
+ "staff.timesheets.errors.noActiveSegment": "No active timer segment found for this entry.",
922
939
  "staff.timesheets.errors.noStaffMember": "No staff member linked to your account.",
940
+ "staff.timesheets.errors.notAssigned": "You are not assigned to this project.",
923
941
  "staff.timesheets.errors.notOwner": "You can only manage your own time entries.",
924
942
  "staff.timesheets.errors.projectCodeDuplicate": "A project with this code already exists.",
925
943
  "staff.timesheets.errors.projectNotFound": "Time project not found or not accessible.",
926
944
  "staff.timesheets.errors.projectsKpis": "Failed to load project KPIs.",
945
+ "staff.timesheets.errors.segmentCreate": "Failed to create time entry segment.",
927
946
  "staff.timesheets.errors.staffMemberNotFound": "Staff member not found or not accessible.",
947
+ "staff.timesheets.errors.timerAlreadyStarted": "Timer is already started for this entry.",
948
+ "staff.timesheets.errors.timerStart": "Failed to start timer.",
949
+ "staff.timesheets.errors.timerStop": "Failed to stop timer.",
950
+ "staff.timesheets.errors.updateMyProject": "Failed to update project visibility.",
928
951
  "staff.timesheets.my.addRow.createProject": "Create a new project",
929
952
  "staff.timesheets.my.addRow.error": "Could not add the project. Please try again.",
930
953
  "staff.timesheets.my.addRow.noProjects": "No projects assigned",
@@ -118,6 +118,14 @@
118
118
  "staff.audit.teams.create": "Crear equipo",
119
119
  "staff.audit.teams.delete": "Eliminar equipo",
120
120
  "staff.audit.teams.update": "Actualizar equipo",
121
+ "staff.audit.timesheets.time_entries.create": "Crear registro de tiempo",
122
+ "staff.audit.timesheets.time_entries.delete": "Eliminar registro de tiempo",
123
+ "staff.audit.timesheets.time_entries.update": "Actualizar registro de tiempo",
124
+ "staff.audit.timesheets.time_project_members.assign": "Asignar miembro del proyecto de tiempo",
125
+ "staff.audit.timesheets.time_project_members.unassign": "Desasignar miembro del proyecto de tiempo",
126
+ "staff.audit.timesheets.time_projects.create": "Crear proyecto de tiempo",
127
+ "staff.audit.timesheets.time_projects.delete": "Eliminar proyecto de tiempo",
128
+ "staff.audit.timesheets.time_projects.update": "Actualizar proyecto de tiempo",
121
129
  "staff.availability.errors.organizationRequired": "Se requiere el contexto de la organización.",
122
130
  "staff.availability.errors.unauthorized": "No autorizado",
123
131
  "staff.availability.errors.updateDateSpecific": "No se pudo guardar la disponibilidad por fecha.",
@@ -202,6 +210,7 @@
202
210
  "staff.availabilityRuleSets.tabs.availability": "Disponibilidad",
203
211
  "staff.availabilityRuleSets.tabs.details": "Detalles",
204
212
  "staff.availabilityRuleSets.tabs.label": "Secciones del horario",
213
+ "staff.errors.missingScope": "Falta el contexto de inquilino u organización.",
205
214
  "staff.errors.unauthorized": "No autorizado",
206
215
  "staff.leaveRequests.actions.accept": "Aprobar",
207
216
  "staff.leaveRequests.actions.add": "Nueva solicitud",
@@ -413,6 +422,7 @@
413
422
  "staff.search.badge.team": "Equipo",
414
423
  "staff.search.badge.teamMember": "Miembro del equipo",
415
424
  "staff.search.badge.teamRole": "Rol del equipo",
425
+ "staff.search.badge.timeProject": "Proyecto",
416
426
  "staff.search.service.maxAttendees": "Máx. {{count}}",
417
427
  "staff.search.status.active": "Activo",
418
428
  "staff.search.status.inactive": "Inactivo",
@@ -918,13 +928,26 @@
918
928
  "staff.teams.tabs.details": "Detalles",
919
929
  "staff.teams.tabs.label": "Secciones del equipo",
920
930
  "staff.teams.tabs.members": "Miembros del equipo",
931
+ "staff.timesheets.errors.bulkSave": "No se pudieron guardar en lote los registros de tiempo.",
921
932
  "staff.timesheets.errors.entryNotFound": "Registro de tiempo no encontrado, eliminado o no asignado a ti.",
933
+ "staff.timesheets.errors.invalidBody": "Cuerpo de la solicitud no válido.",
934
+ "staff.timesheets.errors.invalidProjectId": "Identificador de proyecto no válido.",
935
+ "staff.timesheets.errors.memberRequired": "El identificador del miembro del proyecto de tiempo es obligatorio.",
936
+ "staff.timesheets.errors.missingEntryId": "Falta el identificador del registro.",
937
+ "staff.timesheets.errors.myProjects": "No se pudieron cargar tus proyectos.",
938
+ "staff.timesheets.errors.noActiveSegment": "No se encontró ningún segmento de temporizador activo para este registro.",
922
939
  "staff.timesheets.errors.noStaffMember": "Ningún miembro del personal vinculado a tu cuenta.",
940
+ "staff.timesheets.errors.notAssigned": "No estás asignado a este proyecto.",
923
941
  "staff.timesheets.errors.notOwner": "Solo puedes gestionar tus propios registros de tiempo.",
924
942
  "staff.timesheets.errors.projectCodeDuplicate": "Ya existe un proyecto con este código.",
925
943
  "staff.timesheets.errors.projectNotFound": "Proyecto de tiempo no encontrado o no accesible.",
926
944
  "staff.timesheets.errors.projectsKpis": "Failed to load project KPIs.",
945
+ "staff.timesheets.errors.segmentCreate": "No se pudo crear el segmento del registro de tiempo.",
927
946
  "staff.timesheets.errors.staffMemberNotFound": "Miembro del personal no encontrado o no accesible.",
947
+ "staff.timesheets.errors.timerAlreadyStarted": "El temporizador ya está iniciado para este registro.",
948
+ "staff.timesheets.errors.timerStart": "No se pudo iniciar el temporizador.",
949
+ "staff.timesheets.errors.timerStop": "No se pudo detener el temporizador.",
950
+ "staff.timesheets.errors.updateMyProject": "No se pudo actualizar la visibilidad del proyecto.",
928
951
  "staff.timesheets.my.addRow.createProject": "Create a new project",
929
952
  "staff.timesheets.my.addRow.error": "No se pudo añadir el proyecto. Inténtalo de nuevo.",
930
953
  "staff.timesheets.my.addRow.noProjects": "No projects assigned",
@@ -118,6 +118,14 @@
118
118
  "staff.audit.teams.create": "Utwórz zespół",
119
119
  "staff.audit.teams.delete": "Usuń zespół",
120
120
  "staff.audit.teams.update": "Zaktualizuj zespół",
121
+ "staff.audit.timesheets.time_entries.create": "Utwórz wpis czasu",
122
+ "staff.audit.timesheets.time_entries.delete": "Usuń wpis czasu",
123
+ "staff.audit.timesheets.time_entries.update": "Zaktualizuj wpis czasu",
124
+ "staff.audit.timesheets.time_project_members.assign": "Przypisz członka projektu czasu",
125
+ "staff.audit.timesheets.time_project_members.unassign": "Usuń przypisanie członka projektu czasu",
126
+ "staff.audit.timesheets.time_projects.create": "Utwórz projekt czasu",
127
+ "staff.audit.timesheets.time_projects.delete": "Usuń projekt czasu",
128
+ "staff.audit.timesheets.time_projects.update": "Zaktualizuj projekt czasu",
121
129
  "staff.availability.errors.organizationRequired": "Wymagany jest kontekst organizacji.",
122
130
  "staff.availability.errors.unauthorized": "Brak autoryzacji",
123
131
  "staff.availability.errors.updateDateSpecific": "Nie udało się zapisać dostępności dla dat.",
@@ -202,6 +210,7 @@
202
210
  "staff.availabilityRuleSets.tabs.availability": "Dostępność",
203
211
  "staff.availabilityRuleSets.tabs.details": "Szczegóły",
204
212
  "staff.availabilityRuleSets.tabs.label": "Sekcje harmonogramu",
213
+ "staff.errors.missingScope": "Brak kontekstu najemcy lub organizacji.",
205
214
  "staff.errors.unauthorized": "Brak autoryzacji",
206
215
  "staff.leaveRequests.actions.accept": "Zatwierdź",
207
216
  "staff.leaveRequests.actions.add": "Nowy wniosek",
@@ -413,6 +422,7 @@
413
422
  "staff.search.badge.team": "Zespół",
414
423
  "staff.search.badge.teamMember": "Członek zespołu",
415
424
  "staff.search.badge.teamRole": "Rola zespołu",
425
+ "staff.search.badge.timeProject": "Projekt",
416
426
  "staff.search.service.maxAttendees": "Maks. {{count}}",
417
427
  "staff.search.status.active": "Aktywny",
418
428
  "staff.search.status.inactive": "Nieaktywny",
@@ -918,13 +928,26 @@
918
928
  "staff.teams.tabs.details": "Szczegóły",
919
929
  "staff.teams.tabs.label": "Sekcje zespołu",
920
930
  "staff.teams.tabs.members": "Członkowie zespołu",
931
+ "staff.timesheets.errors.bulkSave": "Nie udało się zbiorczo zapisać wpisów czasu.",
921
932
  "staff.timesheets.errors.entryNotFound": "Wpis czasu nie istnieje, został usunięty lub nie należy do Ciebie.",
933
+ "staff.timesheets.errors.invalidBody": "Nieprawidłowe ciało żądania.",
934
+ "staff.timesheets.errors.invalidProjectId": "Nieprawidłowy identyfikator projektu.",
935
+ "staff.timesheets.errors.memberRequired": "Identyfikator członka projektu czasu jest wymagany.",
936
+ "staff.timesheets.errors.missingEntryId": "Brak identyfikatora wpisu.",
937
+ "staff.timesheets.errors.myProjects": "Nie udało się załadować Twoich projektów.",
938
+ "staff.timesheets.errors.noActiveSegment": "Nie znaleziono aktywnego segmentu czasomierza dla tego wpisu.",
922
939
  "staff.timesheets.errors.noStaffMember": "Brak pracownika powiązanego z Twoim kontem.",
940
+ "staff.timesheets.errors.notAssigned": "Nie jesteś przypisany do tego projektu.",
923
941
  "staff.timesheets.errors.notOwner": "Możesz zarządzać tylko własnymi wpisami czasu.",
924
942
  "staff.timesheets.errors.projectCodeDuplicate": "Projekt o tym kodzie już istnieje.",
925
943
  "staff.timesheets.errors.projectNotFound": "Projekt czasowy nie został znaleziony lub jest niedostępny.",
926
944
  "staff.timesheets.errors.projectsKpis": "Failed to load project KPIs.",
945
+ "staff.timesheets.errors.segmentCreate": "Nie udało się utworzyć segmentu wpisu czasu.",
927
946
  "staff.timesheets.errors.staffMemberNotFound": "Pracownik nie został znaleziony lub jest niedostępny.",
947
+ "staff.timesheets.errors.timerAlreadyStarted": "Czasomierz jest już uruchomiony dla tego wpisu.",
948
+ "staff.timesheets.errors.timerStart": "Nie udało się uruchomić czasomierza.",
949
+ "staff.timesheets.errors.timerStop": "Nie udało się zatrzymać czasomierza.",
950
+ "staff.timesheets.errors.updateMyProject": "Nie udało się zaktualizować widoczności projektu.",
928
951
  "staff.timesheets.my.addRow.createProject": "Create a new project",
929
952
  "staff.timesheets.my.addRow.error": "Nie udało się dodać projektu. Spróbuj ponownie.",
930
953
  "staff.timesheets.my.addRow.noProjects": "No projects assigned",