@open-mercato/core 0.10.1-develop.7717.1.2befe9c634 → 0.10.1-develop.7721.1.b5c4a00a68

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.
Files changed (384) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/staff_support_routing_rule/index.js +21 -0
  3. package/dist/generated/entities/staff_support_routing_rule/index.js.map +7 -0
  4. package/dist/generated/entities/staff_support_ticket/index.js +37 -0
  5. package/dist/generated/entities/staff_support_ticket/index.js.map +7 -0
  6. package/dist/generated/entities/staff_time_project/index.js +2 -0
  7. package/dist/generated/entities/staff_time_project/index.js.map +2 -2
  8. package/dist/generated/entities/staff_time_project_member/index.js +2 -0
  9. package/dist/generated/entities/staff_time_project_member/index.js.map +2 -2
  10. package/dist/generated/entities/staff_time_task/index.js +4 -0
  11. package/dist/generated/entities/staff_time_task/index.js.map +2 -2
  12. package/dist/generated/entities/staff_time_task_comment/index.js +9 -1
  13. package/dist/generated/entities/staff_time_task_comment/index.js.map +2 -2
  14. package/dist/generated/entities.ids.generated.js +2 -0
  15. package/dist/generated/entities.ids.generated.js.map +2 -2
  16. package/dist/generated/entity-fields-registry.js +38 -0
  17. package/dist/generated/entity-fields-registry.js.map +2 -2
  18. package/dist/helpers/integration/auth.js +1 -0
  19. package/dist/helpers/integration/auth.js.map +2 -2
  20. package/dist/helpers/integration/communicationChannelsFixtures.js +20 -0
  21. package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
  22. package/dist/modules/catalog/api/bulk-delete/route.js +12 -2
  23. package/dist/modules/catalog/api/bulk-delete/route.js.map +2 -2
  24. package/dist/modules/communication_channels/api/post/test-seed/route.js +17 -3
  25. package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
  26. package/dist/modules/communication_channels/lib/test-seed.js +38 -5
  27. package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
  28. package/dist/modules/messages/commands/messages.js +2 -3
  29. package/dist/modules/messages/commands/messages.js.map +2 -2
  30. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js +2 -2
  31. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js.map +2 -2
  32. package/dist/modules/staff/api/portal/support-tickets/[id]/attachments/route.js +299 -0
  33. package/dist/modules/staff/api/portal/support-tickets/[id]/attachments/route.js.map +7 -0
  34. package/dist/modules/staff/api/portal/support-tickets/[id]/messages/route.js +91 -0
  35. package/dist/modules/staff/api/portal/support-tickets/[id]/messages/route.js.map +7 -0
  36. package/dist/modules/staff/api/portal/support-tickets/[id]/route.js +146 -0
  37. package/dist/modules/staff/api/portal/support-tickets/[id]/route.js.map +7 -0
  38. package/dist/modules/staff/api/portal/support-tickets/options/route.js +60 -0
  39. package/dist/modules/staff/api/portal/support-tickets/options/route.js.map +7 -0
  40. package/dist/modules/staff/api/portal/support-tickets/route.js +220 -0
  41. package/dist/modules/staff/api/portal/support-tickets/route.js.map +7 -0
  42. package/dist/modules/staff/api/timesheets/settings/route.js +7 -1
  43. package/dist/modules/staff/api/timesheets/settings/route.js.map +2 -2
  44. package/dist/modules/staff/api/timesheets/support-routing-rules/fallback-project/route.js +122 -0
  45. package/dist/modules/staff/api/timesheets/support-routing-rules/fallback-project/route.js.map +7 -0
  46. package/dist/modules/staff/api/timesheets/support-routing-rules/preview/route.js +180 -0
  47. package/dist/modules/staff/api/timesheets/support-routing-rules/preview/route.js.map +7 -0
  48. package/dist/modules/staff/api/timesheets/support-routing-rules/route.js +147 -0
  49. package/dist/modules/staff/api/timesheets/support-routing-rules/route.js.map +7 -0
  50. package/dist/modules/staff/api/timesheets/support-tickets/options/route.js +133 -0
  51. package/dist/modules/staff/api/timesheets/support-tickets/options/route.js.map +7 -0
  52. package/dist/modules/staff/api/timesheets/tasks/[id]/claim/route.js +33 -0
  53. package/dist/modules/staff/api/timesheets/tasks/[id]/claim/route.js.map +7 -0
  54. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js +25 -7
  55. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js.map +2 -2
  56. package/dist/modules/staff/api/timesheets/tasks/[id]/release/route.js +32 -0
  57. package/dist/modules/staff/api/timesheets/tasks/[id]/release/route.js.map +7 -0
  58. package/dist/modules/staff/api/timesheets/tasks/route.js +94 -47
  59. package/dist/modules/staff/api/timesheets/tasks/route.js.map +2 -2
  60. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js +3 -0
  61. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js.map +2 -2
  62. package/dist/modules/staff/api/timesheets/time-projects/route.js +3 -0
  63. package/dist/modules/staff/api/timesheets/time-projects/route.js.map +2 -2
  64. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js +1 -0
  65. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js.map +2 -2
  66. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js +54 -4
  67. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js.map +2 -2
  68. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js +21 -5
  69. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js.map +2 -2
  70. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js +319 -254
  71. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js.map +2 -2
  72. package/dist/modules/staff/backend/staff/time-tracking/support/page.js +363 -0
  73. package/dist/modules/staff/backend/staff/time-tracking/support/page.js.map +7 -0
  74. package/dist/modules/staff/backend/staff/time-tracking/support/page.meta.js +18 -0
  75. package/dist/modules/staff/backend/staff/time-tracking/support/page.meta.js.map +7 -0
  76. package/dist/modules/staff/cli.js +27 -0
  77. package/dist/modules/staff/cli.js.map +2 -2
  78. package/dist/modules/staff/commands/index.js +3 -0
  79. package/dist/modules/staff/commands/index.js.map +2 -2
  80. package/dist/modules/staff/commands/shared.js +10 -1
  81. package/dist/modules/staff/commands/shared.js.map +2 -2
  82. package/dist/modules/staff/commands/support-routing-rules.js +505 -0
  83. package/dist/modules/staff/commands/support-routing-rules.js.map +7 -0
  84. package/dist/modules/staff/commands/support-tickets.js +513 -0
  85. package/dist/modules/staff/commands/support-tickets.js.map +7 -0
  86. package/dist/modules/staff/commands/timesheets-projects.js +72 -14
  87. package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
  88. package/dist/modules/staff/commands/timesheets-task-assignment.js +270 -0
  89. package/dist/modules/staff/commands/timesheets-task-assignment.js.map +7 -0
  90. package/dist/modules/staff/commands/timesheets-task-comments.js +58 -12
  91. package/dist/modules/staff/commands/timesheets-task-comments.js.map +2 -2
  92. package/dist/modules/staff/commands/timesheets-tasks.js +91 -9
  93. package/dist/modules/staff/commands/timesheets-tasks.js.map +3 -3
  94. package/dist/modules/staff/data/enrichers.js +141 -0
  95. package/dist/modules/staff/data/enrichers.js.map +2 -2
  96. package/dist/modules/staff/data/entities.js +143 -2
  97. package/dist/modules/staff/data/entities.js.map +2 -2
  98. package/dist/modules/staff/data/extensions.js +8 -0
  99. package/dist/modules/staff/data/extensions.js.map +2 -2
  100. package/dist/modules/staff/data/validators.js +34 -5
  101. package/dist/modules/staff/data/validators.js.map +2 -2
  102. package/dist/modules/staff/encryption.js +6 -0
  103. package/dist/modules/staff/encryption.js.map +2 -2
  104. package/dist/modules/staff/events.js +25 -0
  105. package/dist/modules/staff/events.js.map +2 -2
  106. package/dist/modules/staff/events.payloads.js +54 -0
  107. package/dist/modules/staff/events.payloads.js.map +2 -2
  108. package/dist/modules/staff/extension-points.js +1 -0
  109. package/dist/modules/staff/extension-points.js.map +2 -2
  110. package/dist/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.js +468 -0
  111. package/dist/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.js.map +7 -0
  112. package/dist/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.meta.js +12 -0
  113. package/dist/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.meta.js.map +7 -0
  114. package/dist/modules/staff/frontend/[orgSlug]/portal/support/new/page.js +316 -0
  115. package/dist/modules/staff/frontend/[orgSlug]/portal/support/new/page.js.map +7 -0
  116. package/dist/modules/staff/frontend/[orgSlug]/portal/support/new/page.meta.js +12 -0
  117. package/dist/modules/staff/frontend/[orgSlug]/portal/support/new/page.meta.js.map +7 -0
  118. package/dist/modules/staff/frontend/[orgSlug]/portal/support/page.js +190 -0
  119. package/dist/modules/staff/frontend/[orgSlug]/portal/support/page.js.map +7 -0
  120. package/dist/modules/staff/frontend/[orgSlug]/portal/support/page.meta.js +19 -0
  121. package/dist/modules/staff/frontend/[orgSlug]/portal/support/page.meta.js.map +7 -0
  122. package/dist/modules/staff/index.js +1 -1
  123. package/dist/modules/staff/index.js.map +2 -2
  124. package/dist/modules/staff/lib/crud.js +2 -0
  125. package/dist/modules/staff/lib/crud.js.map +2 -2
  126. package/dist/modules/staff/lib/support/attachments.js +36 -0
  127. package/dist/modules/staff/lib/support/attachments.js.map +7 -0
  128. package/dist/modules/staff/lib/support/dictionaries.js +87 -0
  129. package/dist/modules/staff/lib/support/dictionaries.js.map +7 -0
  130. package/dist/modules/staff/lib/support/notifications.js +111 -0
  131. package/dist/modules/staff/lib/support/notifications.js.map +7 -0
  132. package/dist/modules/staff/lib/support/portalAttachments.js +100 -0
  133. package/dist/modules/staff/lib/support/portalAttachments.js.map +7 -0
  134. package/dist/modules/staff/lib/support/portalBroadcast.js +117 -0
  135. package/dist/modules/staff/lib/support/portalBroadcast.js.map +7 -0
  136. package/dist/modules/staff/lib/support/portalRoute.js +99 -0
  137. package/dist/modules/staff/lib/support/portalRoute.js.map +7 -0
  138. package/dist/modules/staff/lib/support/portalStatus.js +12 -0
  139. package/dist/modules/staff/lib/support/portalStatus.js.map +7 -0
  140. package/dist/modules/staff/lib/support/portalTickets.js +148 -0
  141. package/dist/modules/staff/lib/support/portalTickets.js.map +7 -0
  142. package/dist/modules/staff/lib/support/routing.js +81 -0
  143. package/dist/modules/staff/lib/support/routing.js.map +7 -0
  144. package/dist/modules/staff/lib/support/routingRuleDraft.js +25 -0
  145. package/dist/modules/staff/lib/support/routingRuleDraft.js.map +7 -0
  146. package/dist/modules/staff/lib/support/seedDefaults.js +114 -0
  147. package/dist/modules/staff/lib/support/seedDefaults.js.map +7 -0
  148. package/dist/modules/staff/lib/support/supportActivity.js +26 -0
  149. package/dist/modules/staff/lib/support/supportActivity.js.map +7 -0
  150. package/dist/modules/staff/lib/support-ui/PortalSupportNotLinked.js +23 -0
  151. package/dist/modules/staff/lib/support-ui/PortalSupportNotLinked.js.map +7 -0
  152. package/dist/modules/staff/lib/support-ui/portalAttachmentValidation.js +112 -0
  153. package/dist/modules/staff/lib/support-ui/portalAttachmentValidation.js.map +7 -0
  154. package/dist/modules/staff/lib/support-ui/portalPendingUploads.js +45 -0
  155. package/dist/modules/staff/lib/support-ui/portalPendingUploads.js.map +7 -0
  156. package/dist/modules/staff/lib/support-ui/portalSupport.js +51 -0
  157. package/dist/modules/staff/lib/support-ui/portalSupport.js.map +7 -0
  158. package/dist/modules/staff/lib/time-tracking/access.js +3 -39
  159. package/dist/modules/staff/lib/time-tracking/access.js.map +2 -2
  160. package/dist/modules/staff/lib/time-tracking/listProjectAccess.js +54 -0
  161. package/dist/modules/staff/lib/time-tracking/listProjectAccess.js.map +7 -0
  162. package/dist/modules/staff/lib/time-tracking/portalRecipients.js +92 -2
  163. package/dist/modules/staff/lib/time-tracking/portalRecipients.js.map +2 -2
  164. package/dist/modules/staff/lib/time-tracking/projectAssignment.js +112 -0
  165. package/dist/modules/staff/lib/time-tracking/projectAssignment.js.map +7 -0
  166. package/dist/modules/staff/lib/time-tracking/settingKeys.js +14 -0
  167. package/dist/modules/staff/lib/time-tracking/settingKeys.js.map +2 -2
  168. package/dist/modules/staff/lib/time-tracking/settings.js +28 -1
  169. package/dist/modules/staff/lib/time-tracking/settings.js.map +2 -2
  170. package/dist/modules/staff/lib/time-tracking/taskAssignmentRoute.js +143 -0
  171. package/dist/modules/staff/lib/time-tracking/taskAssignmentRoute.js.map +7 -0
  172. package/dist/modules/staff/lib/time-tracking/workRecipients.js +92 -0
  173. package/dist/modules/staff/lib/time-tracking/workRecipients.js.map +7 -0
  174. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js +32 -3
  175. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js.map +2 -2
  176. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js +29 -0
  177. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js.map +2 -2
  178. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js +4 -0
  179. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js.map +2 -2
  180. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js +141 -1
  181. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js.map +2 -2
  182. package/dist/modules/staff/lib/time-tracking-ui/SupportAttachmentsSection.js +153 -0
  183. package/dist/modules/staff/lib/time-tracking-ui/SupportAttachmentsSection.js.map +7 -0
  184. package/dist/modules/staff/lib/time-tracking-ui/SupportRequestPanel.js +67 -0
  185. package/dist/modules/staff/lib/time-tracking-ui/SupportRequestPanel.js.map +7 -0
  186. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js +3 -1
  187. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js.map +2 -2
  188. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js +80 -17
  189. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js.map +2 -2
  190. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js +230 -41
  191. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js.map +2 -2
  192. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js +21 -1
  193. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js.map +2 -2
  194. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js +16 -4
  195. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js.map +2 -2
  196. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js +3 -1
  197. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js.map +2 -2
  198. package/dist/modules/staff/lib/time-tracking-ui/projectDefaultAssignee.js +68 -0
  199. package/dist/modules/staff/lib/time-tracking-ui/projectDefaultAssignee.js.map +7 -0
  200. package/dist/modules/staff/lib/time-tracking-ui/settingsTabs.js +7 -0
  201. package/dist/modules/staff/lib/time-tracking-ui/settingsTabs.js.map +7 -0
  202. package/dist/modules/staff/lib/time-tracking-ui/supportTicketData.js +50 -0
  203. package/dist/modules/staff/lib/time-tracking-ui/supportTicketData.js.map +7 -0
  204. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js +13 -1
  205. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js.map +2 -2
  206. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js +36 -2
  207. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js.map +2 -2
  208. package/dist/modules/staff/migrations/Migration20261009180543_staff.js +42 -0
  209. package/dist/modules/staff/migrations/Migration20261009180543_staff.js.map +7 -0
  210. package/dist/modules/staff/notifications.js +92 -0
  211. package/dist/modules/staff/notifications.js.map +2 -2
  212. package/dist/modules/staff/setup.js +6 -2
  213. package/dist/modules/staff/setup.js.map +2 -2
  214. package/dist/modules/staff/subscribers/support-portal-comment-created.js +26 -0
  215. package/dist/modules/staff/subscribers/support-portal-comment-created.js.map +7 -0
  216. package/dist/modules/staff/subscribers/support-portal-comment-deleted.js +26 -0
  217. package/dist/modules/staff/subscribers/support-portal-comment-deleted.js.map +7 -0
  218. package/dist/modules/staff/subscribers/support-portal-comment-updated.js +26 -0
  219. package/dist/modules/staff/subscribers/support-portal-comment-updated.js.map +7 -0
  220. package/dist/modules/staff/subscribers/support-portal-status-column-updated.js +24 -0
  221. package/dist/modules/staff/subscribers/support-portal-status-column-updated.js.map +7 -0
  222. package/dist/modules/staff/subscribers/support-portal-task-status-changed.js +25 -0
  223. package/dist/modules/staff/subscribers/support-portal-task-status-changed.js.map +7 -0
  224. package/dist/modules/staff/subscribers/support-portal-task-updated.js +25 -0
  225. package/dist/modules/staff/subscribers/support-portal-task-updated.js.map +7 -0
  226. package/dist/modules/staff/subscribers/support-ticket-created-notification.js +25 -0
  227. package/dist/modules/staff/subscribers/support-ticket-created-notification.js.map +7 -0
  228. package/dist/modules/staff/subscribers/support-ticket-customer-replied-notification.js +25 -0
  229. package/dist/modules/staff/subscribers/support-ticket-customer-replied-notification.js.map +7 -0
  230. package/dist/modules/staff/subscribers/support-ticket-unnotified-clear.js +26 -0
  231. package/dist/modules/staff/subscribers/support-ticket-unnotified-clear.js.map +7 -0
  232. package/dist/modules/staff/subscribers/time-task-assignee-notification.js +83 -0
  233. package/dist/modules/staff/subscribers/time-task-assignee-notification.js.map +7 -0
  234. package/dist/modules/staff/widgets/injection/portal-support-tickets/widget.client.js +112 -0
  235. package/dist/modules/staff/widgets/injection/portal-support-tickets/widget.client.js.map +7 -0
  236. package/dist/modules/staff/widgets/injection/portal-support-tickets/widget.js +17 -0
  237. package/dist/modules/staff/widgets/injection/portal-support-tickets/widget.js.map +7 -0
  238. package/dist/modules/staff/widgets/injection/time-tracking-settings-support/widget.client.js +870 -0
  239. package/dist/modules/staff/widgets/injection/time-tracking-settings-support/widget.client.js.map +7 -0
  240. package/dist/modules/staff/widgets/injection/time-tracking-settings-support/widget.js +17 -0
  241. package/dist/modules/staff/widgets/injection/time-tracking-settings-support/widget.js.map +7 -0
  242. package/dist/modules/staff/widgets/injection-table.js +16 -1
  243. package/dist/modules/staff/widgets/injection-table.js.map +2 -2
  244. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +4 -18
  245. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
  246. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +4 -18
  247. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
  248. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +4 -18
  249. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
  250. package/dist/modules/wms/lib/inventoryCsvExport.js +19 -0
  251. package/dist/modules/wms/lib/inventoryCsvExport.js.map +7 -0
  252. package/generated/entities/staff_support_routing_rule/index.ts +9 -0
  253. package/generated/entities/staff_support_ticket/index.ts +17 -0
  254. package/generated/entities/staff_time_project/index.ts +1 -0
  255. package/generated/entities/staff_time_project_member/index.ts +1 -0
  256. package/generated/entities/staff_time_task/index.ts +2 -0
  257. package/generated/entities/staff_time_task_comment/index.ts +4 -0
  258. package/generated/entities.ids.generated.ts +2 -0
  259. package/generated/entity-fields-registry.ts +38 -0
  260. package/package.json +8 -8
  261. package/src/helpers/integration/auth.ts +1 -1
  262. package/src/helpers/integration/communicationChannelsFixtures.ts +60 -2
  263. package/src/modules/catalog/api/bulk-delete/route.ts +12 -2
  264. package/src/modules/communication_channels/api/post/test-seed/route.ts +29 -12
  265. package/src/modules/communication_channels/lib/test-seed.ts +49 -10
  266. package/src/modules/messages/commands/messages.ts +8 -10
  267. package/src/modules/portal/frontend/[orgSlug]/portal/dashboard/page.tsx +2 -2
  268. package/src/modules/staff/AGENTS.md +22 -6
  269. package/src/modules/staff/api/portal/support-tickets/[id]/attachments/route.ts +327 -0
  270. package/src/modules/staff/api/portal/support-tickets/[id]/messages/route.ts +94 -0
  271. package/src/modules/staff/api/portal/support-tickets/[id]/route.ts +160 -0
  272. package/src/modules/staff/api/portal/support-tickets/options/route.ts +60 -0
  273. package/src/modules/staff/api/portal/support-tickets/route.ts +253 -0
  274. package/src/modules/staff/api/timesheets/settings/route.ts +7 -1
  275. package/src/modules/staff/api/timesheets/support-routing-rules/fallback-project/route.ts +131 -0
  276. package/src/modules/staff/api/timesheets/support-routing-rules/preview/route.ts +248 -0
  277. package/src/modules/staff/api/timesheets/support-routing-rules/route.ts +150 -0
  278. package/src/modules/staff/api/timesheets/support-tickets/options/route.ts +181 -0
  279. package/src/modules/staff/api/timesheets/tasks/[id]/claim/route.ts +31 -0
  280. package/src/modules/staff/api/timesheets/tasks/[id]/comments/route.ts +25 -7
  281. package/src/modules/staff/api/timesheets/tasks/[id]/release/route.ts +30 -0
  282. package/src/modules/staff/api/timesheets/tasks/route.ts +119 -67
  283. package/src/modules/staff/api/timesheets/time-projects/[id]/employees/route.ts +3 -0
  284. package/src/modules/staff/api/timesheets/time-projects/route.ts +3 -0
  285. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.tsx +1 -0
  286. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.tsx +67 -2
  287. package/src/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.ts +22 -3
  288. package/src/modules/staff/backend/staff/time-tracking/settings/page.tsx +405 -308
  289. package/src/modules/staff/backend/staff/time-tracking/support/page.meta.ts +14 -0
  290. package/src/modules/staff/backend/staff/time-tracking/support/page.tsx +428 -0
  291. package/src/modules/staff/cli.ts +28 -0
  292. package/src/modules/staff/commands/index.ts +3 -0
  293. package/src/modules/staff/commands/shared.ts +22 -1
  294. package/src/modules/staff/commands/support-routing-rules.ts +595 -0
  295. package/src/modules/staff/commands/support-tickets.ts +580 -0
  296. package/src/modules/staff/commands/timesheets-projects.ts +84 -13
  297. package/src/modules/staff/commands/timesheets-task-assignment.ts +319 -0
  298. package/src/modules/staff/commands/timesheets-task-comments.ts +70 -15
  299. package/src/modules/staff/commands/timesheets-tasks.ts +106 -15
  300. package/src/modules/staff/data/enrichers.ts +203 -0
  301. package/src/modules/staff/data/entities.ts +133 -2
  302. package/src/modules/staff/data/extensions.ts +9 -1
  303. package/src/modules/staff/data/validators.ts +36 -0
  304. package/src/modules/staff/encryption.ts +6 -0
  305. package/src/modules/staff/events.payloads.ts +87 -1
  306. package/src/modules/staff/events.ts +26 -0
  307. package/src/modules/staff/extension-points.ts +1 -0
  308. package/src/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.meta.ts +10 -0
  309. package/src/modules/staff/frontend/[orgSlug]/portal/support/[id]/page.tsx +553 -0
  310. package/src/modules/staff/frontend/[orgSlug]/portal/support/new/page.meta.ts +10 -0
  311. package/src/modules/staff/frontend/[orgSlug]/portal/support/new/page.tsx +346 -0
  312. package/src/modules/staff/frontend/[orgSlug]/portal/support/page.meta.ts +17 -0
  313. package/src/modules/staff/frontend/[orgSlug]/portal/support/page.tsx +253 -0
  314. package/src/modules/staff/i18n/de.json +291 -0
  315. package/src/modules/staff/i18n/en.json +291 -0
  316. package/src/modules/staff/i18n/es.json +291 -0
  317. package/src/modules/staff/i18n/ko.json +291 -0
  318. package/src/modules/staff/i18n/pl.json +291 -0
  319. package/src/modules/staff/index.ts +1 -1
  320. package/src/modules/staff/lib/crud.ts +2 -1
  321. package/src/modules/staff/lib/support/attachments.ts +43 -0
  322. package/src/modules/staff/lib/support/dictionaries.ts +120 -0
  323. package/src/modules/staff/lib/support/notifications.ts +138 -0
  324. package/src/modules/staff/lib/support/portalAttachments.ts +140 -0
  325. package/src/modules/staff/lib/support/portalBroadcast.ts +161 -0
  326. package/src/modules/staff/lib/support/portalRoute.ts +108 -0
  327. package/src/modules/staff/lib/support/portalStatus.ts +15 -0
  328. package/src/modules/staff/lib/support/portalTickets.ts +233 -0
  329. package/src/modules/staff/lib/support/routing.ts +117 -0
  330. package/src/modules/staff/lib/support/routingRuleDraft.ts +45 -0
  331. package/src/modules/staff/lib/support/seedDefaults.ts +151 -0
  332. package/src/modules/staff/lib/support/supportActivity.ts +39 -0
  333. package/src/modules/staff/lib/support-ui/PortalSupportNotLinked.tsx +20 -0
  334. package/src/modules/staff/lib/support-ui/portalAttachmentValidation.ts +125 -0
  335. package/src/modules/staff/lib/support-ui/portalPendingUploads.ts +49 -0
  336. package/src/modules/staff/lib/support-ui/portalSupport.ts +116 -0
  337. package/src/modules/staff/lib/time-tracking/access.ts +2 -62
  338. package/src/modules/staff/lib/time-tracking/listProjectAccess.ts +78 -0
  339. package/src/modules/staff/lib/time-tracking/portalRecipients.ts +173 -5
  340. package/src/modules/staff/lib/time-tracking/projectAssignment.ts +172 -0
  341. package/src/modules/staff/lib/time-tracking/settingKeys.ts +11 -0
  342. package/src/modules/staff/lib/time-tracking/settings.ts +46 -1
  343. package/src/modules/staff/lib/time-tracking/taskAssignmentRoute.ts +165 -0
  344. package/src/modules/staff/lib/time-tracking/workRecipients.ts +183 -0
  345. package/src/modules/staff/lib/time-tracking-ui/BoardFilterChips.tsx +36 -1
  346. package/src/modules/staff/lib/time-tracking-ui/KanbanBoard.tsx +30 -0
  347. package/src/modules/staff/lib/time-tracking-ui/KanbanCard.tsx +9 -0
  348. package/src/modules/staff/lib/time-tracking-ui/ProjectFormSections.tsx +185 -6
  349. package/src/modules/staff/lib/time-tracking-ui/SupportAttachmentsSection.tsx +188 -0
  350. package/src/modules/staff/lib/time-tracking-ui/SupportRequestPanel.tsx +102 -0
  351. package/src/modules/staff/lib/time-tracking-ui/TaskBoardScreen.tsx +2 -0
  352. package/src/modules/staff/lib/time-tracking-ui/TaskCommentThread.tsx +105 -22
  353. package/src/modules/staff/lib/time-tracking-ui/TaskDrawer.tsx +278 -43
  354. package/src/modules/staff/lib/time-tracking-ui/boardDirectory.ts +21 -0
  355. package/src/modules/staff/lib/time-tracking-ui/boardFilters.ts +16 -2
  356. package/src/modules/staff/lib/time-tracking-ui/kanbanBoardData.ts +4 -0
  357. package/src/modules/staff/lib/time-tracking-ui/projectDefaultAssignee.ts +117 -0
  358. package/src/modules/staff/lib/time-tracking-ui/settingsTabs.ts +17 -0
  359. package/src/modules/staff/lib/time-tracking-ui/supportTicketData.ts +71 -0
  360. package/src/modules/staff/lib/time-tracking-ui/taskDrawerData.ts +15 -0
  361. package/src/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.ts +48 -1
  362. package/src/modules/staff/migrations/.snapshot-open-mercato.json +714 -0
  363. package/src/modules/staff/migrations/Migration20261009180543_staff.ts +50 -0
  364. package/src/modules/staff/notifications.ts +92 -0
  365. package/src/modules/staff/setup.ts +6 -2
  366. package/src/modules/staff/subscribers/support-portal-comment-created.ts +35 -0
  367. package/src/modules/staff/subscribers/support-portal-comment-deleted.ts +35 -0
  368. package/src/modules/staff/subscribers/support-portal-comment-updated.ts +35 -0
  369. package/src/modules/staff/subscribers/support-portal-status-column-updated.ts +36 -0
  370. package/src/modules/staff/subscribers/support-portal-task-status-changed.ts +34 -0
  371. package/src/modules/staff/subscribers/support-portal-task-updated.ts +34 -0
  372. package/src/modules/staff/subscribers/support-ticket-created-notification.ts +27 -0
  373. package/src/modules/staff/subscribers/support-ticket-customer-replied-notification.ts +27 -0
  374. package/src/modules/staff/subscribers/support-ticket-unnotified-clear.ts +29 -0
  375. package/src/modules/staff/subscribers/time-task-assignee-notification.ts +102 -0
  376. package/src/modules/staff/widgets/injection/portal-support-tickets/widget.client.tsx +151 -0
  377. package/src/modules/staff/widgets/injection/portal-support-tickets/widget.ts +16 -0
  378. package/src/modules/staff/widgets/injection/time-tracking-settings-support/widget.client.tsx +1058 -0
  379. package/src/modules/staff/widgets/injection/time-tracking-settings-support/widget.ts +17 -0
  380. package/src/modules/staff/widgets/injection-table.ts +15 -0
  381. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +4 -20
  382. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +4 -20
  383. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +4 -19
  384. package/src/modules/wms/lib/inventoryCsvExport.ts +18 -0
