@open-mercato/core 0.6.4-develop.4210.1.d412061cfe → 0.6.4-develop.4236.1.9fa6806b34

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 (370) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/staff_time_entry/index.js +37 -0
  3. package/dist/generated/entities/staff_time_entry/index.js.map +7 -0
  4. package/dist/generated/entities/staff_time_entry_segment/index.js +23 -0
  5. package/dist/generated/entities/staff_time_entry_segment/index.js.map +7 -0
  6. package/dist/generated/entities/staff_time_project/index.js +35 -0
  7. package/dist/generated/entities/staff_time_project/index.js.map +7 -0
  8. package/dist/generated/entities/staff_time_project_member/index.js +29 -0
  9. package/dist/generated/entities/staff_time_project_member/index.js.map +7 -0
  10. package/dist/generated/entities.ids.generated.js +5 -1
  11. package/dist/generated/entities.ids.generated.js.map +2 -2
  12. package/dist/generated/entity-fields-registry.js +64 -0
  13. package/dist/generated/entity-fields-registry.js.map +2 -2
  14. package/dist/helpers/integration/timesheetFixtures.js +50 -0
  15. package/dist/helpers/integration/timesheetFixtures.js.map +7 -0
  16. package/dist/modules/attachments/api/library/[id]/route.js +20 -16
  17. package/dist/modules/attachments/api/library/[id]/route.js.map +2 -2
  18. package/dist/modules/attachments/api/route.js +18 -14
  19. package/dist/modules/attachments/api/route.js.map +2 -2
  20. package/dist/modules/auth/api/roles/acl/route.js +10 -4
  21. package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
  22. package/dist/modules/auth/api/sidebar/preferences/route.js +27 -20
  23. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  24. package/dist/modules/auth/api/users/acl/route.js +16 -11
  25. package/dist/modules/auth/api/users/acl/route.js.map +2 -2
  26. package/dist/modules/auth/commands/users.js +87 -71
  27. package/dist/modules/auth/commands/users.js.map +2 -2
  28. package/dist/modules/auth/services/sidebarPreferencesService.js +39 -30
  29. package/dist/modules/auth/services/sidebarPreferencesService.js.map +2 -2
  30. package/dist/modules/catalog/commands/categories.js +61 -12
  31. package/dist/modules/catalog/commands/categories.js.map +2 -2
  32. package/dist/modules/catalog/commands/products.js +79 -54
  33. package/dist/modules/catalog/commands/products.js.map +2 -2
  34. package/dist/modules/catalog/commands/variants.js +29 -16
  35. package/dist/modules/catalog/commands/variants.js.map +2 -2
  36. package/dist/modules/currencies/commands/currencies.js +15 -8
  37. package/dist/modules/currencies/commands/currencies.js.map +2 -2
  38. package/dist/modules/customer_accounts/api/admin/users.js +27 -26
  39. package/dist/modules/customer_accounts/api/admin/users.js.map +2 -2
  40. package/dist/modules/customer_accounts/api/password/reset-confirm.js +5 -5
  41. package/dist/modules/customer_accounts/api/password/reset-confirm.js.map +2 -2
  42. package/dist/modules/customer_accounts/api/portal/users/[id]/roles.js +11 -10
  43. package/dist/modules/customer_accounts/api/portal/users/[id]/roles.js.map +2 -2
  44. package/dist/modules/customers/commands/addresses.js +35 -21
  45. package/dist/modules/customers/commands/addresses.js.map +2 -2
  46. package/dist/modules/customers/commands/companies.js +163 -162
  47. package/dist/modules/customers/commands/companies.js.map +2 -2
  48. package/dist/modules/customers/commands/deals.js +3 -4
  49. package/dist/modules/customers/commands/deals.js.map +2 -2
  50. package/dist/modules/customers/commands/interactions.js +19 -22
  51. package/dist/modules/customers/commands/interactions.js.map +2 -2
  52. package/dist/modules/customers/commands/people.js +18 -15
  53. package/dist/modules/customers/commands/people.js.map +2 -2
  54. package/dist/modules/customers/commands/personCompanyLinks.js +105 -94
  55. package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
  56. package/dist/modules/customers/commands/pipeline-stages.js +30 -23
  57. package/dist/modules/customers/commands/pipeline-stages.js.map +2 -2
  58. package/dist/modules/customers/commands/pipelines.js +27 -20
  59. package/dist/modules/customers/commands/pipelines.js.map +2 -2
  60. package/dist/modules/customers/commands/tags.js +13 -5
  61. package/dist/modules/customers/commands/tags.js.map +2 -2
  62. package/dist/modules/dashboards/api/users/widgets/route.js +0 -1
  63. package/dist/modules/dashboards/api/users/widgets/route.js.map +2 -2
  64. package/dist/modules/dashboards/api/widgets/data/route.js +29 -1
  65. package/dist/modules/dashboards/api/widgets/data/route.js.map +2 -2
  66. package/dist/modules/data_sync/lib/sync-engine.js +4 -4
  67. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  68. package/dist/modules/data_sync/lib/sync-run-service.js +51 -27
  69. package/dist/modules/data_sync/lib/sync-run-service.js.map +2 -2
  70. package/dist/modules/directory/commands/organizations.js +192 -158
  71. package/dist/modules/directory/commands/organizations.js.map +3 -3
  72. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js +22 -16
  73. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js.map +2 -2
  74. package/dist/modules/messages/commands/messages.js +77 -75
  75. package/dist/modules/messages/commands/messages.js.map +2 -2
  76. package/dist/modules/messages/commands/shared.js +132 -132
  77. package/dist/modules/messages/commands/shared.js.map +2 -2
  78. package/dist/modules/perspectives/api/[tableId]/route.js +37 -26
  79. package/dist/modules/perspectives/api/[tableId]/route.js.map +2 -2
  80. package/dist/modules/resources/commands/resources.js +125 -117
  81. package/dist/modules/resources/commands/resources.js.map +2 -2
  82. package/dist/modules/resources/commands/tags.js +7 -3
  83. package/dist/modules/resources/commands/tags.js.map +2 -2
  84. package/dist/modules/sales/api/quotes/send/route.js +12 -11
  85. package/dist/modules/sales/api/quotes/send/route.js.map +2 -2
  86. package/dist/modules/sales/commands/documents.js +629 -478
  87. package/dist/modules/sales/commands/documents.js.map +2 -2
  88. package/dist/modules/sales/commands/payments.js +146 -146
  89. package/dist/modules/sales/commands/payments.js.map +2 -2
  90. package/dist/modules/sales/commands/returns.js +68 -60
  91. package/dist/modules/sales/commands/returns.js.map +2 -2
  92. package/dist/modules/staff/acl.js +10 -1
  93. package/dist/modules/staff/acl.js.map +2 -2
  94. package/dist/modules/staff/analytics.js +33 -0
  95. package/dist/modules/staff/analytics.js.map +7 -0
  96. package/dist/modules/staff/api/guards.js +31 -0
  97. package/dist/modules/staff/api/guards.js.map +7 -0
  98. package/dist/modules/staff/api/interceptors.js +96 -0
  99. package/dist/modules/staff/api/interceptors.js.map +7 -0
  100. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js +170 -0
  101. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js.map +7 -0
  102. package/dist/modules/staff/api/timesheets/my-projects/route.js +103 -0
  103. package/dist/modules/staff/api/timesheets/my-projects/route.js.map +7 -0
  104. package/dist/modules/staff/api/timesheets/projects/kpis/route.js +147 -0
  105. package/dist/modules/staff/api/timesheets/projects/kpis/route.js.map +7 -0
  106. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js +171 -0
  107. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js.map +7 -0
  108. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js +180 -0
  109. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js.map +7 -0
  110. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +155 -0
  111. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +7 -0
  112. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js +173 -0
  113. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js.map +7 -0
  114. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js +260 -0
  115. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js.map +7 -0
  116. package/dist/modules/staff/api/timesheets/time-entries/route.js +188 -0
  117. package/dist/modules/staff/api/timesheets/time-entries/route.js.map +7 -0
  118. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js +159 -0
  119. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js.map +7 -0
  120. package/dist/modules/staff/api/timesheets/time-projects/route.js +230 -0
  121. package/dist/modules/staff/api/timesheets/time-projects/route.js.map +7 -0
  122. package/dist/modules/staff/backend/staff/timesheets/page.js +710 -0
  123. package/dist/modules/staff/backend/staff/timesheets/page.js.map +7 -0
  124. package/dist/modules/staff/backend/staff/timesheets/page.meta.js +22 -0
  125. package/dist/modules/staff/backend/staff/timesheets/page.meta.js.map +7 -0
  126. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js +125 -0
  127. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js.map +7 -0
  128. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js +16 -0
  129. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js.map +7 -0
  130. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js +418 -0
  131. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +7 -0
  132. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js +16 -0
  133. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js.map +7 -0
  134. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js +79 -0
  135. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js.map +7 -0
  136. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js +16 -0
  137. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js.map +7 -0
  138. package/dist/modules/staff/backend/staff/timesheets/projects/page.js +602 -0
  139. package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +7 -0
  140. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js +25 -0
  141. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js.map +7 -0
  142. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js +123 -0
  143. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js.map +7 -0
  144. package/dist/modules/staff/cli.js +38 -1
  145. package/dist/modules/staff/cli.js.map +2 -2
  146. package/dist/modules/staff/commands/index.js +2 -0
  147. package/dist/modules/staff/commands/index.js.map +2 -2
  148. package/dist/modules/staff/commands/leave-requests.js +30 -28
  149. package/dist/modules/staff/commands/leave-requests.js.map +3 -3
  150. package/dist/modules/staff/commands/team-members.js +21 -20
  151. package/dist/modules/staff/commands/team-members.js.map +2 -2
  152. package/dist/modules/staff/commands/timesheets-entries.js +409 -0
  153. package/dist/modules/staff/commands/timesheets-entries.js.map +7 -0
  154. package/dist/modules/staff/commands/timesheets-projects.js +618 -0
  155. package/dist/modules/staff/commands/timesheets-projects.js.map +7 -0
  156. package/dist/modules/staff/data/enrichers.js +104 -0
  157. package/dist/modules/staff/data/enrichers.js.map +7 -0
  158. package/dist/modules/staff/data/entities.js +226 -1
  159. package/dist/modules/staff/data/entities.js.map +2 -2
  160. package/dist/modules/staff/data/validators.js +113 -1
  161. package/dist/modules/staff/data/validators.js.map +2 -2
  162. package/dist/modules/staff/events.js +13 -1
  163. package/dist/modules/staff/events.js.map +2 -2
  164. package/dist/modules/staff/lib/crud.js +7 -1
  165. package/dist/modules/staff/lib/crud.js.map +2 -2
  166. package/dist/modules/staff/lib/staffMemberResolver.js +15 -0
  167. package/dist/modules/staff/lib/staffMemberResolver.js.map +7 -0
  168. package/dist/modules/staff/lib/timesheets-projects/computeProjectHoursTrend.js +60 -0
  169. package/dist/modules/staff/lib/timesheets-projects/computeProjectHoursTrend.js.map +7 -0
  170. package/dist/modules/staff/lib/timesheets-projects/computeProjectsKpis.js +260 -0
  171. package/dist/modules/staff/lib/timesheets-projects/computeProjectsKpis.js.map +7 -0
  172. package/dist/modules/staff/lib/timesheets-projects/dateBuckets.js +41 -0
  173. package/dist/modules/staff/lib/timesheets-projects/dateBuckets.js.map +7 -0
  174. package/dist/modules/staff/lib/timesheets-projects/initials.js +10 -0
  175. package/dist/modules/staff/lib/timesheets-projects/initials.js.map +7 -0
  176. package/dist/modules/staff/lib/timesheets-projects/kpiMath.js +12 -0
  177. package/dist/modules/staff/lib/timesheets-projects/kpiMath.js.map +7 -0
  178. package/dist/modules/staff/lib/timesheets-projects/listProjectMembersPreview.js +55 -0
  179. package/dist/modules/staff/lib/timesheets-projects/listProjectMembersPreview.js.map +7 -0
  180. package/dist/modules/staff/lib/timesheets-projects-ui/HoursSparkline.js +66 -0
  181. package/dist/modules/staff/lib/timesheets-projects-ui/HoursSparkline.js.map +7 -0
  182. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js +81 -0
  183. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js.map +7 -0
  184. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectMembersAvatarStack.js +58 -0
  185. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectMembersAvatarStack.js.map +7 -0
  186. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsKpiStrip.js +152 -0
  187. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsKpiStrip.js.map +7 -0
  188. package/dist/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.js +37 -0
  189. package/dist/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.js.map +7 -0
  190. package/dist/modules/staff/lib/timesheets-projects-ui/ViewModeToggle.js +57 -0
  191. package/dist/modules/staff/lib/timesheets-projects-ui/ViewModeToggle.js.map +7 -0
  192. package/dist/modules/staff/lib/timesheets-projects-ui/useProjectsViewMode.js +50 -0
  193. package/dist/modules/staff/lib/timesheets-projects-ui/useProjectsViewMode.js.map +7 -0
  194. package/dist/modules/staff/lib/timesheets-ui/AddRowDropdown.js +163 -0
  195. package/dist/modules/staff/lib/timesheets-ui/AddRowDropdown.js.map +7 -0
  196. package/dist/modules/staff/lib/timesheets-ui/CalendarPicker.js +209 -0
  197. package/dist/modules/staff/lib/timesheets-ui/CalendarPicker.js.map +7 -0
  198. package/dist/modules/staff/lib/timesheets-ui/ColorPicker.js +52 -0
  199. package/dist/modules/staff/lib/timesheets-ui/ColorPicker.js.map +7 -0
  200. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js +77 -0
  201. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js.map +7 -0
  202. package/dist/modules/staff/lib/timesheets-ui/ListView.js +173 -0
  203. package/dist/modules/staff/lib/timesheets-ui/ListView.js.map +7 -0
  204. package/dist/modules/staff/lib/timesheets-ui/ProjectColorDot.js +32 -0
  205. package/dist/modules/staff/lib/timesheets-ui/ProjectColorDot.js.map +7 -0
  206. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js +270 -0
  207. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js.map +7 -0
  208. package/dist/modules/staff/lib/timesheets-ui/ViewSwitcher.js +57 -0
  209. package/dist/modules/staff/lib/timesheets-ui/ViewSwitcher.js.map +7 -0
  210. package/dist/modules/staff/lib/timesheets-ui/colors.js +43 -0
  211. package/dist/modules/staff/lib/timesheets-ui/colors.js.map +7 -0
  212. package/dist/modules/staff/migrations/Migration20260326135612.js +24 -0
  213. package/dist/modules/staff/migrations/Migration20260326135612.js.map +7 -0
  214. package/dist/modules/staff/migrations/Migration20260413102715.js +23 -0
  215. package/dist/modules/staff/migrations/Migration20260413102715.js.map +7 -0
  216. package/dist/modules/staff/migrations/Migration20260413111602.js +13 -0
  217. package/dist/modules/staff/migrations/Migration20260413111602.js.map +7 -0
  218. package/dist/modules/staff/migrations/Migration20260511112759.js +19 -0
  219. package/dist/modules/staff/migrations/Migration20260511112759.js.map +7 -0
  220. package/dist/modules/staff/search.js +35 -0
  221. package/dist/modules/staff/search.js.map +2 -2
  222. package/dist/modules/staff/setup.js +15 -1
  223. package/dist/modules/staff/setup.js.map +2 -2
  224. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/config.js +16 -0
  225. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/config.js.map +7 -0
  226. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.js +126 -0
  227. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.js.map +7 -0
  228. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.js +26 -0
  229. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.js.map +7 -0
  230. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/config.js +15 -0
  231. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/config.js.map +7 -0
  232. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.js +238 -0
  233. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.js.map +7 -0
  234. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.js +26 -0
  235. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.js.map +7 -0
  236. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js +145 -0
  237. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js.map +7 -0
  238. package/dist/modules/staff/widgets/injection-table.js +12 -0
  239. package/dist/modules/staff/widgets/injection-table.js.map +7 -0
  240. package/dist/modules/sync_excel/api/import/route.js +19 -17
  241. package/dist/modules/sync_excel/api/import/route.js.map +2 -2
  242. package/dist/modules/translations/commands/translations.js +22 -19
  243. package/dist/modules/translations/commands/translations.js.map +2 -2
  244. package/generated/entities/staff_time_entry/index.ts +17 -0
  245. package/generated/entities/staff_time_entry_segment/index.ts +10 -0
  246. package/generated/entities/staff_time_project/index.ts +16 -0
  247. package/generated/entities/staff_time_project_member/index.ts +13 -0
  248. package/generated/entities.ids.generated.ts +5 -1
  249. package/generated/entity-fields-registry.ts +64 -0
  250. package/package.json +7 -7
  251. package/src/helpers/integration/timesheetFixtures.ts +61 -0
  252. package/src/modules/attachments/api/library/[id]/route.ts +24 -17
  253. package/src/modules/attachments/api/route.ts +20 -14
  254. package/src/modules/auth/api/roles/acl/route.ts +11 -5
  255. package/src/modules/auth/api/sidebar/preferences/route.ts +33 -24
  256. package/src/modules/auth/api/users/acl/route.ts +17 -12
  257. package/src/modules/auth/commands/users.ts +96 -80
  258. package/src/modules/auth/services/sidebarPreferencesService.ts +40 -32
  259. package/src/modules/catalog/commands/categories.ts +61 -12
  260. package/src/modules/catalog/commands/products.ts +93 -60
  261. package/src/modules/catalog/commands/variants.ts +29 -16
  262. package/src/modules/currencies/commands/currencies.ts +27 -14
  263. package/src/modules/customer_accounts/api/admin/users.ts +31 -26
  264. package/src/modules/customer_accounts/api/password/reset-confirm.ts +5 -6
  265. package/src/modules/customer_accounts/api/portal/users/[id]/roles.ts +14 -13
  266. package/src/modules/customers/commands/addresses.ts +35 -23
  267. package/src/modules/customers/commands/companies.ts +166 -165
  268. package/src/modules/customers/commands/deals.ts +2 -4
  269. package/src/modules/customers/commands/interactions.ts +20 -26
  270. package/src/modules/customers/commands/people.ts +18 -15
  271. package/src/modules/customers/commands/personCompanyLinks.ts +109 -100
  272. package/src/modules/customers/commands/pipeline-stages.ts +31 -27
  273. package/src/modules/customers/commands/pipelines.ts +29 -23
  274. package/src/modules/customers/commands/tags.ts +13 -5
  275. package/src/modules/dashboards/api/users/widgets/route.ts +0 -1
  276. package/src/modules/dashboards/api/widgets/data/route.ts +36 -1
  277. package/src/modules/data_sync/lib/sync-engine.ts +4 -5
  278. package/src/modules/data_sync/lib/sync-run-service.ts +57 -28
  279. package/src/modules/directory/commands/organizations.ts +203 -166
  280. package/src/modules/inbox_ops/api/emails/[id]/reprocess/route.ts +26 -18
  281. package/src/modules/messages/commands/messages.ts +82 -80
  282. package/src/modules/messages/commands/shared.ts +138 -133
  283. package/src/modules/perspectives/api/[tableId]/route.ts +38 -27
  284. package/src/modules/resources/commands/resources.ts +127 -117
  285. package/src/modules/resources/commands/tags.ts +7 -3
  286. package/src/modules/sales/api/quotes/send/route.ts +17 -12
  287. package/src/modules/sales/commands/documents.ts +673 -481
  288. package/src/modules/sales/commands/payments.ts +158 -152
  289. package/src/modules/sales/commands/returns.ts +74 -63
  290. package/src/modules/staff/acl.ts +11 -0
  291. package/src/modules/staff/analytics.ts +30 -0
  292. package/src/modules/staff/api/guards.ts +59 -0
  293. package/src/modules/staff/api/interceptors.ts +122 -0
  294. package/src/modules/staff/api/timesheets/my-projects/[projectId]/route.ts +191 -0
  295. package/src/modules/staff/api/timesheets/my-projects/route.ts +115 -0
  296. package/src/modules/staff/api/timesheets/projects/kpis/route.ts +159 -0
  297. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.ts +187 -0
  298. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/route.ts +191 -0
  299. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +168 -0
  300. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.ts +191 -0
  301. package/src/modules/staff/api/timesheets/time-entries/bulk/route.ts +292 -0
  302. package/src/modules/staff/api/timesheets/time-entries/route.ts +193 -0
  303. package/src/modules/staff/api/timesheets/time-projects/[id]/employees/route.ts +167 -0
  304. package/src/modules/staff/api/timesheets/time-projects/route.ts +244 -0
  305. package/src/modules/staff/backend/staff/timesheets/page.meta.ts +20 -0
  306. package/src/modules/staff/backend/staff/timesheets/page.tsx +899 -0
  307. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.ts +12 -0
  308. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.tsx +141 -0
  309. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.ts +12 -0
  310. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +579 -0
  311. package/src/modules/staff/backend/staff/timesheets/projects/create/page.meta.ts +12 -0
  312. package/src/modules/staff/backend/staff/timesheets/projects/create/page.tsx +90 -0
  313. package/src/modules/staff/backend/staff/timesheets/projects/page.meta.ts +23 -0
  314. package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +765 -0
  315. package/src/modules/staff/backend/staff/timesheets/projects/projectFormConfig.ts +138 -0
  316. package/src/modules/staff/cli.ts +40 -1
  317. package/src/modules/staff/commands/index.ts +2 -0
  318. package/src/modules/staff/commands/leave-requests.ts +37 -29
  319. package/src/modules/staff/commands/team-members.ts +25 -20
  320. package/src/modules/staff/commands/timesheets-entries.ts +504 -0
  321. package/src/modules/staff/commands/timesheets-projects.ts +699 -0
  322. package/src/modules/staff/data/enrichers.ts +134 -0
  323. package/src/modules/staff/data/entities.ts +198 -0
  324. package/src/modules/staff/data/validators.ts +129 -0
  325. package/src/modules/staff/events.ts +13 -0
  326. package/src/modules/staff/i18n/de.json +209 -1
  327. package/src/modules/staff/i18n/en.json +209 -1
  328. package/src/modules/staff/i18n/es.json +209 -1
  329. package/src/modules/staff/i18n/pl.json +209 -1
  330. package/src/modules/staff/lib/crud.ts +8 -0
  331. package/src/modules/staff/lib/staffMemberResolver.ts +22 -0
  332. package/src/modules/staff/lib/timesheets-projects/computeProjectHoursTrend.ts +89 -0
  333. package/src/modules/staff/lib/timesheets-projects/computeProjectsKpis.ts +311 -0
  334. package/src/modules/staff/lib/timesheets-projects/dateBuckets.ts +37 -0
  335. package/src/modules/staff/lib/timesheets-projects/initials.ts +6 -0
  336. package/src/modules/staff/lib/timesheets-projects/kpiMath.ts +8 -0
  337. package/src/modules/staff/lib/timesheets-projects/listProjectMembersPreview.ts +83 -0
  338. package/src/modules/staff/lib/timesheets-projects-ui/HoursSparkline.tsx +75 -0
  339. package/src/modules/staff/lib/timesheets-projects-ui/ProjectCard.tsx +110 -0
  340. package/src/modules/staff/lib/timesheets-projects-ui/ProjectMembersAvatarStack.tsx +73 -0
  341. package/src/modules/staff/lib/timesheets-projects-ui/ProjectsKpiStrip.tsx +185 -0
  342. package/src/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.tsx +53 -0
  343. package/src/modules/staff/lib/timesheets-projects-ui/ViewModeToggle.tsx +63 -0
  344. package/src/modules/staff/lib/timesheets-projects-ui/useProjectsViewMode.ts +63 -0
  345. package/src/modules/staff/lib/timesheets-ui/AddRowDropdown.tsx +188 -0
  346. package/src/modules/staff/lib/timesheets-ui/CalendarPicker.tsx +229 -0
  347. package/src/modules/staff/lib/timesheets-ui/ColorPicker.tsx +65 -0
  348. package/src/modules/staff/lib/timesheets-ui/CreateProjectDialog.tsx +99 -0
  349. package/src/modules/staff/lib/timesheets-ui/ListView.tsx +230 -0
  350. package/src/modules/staff/lib/timesheets-ui/ProjectColorDot.tsx +40 -0
  351. package/src/modules/staff/lib/timesheets-ui/TimerBar.tsx +327 -0
  352. package/src/modules/staff/lib/timesheets-ui/ViewSwitcher.tsx +60 -0
  353. package/src/modules/staff/lib/timesheets-ui/colors.ts +58 -0
  354. package/src/modules/staff/migrations/.snapshot-open-mercato.json +1148 -0
  355. package/src/modules/staff/migrations/Migration20260326135612.ts +26 -0
  356. package/src/modules/staff/migrations/Migration20260413102715.ts +25 -0
  357. package/src/modules/staff/migrations/Migration20260413111602.ts +13 -0
  358. package/src/modules/staff/migrations/Migration20260511112759.ts +21 -0
  359. package/src/modules/staff/search.ts +35 -0
  360. package/src/modules/staff/setup.ts +15 -0
  361. package/src/modules/staff/widgets/dashboard/timesheets-hours-by-project/config.ts +17 -0
  362. package/src/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.tsx +158 -0
  363. package/src/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.ts +25 -0
  364. package/src/modules/staff/widgets/dashboard/timesheets-time-reporting/config.ts +15 -0
  365. package/src/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.tsx +297 -0
  366. package/src/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.ts +25 -0
  367. package/src/modules/staff/widgets/injection/timer-sidebar-indicator/widget.tsx +161 -0
  368. package/src/modules/staff/widgets/injection-table.ts +10 -0
  369. package/src/modules/sync_excel/api/import/route.ts +23 -18
  370. package/src/modules/translations/commands/translations.ts +49 -41
