@open-mercato/core 0.6.4-develop.4217.1.c9aa050183 → 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
@@ -45,6 +45,7 @@ import { E } from "../../../generated/entities.ids.generated.js";
45
45
  import { findOneWithDecryption, findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
46
46
  import { CUSTOMER_ENTITY_ID, resolveCompanyCustomFieldRouting } from "../lib/customFieldRouting.js";
47
47
  import { CustomFieldValue } from "@open-mercato/core/modules/entities/data/entities";
48
+ import { withAtomicFlush } from "@open-mercato/shared/lib/commands/flush";
48
49
  const COMPANY_ENTITY_ID = "customers:customer_company_profile";
49
50
  const INTERACTION_ENTITY_ID = "customers:customer_interaction";
50
51
  const companyCrudIndexer = {
@@ -340,11 +341,13 @@ const createCompanyCommand = {
340
341
  sizeBucket: parsed.sizeBucket ?? null,
341
342
  annualRevenue: parsed.annualRevenue !== void 0 ? String(parsed.annualRevenue) : null
342
343
  });
343
- em.persist(entity);
344
- em.persist(profile);
345
- await em.flush();
346
- await syncEntityTags(em, entity, parsed.tags);
347
- await em.flush();
344
+ await withAtomicFlush(em, [
345
+ () => {
346
+ em.persist(entity);
347
+ em.persist(profile);
348
+ },
349
+ () => syncEntityTags(em, entity, parsed.tags)
350
+ ], { transaction: true });
348
351
  await setCompanyCustomFields(ctx, entity.id, profile.id, entity.organizationId, entity.tenantId, custom);
349
352
  const de = ctx.container.resolve("dataEngine");
350
353
  await emitCrudSideEffects({
@@ -396,10 +399,13 @@ const createCompanyCommand = {
396
399
  organizationId: entity.organizationId,
397
400
  tenantId: entity.tenantId
398
401
  };
399
- await em.nativeDelete(CustomerCompanyProfile, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
400
- await em.nativeDelete(CustomerTagAssignment, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
401
- em.remove(entity);
402
- await em.flush();
402
+ await withAtomicFlush(em, [
403
+ async () => {
404
+ await em.nativeDelete(CustomerCompanyProfile, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
405
+ await em.nativeDelete(CustomerTagAssignment, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
406
+ em.remove(entity);
407
+ }
408
+ ], { transaction: true });
403
409
  const de = ctx.container.resolve("dataEngine");
404
410
  await emitCrudUndoSideEffects({
405
411
  dataEngine: de,
@@ -460,9 +466,9 @@ const updateCompanyCommand = {
460
466
  if (parsed.annualRevenue !== void 0) {
461
467
  profile.annualRevenue = parsed.annualRevenue !== null && parsed.annualRevenue !== void 0 ? String(parsed.annualRevenue) : null;
462
468
  }
463
- await em.flush();
464
- await syncEntityTags(em, record, parsed.tags);
465
- await em.flush();
469
+ await withAtomicFlush(em, [
470
+ () => syncEntityTags(em, record, parsed.tags)
471
+ ], { transaction: true });
466
472
  await setCompanyCustomFields(ctx, record.id, profile.id, record.organizationId, record.tenantId, custom);
467
473
  const de = ctx.container.resolve("dataEngine");
468
474
  await emitCrudSideEffects({
@@ -889,9 +895,6 @@ const deleteCompanyCommand = {
889
895
  profile.sizeBucket = before.profile.sizeBucket;
890
896
  profile.annualRevenue = before.profile.annualRevenue;
891
897
  }
892
- await em.flush();
893
- await syncEntityTags(em, entity, before.tagIds);
894
- await em.flush();
895
898
  const beforeDeals = before.deals ?? [];
896
899
  const beforeMembers = before.members ?? [];
897
900
  const beforeActivities = before.activities ?? [];
@@ -899,156 +902,154 @@ const deleteCompanyCommand = {
899
902
  const beforeAddresses = before.addresses ?? [];
900
903
  const beforeTodos = before.todos ?? [];
901
904
  const beforeInteractions = before.interactions ?? [];
902
- const relatedDealIds = /* @__PURE__ */ new Set();
903
- for (const link of beforeDeals) relatedDealIds.add(link.dealId);
904
- for (const activity of beforeActivities) {
905
- if (activity.dealId) relatedDealIds.add(activity.dealId);
906
- }
907
- for (const comment of beforeComments) {
908
- if (comment.dealId) relatedDealIds.add(comment.dealId);
909
- }
910
905
  let dealMap = /* @__PURE__ */ new Map();
911
- if (relatedDealIds.size) {
912
- const deals = await em.find(CustomerDeal, {
913
- id: { $in: Array.from(relatedDealIds) },
914
- organizationId: entity.organizationId,
915
- tenantId: entity.tenantId
916
- });
917
- dealMap = new Map(deals.map((deal) => [deal.id, deal]));
918
- }
919
- await em.nativeDelete(CustomerDealCompanyLink, { company: entity });
920
- for (const link of beforeDeals) {
921
- const deal = dealMap.get(link.dealId);
922
- if (!deal) continue;
923
- const restoredLink = em.create(CustomerDealCompanyLink, {
924
- id: link.id,
925
- deal,
926
- company: entity,
927
- createdAt: link.createdAt
928
- });
929
- em.persist(restoredLink);
930
- }
931
- await em.flush();
932
- if (beforeMembers.length) {
933
- const memberIds = beforeMembers.map((member) => member.profileId);
934
- const profiles = await em.find(CustomerPersonProfile, {
935
- id: { $in: memberIds },
936
- organizationId: entity.organizationId,
937
- tenantId: entity.tenantId
938
- });
939
- const profileMap = new Map(profiles.map((profile2) => [profile2.id, profile2]));
940
- for (const member of beforeMembers) {
941
- const memberProfile = profileMap.get(member.profileId);
942
- if (!memberProfile) continue;
943
- memberProfile.company = entity;
906
+ await withAtomicFlush(em, [
907
+ () => syncEntityTags(em, entity, before.tagIds),
908
+ async () => {
909
+ const relatedDealIds = /* @__PURE__ */ new Set();
910
+ for (const link of beforeDeals) relatedDealIds.add(link.dealId);
911
+ for (const activity of beforeActivities) {
912
+ if (activity.dealId) relatedDealIds.add(activity.dealId);
913
+ }
914
+ for (const comment of beforeComments) {
915
+ if (comment.dealId) relatedDealIds.add(comment.dealId);
916
+ }
917
+ if (relatedDealIds.size) {
918
+ const deals = await em.find(CustomerDeal, {
919
+ id: { $in: Array.from(relatedDealIds) },
920
+ organizationId: entity.organizationId,
921
+ tenantId: entity.tenantId
922
+ });
923
+ dealMap = new Map(deals.map((deal) => [deal.id, deal]));
924
+ }
925
+ await em.nativeDelete(CustomerDealCompanyLink, { company: entity });
926
+ for (const link of beforeDeals) {
927
+ const deal = dealMap.get(link.dealId);
928
+ if (!deal) continue;
929
+ const restoredLink = em.create(CustomerDealCompanyLink, {
930
+ id: link.id,
931
+ deal,
932
+ company: entity,
933
+ createdAt: link.createdAt
934
+ });
935
+ em.persist(restoredLink);
936
+ }
937
+ if (beforeMembers.length) {
938
+ const memberIds = beforeMembers.map((member) => member.profileId);
939
+ const profiles = await em.find(CustomerPersonProfile, {
940
+ id: { $in: memberIds },
941
+ organizationId: entity.organizationId,
942
+ tenantId: entity.tenantId
943
+ });
944
+ const profileMap = new Map(profiles.map((profile2) => [profile2.id, profile2]));
945
+ for (const member of beforeMembers) {
946
+ const memberProfile = profileMap.get(member.profileId);
947
+ if (!memberProfile) continue;
948
+ memberProfile.company = entity;
949
+ }
950
+ }
951
+ await em.nativeDelete(CustomerActivity, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
952
+ for (const activity of beforeActivities) {
953
+ const restoredActivity = em.create(CustomerActivity, {
954
+ id: activity.id,
955
+ organizationId: entity.organizationId,
956
+ tenantId: entity.tenantId,
957
+ entity,
958
+ activityType: activity.activityType,
959
+ subject: activity.subject,
960
+ body: activity.body,
961
+ occurredAt: activity.occurredAt,
962
+ authorUserId: activity.authorUserId,
963
+ appearanceIcon: activity.appearanceIcon,
964
+ appearanceColor: activity.appearanceColor,
965
+ deal: activity.dealId ? dealMap.get(activity.dealId) ?? null : null,
966
+ createdAt: activity.createdAt,
967
+ updatedAt: activity.updatedAt
968
+ });
969
+ em.persist(restoredActivity);
970
+ }
971
+ await em.nativeDelete(CustomerComment, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
972
+ for (const comment of beforeComments) {
973
+ const restoredComment = em.create(CustomerComment, {
974
+ id: comment.id,
975
+ organizationId: entity.organizationId,
976
+ tenantId: entity.tenantId,
977
+ entity,
978
+ body: comment.body,
979
+ authorUserId: comment.authorUserId,
980
+ appearanceIcon: comment.appearanceIcon,
981
+ appearanceColor: comment.appearanceColor,
982
+ deal: comment.dealId ? dealMap.get(comment.dealId) ?? null : null,
983
+ createdAt: comment.createdAt,
984
+ updatedAt: comment.updatedAt,
985
+ deletedAt: comment.deletedAt
986
+ });
987
+ em.persist(restoredComment);
988
+ }
989
+ await em.nativeDelete(CustomerAddress, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
990
+ for (const address of beforeAddresses) {
991
+ const restoredAddress = em.create(CustomerAddress, {
992
+ id: address.id,
993
+ organizationId: entity.organizationId,
994
+ tenantId: entity.tenantId,
995
+ entity,
996
+ name: address.name,
997
+ purpose: address.purpose,
998
+ addressLine1: address.addressLine1,
999
+ addressLine2: address.addressLine2,
1000
+ city: address.city,
1001
+ region: address.region,
1002
+ postalCode: address.postalCode,
1003
+ country: address.country,
1004
+ latitude: address.latitude,
1005
+ longitude: address.longitude,
1006
+ isPrimary: address.isPrimary
1007
+ });
1008
+ em.persist(restoredAddress);
1009
+ }
1010
+ await em.nativeDelete(CustomerTodoLink, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
1011
+ for (const todo of beforeTodos) {
1012
+ const restoredTodo = em.create(CustomerTodoLink, {
1013
+ id: todo.id,
1014
+ organizationId: entity.organizationId,
1015
+ tenantId: entity.tenantId,
1016
+ entity,
1017
+ todoId: todo.todoId,
1018
+ todoSource: todo.todoSource,
1019
+ createdAt: todo.createdAt,
1020
+ createdByUserId: todo.createdByUserId
1021
+ });
1022
+ em.persist(restoredTodo);
1023
+ }
1024
+ await em.nativeDelete(CustomerInteraction, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
1025
+ for (const interaction of beforeInteractions) {
1026
+ const restoredInteraction = em.create(CustomerInteraction, {
1027
+ id: interaction.id,
1028
+ organizationId: entity.organizationId,
1029
+ tenantId: entity.tenantId,
1030
+ entity,
1031
+ interactionType: interaction.interactionType,
1032
+ title: interaction.title,
1033
+ body: interaction.body,
1034
+ status: interaction.status,
1035
+ scheduledAt: interaction.scheduledAt,
1036
+ occurredAt: interaction.occurredAt,
1037
+ priority: interaction.priority,
1038
+ authorUserId: interaction.authorUserId,
1039
+ ownerUserId: interaction.ownerUserId,
1040
+ dealId: interaction.dealId,
1041
+ source: interaction.source,
1042
+ appearanceIcon: interaction.appearanceIcon,
1043
+ appearanceColor: interaction.appearanceColor,
1044
+ createdAt: interaction.createdAt,
1045
+ updatedAt: interaction.updatedAt,
1046
+ deletedAt: interaction.deletedAt
1047
+ });
1048
+ em.persist(restoredInteraction);
1049
+ }
944
1050
  }
945
- await em.flush();
946
- }
947
- await em.nativeDelete(CustomerActivity, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
948
- for (const activity of beforeActivities) {
949
- const restoredActivity = em.create(CustomerActivity, {
950
- id: activity.id,
951
- organizationId: entity.organizationId,
952
- tenantId: entity.tenantId,
953
- entity,
954
- activityType: activity.activityType,
955
- subject: activity.subject,
956
- body: activity.body,
957
- occurredAt: activity.occurredAt,
958
- authorUserId: activity.authorUserId,
959
- appearanceIcon: activity.appearanceIcon,
960
- appearanceColor: activity.appearanceColor,
961
- deal: activity.dealId ? dealMap.get(activity.dealId) ?? null : null,
962
- createdAt: activity.createdAt,
963
- updatedAt: activity.updatedAt
964
- });
965
- em.persist(restoredActivity);
966
- }
967
- await em.flush();
968
- await em.nativeDelete(CustomerComment, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
969
- for (const comment of beforeComments) {
970
- const restoredComment = em.create(CustomerComment, {
971
- id: comment.id,
972
- organizationId: entity.organizationId,
973
- tenantId: entity.tenantId,
974
- entity,
975
- body: comment.body,
976
- authorUserId: comment.authorUserId,
977
- appearanceIcon: comment.appearanceIcon,
978
- appearanceColor: comment.appearanceColor,
979
- deal: comment.dealId ? dealMap.get(comment.dealId) ?? null : null,
980
- createdAt: comment.createdAt,
981
- updatedAt: comment.updatedAt,
982
- deletedAt: comment.deletedAt
983
- });
984
- em.persist(restoredComment);
985
- }
986
- await em.flush();
987
- await em.nativeDelete(CustomerAddress, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
988
- for (const address of beforeAddresses) {
989
- const restoredAddress = em.create(CustomerAddress, {
990
- id: address.id,
991
- organizationId: entity.organizationId,
992
- tenantId: entity.tenantId,
993
- entity,
994
- name: address.name,
995
- purpose: address.purpose,
996
- addressLine1: address.addressLine1,
997
- addressLine2: address.addressLine2,
998
- city: address.city,
999
- region: address.region,
1000
- postalCode: address.postalCode,
1001
- country: address.country,
1002
- latitude: address.latitude,
1003
- longitude: address.longitude,
1004
- isPrimary: address.isPrimary
1005
- });
1006
- em.persist(restoredAddress);
1007
- }
1008
- await em.flush();
1009
- await em.nativeDelete(CustomerTodoLink, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
1010
- for (const todo of beforeTodos) {
1011
- const restoredTodo = em.create(CustomerTodoLink, {
1012
- id: todo.id,
1013
- organizationId: entity.organizationId,
1014
- tenantId: entity.tenantId,
1015
- entity,
1016
- todoId: todo.todoId,
1017
- todoSource: todo.todoSource,
1018
- createdAt: todo.createdAt,
1019
- createdByUserId: todo.createdByUserId
1020
- });
1021
- em.persist(restoredTodo);
1022
- }
1023
- await em.flush();
1051
+ ], { transaction: true });
1024
1052
  const de = ctx.container.resolve("dataEngine");
1025
- await em.nativeDelete(CustomerInteraction, { entity, organizationId: entity.organizationId, tenantId: entity.tenantId });
1026
- for (const interaction of beforeInteractions) {
1027
- const restoredInteraction = em.create(CustomerInteraction, {
1028
- id: interaction.id,
1029
- organizationId: entity.organizationId,
1030
- tenantId: entity.tenantId,
1031
- entity,
1032
- interactionType: interaction.interactionType,
1033
- title: interaction.title,
1034
- body: interaction.body,
1035
- status: interaction.status,
1036
- scheduledAt: interaction.scheduledAt,
1037
- occurredAt: interaction.occurredAt,
1038
- priority: interaction.priority,
1039
- authorUserId: interaction.authorUserId,
1040
- ownerUserId: interaction.ownerUserId,
1041
- dealId: interaction.dealId,
1042
- source: interaction.source,
1043
- appearanceIcon: interaction.appearanceIcon,
1044
- appearanceColor: interaction.appearanceColor,
1045
- createdAt: interaction.createdAt,
1046
- updatedAt: interaction.updatedAt,
1047
- deletedAt: interaction.deletedAt
1048
- });
1049
- em.persist(restoredInteraction);
1050
- }
1051
- await em.flush();
1052
1053
  for (const interaction of beforeInteractions) {
1053
1054
  if (!interaction.custom || !Object.keys(interaction.custom).length) continue;
1054
1055
  await setCustomFieldsIfAny({