@@ -96,6 +96,12 @@
96
96
  "staff.audit.resources.create": "Utwórz zasób",
97
97
  "staff.audit.resources.delete": "Usuń zasób",
98
98
  "staff.audit.resources.update": "Zaktualizuj zasób",
99
+ "staff.audit.support.routingRules.create": "Utwórz regułę routingu zgłoszeń",
100
+ "staff.audit.support.routingRules.createFallbackProject": "Utwórz projekt zapasowy wsparcia",
101
+ "staff.audit.support.routingRules.delete": "Usuń regułę routingu zgłoszeń",
102
+ "staff.audit.support.routingRules.update": "Zaktualizuj regułę routingu zgłoszeń",
103
+ "staff.audit.support.tickets.create": "Utwórz zgłoszenie",
104
+ "staff.audit.support.tickets.message": "Wiadomość klienta w zgłoszeniu",
99
105
  "staff.audit.teamMemberActivities.create": "Utwórz aktywność członka zespołu",
100
106
  "staff.audit.teamMemberActivities.delete": "Usuń aktywność członka zespołu",
101
107
  "staff.audit.teamMemberActivities.update": "Zaktualizuj aktywność członka zespołu",
@@ -138,8 +144,10 @@
138
144
  "staff.audit.timesheets.task_statuses.delete": "Usuń status zadania",