@@ -917,5 +917,213 @@
917
917
  "staff.teams.table.updatedAt": "Actualizado",
918
918
  "staff.teams.tabs.details": "Detalles",
919
919
  "staff.teams.tabs.label": "Secciones del equipo",
920
- "staff.teams.tabs.members": "Miembros del equipo"
920
+ "staff.teams.tabs.members": "Miembros del equipo",
921
+ "staff.timesheets.errors.entryNotFound": "Registro de tiempo no encontrado, eliminado o no asignado a ti.",
922
+ "staff.timesheets.errors.noStaffMember": "Ningún miembro del personal vinculado a tu cuenta.",
923
+ "staff.timesheets.errors.notOwner": "Solo puedes gestionar tus propios registros de tiempo.",
924
+ "staff.timesheets.errors.projectCodeDuplicate": "Ya existe un proyecto con este código.",
925
+ "staff.timesheets.errors.projectNotFound": "Proyecto de tiempo no encontrado o no accesible.",
926
+ "staff.timesheets.errors.projectsKpis": "Failed to load project KPIs.",
927
+ "staff.timesheets.errors.staffMemberNotFound": "Miembro del personal no encontrado o no accesible.",
928
+ "staff.timesheets.my.addRow.createProject": "Create a new project",
929
+ "staff.timesheets.my.addRow.error": "No se pudo añadir el proyecto. Inténtalo de nuevo.",
930
+ "staff.timesheets.my.addRow.noProjects": "No projects assigned",
931
+ "staff.timesheets.my.addRow.searchPlaceholder": "Search by project",
932
+ "staff.timesheets.my.addRow.trigger": "Add row",
933
+ "staff.timesheets.my.calendar.lastWeek": "Last week",
934
+ "staff.timesheets.my.calendar.nextMonth": "Next month",
935
+ "staff.timesheets.my.calendar.open": "Open calendar",
936
+ "staff.timesheets.my.calendar.prevMonth": "Previous month",
937
+ "staff.timesheets.my.calendar.thisWeek": "This week",
938
+ "staff.timesheets.my.confirm_save.body": "Your timesheet entries will be saved.",
939
+ "staff.timesheets.my.confirm_save.title": "Save changes?",
940
+ "staff.timesheets.my.createProfile": "Create Team Member Profile",
941
+ "staff.timesheets.my.daily_average": "Daily Average",
942
+ "staff.timesheets.my.daily_total": "Daily Total",
943
+ "staff.timesheets.my.durationPlaceholder": "0",
944
+ "staff.timesheets.my.errors.load": "Failed to load timesheets.",
945
+ "staff.timesheets.my.errors.save": "Failed to save timesheets.",
946
+ "staff.timesheets.my.errors.updateAssignment": "Failed to update projects.",
947
+ "staff.timesheets.my.list.addDescription": "Add description",
948
+ "staff.timesheets.my.list.noEntries": "No entries for this period.",
949
+ "staff.timesheets.my.list.today": "Today",
950
+ "staff.timesheets.my.list.yesterday": "Yesterday",
951
+ "staff.timesheets.my.loading": "Loading timesheets...",
952
+ "staff.timesheets.my.noProfile": "You need a Team Member profile to track time.",
953
+ "staff.timesheets.my.noProfile.title": "Set up your profile to start tracking time",
954
+ "staff.timesheets.my.noProjects": "No active projects. Create a project first.",
955
+ "staff.timesheets.my.noProjects.admin": "Create a project and assign yourself to start tracking time.",
956
+ "staff.timesheets.my.noProjects.createProject": "Create Project",
957
+ "staff.timesheets.my.noProjects.employee": "Ask your manager to assign you to a project.",
958
+ "staff.timesheets.my.noProjects.title": "No projects assigned yet",
959
+ "staff.timesheets.my.noProjects.viewProjects": "View Projects",
960
+ "staff.timesheets.my.project": "Project",
961
+ "staff.timesheets.my.removeRow": "Quitar de la cuadrícula",
962
+ "staff.timesheets.my.removeRow.confirm": "¿Quitar {projectName} de tu cuadrícula? Puedes volver a añadirlo en cualquier momento con \"+ Añadir fila\".",
963
+ "staff.timesheets.my.removeRow.error": "No se pudo quitar el proyecto. Inténtalo de nuevo.",
964
+ "staff.timesheets.my.save_changes": "Save Changes",
965
+ "staff.timesheets.my.saved": "Timesheet saved.",
966
+ "staff.timesheets.my.saving": "Saving...",
967
+ "staff.timesheets.my.status": "Status",
968
+ "staff.timesheets.my.status_open": "Open",
969
+ "staff.timesheets.my.timer.noProjects": "No projects found",
970
+ "staff.timesheets.my.timer.placeholder": "What are you working on?",
971
+ "staff.timesheets.my.timer.searchProject": "Search projects...",
972
+ "staff.timesheets.my.timer.selectProject": "Project",
973
+ "staff.timesheets.my.timer.start": "Start timer",
974
+ "staff.timesheets.my.timer.startError": "Failed to start timer",
975
+ "staff.timesheets.my.timer.stop": "Stop timer",
976
+ "staff.timesheets.my.timer.stopError": "Failed to stop timer",
977
+ "staff.timesheets.my.timerStart": "Start Timer",
978
+ "staff.timesheets.my.timerStop": "Stop Timer",
979
+ "staff.timesheets.my.total": "Total",
980
+ "staff.timesheets.my.total_hours": "Total Hours",
981
+ "staff.timesheets.my.unsaved": "Unsaved changes",
982
+ "staff.timesheets.my.viewMode.monthly": "Monthly",
983
+ "staff.timesheets.my.viewMode.weekly": "Weekly",
984
+ "staff.timesheets.my.viewType.list": "List view",
985
+ "staff.timesheets.my.viewType.timesheet": "Timesheet",
986
+ "staff.timesheets.my.weekTotal": "Week Total",
987
+ "staff.timesheets.my.working_days": "Working Days",
988
+ "staff.timesheets.nav.create_project": "Create Project",
989
+ "staff.timesheets.nav.edit_project": "Edit Project",
990
+ "staff.timesheets.nav.my_timesheets": "My Timesheets",
991
+ "staff.timesheets.nav.project_details": "Project Details",
992
+ "staff.timesheets.nav.projects": "Projects",
993
+ "staff.timesheets.projects.actions.add": "Add Project",
994
+ "staff.timesheets.projects.actions.addFirst": "+ Add first project",
995
+ "staff.timesheets.projects.actions.delete": "Delete",
996
+ "staff.timesheets.projects.actions.deleteConfirm": "Delete project \"{{name}}\"?",
997
+ "staff.timesheets.projects.actions.refresh": "Refresh",
998
+ "staff.timesheets.projects.actions.viewDetails": "View Details",
999
+ "staff.timesheets.projects.active_employees": "Active Employees",
1000
+ "staff.timesheets.projects.add_employee": "Add Employee",
1001
+ "staff.timesheets.projects.detail.subtitle": "Project Settings",
1002
+ "staff.timesheets.projects.employees.addError": "Failed to add employee.",
1003
+ "staff.timesheets.projects.employees.added": "Employee added.",
1004
+ "staff.timesheets.projects.employees.assignmentStartDate": "Assignment Start Date",
1005
+ "staff.timesheets.projects.employees.department": "Department",
1006
+ "staff.timesheets.projects.employees.empty": "No employees assigned yet.",
1007
+ "staff.timesheets.projects.employees.endDate": "Assignment end",
1008
+ "staff.timesheets.projects.employees.loading": "Loading employees...",
1009
+ "staff.timesheets.projects.employees.noResults": "No team members found",
1010
+ "staff.timesheets.projects.employees.remove": "Remove",
1011
+ "staff.timesheets.projects.employees.removeConfirm": "Remove this employee from the project?",
1012
+ "staff.timesheets.projects.employees.removeError": "Failed to remove employee.",
1013
+ "staff.timesheets.projects.employees.removed": "Employee removed.",
1014
+ "staff.timesheets.projects.employees.role": "Role",
1015
+ "staff.timesheets.projects.employees.roleOnProject": "Role on Project",
1016
+ "staff.timesheets.projects.employees.rolePlaceholder": "e.g. Developer, Designer...",
1017
+ "staff.timesheets.projects.employees.searchEmployee": "Search team members...",
1018
+ "staff.timesheets.projects.employees.selectEmployee": "Select Employee",
1019
+ "staff.timesheets.projects.employees.startDate": "Assignment start",
1020
+ "staff.timesheets.projects.employees.status": "Status",
1021
+ "staff.timesheets.projects.employees.title": "Assigned Employees",
1022
+ "staff.timesheets.projects.errors.delete": "Failed to delete project.",
1023
+ "staff.timesheets.projects.errors.fieldRequired": "Required",
1024
+ "staff.timesheets.projects.errors.load": "Failed to load project.",
1025
+ "staff.timesheets.projects.errors.notFound": "Project not found.",
1026
+ "staff.timesheets.projects.errors.required": "Name and code are required.",
1027
+ "staff.timesheets.projects.errors.save": "Failed to save project.",
1028
+ "staff.timesheets.projects.form.actions.cancel": "Cancel",
1029
+ "staff.timesheets.projects.form.actions.create": "Create",
1030
+ "staff.timesheets.projects.form.actions.edit": "Edit Project",
1031
+ "staff.timesheets.projects.form.actions.save": "Save",
1032
+ "staff.timesheets.projects.form.code": "Code",
1033
+ "staff.timesheets.projects.form.codePlaceholder": "PROJECT-001",
1034
+ "staff.timesheets.projects.form.color": "Color del proyecto",
1035
+ "staff.timesheets.projects.form.colorAuto": "Auto",
1036
+ "staff.timesheets.projects.form.costCenter": "Cost center",
1037
+ "staff.timesheets.projects.form.costCenterPlaceholder": "Cost center code",
1038
+ "staff.timesheets.projects.form.createTitle": "Create project",
1039
+ "staff.timesheets.projects.form.description": "Description",
1040
+ "staff.timesheets.projects.form.descriptionPlaceholder": "Project description",
1041
+ "staff.timesheets.projects.form.editTitle": "Edit project",
1042
+ "staff.timesheets.projects.form.groupDetails": "Additional Information",
1043
+ "staff.timesheets.projects.form.groupMain": "Project Details",
1044
+ "staff.timesheets.projects.form.name": "Name",
1045
+ "staff.timesheets.projects.form.namePlaceholder": "Project name",
1046
+ "staff.timesheets.projects.form.projectType": "Project type",
1047
+ "staff.timesheets.projects.form.projectTypePlaceholder": "e.g. Internal, Client, R&D",
1048
+ "staff.timesheets.projects.form.startDate": "Start date",
1049
+ "staff.timesheets.projects.form.status": "Status",
1050
+ "staff.timesheets.projects.inactive_employees": "Inactive Employees",
1051
+ "staff.timesheets.projects.loading": "Loading project...",
1052
+ "staff.timesheets.projects.messages.deleted": "Project deleted.",
1053
+ "staff.timesheets.projects.messages.saved": "Project saved.",
1054
+ "staff.timesheets.projects.page.description": "Manage time tracking projects.",
1055
+ "staff.timesheets.projects.page.title": "Projects",
1056
+ "staff.timesheets.projects.portfolio.card.hoursPanelCollab": "My hours · last 7w",
1057
+ "staff.timesheets.projects.portfolio.card.hoursPanelPm": "Team hours · last 7w",
1058
+ "staff.timesheets.projects.portfolio.card.role": "Role",
1059
+ "staff.timesheets.projects.portfolio.emptyState.noAssignments": "You aren't assigned to any projects yet. Ask a PM to add you.",
1060
+ "staff.timesheets.projects.portfolio.emptyState.noMatches": "No projects match these filters.",
1061
+ "staff.timesheets.projects.portfolio.emptyState.noProjects": "No projects yet.",
1062
+ "staff.timesheets.projects.portfolio.hoursWeek": "Hours / week",
1063
+ "staff.timesheets.projects.portfolio.kpi.assignedToMe": "Assigned to me",
1064
+ "staff.timesheets.projects.portfolio.kpi.deltaFlat": "no change",
1065
+ "staff.timesheets.projects.portfolio.kpi.hoursMonth": "Hours this month",
1066
+ "staff.timesheets.projects.portfolio.kpi.hoursMonthSub": "vs previous month",
1067
+ "staff.timesheets.projects.portfolio.kpi.hoursWeek": "Hours this week",
1068
+ "staff.timesheets.projects.portfolio.kpi.hoursWeekSub": "vs previous week",
1069
+ "staff.timesheets.projects.portfolio.kpi.myHoursMonth": "My hours this month",
1070
+ "staff.timesheets.projects.portfolio.kpi.myHoursWeek": "My hours this week",
1071
+ "staff.timesheets.projects.portfolio.kpi.myProjects": "My projects",
1072
+ "staff.timesheets.projects.portfolio.kpi.noPrevious": "no previous data",
1073
+ "staff.timesheets.projects.portfolio.kpi.onHold": "On Hold",
1074
+ "staff.timesheets.projects.portfolio.kpi.teamActive": "Active team",
1075
+ "staff.timesheets.projects.portfolio.kpi.teamActiveSub": "Members with entries this month",
1076
+ "staff.timesheets.projects.portfolio.kpi.totalProjects": "Total Projects",
1077
+ "staff.timesheets.projects.portfolio.myHoursWeek": "My hours / week",
1078
+ "staff.timesheets.projects.portfolio.myRole": "My role",
1079
+ "staff.timesheets.projects.portfolio.relativeTime.daysAgo": "hace {days}d",
1080
+ "staff.timesheets.projects.portfolio.relativeTime.hoursAgo": "hace {hours}h",
1081
+ "staff.timesheets.projects.portfolio.relativeTime.justNow": "ahora mismo",
1082
+ "staff.timesheets.projects.portfolio.relativeTime.minutesAgo": "hace {minutes}m",
1083
+ "staff.timesheets.projects.portfolio.savedViews.ariaLabel": "Vistas guardadas",
1084
+ "staff.timesheets.projects.portfolio.sparkline.ariaLabel": "Hours per week, last 7 weeks",
1085
+ "staff.timesheets.projects.portfolio.tabs.active": "Active",
1086
+ "staff.timesheets.projects.portfolio.tabs.all": "All",
1087
+ "staff.timesheets.projects.portfolio.tabs.completed": "Completed",
1088
+ "staff.timesheets.projects.portfolio.tabs.mine": "Mine",
1089
+ "staff.timesheets.projects.portfolio.tabs.onHold": "On Hold",
1090
+ "staff.timesheets.projects.portfolio.team": "Team",
1091
+ "staff.timesheets.projects.portfolio.viewMode.ariaLabel": "Modo de visualización",
1092
+ "staff.timesheets.projects.portfolio.viewMode.cards": "Cards",
1093
+ "staff.timesheets.projects.portfolio.viewMode.table": "Table",
1094
+ "staff.timesheets.projects.stats.active": "Active Projects",
1095
+ "staff.timesheets.projects.stats.onHold": "On Hold",
1096
+ "staff.timesheets.projects.stats.total": "Total Projects",
1097
+ "staff.timesheets.projects.statuses.active": "Active",
1098
+ "staff.timesheets.projects.statuses.all": "All",
1099
+ "staff.timesheets.projects.statuses.completed": "Completed",
1100
+ "staff.timesheets.projects.statuses.onHold": "On Hold",
1101
+ "staff.timesheets.projects.table.empty": "No projects yet.",
1102
+ "staff.timesheets.projects.table.name": "Name",
1103
+ "staff.timesheets.projects.table.search": "Search projects...",
1104
+ "staff.timesheets.projects.table.startDate": "Start Date",
1105
+ "staff.timesheets.projects.table.status": "Status",
1106
+ "staff.timesheets.projects.table.type": "Type",
1107
+ "staff.timesheets.projects.table.updatedAt": "Updated",
1108
+ "staff.timesheets.sidebar.timerRunning": "Temporizador activo — haz clic para ver",
1109
+ "staff.timesheets.widgets.hoursByProject.empty": "No hours tracked in this period.",
1110
+ "staff.timesheets.widgets.hoursByProject.error": "Failed to load data",
1111
+ "staff.timesheets.widgets.hoursByProject.loading": "Loading...",
1112
+ "staff.timesheets.widgets.hoursByProject.settings.dateRange": "Date Range",
1113
+ "staff.timesheets.widgets.hoursByProject.total": "Total",
1114
+ "staff.timesheets.widgets.timeReporting.error": "Failed to load timer state",
1115
+ "staff.timesheets.widgets.timeReporting.loading": "Loading...",
1116
+ "staff.timesheets.widgets.timeReporting.noProjects": "No projects assigned.",
1117
+ "staff.timesheets.widgets.timeReporting.notRunning": "Not running",
1118
+ "staff.timesheets.widgets.timeReporting.notesPlaceholder": "What are you working on?",
1119
+ "staff.timesheets.widgets.timeReporting.project": "Project",
1120
+ "staff.timesheets.widgets.timeReporting.running": "Timer running",
1121
+ "staff.timesheets.widgets.timeReporting.selectProject": "Select project...",
1122
+ "staff.timesheets.widgets.timeReporting.settings.description": "No additional settings. Select a project and start tracking from the widget.",
1123
+ "staff.timesheets.widgets.timeReporting.start": "Start Timer",
1124
+ "staff.timesheets.widgets.timeReporting.startError": "Failed to start timer",
1125
+ "staff.timesheets.widgets.timeReporting.stop": "Stop Timer",
1126
+ "staff.timesheets.widgets.timeReporting.stopError": "Failed to stop timer",
1127
+ "staff.timesheets.widgets.timeReporting.taskNote": "Task / Note",
1128
+ "staff.timesheets.widgets.timeReporting.unknownProject": "Unknown project"
921
1129
  }
