@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/dist/modules/customer_accounts/api/portal/events/stream.js +1 -0
- package/dist/modules/customer_accounts/api/portal/events/stream.js.map +2 -2
- package/dist/modules/query_index/lib/coverage.js +13 -10
- package/dist/modules/query_index/lib/coverage.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +23 -12
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/customer_accounts/api/portal/events/stream.ts +6 -0
- package/src/modules/query_index/lib/coverage.ts +15 -12
- package/src/modules/query_index/lib/engine.ts +32 -9
- package/src/modules/staff/i18n/de.json +23 -0
- package/src/modules/staff/i18n/en.json +23 -0
- package/src/modules/staff/i18n/es.json +23 -0
- package/src/modules/staff/i18n/pl.json +23 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/core",
|
|
3
|
-
"version": "0.6.4-develop.
|
|
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.
|
|
247
|
-
"@open-mercato/shared": "0.6.4-develop.
|
|
248
|
-
"@open-mercato/ui": "0.6.4-develop.
|
|
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.
|
|
254
|
-
"@open-mercato/shared": "0.6.4-develop.
|
|
255
|
-
"@open-mercato/ui": "0.6.4-develop.
|
|
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
|
|
276
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1762
|
+
const scope = {
|
|
1768
1763
|
entityType: entity, tenantId, organizationId, withDeleted,
|
|
1769
|
-
}
|
|
1770
|
-
|
|
1771
|
-
|
|
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",
|