139
145
  "staff.audit.timesheets.task_statuses.reorder": "Zmień kolejność statusów zadań",
140
146
  "staff.audit.timesheets.task_statuses.update": "Zaktualizuj status zadania",
147
+ "staff.audit.timesheets.tasks.claim": "Przejmij zadanie",
141
148
  "staff.audit.timesheets.tasks.create": "Utwórz zadanie",
142
149
  "staff.audit.timesheets.tasks.delete": "Usuń zadanie",
150
+ "staff.audit.timesheets.tasks.release": "Zwolnij zadanie",
143
151
  "staff.audit.timesheets.tasks.statusChange": "Przenieś zadanie",
144
152
  "staff.audit.timesheets.tasks.update": "Zaktualizuj zadanie",
145
153
  "staff.audit.timesheets.time_entries.create": "Utwórz wpis czasu",
@@ -343,6 +351,11 @@
343
351
  "staff.notifications.leaveRequest.pending.title": "Wniosek urlopowy oczekuje",
344
352
  "staff.notifications.leaveRequest.rejected.body": "Wniosek urlopowy od {startDate} do {endDate} został odrzucony{reason, select, other { - {reason}}}",
345
353
  "staff.notifications.leaveRequest.rejected.title": "Wniosek urlopowy odrzucony",