@@ -917,5 +917,213 @@
917
917
  "staff.teams.table.updatedAt": "Zaktualizowano",
918
918
  "staff.teams.tabs.details": "Szczegóły",
919
919
  "staff.teams.tabs.label": "Sekcje zespołu",
920
- "staff.teams.tabs.members": "Członkowie zespołu"
920
+ "staff.teams.tabs.members": "Członkowie zespołu",
921
+ "staff.timesheets.errors.entryNotFound": "Wpis czasu nie istnieje, został usunięty lub nie należy do Ciebie.",
922
+ "staff.timesheets.errors.noStaffMember": "Brak pracownika powiązanego z Twoim kontem.",
923
+ "staff.timesheets.errors.notOwner": "Możesz zarządzać tylko własnymi wpisami czasu.",
924
+ "staff.timesheets.errors.projectCodeDuplicate": "Projekt o tym kodzie już istnieje.",
925
+ "staff.timesheets.errors.projectNotFound": "Projekt czasowy nie został znaleziony lub jest niedostępny.",
926
+ "staff.timesheets.errors.projectsKpis": "Failed to load project KPIs.",
927
+ "staff.timesheets.errors.staffMemberNotFound": "Pracownik nie został znaleziony lub jest niedostępny.",
928
+ "staff.timesheets.my.addRow.createProject": "Create a new project",
929
+ "staff.timesheets.my.addRow.error": "Nie udało się dodać projektu. Spróbuj ponownie.",
930
+ "staff.timesheets.my.addRow.noProjects": "No projects assigned",
931
+ "staff.timesheets.my.addRow.searchPlaceholder": "Search by project",
932
+ "staff.timesheets.my.addRow.trigger": "Add row",
933
+ "staff.timesheets.my.calendar.lastWeek": "Last week",
934
+ "staff.timesheets.my.calendar.nextMonth": "Next month",
935
+ "staff.timesheets.my.calendar.open": "Open calendar",
936
+ "staff.timesheets.my.calendar.prevMonth": "Previous month",
937
+ "staff.timesheets.my.calendar.thisWeek": "This week",
938
+ "staff.timesheets.my.confirm_save.body": "Your timesheet entries will be saved.",
939
+ "staff.timesheets.my.confirm_save.title": "Save changes?",
940
+ "staff.timesheets.my.createProfile": "Create Team Member Profile",
941
+ "staff.timesheets.my.daily_average": "Daily Average",
942
+ "staff.timesheets.my.daily_total": "Daily Total",
943
+ "staff.timesheets.my.durationPlaceholder": "0",
944
+ "staff.timesheets.my.errors.load": "Failed to load timesheets.",
945
+ "staff.timesheets.my.errors.save": "Failed to save timesheets.",
946
+ "staff.timesheets.my.errors.updateAssignment": "Failed to update projects.",
947
+ "staff.timesheets.my.list.addDescription": "Add description",
948
+ "staff.timesheets.my.list.noEntries": "No entries for this period.",
949
+ "staff.timesheets.my.list.today": "Today",
950
+ "staff.timesheets.my.list.yesterday": "Yesterday",
951
+ "staff.timesheets.my.loading": "Loading timesheets...",
952
+ "staff.timesheets.my.noProfile": "You need a Team Member profile to track time.",
953
+ "staff.timesheets.my.noProfile.title": "Set up your profile to start tracking time",
954
+ "staff.timesheets.my.noProjects": "No active projects. Create a project first.",
955
+ "staff.timesheets.my.noProjects.admin": "Create a project and assign yourself to start tracking time.",
956
+ "staff.timesheets.my.noProjects.createProject": "Create Project",
957
+ "staff.timesheets.my.noProjects.employee": "Ask your manager to assign you to a project.",
958
+ "staff.timesheets.my.noProjects.title": "No projects assigned yet",
959
+ "staff.timesheets.my.noProjects.viewProjects": "View Projects",
960
+ "staff.timesheets.my.project": "Project",
961
+ "staff.timesheets.my.removeRow": "Usuń z siatki",
962
+ "staff.timesheets.my.removeRow.confirm": "Usunąć {projectName} z Twojej siatki? Możesz go ponownie dodać przez \"+ Dodaj wiersz\".",
963
+ "staff.timesheets.my.removeRow.error": "Nie udało się usunąć projektu. Spróbuj ponownie.",
964
+ "staff.timesheets.my.save_changes": "Save Changes",
965
+ "staff.timesheets.my.saved": "Timesheet saved.",
966
+ "staff.timesheets.my.saving": "Saving...",
967
+ "staff.timesheets.my.status": "Status",
968
+ "staff.timesheets.my.status_open": "Open",
969
+ "staff.timesheets.my.timer.noProjects": "No projects found",
970
+ "staff.timesheets.my.timer.placeholder": "What are you working on?",
971
+ "staff.timesheets.my.timer.searchProject": "Search projects...",
972
+ "staff.timesheets.my.timer.selectProject": "Project",
973
+ "staff.timesheets.my.timer.start": "Start timer",
974
+ "staff.timesheets.my.timer.startError": "Failed to start timer",
975
+ "staff.timesheets.my.timer.stop": "Stop timer",
976
+ "staff.timesheets.my.timer.stopError": "Failed to stop timer",
977
+ "staff.timesheets.my.timerStart": "Start Timer",
978
+ "staff.timesheets.my.timerStop": "Stop Timer",
979
+ "staff.timesheets.my.total": "Total",
980
+ "staff.timesheets.my.total_hours": "Total Hours",
981
+ "staff.timesheets.my.unsaved": "Unsaved changes",
982
+ "staff.timesheets.my.viewMode.monthly": "Monthly",
983
+ "staff.timesheets.my.viewMode.weekly": "Weekly",
984
+ "staff.timesheets.my.viewType.list": "List view",
985
+ "staff.timesheets.my.viewType.timesheet": "Timesheet",
986
+ "staff.timesheets.my.weekTotal": "Week Total",
987
+ "staff.timesheets.my.working_days": "Working Days",
988
+ "staff.timesheets.nav.create_project": "Create Project",
989
+ "staff.timesheets.nav.edit_project": "Edit Project",
990
+ "staff.timesheets.nav.my_timesheets": "My Timesheets",
991
+ "staff.timesheets.nav.project_details": "Project Details",
992
+ "staff.timesheets.nav.projects": "Projects",
993
+ "staff.timesheets.projects.actions.add": "Add Project",
994
+ "staff.timesheets.projects.actions.addFirst": "+ Add first project",
995
+ "staff.timesheets.projects.actions.delete": "Delete",
996
+ "staff.timesheets.projects.actions.deleteConfirm": "Delete project \"{{name}}\"?",
997
+ "staff.timesheets.projects.actions.refresh": "Refresh",
998
+ "staff.timesheets.projects.actions.viewDetails": "View Details",
999
+ "staff.timesheets.projects.active_employees": "Active Employees",
1000
+ "staff.timesheets.projects.add_employee": "Add Employee",
1001
+ "staff.timesheets.projects.detail.subtitle": "Project Settings",
1002
+ "staff.timesheets.projects.employees.addError": "Failed to add employee.",
1003
+ "staff.timesheets.projects.employees.added": "Employee added.",
1004
+ "staff.timesheets.projects.employees.assignmentStartDate": "Assignment Start Date",
1005
+ "staff.timesheets.projects.employees.department": "Department",
1006
+ "staff.timesheets.projects.employees.empty": "No employees assigned yet.",
1007
+ "staff.timesheets.projects.employees.endDate": "Assignment end",
1008
+ "staff.timesheets.projects.employees.loading": "Loading employees...",
1009
+ "staff.timesheets.projects.employees.noResults": "No team members found",
1010
+ "staff.timesheets.projects.employees.remove": "Remove",
1011
+ "staff.timesheets.projects.employees.removeConfirm": "Remove this employee from the project?",
1012
+ "staff.timesheets.projects.employees.removeError": "Failed to remove employee.",
1013
+ "staff.timesheets.projects.employees.removed": "Employee removed.",
1014
+ "staff.timesheets.projects.employees.role": "Role",
1015
+ "staff.timesheets.projects.employees.roleOnProject": "Role on Project",
1016
+ "staff.timesheets.projects.employees.rolePlaceholder": "e.g. Developer, Designer...",
1017
+ "staff.timesheets.projects.employees.searchEmployee": "Search team members...",
1018
+ "staff.timesheets.projects.employees.selectEmployee": "Select Employee",
1019
+ "staff.timesheets.projects.employees.startDate": "Assignment start",
1020
+ "staff.timesheets.projects.employees.status": "Status",
1021
+ "staff.timesheets.projects.employees.title": "Assigned Employees",
1022
+ "staff.timesheets.projects.errors.delete": "Failed to delete project.",
1023
+ "staff.timesheets.projects.errors.fieldRequired": "Required",
1024
+ "staff.timesheets.projects.errors.load": "Failed to load project.",
1025
+ "staff.timesheets.projects.errors.notFound": "Project not found.",
1026
+ "staff.timesheets.projects.errors.required": "Name and code are required.",
1027
+ "staff.timesheets.projects.errors.save": "Failed to save project.",
1028
+ "staff.timesheets.projects.form.actions.cancel": "Cancel",
1029
+ "staff.timesheets.projects.form.actions.create": "Create",
1030
+ "staff.timesheets.projects.form.actions.edit": "Edit Project",
1031
+ "staff.timesheets.projects.form.actions.save": "Save",
1032
+ "staff.timesheets.projects.form.code": "Code",
1033
+ "staff.timesheets.projects.form.codePlaceholder": "PROJECT-001",
1034
+ "staff.timesheets.projects.form.color": "Kolor projektu",
1035
+ "staff.timesheets.projects.form.colorAuto": "Auto",
1036
+ "staff.timesheets.projects.form.costCenter": "Cost center",
1037
+ "staff.timesheets.projects.form.costCenterPlaceholder": "Cost center code",
1038
+ "staff.timesheets.projects.form.createTitle": "Create project",
1039
+ "staff.timesheets.projects.form.description": "Description",
1040
+ "staff.timesheets.projects.form.descriptionPlaceholder": "Project description",
1041
+ "staff.timesheets.projects.form.editTitle": "Edit project",
1042
+ "staff.timesheets.projects.form.groupDetails": "Additional Information",
1043
+ "staff.timesheets.projects.form.groupMain": "Project Details",
1044
+ "staff.timesheets.projects.form.name": "Name",
1045
+ "staff.timesheets.projects.form.namePlaceholder": "Project name",
1046
+ "staff.timesheets.projects.form.projectType": "Project type",
1047
+ "staff.timesheets.projects.form.projectTypePlaceholder": "e.g. Internal, Client, R&D",
1048
+ "staff.timesheets.projects.form.startDate": "Start date",
1049
+ "staff.timesheets.projects.form.status": "Status",
1050
+ "staff.timesheets.projects.inactive_employees": "Inactive Employees",
1051
+ "staff.timesheets.projects.loading": "Loading project...",
1052
+ "staff.timesheets.projects.messages.deleted": "Project deleted.",
1053
+ "staff.timesheets.projects.messages.saved": "Project saved.",
1054
+ "staff.timesheets.projects.page.description": "Manage time tracking projects.",
1055
+ "staff.timesheets.projects.page.title": "Projects",
1056
+ "staff.timesheets.projects.portfolio.card.hoursPanelCollab": "My hours · last 7w",
1057
+ "staff.timesheets.projects.portfolio.card.hoursPanelPm": "Team hours · last 7w",
1058
+ "staff.timesheets.projects.portfolio.card.role": "Role",
1059
+ "staff.timesheets.projects.portfolio.emptyState.noAssignments": "You aren't assigned to any projects yet. Ask a PM to add you.",
1060
+ "staff.timesheets.projects.portfolio.emptyState.noMatches": "No projects match these filters.",
1061
+ "staff.timesheets.projects.portfolio.emptyState.noProjects": "No projects yet.",
1062
+ "staff.timesheets.projects.portfolio.hoursWeek": "Hours / week",
1063
+ "staff.timesheets.projects.portfolio.kpi.assignedToMe": "Assigned to me",
1064
+ "staff.timesheets.projects.portfolio.kpi.deltaFlat": "no change",
1065
+ "staff.timesheets.projects.portfolio.kpi.hoursMonth": "Hours this month",
1066
+ "staff.timesheets.projects.portfolio.kpi.hoursMonthSub": "vs previous month",
1067
+ "staff.timesheets.projects.portfolio.kpi.hoursWeek": "Hours this week",
1068
+ "staff.timesheets.projects.portfolio.kpi.hoursWeekSub": "vs previous week",
1069
+ "staff.timesheets.projects.portfolio.kpi.myHoursMonth": "My hours this month",
1070
+ "staff.timesheets.projects.portfolio.kpi.myHoursWeek": "My hours this week",
1071
+ "staff.timesheets.projects.portfolio.kpi.myProjects": "My projects",
1072
+ "staff.timesheets.projects.portfolio.kpi.noPrevious": "no previous data",
1073
+ "staff.timesheets.projects.portfolio.kpi.onHold": "On Hold",
1074
+ "staff.timesheets.projects.portfolio.kpi.teamActive": "Active team",
1075
+ "staff.timesheets.projects.portfolio.kpi.teamActiveSub": "Members with entries this month",
1076
+ "staff.timesheets.projects.portfolio.kpi.totalProjects": "Total Projects",
1077
+ "staff.timesheets.projects.portfolio.myHoursWeek": "My hours / week",
1078
+ "staff.timesheets.projects.portfolio.myRole": "My role",
1079
+ "staff.timesheets.projects.portfolio.relativeTime.daysAgo": "{days}d temu",
1080
+ "staff.timesheets.projects.portfolio.relativeTime.hoursAgo": "{hours}h temu",
1081
+ "staff.timesheets.projects.portfolio.relativeTime.justNow": "przed chwilą",
1082
+ "staff.timesheets.projects.portfolio.relativeTime.minutesAgo": "{minutes}m temu",
1083
+ "staff.timesheets.projects.portfolio.savedViews.ariaLabel": "Zapisane widoki",
1084
+ "staff.timesheets.projects.portfolio.sparkline.ariaLabel": "Hours per week, last 7 weeks",
1085
+ "staff.timesheets.projects.portfolio.tabs.active": "Active",
1086
+ "staff.timesheets.projects.portfolio.tabs.all": "All",
1087
+ "staff.timesheets.projects.portfolio.tabs.completed": "Completed",
1088
+ "staff.timesheets.projects.portfolio.tabs.mine": "Mine",
1089
+ "staff.timesheets.projects.portfolio.tabs.onHold": "On Hold",
1090
+ "staff.timesheets.projects.portfolio.team": "Team",
1091
+ "staff.timesheets.projects.portfolio.viewMode.ariaLabel": "Tryb widoku",
1092
+ "staff.timesheets.projects.portfolio.viewMode.cards": "Cards",
1093
+ "staff.timesheets.projects.portfolio.viewMode.table": "Table",
1094
+ "staff.timesheets.projects.stats.active": "Active Projects",
1095
+ "staff.timesheets.projects.stats.onHold": "On Hold",
1096
+ "staff.timesheets.projects.stats.total": "Total Projects",
1097
+ "staff.timesheets.projects.statuses.active": "Active",
1098
+ "staff.timesheets.projects.statuses.all": "All",
1099
+ "staff.timesheets.projects.statuses.completed": "Completed",
1100
+ "staff.timesheets.projects.statuses.onHold": "On Hold",
1101
+ "staff.timesheets.projects.table.empty": "No projects yet.",
1102
+ "staff.timesheets.projects.table.name": "Name",
1103
+ "staff.timesheets.projects.table.search": "Search projects...",
1104
+ "staff.timesheets.projects.table.startDate": "Start Date",
1105
+ "staff.timesheets.projects.table.status": "Status",
1106
+ "staff.timesheets.projects.table.type": "Type",
1107
+ "staff.timesheets.projects.table.updatedAt": "Updated",
1108
+ "staff.timesheets.sidebar.timerRunning": "Timer działa — kliknij, aby zobaczyć",
1109
+ "staff.timesheets.widgets.hoursByProject.empty": "No hours tracked in this period.",
1110
+ "staff.timesheets.widgets.hoursByProject.error": "Failed to load data",
1111
+ "staff.timesheets.widgets.hoursByProject.loading": "Loading...",
1112
+ "staff.timesheets.widgets.hoursByProject.settings.dateRange": "Date Range",
1113
+ "staff.timesheets.widgets.hoursByProject.total": "Total",
1114
+ "staff.timesheets.widgets.timeReporting.error": "Failed to load timer state",
1115
+ "staff.timesheets.widgets.timeReporting.loading": "Loading...",
1116
+ "staff.timesheets.widgets.timeReporting.noProjects": "No projects assigned.",
1117
+ "staff.timesheets.widgets.timeReporting.notRunning": "Not running",
1118
+ "staff.timesheets.widgets.timeReporting.notesPlaceholder": "What are you working on?",
1119
+ "staff.timesheets.widgets.timeReporting.project": "Project",
1120
+ "staff.timesheets.widgets.timeReporting.running": "Timer running",
1121
+ "staff.timesheets.widgets.timeReporting.selectProject": "Select project...",
1122
+ "staff.timesheets.widgets.timeReporting.settings.description": "No additional settings. Select a project and start tracking from the widget.",
1123
+ "staff.timesheets.widgets.timeReporting.start": "Start Timer",
1124
+ "staff.timesheets.widgets.timeReporting.startError": "Failed to start timer",
1125
+ "staff.timesheets.widgets.timeReporting.stop": "Stop Timer",
1126
+ "staff.timesheets.widgets.timeReporting.stopError": "Failed to stop timer",
1127
+ "staff.timesheets.widgets.timeReporting.taskNote": "Task / Note",
1128
+ "staff.timesheets.widgets.timeReporting.unknownProject": "Unknown project"
921
1129
  }
