@nuxt-customer-portal/timesheets 0.3.0
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/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/app/assets/timesheets.css +368 -0
- package/app/components/TimesheetsActivityForm.vue +61 -0
- package/app/components/TimesheetsAdminActivities.vue +323 -0
- package/app/components/TimesheetsAdminApprovals.vue +449 -0
- package/app/components/TimesheetsAdminEmptyState.vue +28 -0
- package/app/components/TimesheetsAdminListToolbar.vue +19 -0
- package/app/components/TimesheetsAdminPaginatedList.vue +95 -0
- package/app/components/TimesheetsAdminProjects.vue +234 -0
- package/app/components/TimesheetsAdminRates.vue +83 -0
- package/app/components/TimesheetsAdminReports.vue +123 -0
- package/app/components/TimesheetsAdminSectionPage.vue +135 -0
- package/app/components/TimesheetsAdminSettings.vue +15 -0
- package/app/components/TimesheetsAdministrationOrganizationPanel.vue +26 -0
- package/app/components/TimesheetsClientSettingsPanel.vue +52 -0
- package/app/components/TimesheetsClientTimesheetBrowser.vue +439 -0
- package/app/components/TimesheetsDashboardCard.vue +260 -0
- package/app/components/TimesheetsDashboardClientApprovals.vue +1 -0
- package/app/components/TimesheetsDashboardInternalApprovals.vue +1 -0
- package/app/components/TimesheetsDashboardMyTimesheets.vue +1 -0
- package/app/components/TimesheetsDashboardMyWeek.vue +1 -0
- package/app/components/TimesheetsDashboardSupplierTimesheets.vue +47 -0
- package/app/components/TimesheetsOrganizationFeaturesCard.vue +66 -0
- package/app/components/TimesheetsPageShell.vue +48 -0
- package/app/components/TimesheetsProjectDetail.vue +338 -0
- package/app/components/TimesheetsProjectForm.vue +215 -0
- package/app/components/TimesheetsSetupChecklist.vue +48 -0
- package/app/components/TimesheetsSubmissionMessages.vue +30 -0
- package/app/components/TimesheetsSubmissionTimeline.vue +89 -0
- package/app/components/TimesheetsWorkspaceSettingsForm.vue +80 -0
- package/app/composables/useTimesheetMenu.ts +69 -0
- package/app/composables/useTimesheetMutationError.ts +35 -0
- package/app/composables/useTimesheets.ts +248 -0
- package/app/composables/useTimesheetsAdminList.ts +165 -0
- package/app/composables/useTimesheetsDashboard.ts +8 -0
- package/app/pages/admin/timesheets/activities.vue +3 -0
- package/app/pages/admin/timesheets/approvals.vue +3 -0
- package/app/pages/admin/timesheets/index.vue +7 -0
- package/app/pages/admin/timesheets/internal-approvals.vue +131 -0
- package/app/pages/admin/timesheets/projects/[id].vue +57 -0
- package/app/pages/admin/timesheets/projects.vue +8 -0
- package/app/pages/admin/timesheets/rates.vue +3 -0
- package/app/pages/admin/timesheets/reports.vue +3 -0
- package/app/pages/admin/timesheets/settings.vue +3 -0
- package/app/pages/timesheets/approvals/reviewers.vue +96 -0
- package/app/pages/timesheets/approvals.vue +11 -0
- package/app/pages/timesheets/client-approvals.vue +108 -0
- package/app/pages/timesheets/client.vue +17 -0
- package/app/pages/timesheets/index.vue +1458 -0
- package/app/pages/timesheets/internal-approvals.vue +100 -0
- package/app/pages/timesheets/suppliers.vue +23 -0
- package/app/plugins/timesheets-feature.ts +122 -0
- package/i18n/locales/en.json +455 -0
- package/i18n/locales/nl.json +455 -0
- package/migrations/0000_baseline.sql +409 -0
- package/migrations/0001_remove_unused_legacy_invoice_schema.sql +31 -0
- package/migrations/0002_submission_batches.sql +47 -0
- package/migrations/0003_sync_provider_clients.sql +26 -0
- package/migrations/0004_client_reply.sql +1 -0
- package/migrations/0005_timer_rounding.sql +1 -0
- package/migrations/meta/0000_snapshot.json +3178 -0
- package/migrations/meta/_journal.json +13 -0
- package/nuxt.config.ts +20 -0
- package/package.json +61 -0
- package/portal.manifest.mjs +10 -0
- package/server/api/timesheets/admin/activities/[id]/deletion.get.ts +18 -0
- package/server/api/timesheets/admin/activities/[id].delete.ts +20 -0
- package/server/api/timesheets/admin/activities/[id].patch.ts +19 -0
- package/server/api/timesheets/admin/activities/index.get.ts +19 -0
- package/server/api/timesheets/admin/activities/index.post.ts +19 -0
- package/server/api/timesheets/admin/approvals/[id].post.ts +19 -0
- package/server/api/timesheets/admin/bootstrap.get.ts +73 -0
- package/server/api/timesheets/admin/client-settings/[clientId]/index.get.ts +25 -0
- package/server/api/timesheets/admin/client-settings/[clientId]/index.put.ts +28 -0
- package/server/api/timesheets/admin/clients/[id]/deletion.get.ts +18 -0
- package/server/api/timesheets/admin/clients/[id].delete.ts +20 -0
- package/server/api/timesheets/admin/clients/[id].patch.ts +14 -0
- package/server/api/timesheets/admin/clients/index.get.ts +18 -0
- package/server/api/timesheets/admin/clients/index.post.ts +25 -0
- package/server/api/timesheets/admin/internal-approvals/[userId].put.ts +11 -0
- package/server/api/timesheets/admin/internal-approvals/index.get.ts +8 -0
- package/server/api/timesheets/admin/internal-approvals/index.patch.ts +11 -0
- package/server/api/timesheets/admin/organization-capabilities/[organizationId].get.ts +19 -0
- package/server/api/timesheets/admin/organization-capabilities/[organizationId].patch.ts +23 -0
- package/server/api/timesheets/admin/projects/[id]/deletion.get.ts +18 -0
- package/server/api/timesheets/admin/projects/[id].delete.ts +20 -0
- package/server/api/timesheets/admin/projects/[id].get.ts +22 -0
- package/server/api/timesheets/admin/projects/[id].patch.ts +19 -0
- package/server/api/timesheets/admin/projects/index.get.ts +18 -0
- package/server/api/timesheets/admin/projects/index.post.ts +19 -0
- package/server/api/timesheets/admin/report.get.ts +26 -0
- package/server/api/timesheets/admin/settings.patch.ts +19 -0
- package/server/api/timesheets/admin/tariffs/index.put.ts +20 -0
- package/server/api/timesheets/admin/team/[userId].put.ts +24 -0
- package/server/api/timesheets/bootstrap.get.ts +24 -0
- package/server/api/timesheets/capabilities.get.ts +58 -0
- package/server/api/timesheets/client/[workspaceClientId]/index.get.ts +12 -0
- package/server/api/timesheets/client/[workspaceClientId]/reviewers.get.ts +10 -0
- package/server/api/timesheets/client/[workspaceClientId]/reviewers.put.ts +18 -0
- package/server/api/timesheets/client/[workspaceClientId]/reviews/[submissionId].post.ts +18 -0
- package/server/api/timesheets/client/approval-members.get.ts +11 -0
- package/server/api/timesheets/client/approval-suppliers.get.ts +8 -0
- package/server/api/timesheets/client/approvals.get.ts +14 -0
- package/server/api/timesheets/client/reviewer-suppliers.get.ts +10 -0
- package/server/api/timesheets/client/supplier-options.get.ts +14 -0
- package/server/api/timesheets/client/supplier-timesheets.get.ts +17 -0
- package/server/api/timesheets/client/workspaces.get.ts +11 -0
- package/server/api/timesheets/client-approvals.get.ts +18 -0
- package/server/api/timesheets/dashboard.get.ts +191 -0
- package/server/api/timesheets/entries/[id].delete.ts +18 -0
- package/server/api/timesheets/entries/[id].patch.ts +23 -0
- package/server/api/timesheets/entries/index.post.ts +22 -0
- package/server/api/timesheets/internal-approvals/[id].post.ts +9 -0
- package/server/api/timesheets/internal-approvals/index.get.ts +37 -0
- package/server/api/timesheets/internal-approvals/list.get.ts +12 -0
- package/server/api/timesheets/setup-status.get.ts +21 -0
- package/server/api/timesheets/submissions/[id]/client-reply.post.ts +20 -0
- package/server/api/timesheets/submissions/[id]/request-client-approval.post.ts +21 -0
- package/server/api/timesheets/submissions/[id]/resubmit.post.ts +10 -0
- package/server/api/timesheets/timer/index.delete.ts +18 -0
- package/server/api/timesheets/timer/index.post.ts +23 -0
- package/server/api/timesheets/weeks/[id]/submissions.post.ts +19 -0
- package/server/db/schema/timesheets.ts +383 -0
- package/server/plugins/client-sync.ts +30 -0
- package/server/plugins/openapi-contracts.ts +57 -0
- package/server/utils/timesheet-admin-listing.ts +281 -0
- package/server/utils/timesheet-email.ts +221 -0
- package/server/utils/timesheet-repository.ts +3096 -0
- package/server/utils/timesheet-validation.ts +231 -0
- package/shared/client-approval-dashboard.ts +17 -0
- package/shared/emails.ts +403 -0
- package/shared/feature.ts +184 -0
- package/shared/period-lock.ts +8 -0
- package/shared/submission-reply.ts +3 -0
- package/shared/timer-rounding.ts +2 -0
- package/shared/timesheet-dates.ts +23 -0
- package/shared/timesheet-errors.ts +13 -0
- package/shared/types/timesheet.ts +424 -0
- package/tokens.css +25 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
{
|
|
2
|
+
"features": {
|
|
3
|
+
"timesheets": {
|
|
4
|
+
"title": "Timesheets",
|
|
5
|
+
"roles": {
|
|
6
|
+
"owner": "Owner",
|
|
7
|
+
"admin": "Admin",
|
|
8
|
+
"member": "Member"
|
|
9
|
+
},
|
|
10
|
+
"subtitle": "Record your work while the details are still fresh.",
|
|
11
|
+
"loading": "Loading timesheet…",
|
|
12
|
+
"previousWeek": "Previous week",
|
|
13
|
+
"nextWeek": "Next week",
|
|
14
|
+
"projectActivity": "Project / activity",
|
|
15
|
+
"total": "Total",
|
|
16
|
+
"weekNumber": "Week {number}",
|
|
17
|
+
"weekTotal": "Week total",
|
|
18
|
+
"submissions": {
|
|
19
|
+
"events": {
|
|
20
|
+
"CLIENT_SUBMITTED": "Timesheet submitted for approval",
|
|
21
|
+
"SUBMITTED": "Submitted",
|
|
22
|
+
"REJECTED": "Rejected",
|
|
23
|
+
"APPROVED": "Approved",
|
|
24
|
+
"REOPENED": "Reopened",
|
|
25
|
+
"DISPUTED": "Disputed",
|
|
26
|
+
"AUTO_APPROVED": "Auto approved"
|
|
27
|
+
},
|
|
28
|
+
"remark": "Remark (optional)",
|
|
29
|
+
"title": "Submit time for approval",
|
|
30
|
+
"description": "Choose the last date to include. Submitted entries are locked, while later entries remain editable.",
|
|
31
|
+
"cutoff": "Submit through",
|
|
32
|
+
"summary": "{range} · {entries} · {hours}",
|
|
33
|
+
"entryCount": "{count} entry | {count} entries",
|
|
34
|
+
"fullStatus": "Week: {period} · {status}",
|
|
35
|
+
"partialStatus": "Partial week: {period} · {status}",
|
|
36
|
+
"remainingWeekUnsubmitted": "Other hours in this week have not been submitted yet",
|
|
37
|
+
"submitterMessage": "Message from submitter",
|
|
38
|
+
"reply": "Reply to reviewer (optional)",
|
|
39
|
+
"reviewerMessage": "Message from reviewer",
|
|
40
|
+
"confirm": "Submit for approval",
|
|
41
|
+
"resubmit": "Resubmit corrected entries",
|
|
42
|
+
"none": "Unsubmitted"
|
|
43
|
+
},
|
|
44
|
+
"addEntry": "Add time",
|
|
45
|
+
"mobile": {
|
|
46
|
+
"dayTotal": "Day total",
|
|
47
|
+
"entryCount": "{count} entry | {count} entries",
|
|
48
|
+
"empty": "No time recorded yet",
|
|
49
|
+
"emptyDescription": "Add time for this day to complete your week."
|
|
50
|
+
},
|
|
51
|
+
"editEntry": "Edit time",
|
|
52
|
+
"cellEntries": {
|
|
53
|
+
"title": "Time entries",
|
|
54
|
+
"noNote": "No note",
|
|
55
|
+
"addAnother": "Add another entry"
|
|
56
|
+
},
|
|
57
|
+
"delete": "Delete",
|
|
58
|
+
"cancel": "Cancel",
|
|
59
|
+
"save": "Save",
|
|
60
|
+
"clientAccess": {
|
|
61
|
+
"disabled": "No client access",
|
|
62
|
+
"view": "Client can view",
|
|
63
|
+
"review": "Client can review"
|
|
64
|
+
},
|
|
65
|
+
"timesheetAccess": "Timesheet access",
|
|
66
|
+
"internalApprovals": {
|
|
67
|
+
"memberFilter": "Team member",
|
|
68
|
+
"allMembers": "All team members",
|
|
69
|
+
"title": "Internal approvals",
|
|
70
|
+
"subtitle": "Review timesheets for members assigned to you.",
|
|
71
|
+
"manageTitle": "Internal approval settings",
|
|
72
|
+
"manageSubtitle": "Choose who requires approval and assign the members who may review their timesheets.",
|
|
73
|
+
"enabled": "Internal approvals",
|
|
74
|
+
"enabledHelp": "When disabled, every submitted week is approved automatically.",
|
|
75
|
+
"required": "Approval required",
|
|
76
|
+
"approvers": "Approvers",
|
|
77
|
+
"approversHelp": "Any assigned approver may complete the review.",
|
|
78
|
+
"search": "Search members",
|
|
79
|
+
"emptySearch": "No members match your search."
|
|
80
|
+
},
|
|
81
|
+
"organizationFeatures": {
|
|
82
|
+
"title": "Features",
|
|
83
|
+
"workspace": "Timesheets workspace",
|
|
84
|
+
"workspaceDescription": "Allow this organization to register and administer time.",
|
|
85
|
+
"clientRelationships": "Client relationships",
|
|
86
|
+
"noClientRelationships": "This organization is not a Timesheets client of another workspace.",
|
|
87
|
+
"saved": "Organization features updated"
|
|
88
|
+
},
|
|
89
|
+
"clientPortal": {
|
|
90
|
+
"title": "Client timesheets",
|
|
91
|
+
"subtitle": "Review approved time submitted for your projects.",
|
|
92
|
+
"supplier": "Supplier",
|
|
93
|
+
"noAccess": "No supplier has enabled client timesheet access.",
|
|
94
|
+
"reviewers": "Reviewers",
|
|
95
|
+
"reviewerHelp": "Select who receives approval emails and reviews time. At least one reviewer must remain assigned.",
|
|
96
|
+
"weekPeriod": "Week {week} · {period}",
|
|
97
|
+
"history": "History",
|
|
98
|
+
"historyActions": {
|
|
99
|
+
"submitted": "{actor} submitted the timesheet",
|
|
100
|
+
"approvedInternal": "{actor} approved the timesheet internally",
|
|
101
|
+
"reopened": "{actor} reopened the timesheet",
|
|
102
|
+
"approvedClient": "{actor} approved the time for the client",
|
|
103
|
+
"disputedClient": "{actor} disputed the time for the client"
|
|
104
|
+
},
|
|
105
|
+
"pending": "Awaiting client review",
|
|
106
|
+
"pendingDescription": "The supplier has approved this time internally. It is now waiting for review by an assigned client reviewer.",
|
|
107
|
+
"approved": "Approved",
|
|
108
|
+
"disputed": "Disputed",
|
|
109
|
+
"approve": "Approve",
|
|
110
|
+
"dispute": "Dispute",
|
|
111
|
+
"comment": "Reason for dispute",
|
|
112
|
+
"saveReviewers": "Reviewer access is updated immediately",
|
|
113
|
+
"auto_approved": "Auto approved"
|
|
114
|
+
},
|
|
115
|
+
"approvals": {
|
|
116
|
+
"pending": "Awaiting review",
|
|
117
|
+
"title": "Timesheets to review",
|
|
118
|
+
"subtitle": "Review supplier time that is ready for your decision.",
|
|
119
|
+
"reviewersTitle": "Approval reviewers",
|
|
120
|
+
"reviewersSubtitle": "Choose which organization members may review client timesheets.",
|
|
121
|
+
"allSuppliers": "All suppliers",
|
|
122
|
+
"allStatuses": "All statuses",
|
|
123
|
+
"statusFilter": "Status",
|
|
124
|
+
"supplierFilter": "Supplier",
|
|
125
|
+
"sortNewest": "Week",
|
|
126
|
+
"sortSupplier": "Supplier",
|
|
127
|
+
"sortPerson": "Person",
|
|
128
|
+
"sortStatus": "Status",
|
|
129
|
+
"sortHours": "Total hours",
|
|
130
|
+
"reviewTimesheet": "Review timesheet",
|
|
131
|
+
"viewDetails": "View details",
|
|
132
|
+
"back": "Back to approvals",
|
|
133
|
+
"totalHours": "{hours} hours",
|
|
134
|
+
"emptyFiltered": "No matching timesheets",
|
|
135
|
+
"emptyFilteredDescription": "Adjust the search or filters to see other approvals.",
|
|
136
|
+
"noReviewers": "No reviewers assigned",
|
|
137
|
+
"noReviewersDescription": "Assign at least one reviewer so this supplier's future approvals reach the right people.",
|
|
138
|
+
"assignReviewers": "Assign reviewers",
|
|
139
|
+
"disputeTitle": "Dispute this timesheet",
|
|
140
|
+
"disputeDescription": "Explain what the supplier needs to correct before resubmitting.",
|
|
141
|
+
"approvedMessage": "Timesheet approved",
|
|
142
|
+
"disputedMessage": "Timesheet disputed",
|
|
143
|
+
"conflictTitle": "This review has changed",
|
|
144
|
+
"conflictDescription": "The latest version has been loaded. Check it before trying again.",
|
|
145
|
+
"reviewerCount": "{count} reviewer | {count} reviewers",
|
|
146
|
+
"chooseReviewers": "Who may review timesheets?",
|
|
147
|
+
"approvalUnavailable": "Timesheet approval is not enabled for your organization",
|
|
148
|
+
"noEligibleReviewers": "Add members to your organization before assigning reviewers.",
|
|
149
|
+
"alwaysAccess": "Always has access",
|
|
150
|
+
"additionalAccess": "Additional access",
|
|
151
|
+
"hasAccess": "Has access"
|
|
152
|
+
},
|
|
153
|
+
"suppliers": {
|
|
154
|
+
"title": "Supplier timesheets",
|
|
155
|
+
"subtitle": "View internally approved time submitted by your suppliers.",
|
|
156
|
+
"back": "Back to supplier timesheets",
|
|
157
|
+
"emptyFiltered": "No supplier timesheets found",
|
|
158
|
+
"emptyFilteredDescription": "Try changing your search or filters."
|
|
159
|
+
},
|
|
160
|
+
"submit": "Submit week",
|
|
161
|
+
"billable": "Billable",
|
|
162
|
+
"nonBillable": "Non-billable",
|
|
163
|
+
"tariffMissingShort": "rate required",
|
|
164
|
+
"errors": {
|
|
165
|
+
"generic": "Something went wrong. Please try again.",
|
|
166
|
+
"tariffRequiredTitle": "A billing rate is required",
|
|
167
|
+
"tariffRequired": "Billable time cannot be registered until your member default rate or a project-specific rate is configured.",
|
|
168
|
+
"tariffRequiredAdmin": "Set a default rate for this member or add a project-specific override before registering billable time.",
|
|
169
|
+
"tariffRequiredMember": "Ask a Timesheets administrator to configure your default rate or a rate for this project.",
|
|
170
|
+
"memberTariffMissingTitle": "You can currently enter non-billable time only",
|
|
171
|
+
"memberTariffMissingDescription": "Your default billing rate has not been configured yet. Billable activities remain unavailable unless an administrator has configured a rate for that project.",
|
|
172
|
+
"configureRates": "Configure team rates",
|
|
173
|
+
"entryDisabledTitle": "Time registration is disabled",
|
|
174
|
+
"entryDisabled": "You cannot register or submit time for this organization. Contact an administrator if you need access.",
|
|
175
|
+
"runningTimer": "Stop this member’s running timer before disabling time registration.",
|
|
176
|
+
"timerStartTitle": "The timer could not be started",
|
|
177
|
+
"internalApproverRequiredTitle": "An approver is required",
|
|
178
|
+
"internalApproverRequired": "No approver is assigned to you. Assign one or disable approval for your account in Internal approval settings.",
|
|
179
|
+
"configureApprovers": "Configure approvals"
|
|
180
|
+
},
|
|
181
|
+
"setup": {
|
|
182
|
+
"title": "Finish setting up Timesheets",
|
|
183
|
+
"description": "Complete these steps before your team starts registering billable time.",
|
|
184
|
+
"waitingTitle": "Waiting for an administrator to set up Timesheets",
|
|
185
|
+
"waitingDescription": "Timesheets setup is not complete yet. An organization administrator needs to configure the required clients, activities, projects, and team rates.",
|
|
186
|
+
"client": "Add a client",
|
|
187
|
+
"activity": "Create an active activity",
|
|
188
|
+
"project": "Configure an active project",
|
|
189
|
+
"rates": "Add default rates ({count} missing)"
|
|
190
|
+
},
|
|
191
|
+
"navigation": {
|
|
192
|
+
"myTimesheet": "Timesheets",
|
|
193
|
+
"manage": "Manage timesheets"
|
|
194
|
+
},
|
|
195
|
+
"status": {
|
|
196
|
+
"draft": "Draft",
|
|
197
|
+
"submitted": "Submitted",
|
|
198
|
+
"approved": "Approved",
|
|
199
|
+
"rejected": "Needs changes"
|
|
200
|
+
},
|
|
201
|
+
"timer": {
|
|
202
|
+
"start": "Start timer",
|
|
203
|
+
"stop": "Stop",
|
|
204
|
+
"running": "Timer running",
|
|
205
|
+
"todayLocked": "The timer cannot be started because today’s hours are submitted or approved. Reopen the submission to record more time today."
|
|
206
|
+
},
|
|
207
|
+
"fields": {
|
|
208
|
+
"project": "Project",
|
|
209
|
+
"activity": "Activity",
|
|
210
|
+
"date": "Date",
|
|
211
|
+
"hours": "Hours",
|
|
212
|
+
"minutes": "Minutes",
|
|
213
|
+
"note": "Note"
|
|
214
|
+
},
|
|
215
|
+
"validation": {
|
|
216
|
+
"required": "This field is required",
|
|
217
|
+
"validDate": "Enter a valid date",
|
|
218
|
+
"periodLocked": "This date falls within a submitted or approved period.",
|
|
219
|
+
"activityNameLength": "Enter at least 2 characters",
|
|
220
|
+
"projectNameLength": "Enter at least 2 characters",
|
|
221
|
+
"clientNameLength": "Enter at least 2 characters",
|
|
222
|
+
"organizationSlugInvalid": "Use lowercase letters, numbers, and single hyphens only",
|
|
223
|
+
"selectActivity": "Select at least one activity",
|
|
224
|
+
"currencyLength": "Use a 3-letter currency code",
|
|
225
|
+
"rejectionReason": "Enter a reason for rejecting this timesheet",
|
|
226
|
+
"hoursRange": "Hours must be between 0 and 24",
|
|
227
|
+
"minutesRange": "Minutes must be between 0 and 59",
|
|
228
|
+
"positiveDuration": "Enter a duration greater than zero",
|
|
229
|
+
"maximumDuration": "The duration cannot exceed 24 hours"
|
|
230
|
+
},
|
|
231
|
+
"dashboard": {
|
|
232
|
+
"duration": {
|
|
233
|
+
"one": "{value} hour",
|
|
234
|
+
"other": "{value} hours"
|
|
235
|
+
},
|
|
236
|
+
"error": "This timesheet summary could not be loaded.",
|
|
237
|
+
"retry": "Try again",
|
|
238
|
+
"unavailable": "This summary is not available.",
|
|
239
|
+
"open": "Open",
|
|
240
|
+
"review": "Review",
|
|
241
|
+
"viewAll": "View all",
|
|
242
|
+
"myWeek": {
|
|
243
|
+
"previousSubmissions": "Previous submissions",
|
|
244
|
+
"title": "My week",
|
|
245
|
+
"period": "Week {week} · {start} to {end}",
|
|
246
|
+
"compactPeriod": "{start} to {end}",
|
|
247
|
+
"rejected": "Changes requested",
|
|
248
|
+
"timerRunning": "A timer is currently running."
|
|
249
|
+
},
|
|
250
|
+
"internalApprovals": {
|
|
251
|
+
"title": "Internal timesheet approvals",
|
|
252
|
+
"empty": "No recent timesheets."
|
|
253
|
+
},
|
|
254
|
+
"clientApprovals": {
|
|
255
|
+
"title": "Timesheets to review",
|
|
256
|
+
"empty": "No client timesheets are waiting for your review.",
|
|
257
|
+
"noReviewer": "No reviewer has been assigned yet."
|
|
258
|
+
},
|
|
259
|
+
"supplierTimesheets": {
|
|
260
|
+
"title": "Supplier timesheets",
|
|
261
|
+
"empty": "No supplier timesheets are available."
|
|
262
|
+
},
|
|
263
|
+
"myTimesheets": {
|
|
264
|
+
"title": "My submitted timesheets",
|
|
265
|
+
"empty": "No previous submissions."
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
"admin": {
|
|
269
|
+
"clientApprovals": "Client approvals",
|
|
270
|
+
"refresh": "Refresh",
|
|
271
|
+
"clients": "Clients",
|
|
272
|
+
"projects": "Projects",
|
|
273
|
+
"activities": "Activities",
|
|
274
|
+
"teamRates": "Team rates",
|
|
275
|
+
"sectionSubtitles": {
|
|
276
|
+
"approvals": "Review submitted timesheets that are waiting for approval.",
|
|
277
|
+
"projects": "Manage client projects, activities, budgets, and rates.",
|
|
278
|
+
"activities": "Manage the activities your team can use when registering time.",
|
|
279
|
+
"rates": "Manage hourly rates and who can register time.",
|
|
280
|
+
"settings": "Configure the Timesheets workspace and its defaults.",
|
|
281
|
+
"reports": "Review recorded time and team performance."
|
|
282
|
+
},
|
|
283
|
+
"canEnterTime": "Can register time",
|
|
284
|
+
"canEnterTimeFor": "Allow {name} to register time",
|
|
285
|
+
"reports": "Reports",
|
|
286
|
+
"noClientsTitle": "No clients yet",
|
|
287
|
+
"noClientsDescription": "Link your first client organization so you can create projects and record time.",
|
|
288
|
+
"createFirstClient": "Create your first client",
|
|
289
|
+
"noProjectsTitle": "No projects yet",
|
|
290
|
+
"noProjectsDescription": "Create a project for a client to organize activities, budgets, rates, and recorded time.",
|
|
291
|
+
"createFirstProject": "Create your first project",
|
|
292
|
+
"noActivitiesTitle": "No activities yet",
|
|
293
|
+
"noActivitiesDescription": "Create an activity to define the billable and non-billable work your team can record.",
|
|
294
|
+
"createFirstActivity": "Create your first activity",
|
|
295
|
+
"from": "From",
|
|
296
|
+
"noApprovals": "Nothing needs your attention",
|
|
297
|
+
"approve": "Approve",
|
|
298
|
+
"reject": "Reject",
|
|
299
|
+
"reopen": "Reopen",
|
|
300
|
+
"rejectTimesheet": "Return this timesheet",
|
|
301
|
+
"rejectionReason": "What needs to change?",
|
|
302
|
+
"reviewDetails": "Review details",
|
|
303
|
+
"entryCount": "{count} entry | {count} entries",
|
|
304
|
+
"noNote": "No note provided",
|
|
305
|
+
"newProject": "New project",
|
|
306
|
+
"backToProjects": "Back to projects",
|
|
307
|
+
"openProject": "Open {name}",
|
|
308
|
+
"projectLoading": "Loading project",
|
|
309
|
+
"projectNotFound": "This project could not be found",
|
|
310
|
+
"projectDetails": "Project details",
|
|
311
|
+
"projectLifecycle": "Project status and deletion",
|
|
312
|
+
"archiveProject": "Archive project",
|
|
313
|
+
"restoreProject": "Restore project",
|
|
314
|
+
"projectStatus": {
|
|
315
|
+
"active": "Active",
|
|
316
|
+
"archived": "Archived"
|
|
317
|
+
},
|
|
318
|
+
"editProject": "Edit project",
|
|
319
|
+
"deleteProject": "Delete project",
|
|
320
|
+
"checkingProjectDeletion": "Checking whether this project can be deleted…",
|
|
321
|
+
"projectHasNoTimeEntries": "This project has no time entries and can be deleted.",
|
|
322
|
+
"projectHasTimeEntries": "This project has existing time entries and cannot be deleted.",
|
|
323
|
+
"typeProjectNameToDelete": "Type “{name}” to confirm that you want to permanently delete this project.",
|
|
324
|
+
"projectNameConfirmation": "Project name",
|
|
325
|
+
"client": "Client",
|
|
326
|
+
"internalOrganization": "{name} — Internal",
|
|
327
|
+
"internalProjectHelp": "You can create an internal project for your own company, or manage clients to add external projects.",
|
|
328
|
+
"newClient": "New client",
|
|
329
|
+
"linkClient": "Link client",
|
|
330
|
+
"linkExistingOrganization": "Link existing organization",
|
|
331
|
+
"createOrganization": "Create new organization",
|
|
332
|
+
"clientOrganizationOption": "Choose how to add the client organization",
|
|
333
|
+
"organizationName": "Organization name",
|
|
334
|
+
"organizationSlug": "Organization URL identifier",
|
|
335
|
+
"createAndLinkClient": "Create and link client",
|
|
336
|
+
"removeClient": "Remove client",
|
|
337
|
+
"organization": "Organization",
|
|
338
|
+
"manageClients": "Manage clients",
|
|
339
|
+
"noAvailableClientOrganizations": "There are no other accessible organizations available to link.",
|
|
340
|
+
"createClientFirst": "Add a client before creating the first project.",
|
|
341
|
+
"close": "Close",
|
|
342
|
+
"code": "Code",
|
|
343
|
+
"hoursBudget": "Hours budget",
|
|
344
|
+
"moneyBudget": "Money budget",
|
|
345
|
+
"projectRates": "Project-specific rates",
|
|
346
|
+
"saveOverrides": "Save overrides",
|
|
347
|
+
"workspaceSettings": "Workspace settings",
|
|
348
|
+
"clientSettings": "Timesheets client settings",
|
|
349
|
+
"currency": "Currency",
|
|
350
|
+
"timezone": "Timezone",
|
|
351
|
+
"createProject": "Create project",
|
|
352
|
+
"newActivity": "New activity",
|
|
353
|
+
"createActivity": "Create activity",
|
|
354
|
+
"editActivity": "Edit activity",
|
|
355
|
+
"deleteActivity": "Delete activity",
|
|
356
|
+
"checkingActivityDeletion": "Checking whether this activity can be deleted…",
|
|
357
|
+
"activityHasNoTimeEntries": "This activity has no time entries and can be deleted.",
|
|
358
|
+
"activityHasTimeEntries": "This activity has existing time entries and cannot be deleted.",
|
|
359
|
+
"typeActivityNameToDelete": "Type “{name}” to confirm that you want to permanently delete this activity.",
|
|
360
|
+
"activityNameConfirmation": "Activity name",
|
|
361
|
+
"active": "Active",
|
|
362
|
+
"inactive": "Inactive",
|
|
363
|
+
"list": {
|
|
364
|
+
"search": "Search…",
|
|
365
|
+
"filters": "Filters",
|
|
366
|
+
"sort": "Sort",
|
|
367
|
+
"direction": "Change sort direction",
|
|
368
|
+
"totalRecords": "{count} Entry | {count} Entries",
|
|
369
|
+
"allClients": "All clients",
|
|
370
|
+
"clientFilter": "Filter by client",
|
|
371
|
+
"projectStatusFilter": "Filter by project status",
|
|
372
|
+
"allProjectStatuses": "All project statuses",
|
|
373
|
+
"configurationFilter": "Timesheet access",
|
|
374
|
+
"allConfigurations": "All configurations",
|
|
375
|
+
"configured": "Configured",
|
|
376
|
+
"incomplete": "Incomplete",
|
|
377
|
+
"statusFilter": "Filter by status",
|
|
378
|
+
"allStatuses": "All statuses",
|
|
379
|
+
"billingFilter": "Filter by billing",
|
|
380
|
+
"allBilling": "All billing types",
|
|
381
|
+
"billable": "Billable",
|
|
382
|
+
"nonBillable": "Non-billable",
|
|
383
|
+
"overdueFilter": "Payment state",
|
|
384
|
+
"allPaymentStates": "All payment states",
|
|
385
|
+
"overdue": "Overdue",
|
|
386
|
+
"notOverdue": "Not overdue",
|
|
387
|
+
"sortName": "Name",
|
|
388
|
+
"sortClient": "Client",
|
|
389
|
+
"sortStartDate": "Start date",
|
|
390
|
+
"sortActive": "Active state",
|
|
391
|
+
"sortBilling": "Billing type"
|
|
392
|
+
},
|
|
393
|
+
"to": "To",
|
|
394
|
+
"all": "All",
|
|
395
|
+
"runReport": "Run report",
|
|
396
|
+
"exportCsv": "Export CSV",
|
|
397
|
+
"totalHours": "Total hours",
|
|
398
|
+
"billableHours": "Billable hours",
|
|
399
|
+
"nonBillableHours": "Non-billable hours",
|
|
400
|
+
"billableAmount": "Billable amount",
|
|
401
|
+
"person": "Person",
|
|
402
|
+
"hours": "Hours",
|
|
403
|
+
"amount": "Amount",
|
|
404
|
+
"clientApprovalsSubtitle": "Track client decisions and respond to disputed timesheets.",
|
|
405
|
+
"timerRounding": "Round timer up to (minutes)",
|
|
406
|
+
"timerRoundingHelp": "Round stopped timers up to this interval (1–60 minutes). For example, 16 minutes becomes 30 with a 15-minute interval.",
|
|
407
|
+
"noBudget": "No budget",
|
|
408
|
+
"clearBudget": "Clear budget"
|
|
409
|
+
},
|
|
410
|
+
"messages": {
|
|
411
|
+
"saved": "Time saved",
|
|
412
|
+
"saveError": "The change could not be saved",
|
|
413
|
+
"projectCreated": "Project created",
|
|
414
|
+
"projectUpdated": "Project updated",
|
|
415
|
+
"projectArchived": "Project archived",
|
|
416
|
+
"projectRestored": "Project restored",
|
|
417
|
+
"projectDeleted": "Project deleted",
|
|
418
|
+
"rateSaved": "Rate saved",
|
|
419
|
+
"settingsSaved": "Settings saved"
|
|
420
|
+
},
|
|
421
|
+
"email": {
|
|
422
|
+
"messages": {
|
|
423
|
+
"internal-requested": "Internal approval requested",
|
|
424
|
+
"internal-approved": "Timesheet approved internally",
|
|
425
|
+
"internal-rejected": "Timesheet rejected internally",
|
|
426
|
+
"internal-reopened": "Timesheet reopened",
|
|
427
|
+
"client-requested": "Client approval requested",
|
|
428
|
+
"client-approved": "Timesheet approved by client",
|
|
429
|
+
"client-disputed": "Timesheet disputed by client"
|
|
430
|
+
},
|
|
431
|
+
"placeholders": {
|
|
432
|
+
"person_name": "Submitter",
|
|
433
|
+
"organization_name": "Organization",
|
|
434
|
+
"period": "Period",
|
|
435
|
+
"period_start": "Period start",
|
|
436
|
+
"period_end": "Period end",
|
|
437
|
+
"client_name": "Client",
|
|
438
|
+
"comment": "Review comment",
|
|
439
|
+
"action_url": "Portal link",
|
|
440
|
+
"recipient_name": "Addressee name"
|
|
441
|
+
}
|
|
442
|
+
},
|
|
443
|
+
"clientSubmissionErrors": {
|
|
444
|
+
"title": "Timesheet could not be submitted",
|
|
445
|
+
"accessRequired": "Enable timesheet review access for this client in the client settings, then try again.",
|
|
446
|
+
"invoiced": "Some of these hours are already linked to an invoice. They cannot be submitted for client approval.",
|
|
447
|
+
"notReady": "This timesheet must be internally approved first. Refresh the page to see its current status.",
|
|
448
|
+
"empty": "There are no time entries for this client in this submission.",
|
|
449
|
+
"exists": "This timesheet has already been sent to the client. Refresh the page to see the latest status.",
|
|
450
|
+
"unauthorized": "Only a workspace owner or administrator can submit timesheets for client approval.",
|
|
451
|
+
"generic": "We could not submit this timesheet. Please try again. If the problem continues, contact your administrator."
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|