354
+ "staff.notifications.supportTicket.actions.open": "Otwórz zgłoszenie",
355
+ "staff.notifications.supportTicket.created.body": "{customer} zgłosił „{subject}” ({category}) w projekcie {project}.",
356
+ "staff.notifications.supportTicket.created.title": "Nowe zgłoszenie {reference}",
357
+ "staff.notifications.supportTicket.customerReplied.body": "{customer} dodał wiadomość do „{subject}”.",
358
+ "staff.notifications.supportTicket.customerReplied.title": "Klient odpowiedział w zgłoszeniu {reference}",
346
359
  "staff.notifications.timeEntryTimer.runningLong.body": "Stoper działa od dłuższego czasu. Zatrzymaj go, jeśli praca została zakończona.",
347
360
  "staff.notifications.timeEntryTimer.runningLong.title": "Stoper wciąż działa",
348
361
  "staff.notifications.timeProjectAccess.actions.openTeam": "Otwórz zespół projektu",
@@ -359,9 +372,89 @@
359
372
  "staff.notifications.timeReport.approved.title": "Raport czasu zamknięty",
360
373
  "staff.notifications.timeReport.readyForApproval.body": "Raport {reference} czeka na Twoje zatwierdzenie.",
361
374
  "staff.notifications.timeReport.readyForApproval.title": "Raport czasu gotowy do zatwierdzenia",
375
+ "staff.notifications.timeTask.actions.open": "Otwórz zadanie",
376
+ "staff.notifications.timeTask.assigned.body": "Zadanie „{title}” jest teraz Twoje.",
377
+ "staff.notifications.timeTask.assigned.title": "Przypisano Ci zadanie {reference}",
378
+ "staff.notifications.timeTask.released.body": "Zadanie „{title}” można przejąć.",
379
+ "staff.notifications.timeTask.released.title": "Zadanie {reference} nie ma wykonawcy",
362
380
  "staff.notifications.timesheet.actions.openTimesheet": "Otwórz ewidencję czasu",
363
381
  "staff.notifications.timesheet.periodIncomplete.body": "Niektóre dni robocze między {periodFrom} a {periodTo} nie mają zarejestrowanego czasu.",
364
382
  "staff.notifications.timesheet.periodIncomplete.title": "Niekompletny okres w ewidencji czasu",
383
+ "staff.portal.support.attachments.add": "Dodaj pliki",
384
+ "staff.portal.support.attachments.delete": "Usuń plik",
385
+ "staff.portal.support.attachments.deleteConfirm": "Usunąć {name}?",
386
+ "staff.portal.support.attachments.deleteFailed": "Nie udało się usunąć pliku.",
387
+ "staff.portal.support.attachments.empty": "Brak plików.",
388
+ "staff.portal.support.attachments.failedHeading": "Nie udało się przesłać tych plików.",
389
+ "staff.portal.support.attachments.reattach": "Dołącz ten plik ponownie.",
390
+ "staff.portal.support.attachments.remove": "Usuń plik",
391
+ "staff.portal.support.attachments.retry": "Ponów",
392
+ "staff.portal.support.attachments.title": "Pliki",
393
+ "staff.portal.support.attachments.uploadFailed": "Nie udało się przesłać {name}.",
394
+ "staff.portal.support.attachments.uploadFailedReason": "Nie udało się przesłać {name}: {reason}",
395
+ "staff.portal.support.backToList": "Wszystkie zgłoszenia",
396
+ "staff.portal.support.blocked": "Ta akcja jest teraz niedostępna.",
397
+ "staff.portal.support.description": "Poproś o pomoc i śledź postęp swoich zgłoszeń.",
398
+ "staff.portal.support.detail.colleague": "Współpracownik",
399
+ "staff.portal.support.detail.conversation": "Rozmowa",
400
+ "staff.portal.support.detail.loadFailed": "Nie udało się wczytać zgłoszenia.",
401
+ "staff.portal.support.detail.notFoundDescription": "To zgłoszenie nie istnieje lub nie należy do Ciebie.",
402
+ "staff.portal.support.detail.notFoundTitle": "Nie znaleziono zgłoszenia",
403
+ "staff.portal.support.detail.rateLimited": "Wysłałeś ostatnio wiele wiadomości. Spróbuj później.",
404
+ "staff.portal.support.detail.reopenHint": "Odpowiedź ponownie otworzy to zgłoszenie.",
405
+ "staff.portal.support.detail.reopened": "Wiadomość wysłana, a zgłoszenie ponownie otwarte.",
406
+ "staff.portal.support.detail.replyFailed": "Nie udało się wysłać wiadomości.",
407
+ "staff.portal.support.detail.replyLabel": "Twoja odpowiedź",
408
+ "staff.portal.support.detail.replyPlaceholder": "Napisz odpowiedź",
409
+ "staff.portal.support.detail.replySent": "Wiadomość została wysłana.",
410
+ "staff.portal.support.detail.send": "Wyślij odpowiedź",
411
+ "staff.portal.support.detail.supportTeam": "Zespół wsparcia",
412
+ "staff.portal.support.detail.supportTeamNamed": "Zespół wsparcia · {name}",
413
+ "staff.portal.support.detail.title": "Zgłoszenie",
414
+ "staff.portal.support.detail.you": "Ty",
415
+ "staff.portal.support.emptyDescription": "Po utworzeniu zgłoszenia możesz je tutaj śledzić.",
416
+ "staff.portal.support.emptyTitle": "Brak zgłoszeń",
417
+ "staff.portal.support.fileSize.bytes": "{size} B",
418
+ "staff.portal.support.fileSize.kilobytes": "{size} KB",
419
+ "staff.portal.support.fileSize.megabytes": "{size} MB",
420
+ "staff.portal.support.filter.all": "Wszystkie statusy",
421
+ "staff.portal.support.filter.status": "Status",
422
+ "staff.portal.support.lastActivityAt": "Ostatnia aktywność: {date}",
423
+ "staff.portal.support.loadFailed": "Nie udało się wczytać zgłoszeń.",
424
+ "staff.portal.support.nav": "Wsparcie",
425
+ "staff.portal.support.new.cancel": "Anuluj",
426
+ "staff.portal.support.new.category": "Kategoria",
427
+ "staff.portal.support.new.categoryPlaceholder": "Wybierz kategorię",
428
+ "staff.portal.support.new.createFailed": "Nie udało się utworzyć zgłoszenia. Spróbuj ponownie.",
429
+ "staff.portal.support.new.created": "Zgłoszenie {reference} zostało utworzone.",
430
+ "staff.portal.support.new.description": "Opisz, czego potrzebujesz. Nie podawaj haseł ani innych poufnych danych.",
431
+ "staff.portal.support.new.descriptionLabel": "Opis",
432
+ "staff.portal.support.new.descriptionPlaceholder": "Co się stało i czego oczekiwałeś?",
433
+ "staff.portal.support.new.optionsLoadFailed": "Nie udało się wczytać formularza zgłoszenia.",
434
+ "staff.portal.support.new.rateLimited": "Utworzyłeś ostatnio wiele zgłoszeń. Spróbuj później.",
435
+ "staff.portal.support.new.subject": "Temat",
436
+ "staff.portal.support.new.subjectPlaceholder": "Krótkie podsumowanie problemu",
437
+ "staff.portal.support.new.submit": "Wyślij zgłoszenie",
438
+ "staff.portal.support.new.title": "Nowe zgłoszenie",
439
+ "staff.portal.support.newTicket": "Nowe zgłoszenie",
440
+ "staff.portal.support.next": "Następna",
441
+ "staff.portal.support.notLinked.description": "Twoje konto portalu nie jest powiązane z firmą, więc nie ma zgłoszeń do wyświetlenia. Poproś administratora konta o jego powiązanie.",
442
+ "staff.portal.support.notLinked.title": "Zgłoszenia nie są dostępne dla Twojego konta",
443
+ "staff.portal.support.pageIndicator": "Strona {page} / {total}",
444
+ "staff.portal.support.previous": "Poprzednia",
445
+ "staff.portal.support.retry": "Spróbuj ponownie",
446
+ "staff.portal.support.status.inProgress": "W toku",
447
+ "staff.portal.support.status.received": "Przyjęte",
448
+ "staff.portal.support.status.resolved": "Rozwiązane",
449
+ "staff.portal.support.title": "Wsparcie",
450
+ "staff.portal.support.unavailableDescription": "Do czasu uruchomienia zgłoszeń skontaktuj się z nami bezpośrednio.",
451
+ "staff.portal.support.unavailableTitle": "Zgłoszenia nie są jeszcze dostępne",
452
+ "staff.portal.support.widget.empty": "Brak otwartych zgłoszeń.",
453
+ "staff.portal.support.widget.loading": "Wczytywanie zgłoszeń…",
454
+ "staff.portal.support.widget.openCount": "Otwarte zgłoszenia: {count}",
455
+ "staff.portal.support.widget.retry": "Spróbuj ponownie",
456
+ "staff.portal.support.widget.title": "Zgłoszenia",
457
+ "staff.portal.support.widget.viewAll": "Zobacz wszystkie",
365
458
  "staff.portal.timeReports.backToList": "Wszystkie raporty czasu",