@@ -8,6 +8,9 @@ import type {
8
8
  StaffTeamMemberComment,
9
9
  StaffTeamMemberJobHistory,
10
10
  StaffTeamRole,
11
+ StaffTimeEntry,
12
+ StaffTimeProject,
13
+ StaffTimeProjectMember,
11
14
  } from '../data/entities'
12
15
 
13
16
  function buildCrudEvents<TEntity>(entity: string): CrudEventsConfig<TEntity> {
@@ -31,3 +34,8 @@ export const staffTeamMemberAddressCrudEvents = buildCrudEvents<StaffTeamMemberA
31
34
  export const staffTeamMemberCommentCrudEvents = buildCrudEvents<StaffTeamMemberComment>('comment')
32
35
  export const staffTeamMemberActivityCrudEvents = buildCrudEvents<StaffTeamMemberActivity>('activity')
33
36
  export const staffTeamMemberJobHistoryCrudEvents = buildCrudEvents<StaffTeamMemberJobHistory>('job_history')
37
+
38
+ // Timesheets
39
+ export const staffTimeEntryCrudEvents = buildCrudEvents<StaffTimeEntry>('timesheets.time_entry')
40
+ export const staffTimeProjectCrudEvents = buildCrudEvents<StaffTimeProject>('timesheets.time_project')
41
+ export const staffTimeProjectMemberCrudEvents = buildCrudEvents<StaffTimeProjectMember>('timesheets.time_project_member')
@@ -0,0 +1,22 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
3
+ import { StaffTeamMember } from '../data/entities'
4
+
5
+ /**
6
+ * Resolve the StaffTeamMember record for an authenticated user.
7
+ * Returns null if the user has no linked staff member.
8
+ */
9
+ export async function getStaffMemberByUserId(
10
+ em: EntityManager,
11
+ userId: string,
12
+ tenantId: string | null,
13
+ organizationId: string | null,
14
+ ): Promise<StaffTeamMember | null> {
15
+ return findOneWithDecryption(
16
+ em,
17
+ StaffTeamMember,
18
+ { userId, deletedAt: null },
19
+ undefined,
20
+ { tenantId, organizationId },
21
+ )
22
+ }
@@ -0,0 +1,89 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import { addUtcDays, getLastNWeekStarts, toDateOnlyString } from './dateBuckets'
3
+
4
+ export type HoursTrendScope = {
5
+ em: EntityManager
6
+ organizationId: string
7
+ tenantId: string
8
+ projectIds: string[]
9
+ weekCount?: number
10
+ staffMemberId?: string | null
11
+ now?: Date
12
+ }
13
+
14
+ export type ProjectHoursTrend = {
15
+ hoursWeek: number
16
+ hoursTrend: number[]
17
+ }
18
+
19
+ const DEFAULT_WEEK_COUNT = 7
20
+
21
+ export async function computeProjectHoursTrend(
22
+ scope: HoursTrendScope,
23
+ ): Promise<Map<string, ProjectHoursTrend>> {
24
+ const weekCount = scope.weekCount ?? DEFAULT_WEEK_COUNT
25
+ const now = scope.now ?? new Date()
26
+ const weekStarts = getLastNWeekStarts(weekCount, now)
27
+ const oldestStart = weekStarts[0]
28
+ const endExclusive = addUtcDays(weekStarts[weekStarts.length - 1], 7)
29
+
30
+ const result = new Map<string, ProjectHoursTrend>()
31
+ for (const id of scope.projectIds) {
32
+ result.set(id, { hoursWeek: 0, hoursTrend: new Array(weekCount).fill(0) })
33
+ }
34
+
35
+ if (scope.projectIds.length === 0) return result
36
+
37
+ const memberFilter = scope.staffMemberId ? 'AND staff_member_id = ?' : ''
38
+ const projectPlaceholders = scope.projectIds.map(() => '?').join(', ')
39
+ const params: unknown[] = [
40
+ scope.organizationId,
41
+ scope.tenantId,
42
+ ...scope.projectIds,
43
+ toDateOnlyString(oldestStart),
44
+ toDateOnlyString(endExclusive),
45
+ ]
46
+ if (scope.staffMemberId) params.push(scope.staffMemberId)
47
+
48
+ const sql = `
49
+ SELECT
50
+ time_project_id AS project_id,
51
+ date_trunc('week', date)::date AS week_start,
52
+ COALESCE(SUM(duration_minutes), 0)::bigint AS total_minutes
53
+ FROM staff_time_entries
54
+ WHERE organization_id = ?
55
+ AND tenant_id = ?
56
+ AND time_project_id IN (${projectPlaceholders})
57
+ AND deleted_at IS NULL
58
+ AND date >= ?
59
+ AND date < ?
60
+ ${memberFilter}
61
+ GROUP BY 1, 2
62
+ `
63
+
64
+ type Row = { project_id: string; week_start: Date | string; total_minutes: string | number }
65
+ const rows = (await scope.em.getConnection().execute(sql, params)) as Row[]
66
+
67
+ const weekIndex = new Map<string, number>()
68
+ weekStarts.forEach((d, idx) => weekIndex.set(toDateOnlyString(d), idx))
69
+
70
+ for (const row of rows) {
71
+ const bucket = result.get(row.project_id)
72
+ if (!bucket) continue
73
+ const weekKey =
74
+ typeof row.week_start === 'string'
75
+ ? row.week_start.slice(0, 10)
76
+ : toDateOnlyString(row.week_start)
77
+ const idx = weekIndex.get(weekKey)
78
+ if (idx === undefined) continue
79
+ const minutes = typeof row.total_minutes === 'string' ? Number(row.total_minutes) : row.total_minutes
80
+ const hours = Math.round((minutes / 60) * 10) / 10
81
+ bucket.hoursTrend[idx] = hours
82
+ }
83
+
84
+ for (const bucket of result.values()) {
85
+ bucket.hoursWeek = bucket.hoursTrend[bucket.hoursTrend.length - 1] ?? 0
86
+ }
87
+
88
+ return result
89
+ }