366
459
  "staff.portal.timeReports.billableHours": "Godziny rozliczalne",
367
460
  "staff.portal.timeReports.detailTitle": "Raport czasu",
@@ -524,6 +617,148 @@
524
617
  "staff.services.table.name": "Nazwa",
525
618
  "staff.services.table.search": "Szukaj usług...",
526
619
  "staff.services.table.tags": "Tagi",
620
+ "staff.support.attachments.empty": "Brak plików w tym zgłoszeniu.",
621
+ "staff.support.attachments.fromCustomer": "Od klienta",
622
+ "staff.support.attachments.internal": "Wewnętrzne",
623
+ "staff.support.attachments.loadFailed": "Nie udało się wczytać plików zgłoszenia.",
624
+ "staff.support.attachments.loading": "Wczytywanie plików…",
625
+ "staff.support.attachments.retry": "Spróbuj ponownie",
626
+ "staff.support.attachments.shareWithCustomer": "Udostępnij klientowi",
627
+ "staff.support.attachments.title": "Pliki zgłoszenia",
628
+ "staff.support.attachments.upload": "Prześlij",
629
+ "staff.support.attachments.uploadFailed": "Nie udało się przesłać pliku.",
630
+ "staff.support.attachments.visible": "Widoczne dla klienta",
631
+ "staff.support.errors.attachmentNotYours": "Możesz usuwać tylko przesłane przez siebie pliki.",
632
+ "staff.support.errors.attachmentsUnavailable": "Załączniki są teraz niedostępne.",
633
+ "staff.support.errors.categoryNotFound": "Ta kategoria nie istnieje w słowniku kategorii zgłoszeń.",
634
+ "staff.support.errors.categoryRuleExists": "Ta kategoria ma już regułę routingu.",
635
+ "staff.support.errors.categoryUnavailable": "Zgłoszenia w tej kategorii są teraz niedostępne.",
636
+ "staff.support.errors.fallbackProjectInUse": "Projekt wsparcia ma już zadania, więc jego utworzenia nie można cofnąć. Zamiast tego wskaż w regule zapasowej inny projekt.",
637
+ "staff.support.errors.fallbackRuleExists": "Ta organizacja ma już regułę zapasową.",
638
+ "staff.support.errors.fallbackRuleRequired": "Reguły zapasowej nie można usunąć ani wstrzymać. Zamiast tego wskaż inny projekt.",
639
+ "staff.support.errors.fileRequired": "Wybierz plik przed przesłaniem.",
640
+ "staff.support.errors.projectHasNoDefaultStatus": "Wybrany projekt nie ma domyślnego statusu zadań, więc nie można do niego kierować zgłoszeń.",
641
+ "staff.support.errors.projectNotFound": "Wybrany projekt nie istnieje w tej organizacji.",
642
+ "staff.support.errors.referenceConflict": "Jednocześnie utworzono zbyt wiele zgłoszeń. Wyślij ponownie.",
643
+ "staff.support.errors.routingRuleNotFound": "Nie znaleziono reguły routingu.",
644
+ "staff.support.errors.ticketNotFound": "Nie znaleziono zgłoszenia.",
645
+ "staff.support.fallbackProject.name": "Obsługa klienta",
646
+ "staff.support.settings.actions.cancel": "Anuluj",
647
+ "staff.support.settings.actions.delete": "Usuń",
648
+ "staff.support.settings.actions.edit": "Edytuj",
649
+ "staff.support.settings.actions.refresh": "Odśwież",
650
+ "staff.support.settings.actions.retry": "Spróbuj ponownie",
651
+ "staff.support.settings.actions.save": "Zapisz",
652
+ "staff.support.settings.categories.add": "Dodaj kategorię",
653
+ "staff.support.settings.categories.appearance": "Wygląd",
654
+ "staff.support.settings.categories.colorClear": "Wyczyść kolor",
655
+ "staff.support.settings.categories.colorHelp": "Kolor plakietki kategorii.",
656
+ "staff.support.settings.categories.colorLabel": "Kolor",
657
+ "staff.support.settings.categories.confirmDelete": "Usunąć kategorię „{value}”?",
658
+ "staff.support.settings.categories.createTitle": "Dodaj kategorię",
659
+ "staff.support.settings.categories.deleted": "Kategoria usunięta.",
660
+ "staff.support.settings.categories.description": "Kategorie, które klienci wybierają, zgłaszając zgłoszenie w portalu.",
661
+ "staff.support.settings.categories.editTitle": "Edytuj kategorię",
662
+ "staff.support.settings.categories.empty": "Brak kategorii.",
663
+ "staff.support.settings.categories.iconBrowse": "Przeglądaj ikony",
664
+ "staff.support.settings.categories.iconClear": "Wyczyść ikonę",
665
+ "staff.support.settings.categories.iconLabel": "Ikona",
666
+ "staff.support.settings.categories.iconPlaceholder": "Nazwa ikony",
667
+ "staff.support.settings.categories.iconSearchEmpty": "Nie znaleziono ikon.",
668
+ "staff.support.settings.categories.iconSearchPlaceholder": "Szukaj ikon",
669
+ "staff.support.settings.categories.iconSuggestions": "Sugestie",
670
+ "staff.support.settings.categories.inherited": "Odziedziczona",
671
+ "staff.support.settings.categories.inheritedTooltip": "Zdefiniowana przez organizację nadrzędną.",
672
+ "staff.support.settings.categories.label": "Etykieta",
673
+ "staff.support.settings.categories.missingDictionary": "Słownik kategorii zgłoszeń nie został jeszcze utworzony dla tej organizacji.",
674
+ "staff.support.settings.categories.noAccess": "Nie masz uprawnień do przeglądania kategorii zgłoszeń.",
675
+ "staff.support.settings.categories.previewEmpty": "Brak wyglądu",
676
+ "staff.support.settings.categories.saved": "Kategoria zapisana.",
677
+ "staff.support.settings.categories.search": "Szukaj kategorii",
678
+ "staff.support.settings.categories.title": "Kategorie",
679
+ "staff.support.settings.categories.value": "Wartość",
680
+ "staff.support.settings.description": "Skonfiguruj kategorie zgłoszeń, ich kierowanie do projektów oraz prefiks numeru zgłoszenia.",
681
+ "staff.support.settings.errors.delete": "Nie udało się usunąć.",
682
+ "staff.support.settings.errors.load": "Nie udało się wczytać ustawień wsparcia.",
683
+ "staff.support.settings.errors.save": "Nie udało się zapisać.",
684
+ "staff.support.settings.errors.saveBlocked": "Zapis zablokowany przez walidację",
685
+ "staff.support.settings.prefix.description": "Klienci widzą numery zgłoszeń, np. SUP-1042. Prefiks obowiązuje w całym tenancie.",
686
+ "staff.support.settings.prefix.invalid": "Użyj 2–10 wielkich liter lub cyfr, zaczynając od litery.",
687
+ "staff.support.settings.prefix.saved": "Prefiks numeru zapisany.",
688
+ "staff.support.settings.prefix.title": "Prefiks numeru",
689
+ "staff.support.settings.preview.empty": "Brak kategorii do skierowania.",
690
+ "staff.support.settings.preview.title": "Dokąd trafiają zgłoszenia",
691
+ "staff.support.settings.preview.unavailable": "Niedostępne w portalu",
692
+ "staff.support.settings.preview.via": "Skierowane przez",
693
+ "staff.support.settings.preview.viaCategory": "Regułę kategorii",
694
+ "staff.support.settings.preview.viaFallback": "Regułę domyślną",
695
+ "staff.support.settings.referencePrefix": "Prefiks numeru",
696
+ "staff.support.settings.routing.active": "Aktywna",
697
+ "staff.support.settings.routing.addRule": "Dodaj regułę",
698
+ "staff.support.settings.routing.addRuleTitle": "Dodaj regułę",
699
+ "staff.support.settings.routing.category": "Kategoria",
700
+ "staff.support.settings.routing.confirmDelete": "Usunąć tę regułę? Kategoria trafi do projektu domyślnego.",
701
+ "staff.support.settings.routing.createFallback": "Utwórz projekt domyślny",
702
+ "staff.support.settings.routing.deleted": "Reguła usunięta.",
703
+ "staff.support.settings.routing.description": "Każda kategoria bez działającej reguły trafia do projektu domyślnego. Dodaj regułę, aby skierować kategorię do własnego projektu.",
704
+ "staff.support.settings.routing.editRuleTitle": "Edytuj regułę",
705
+ "staff.support.settings.routing.fallbackCreated": "Utworzono projekt domyślny.",
706
+ "staff.support.settings.routing.fallbackProject": "Projekt domyślny",
707
+ "staff.support.settings.routing.fallbackUnusableDescription": "Jest zakończony, usunięty lub nie ma domyślnego statusu. Wskaż inny projekt w regule domyślnej.",
708
+ "staff.support.settings.routing.fallbackUnusableTitle": "Projekt domyślny nie może przyjmować zgłoszeń",
709
+ "staff.support.settings.routing.fallingBack": "Trafia do {project}",
710
+ "staff.support.settings.routing.loading": "Wczytywanie kierowania…",
711
+ "staff.support.settings.routing.noFallbackDescription": "Klienci nie mogą zgłaszać kategorii bez własnej reguły, dopóki nie istnieje projekt domyślny.",
712
+ "staff.support.settings.routing.noFallbackTitle": "Brak projektu domyślnego",
713
+ "staff.support.settings.routing.noOverrides": "Brak reguł kategorii. Każda kategoria trafia do projektu domyślnego.",
714
+ "staff.support.settings.routing.nobodyNotified": "Nikt w tym projekcie nie zostanie powiadomiony o kierowanych tutaj zgłoszeniach: projekt nie ma aktywnej osoby przydzielającej, użytecznego domyślnego wykonawcy ani właściciela. Nowe zgłoszenia trafią zamiast tego do kierowników projektów organizacji.",
715
+ "staff.support.settings.routing.overrides": "Reguły kategorii",
716
+ "staff.support.settings.routing.problem.categoryMissing": "Kategoria już nie istnieje.",
717
+ "staff.support.settings.routing.problem.paused": "Reguła jest wstrzymana.",
718
+ "staff.support.settings.routing.problem.projectUnusable": "Projekt jest zakończony, usunięty lub nie ma domyślnego statusu.",
719
+ "staff.support.settings.routing.project": "Projekt",
720
+ "staff.support.settings.routing.routing": "Kieruje",
721
+ "staff.support.settings.routing.saved": "Kierowanie zapisane.",
722
+ "staff.support.settings.routing.searchProject": "Szukaj projektów",
723
+ "staff.support.settings.routing.selectCategory": "Wybierz kategorię",
724
+ "staff.support.settings.routing.selectProject": "Wybierz projekt",
725
+ "staff.support.settings.routing.state": "Stan",
726
+ "staff.support.settings.routing.title": "Kierowanie",
727
+ "staff.support.settings.routing.unnotifiedTickets.few": "Nikt nie został powiadomiony o {count} zgłoszeniach.",
728
+ "staff.support.settings.routing.unnotifiedTickets.many": "Nikt nie został powiadomiony o {count} zgłoszeniach.",
729
+ "staff.support.settings.routing.unnotifiedTickets.one": "Nikt nie został powiadomiony o {count} zgłoszeniu.",
730
+ "staff.support.settings.routing.unnotifiedTickets.other": "Nikt nie został powiadomiony o {count} zgłoszenia.",
731
+ "staff.support.settings.routing.unnotifiedTicketsLink": "Otwórz je w skrzynce zgłoszeń",
732
+ "staff.support.settings.title": "Wsparcie",
733
+ "staff.support.tickets.columns.assignee": "Wykonawca",
734
+ "staff.support.tickets.columns.category": "Kategoria",
735
+ "staff.support.tickets.columns.customer": "Klient",
736
+ "staff.support.tickets.columns.lastActivity": "Ostatnia aktywność",
737
+ "staff.support.tickets.columns.portalStatus": "Status",
738
+ "staff.support.tickets.columns.project": "Projekt",
739
+ "staff.support.tickets.columns.reference": "Zgłoszenie",
740
+ "staff.support.tickets.columns.subject": "Temat",
741
+ "staff.support.tickets.customerKind.company": "Firma",
742
+ "staff.support.tickets.customerKind.person": "Osoba",
743
+ "staff.support.tickets.empty": "Brak zgłoszeń pasujących do filtrów.",
744
+ "staff.support.tickets.filters.assignee": "Wykonawca",
745
+ "staff.support.tickets.filters.category": "Kategoria",
746
+ "staff.support.tickets.filters.customer": "Klient",
747
+ "staff.support.tickets.filters.customerPlaceholder": "Szukaj klientów",
748
+ "staff.support.tickets.filters.nobodyNotified": "Nikt nie został powiadomiony",
749
+ "staff.support.tickets.filters.portalStatus": "Status widoczny dla klienta",
750
+ "staff.support.tickets.filters.project": "Projekt",
751
+ "staff.support.tickets.filters.projectPlaceholder": "Szukaj projektów",
752
+ "staff.support.tickets.loadError": "Nie udało się wczytać zgłoszeń.",
753
+ "staff.support.tickets.nobodyNotified": "Nikt nie został powiadomiony",
754
+ "staff.support.tickets.optionsLoadError": "Nie udało się wczytać opcji filtrów.",
755
+ "staff.support.tickets.refresh": "Odśwież",
756
+ "staff.support.tickets.searchPlaceholder": "Szukaj po numerze zgłoszenia",
757
+ "staff.support.tickets.status.inProgress": "W toku",
758
+ "staff.support.tickets.status.received": "Przyjęte",
759
+ "staff.support.tickets.status.resolved": "Rozwiązane",
760
+ "staff.support.tickets.title": "Skrzynka zgłoszeń",
761
+ "staff.support.tickets.unassigned": "Bez wykonawcy",
527
762
  "staff.teamMembers.actions.add": "Dodaj członka",
528
763
  "staff.teamMembers.actions.backToList": "Powrót do członków zespołu",
529
764
  "staff.teamMembers.actions.delete": "Usuń",
@@ -1023,6 +1258,20 @@
1023
1258
  "staff.time_tracking.access.request.error": "Nie udało się wysłać prośby o dostęp.",
1024
1259
  "staff.time_tracking.access.request.sent": "Prośba wysłana",
1025
1260
  "staff.time_tracking.access.request.success": "Twoja prośba została wysłana do Team Leaderów.",
1261
+ "staff.time_tracking.assigners.badge": "Przydzielający",
1262
+ "staff.time_tracking.assigners.defaultAssignee": "Domyślny wykonawca zgłoszeń z portalu",
1263
+ "staff.time_tracking.assigners.defaultAssigneeAfterCreate": "Zapisz projekt i dodaj członków, aby wybrać domyślnego wykonawcę.",
1264
+ "staff.time_tracking.assigners.defaultAssigneeHelp": "Nowe zgłoszenia z portalu klienta kierowane do tego projektu są przypisywane temu członkowi. Zadania utworzone na tablicy pozostają przypisane do ich autora.",
1265
+ "staff.time_tracking.assigners.defaultAssigneeInactive": "Ten członek nie jest już aktywnym członkiem projektu. Nowe zgłoszenia pozostaną nieprzypisane, a przydzielający zostaną powiadomieni.",
1266
+ "staff.time_tracking.assigners.defaultAssigneeLoadFailed": "Nie udało się wczytać członków projektu, więc nie można teraz sprawdzić domyślnej osoby przypisanej.",
1267
+ "staff.time_tracking.assigners.defaultAssigneeNone": "Brak domyślnego wykonawcy",
1268
+ "staff.time_tracking.assigners.defaultAssigneeRetry": "Spróbuj ponownie",
1269
+ "staff.time_tracking.assigners.disabled": "Członek nie jest już przydzielającym.",
1270
+ "staff.time_tracking.assigners.enabled": "Członek jest teraz przydzielającym.",
1271
+ "staff.time_tracking.assigners.help": "Przydzielający otrzymują powiadomienia o nowej i zwolnionej pracy oraz mogą przejmować nieprzypisane zadania.",
1272
+ "staff.time_tracking.assigners.label": "Przydzielający",
1273
+ "staff.time_tracking.assigners.needsUser": "Przydzielającym może być tylko członek z kontem użytkownika.",
1274
+ "staff.time_tracking.assigners.saveError": "Nie udało się zmienić ustawienia przydzielającego.",
1026
1275
  "staff.time_tracking.board.addStatus.cta": "Dodaj status",
1027
1276
  "staff.time_tracking.board.addStatus.error": "Nie udało się dodać kolumny.",
1028
1277
  "staff.time_tracking.board.addStatus.placeholder": "Nazwa kolumny",
@@ -1031,6 +1280,7 @@
1031
1280
  "staff.time_tracking.board.card.addTimeAria": "Dodaj czas do zadania {title}",
1032
1281
  "staff.time_tracking.board.card.aria": "Zadanie: {title}",
1033
1282
  "staff.time_tracking.board.card.assignee": "Przypisane do: {name}",
1283
+ "staff.time_tracking.board.card.customerRequest": "Zgłoszenie klienta",
1034
1284
  "staff.time_tracking.board.card.moveTo.aria": "Przenieś zadanie {title} do innej kolumny",
1035
1285
  "staff.time_tracking.board.card.moveTo.cta": "Przenieś",
1036
1286
  "staff.time_tracking.board.card.moveTo.menu": "Przenieś zadanie {title} do",
@@ -1059,6 +1309,8 @@
1059
1309
  "staff.time_tracking.board.filters.remove": "Usuń filtr: {label}",
1060
1310
  "staff.time_tracking.board.filters.status": "Status",
1061
1311
  "staff.time_tracking.board.filters.tag": "Tag",
1312
+ "staff.time_tracking.board.filters.unassigned": "Nieprzypisane",
1313
+ "staff.time_tracking.board.filters.unassignedWithCount": "Nieprzypisane ({count})",
1062
1314
  "staff.time_tracking.board.list.caption": "Zadania",
1063
1315
  "staff.time_tracking.board.list.columns.assignee": "Osoba",
1064
1316
  "staff.time_tracking.board.list.columns.hours": "Zalogowane",
@@ -1613,6 +1865,8 @@
1613
1865
  "staff.time_tracking.settings.scope.hint": "Stawka i waluta pozostają na poziomie projektu, a nadpisanie stawki — na poziomie wpisu.",
1614
1866
  "staff.time_tracking.settings.scope.title": "Zakres ustawień",
1615
1867
  "staff.time_tracking.settings.subtitle": "Reguły wspólne dla wszystkich klientów i projektów",
1868
+ "staff.time_tracking.settings.tabs.general": "Śledzenie czasu",
1869
+ "staff.time_tracking.settings.tabs.label": "Sekcje ustawień",
1616
1870
  "staff.time_tracking.settings.targets.dailyHours": "Dzienny cel godzin",
1617
1871
  "staff.time_tracking.settings.targets.dailyHoursError": "Podaj liczbę godzin od 0 do 24 albo zostaw pole puste.",
1618
1872
  "staff.time_tracking.settings.targets.dailyHoursHint": "Skalowanie pasków obciążenia w timesheecie. Zostaw puste, aby wyłączyć cele.",
@@ -1640,15 +1894,32 @@
1640
1894
  "staff.time_tracking.tags.placeholder": "Szukaj tagów",
1641
1895
  "staff.time_tracking.tags.remove": "Usuń tag",
1642
1896
  "staff.time_tracking.tags.title": "Tagi",
1897
+ "staff.time_tracking.taskComments.addInternalNote": "Dodaj notatkę wewnętrzną",
1643
1898
  "staff.time_tracking.taskComments.empty": "Brak komentarzy.",
1899
+ "staff.time_tracking.taskComments.errors.customerImmutable": "Wiadomości napisanych przez klienta nie można edytować ani usuwać.",
1644
1900
  "staff.time_tracking.taskComments.errors.idRequired": "Identyfikator komentarza jest wymagany.",
1645
1901
  "staff.time_tracking.taskComments.errors.notAuthor": "Możesz edytować lub usuwać tylko własne komentarze.",
1646
1902
  "staff.time_tracking.taskComments.errors.notFound": "Nie znaleziono komentarza lub brak dostępu.",
1647
1903
  "staff.time_tracking.taskComments.errors.taskIdRequired": "Identyfikator zadania jest wymagany.",
1904
+ "staff.time_tracking.taskComments.errors.visibilityPortalOnly": "Tylko zgłoszenia klientów mogą zawierać odpowiedzi widoczne dla klienta.",
1905
+ "staff.time_tracking.taskComments.fromCustomer": "Klient",
1906
+ "staff.time_tracking.taskComments.internalNote": "Notatka wewnętrzna",
1907
+ "staff.time_tracking.taskComments.makeInternal": "Ukryj przed klientem",
1908
+ "staff.time_tracking.taskComments.makeInternalError": "Nie udało się zmienić odpowiedzi.",
1648
1909
  "staff.time_tracking.taskComments.placeholder": "Napisz komentarz…",
1910
+ "staff.time_tracking.taskComments.replyToCustomer": "Odpowiedz klientowi",
1911
+ "staff.time_tracking.taskComments.shortcutInternal": "dodaje notatkę wewnętrzną",
1649
1912
  "staff.time_tracking.taskComments.submit": "Skomentuj",
1650
1913
  "staff.time_tracking.taskComments.submitHint": "⌘↵ wysyła",
1914
+ "staff.time_tracking.taskComments.supportPlaceholder": "Napisz odpowiedź lub notatkę wewnętrzną…",
1651
1915
  "staff.time_tracking.taskComments.title": "Komentarze",
1916
+ "staff.time_tracking.taskComments.visibleToCustomer": "Widoczne dla klienta",
1917
+ "staff.time_tracking.taskDrawer.assignment.claim": "Przejmij",
1918
+ "staff.time_tracking.taskDrawer.assignment.claimError": "Nie udało się przejąć zadania.",
1919
+ "staff.time_tracking.taskDrawer.assignment.claimed": "Zadanie przejęte.",
1920
+ "staff.time_tracking.taskDrawer.assignment.release": "Zwolnij",
1921
+ "staff.time_tracking.taskDrawer.assignment.releaseError": "Nie udało się zwolnić zadania.",
1922
+ "staff.time_tracking.taskDrawer.assignment.released": "Zadanie zwolnione.",
1652
1923
  "staff.time_tracking.taskDrawer.autoSave": "Zmiany zapisują się automatycznie",
1653
1924
  "staff.time_tracking.taskDrawer.close": "Zamknij",
1654
1925
  "staff.time_tracking.taskDrawer.comments.empty": "Brak komentarzy.",
@@ -1660,6 +1931,7 @@
1660
1931
  "staff.time_tracking.taskDrawer.comments.submit": "Skomentuj",
1661
1932
  "staff.time_tracking.taskDrawer.comments.title": "Komentarze ({count})",
1662
1933
  "staff.time_tracking.taskDrawer.comments.unknownAuthor": "Nieznany autor",
1934
+ "staff.time_tracking.taskDrawer.conflict": "Ktoś inny zmienił to zadanie. Widzisz teraz jego najnowszą wersję. Sprawdź ją i spróbuj ponownie.",
1663
1935
  "staff.time_tracking.taskDrawer.created": "utworzone {date}",
1664
1936
  "staff.time_tracking.taskDrawer.entries.empty": "Brak wpisów czasu.",
1665
1937
  "staff.time_tracking.taskDrawer.entries.noDescription": "Bez opisu",
@@ -1699,6 +1971,18 @@
1699
1971
  "staff.time_tracking.taskDrawer.subtasks.title": "Podzadania",
1700
1972
  "staff.time_tracking.taskDrawer.subtasks.toggle": "Oznacz „{title}” jako zrobione",
1701
1973
  "staff.time_tracking.taskDrawer.subtasks.toggleError": "Nie udało się zmienić statusu podzadania.",
1974
+ "staff.time_tracking.taskDrawer.support.category": "Kategoria",
1975
+ "staff.time_tracking.taskDrawer.support.customer": "Klient",
1976
+ "staff.time_tracking.taskDrawer.support.originalRequest": "Oryginalne zgłoszenie",
1977
+ "staff.time_tracking.taskDrawer.support.portalStatus": "Klient widzi",
1978
+ "staff.time_tracking.taskDrawer.support.reference": "Zgłoszenie",
1979
+ "staff.time_tracking.taskDrawer.support.reporter": "Zgłaszający",
1980
+ "staff.time_tracking.taskDrawer.support.routedVia": "Przekierowane przez",
1981
+ "staff.time_tracking.taskDrawer.support.routedViaCategory": "Regułę kategorii",
1982
+ "staff.time_tracking.taskDrawer.support.routedViaFallback": "Projekt zapasowy",
1983
+ "staff.time_tracking.taskDrawer.support.title": "Zgłoszenie klienta",
1984
+ "staff.time_tracking.taskDrawer.support.titleHint": "Klient widzi swoje oryginalne zgłoszenie, a nie tytuł i opis zadania.",
1985
+ "staff.time_tracking.taskDrawer.support.unknown": "Nieznany",
1702
1986
  "staff.time_tracking.taskDrawer.timer.start": "Start",
1703
1987
  "staff.time_tracking.taskDrawer.timer.stop": "Zatrzymaj {elapsed}",
1704
1988
  "staff.time_tracking.taskDrawer.timer.switchText": "Jednocześnie może działać tylko jeden timer. Zatrzymać tamten i uruchomić tutaj?",
@@ -1787,10 +2071,12 @@
1787
2071
  "staff.time_tracking.timesheet.view.grid": "Siatka",
1788
2072
  "staff.time_tracking.timesheet.view.label": "Widok timesheetu",
1789
2073
  "staff.time_tracking.timesheet.view.list": "Lista",
2074
+ "staff.timesheets.errors.assignerNeedsUser": "Przydzielającym może być tylko członek zespołu z kontem użytkownika, ponieważ musi się logować i otrzymywać powiadomienia.",
1790
2075
  "staff.timesheets.errors.bulkSave": "Nie udało się zbiorczo zapisać wpisów czasu.",
1791
2076
  "staff.timesheets.errors.bulkTagsUnsupported": "Tagów nie można zmieniać w siatce karty czasu pracy. Otwórz wpis czasu, aby edytować jego tagi.",
1792
2077
  "staff.timesheets.errors.copyDaySameDate": "Dzień źródłowy i docelowy muszą być różne.",
1793
2078
  "staff.timesheets.errors.copyDayTargetNotEmpty": "Dzień docelowy zawiera już wpisy czasu. Przejrzyj je najpierw lub potwierdź, aby mimo to dodać kopie.",
2079
+ "staff.timesheets.errors.defaultAssigneeNotMember": "Domyślny wykonawca musi być aktywnym członkiem tego projektu.",
1794
2080
  "staff.timesheets.errors.entryNotFound": "Wpis czasu nie istnieje, został usunięty lub nie należy do Ciebie.",
1795
2081
  "staff.timesheets.errors.invalidBody": "Nieprawidłowe ciało żądania.",
1796
2082
  "staff.timesheets.errors.invalidProjectId": "Nieprawidłowy identyfikator projektu.",
@@ -1801,6 +2087,8 @@
1801
2087
  "staff.timesheets.errors.noActiveSegment": "Nie znaleziono aktywnego segmentu czasomierza dla tego wpisu.",
1802
2088
  "staff.timesheets.errors.noStaffMember": "Brak pracownika powiązanego z Twoim kontem.",
1803
2089
  "staff.timesheets.errors.notAssigned": "Nie jesteś przypisany do tego projektu.",
2090
+ "staff.timesheets.errors.notAssignee": "Tylko obecny wykonawca może zwolnić to zadanie.",
2091
+ "staff.timesheets.errors.notAssigner": "Tylko aktywni przydzielający tego projektu mogą przejmować zadania.",
1804
2092
  "staff.timesheets.errors.notOwner": "Możesz zarządzać tylko własnymi wpisami czasu.",
1805
2093
  "staff.timesheets.errors.outsideAssignmentWindow": "Ta data wykracza poza Twoje przypisanie do tego projektu.",
1806
2094
  "staff.timesheets.errors.projectCodeDuplicate": "Projekt o tym kodzie już istnieje.",
@@ -1810,6 +2098,9 @@
1810
2098
  "staff.timesheets.errors.projectsKpis": "Nie udało się załadować wskaźników KPI projektów.",
1811
2099
  "staff.timesheets.errors.segmentCreate": "Nie udało się utworzyć segmentu wpisu czasu.",
1812
2100
  "staff.timesheets.errors.staffMemberNotFound": "Pracownik nie został znaleziony lub jest niedostępny.",
2101
+ "staff.timesheets.errors.taskAlreadyClaimed": "Ktoś inny już przejął to zadanie.",
2102
+ "staff.timesheets.errors.taskChanged": "Zadanie zmieniło się podczas zwalniania. Odśwież i spróbuj ponownie.",
2103
+ "staff.timesheets.errors.taskNotClaimable": "Nie można przejąć zakończonego zadania.",
1813
2104
  "staff.timesheets.errors.taskNotFound": "Nie znaleziono zadania lub brak dostępu.",
1814
2105
  "staff.timesheets.errors.timerAlreadyRunning": "Inny licznik czasu jest już uruchomiony. Zatrzymaj go przed rozpoczęciem nowego.",
1815
2106
  "staff.timesheets.errors.timerAlreadyStarted": "Czasomierz jest już uruchomiony dla tego wpisu.",
@@ -7,7 +7,7 @@ export const metadata: ModuleInfo = {
7
7
  description: 'Teams, roles, and employee rosters.',
8
8
  author: 'Open Mercato Team',
9
9
  license: 'MIT',
10
- requires: ['planner', 'resources'],
10
+ requires: ['planner', 'resources', 'dictionaries'],
11
11
  ejectable: true,
12
12
  }
13
13
 
@@ -1,4 +1,4 @@
1
- import type { CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'
1
+ import type { CrudEventsConfig, CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'
2
2
  import type {
3
3
  StaffLeaveRequest,
4
4
  StaffTeam,
@@ -56,6 +56,7 @@ export const staffTimeEntryCommandIds = {
56
56
 
57
57
  export const staffTimeEntryCrudEvents = buildCrudEvents<StaffTimeEntry>('timesheets.time_entry')
58
58
  export const staffTimeProjectCrudEvents = buildCrudEvents<StaffTimeProject>('timesheets.time_project')
59
+ export const staffTimeProjectCrudIndexer: CrudIndexerConfig<StaffTimeProject> = { entityType: 'staff:staff_time_project' }
59
60
  export const staffTimeProjectMemberCrudEvents = buildCrudEvents<StaffTimeProjectMember>('timesheets.time_project_member')
60
61
  export const staffTimeTaskCrudEvents = buildCrudEvents<StaffTimeTask>('timesheets.time_task')
61
62
  export const staffTimeTaskStatusCrudEvents = buildCrudEvents<StaffTimeTaskStatus>('timesheets.time_task_status')
@@ -0,0 +1,43 @@
1
+ import type { ScopedAttachmentUploadErrorCode } from '@open-mercato/core/modules/attachments/lib/scoped-upload-service'
2
+
3
+ export const SUPPORT_TICKET_ATTACHMENT_ENTITY_ID = 'staff:staff_time_task'
4
+ export const CUSTOMER_VISIBLE_ATTACHMENT_TAG = 'customer-visible'
5
+ export const CUSTOMER_UPLOAD_TAG_PREFIX = 'customer-upload:'
6
+
7
+ export function customerUploadTag(customerUserId: string): string {
8
+ return `${CUSTOMER_UPLOAD_TAG_PREFIX}${customerUserId}`
9
+ }
10
+
11
+ export function isCustomerVisibleAttachmentTags(tags: readonly string[] | null | undefined): boolean {
12
+ return Array.isArray(tags) && tags.includes(CUSTOMER_VISIBLE_ATTACHMENT_TAG)
13
+ }
14
+
15
+ type ErrorTranslation = readonly [key: string, fallback: string]
16
+
17
+ /**
18
+ * The scoped upload service reports failures as machine codes; the portal answers
19
+ * with the attachments module's own translated message for the same condition, the
20
+ * way `warranty_claims` does, so the client can show `error` verbatim.
21
+ */
22
+ export const SUPPORT_UPLOAD_ERROR_TRANSLATIONS: Record<ScopedAttachmentUploadErrorCode, ErrorTranslation> = {
23
+ dangerous_executable: ['attachments.errors.dangerousExecutable', 'Executable file types are not allowed as attachments.'],
24
+ max_upload_size: ['attachments.errors.maxUploadSize', 'Attachment exceeds the maximum upload size.'],
25
+ active_content: ['attachments.errors.activeContentBlocked', 'Active content uploads are not allowed.'],
26
+ partition_unavailable: ['attachments.errors.partitionUnavailable', 'Attachment partition is not available for this scope.'],
27
+ quota_exceeded: ['attachments.errors.quotaExceeded', 'Attachment storage quota exceeded for this tenant.'],
28
+ quota_target_exists: ['attachments.errors.storagePathExists', 'The target storage path already exists.'],
29
+ quota_unavailable: ['attachments.errors.quotaUnavailable', 'Storage quota accounting is unavailable.'],
30
+ quota_recovery_unsupported: ['attachments.errors.quotaRecoveryUnsupported', 'Storage driver cannot participate in quota recovery.'],
31
+ storage_failed: ['attachments.errors.storageFailed', 'Failed to store the attachment file.'],
32
+ persistence_failed: ['attachments.errors.persistenceFailed', 'Failed to persist attachment.'],
33
+ }
34
+
35
+ const UPLOAD_FAILED_TRANSLATION: ErrorTranslation = ['attachments.errors.uploadFailed', 'Attachment upload failed.']
36
+
37
+ export function translateSupportUploadError(
38
+ code: string,
39
+ translate: (key: string, fallback: string) => string,
40
+ ): string {
41
+ const entry = (SUPPORT_UPLOAD_ERROR_TRANSLATIONS as Record<string, ErrorTranslation | undefined>)[code] ?? UPLOAD_FAILED_TRANSLATION
42
+ return translate(entry[0], entry[1])
43
+ }
@@ -0,0 +1,120 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import { Dictionary, DictionaryEntry } from '@open-mercato/core/modules/dictionaries/data/entities'
3
+ import { normalizeDictionaryValue } from '@open-mercato/core/modules/dictionaries/lib/utils'
4
+ import { isUniqueViolation } from '@open-mercato/shared/lib/crud/errors'
5
+
6
+ export const SUPPORT_TICKET_CATEGORY_DICTIONARY_KEY = 'staff.support_ticket_category'
7
+
8
+ type SupportScope = {
9
+ tenantId: string
10
+ organizationId: string
11
+ }
12
+
13
+ export type SupportTicketCategoryOption = {
14
+ value: string
15
+ label: string
16
+ }
17
+
18
+ type CategorySeed = {
19
+ value: string
20
+ label: string
21
+ color: string
22
+ icon: string
23
+ }
24
+
25
+ const CATEGORY_DEFAULTS: CategorySeed[] = [
26
+ { value: 'general-question', label: 'General question', color: '#6366f1', icon: 'lucide:message-circle-question' },
27
+ { value: 'technical-issue', label: 'Technical issue', color: '#ef4444', icon: 'lucide:bug' },
28
+ { value: 'change-request', label: 'Change request', color: '#0d9488', icon: 'lucide:git-pull-request' },
29
+ { value: 'billing', label: 'Billing', color: '#f59e0b', icon: 'lucide:receipt' },
30
+ ]
31
+
32
+ export async function findSupportCategoryDictionary(
33
+ em: EntityManager,
34
+ scope: SupportScope,
35
+ ): Promise<Dictionary | null> {
36
+ return em.findOne(Dictionary, {
37
+ tenantId: scope.tenantId,
38
+ organizationId: scope.organizationId,
39
+ key: SUPPORT_TICKET_CATEGORY_DICTIONARY_KEY,
40
+ deletedAt: null,
41
+ })
42
+ }
43
+
44
+ export async function loadSupportTicketCategories(
45
+ em: EntityManager,
46
+ scope: SupportScope,
47
+ ): Promise<SupportTicketCategoryOption[]> {
48
+ const dictionary = await findSupportCategoryDictionary(em, scope)
49
+ if (!dictionary || !dictionary.isActive) return []
50
+ const entries = await em.find(
51
+ DictionaryEntry,
52
+ { dictionary, tenantId: scope.tenantId, organizationId: scope.organizationId },
53
+ { orderBy: { position: 'asc', label: 'asc' } },
54
+ )
55
+ return entries.map((entry) => ({ value: entry.value, label: entry.label }))
56
+ }
57
+
58
+ export async function findSupportTicketCategory(
59
+ em: EntityManager,
60
+ scope: SupportScope,
61
+ value: string,
62
+ ): Promise<SupportTicketCategoryOption | null> {
63
+ const categories = await loadSupportTicketCategories(em, scope)
64
+ return categories.find((category) => category.value === value) ?? null
65
+ }
66
+
67
+ /**
68
+ * Seeds the category dictionary together with its default entries, once per organization.
69
+ * Runs only when no support-category dictionary row exists yet (live or soft-deleted), so
70
+ * a re-run never re-adds a default category an admin deleted. Dictionary and entries are
71
+ * written in one flush on a fork, so a failed or lost race leaves nothing half-seeded.
72
+ * Returns `true` when this call created the dictionary.
73
+ */
74
+ export async function seedSupportTicketCategories(em: EntityManager, scope: SupportScope): Promise<boolean> {
75
+ const forked = em.fork()
76
+ const existing = await forked.findOne(Dictionary, {
77
+ tenantId: scope.tenantId,
78
+ organizationId: scope.organizationId,
79
+ key: SUPPORT_TICKET_CATEGORY_DICTIONARY_KEY,
80
+ })
81
+ if (existing) return false
82
+ const now = new Date()
83
+ const dictionary = forked.create(Dictionary, {
84
+ tenantId: scope.tenantId,
85
+ organizationId: scope.organizationId,
86
+ key: SUPPORT_TICKET_CATEGORY_DICTIONARY_KEY,
87
+ name: 'Support ticket categories',
88
+ description: 'Categories customers pick when they file a support ticket in the portal.',
89
+ isSystem: true,
90
+ isActive: true,
91
+ managerVisibility: 'hidden',
92
+ createdAt: now,
93
+ updatedAt: now,
94
+ })
95
+ forked.persist(dictionary)
96
+ CATEGORY_DEFAULTS.forEach((seed, index) => {
97
+ forked.persist(
98
+ forked.create(DictionaryEntry, {
99
+ dictionary,
100
+ tenantId: scope.tenantId,
101
+ organizationId: scope.organizationId,
102
+ value: seed.value,
103
+ normalizedValue: normalizeDictionaryValue(seed.value),
104
+ label: seed.label,
105
+ color: seed.color,
106
+ icon: seed.icon,
107
+ position: index,
108
+ createdAt: now,
109
+ updatedAt: now,
110
+ }),
111
+ )
112
+ })
113
+ try {
114
+ await forked.flush()
115
+ } catch (err) {
116
+ if (isUniqueViolation(err)) return false
117
+ throw err
118
+ }
119
+ return true
120
+ }