@hed-hog/operations 0.0.322 → 0.0.325

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 (689) hide show
  1. package/dist/controllers/operations-collaborators.controller.d.ts +9 -0
  2. package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
  3. package/dist/controllers/operations-collaborators.controller.js +25 -0
  4. package/dist/controllers/operations-collaborators.controller.js.map +1 -1
  5. package/dist/controllers/operations-project-costs.controller.d.ts +422 -0
  6. package/dist/controllers/operations-project-costs.controller.d.ts.map +1 -0
  7. package/dist/controllers/operations-project-costs.controller.js +250 -0
  8. package/dist/controllers/operations-project-costs.controller.js.map +1 -0
  9. package/dist/controllers/operations-reports.controller.d.ts +9 -0
  10. package/dist/controllers/operations-reports.controller.d.ts.map +1 -1
  11. package/dist/controllers/operations-tasks.controller.d.ts +42 -0
  12. package/dist/controllers/operations-tasks.controller.d.ts.map +1 -1
  13. package/dist/controllers/operations-tasks.controller.js +48 -0
  14. package/dist/controllers/operations-tasks.controller.js.map +1 -1
  15. package/dist/controllers/operations-timesheets.controller.d.ts +1 -0
  16. package/dist/controllers/operations-timesheets.controller.d.ts.map +1 -1
  17. package/dist/dto/create-collaborator-project-assignment.dto.d.ts +5 -0
  18. package/dist/dto/create-collaborator-project-assignment.dto.d.ts.map +1 -0
  19. package/dist/dto/create-collaborator-project-assignment.dto.js +30 -0
  20. package/dist/dto/create-collaborator-project-assignment.dto.js.map +1 -0
  21. package/dist/dto/create-project-cost-category.dto.d.ts +10 -0
  22. package/dist/dto/create-project-cost-category.dto.d.ts.map +1 -0
  23. package/dist/dto/create-project-cost-category.dto.js +59 -0
  24. package/dist/dto/create-project-cost-category.dto.js.map +1 -0
  25. package/dist/dto/create-project-cost-type.dto.d.ts +14 -0
  26. package/dist/dto/create-project-cost-type.dto.d.ts.map +1 -0
  27. package/dist/dto/create-project-cost-type.dto.js +87 -0
  28. package/dist/dto/create-project-cost-type.dto.js.map +1 -0
  29. package/dist/dto/create-project-cost.dto.d.ts +22 -0
  30. package/dist/dto/create-project-cost.dto.d.ts.map +1 -0
  31. package/dist/dto/create-project-cost.dto.js +135 -0
  32. package/dist/dto/create-project-cost.dto.js.map +1 -0
  33. package/dist/dto/get-project-cost-report.dto.d.ts +10 -0
  34. package/dist/dto/get-project-cost-report.dto.d.ts.map +1 -0
  35. package/dist/dto/get-project-cost-report.dto.js +65 -0
  36. package/dist/dto/get-project-cost-report.dto.js.map +1 -0
  37. package/dist/dto/list-project-cost-categories.dto.d.ts +6 -0
  38. package/dist/dto/list-project-cost-categories.dto.d.ts.map +1 -0
  39. package/dist/dto/list-project-cost-categories.dto.js +34 -0
  40. package/dist/dto/list-project-cost-categories.dto.js.map +1 -0
  41. package/dist/dto/list-project-cost-types.dto.d.ts +8 -0
  42. package/dist/dto/list-project-cost-types.dto.d.ts.map +1 -0
  43. package/dist/dto/list-project-cost-types.dto.js +45 -0
  44. package/dist/dto/list-project-cost-types.dto.js.map +1 -0
  45. package/dist/dto/list-project-costs.dto.d.ts +14 -0
  46. package/dist/dto/list-project-costs.dto.d.ts.map +1 -0
  47. package/dist/dto/list-project-costs.dto.js +81 -0
  48. package/dist/dto/list-project-costs.dto.js.map +1 -0
  49. package/dist/dto/list-tasks.dto.d.ts +1 -0
  50. package/dist/dto/list-tasks.dto.d.ts.map +1 -1
  51. package/dist/dto/list-tasks.dto.js +6 -0
  52. package/dist/dto/list-tasks.dto.js.map +1 -1
  53. package/dist/dto/list-timesheets.dto.d.ts +1 -0
  54. package/dist/dto/list-timesheets.dto.d.ts.map +1 -1
  55. package/dist/dto/list-timesheets.dto.js +7 -0
  56. package/dist/dto/list-timesheets.dto.js.map +1 -1
  57. package/dist/dto/update-collaborator-project-assignment.dto.d.ts +11 -0
  58. package/dist/dto/update-collaborator-project-assignment.dto.d.ts.map +1 -0
  59. package/dist/dto/update-collaborator-project-assignment.dto.js +65 -0
  60. package/dist/dto/update-collaborator-project-assignment.dto.js.map +1 -0
  61. package/dist/dto/update-project-cost-category.dto.d.ts +6 -0
  62. package/dist/dto/update-project-cost-category.dto.d.ts.map +1 -0
  63. package/dist/dto/update-project-cost-category.dto.js +9 -0
  64. package/dist/dto/update-project-cost-category.dto.js.map +1 -0
  65. package/dist/dto/update-project-cost-type.dto.d.ts +6 -0
  66. package/dist/dto/update-project-cost-type.dto.d.ts.map +1 -0
  67. package/dist/dto/update-project-cost-type.dto.js +9 -0
  68. package/dist/dto/update-project-cost-type.dto.js.map +1 -0
  69. package/dist/dto/update-project-cost.dto.d.ts +6 -0
  70. package/dist/dto/update-project-cost.dto.d.ts.map +1 -0
  71. package/dist/dto/update-project-cost.dto.js +9 -0
  72. package/dist/dto/update-project-cost.dto.js.map +1 -0
  73. package/dist/operations.module.d.ts.map +1 -1
  74. package/dist/operations.module.js +2 -0
  75. package/dist/operations.module.js.map +1 -1
  76. package/dist/operations.service.d.ts +562 -0
  77. package/dist/operations.service.d.ts.map +1 -1
  78. package/dist/operations.service.js +1657 -47
  79. package/dist/operations.service.js.map +1 -1
  80. package/hedhog/data/menu.yaml +52 -0
  81. package/hedhog/data/operations_project_cost_category.yaml +80 -0
  82. package/hedhog/data/operations_project_cost_type.yaml +503 -0
  83. package/hedhog/data/route.yaml +274 -0
  84. package/hedhog/frontend/app/_components/collaborator-costs-section.tsx.ejs +2 -18
  85. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +185 -276
  86. package/hedhog/frontend/app/_components/collaborator-tasks-tab.tsx.ejs +358 -0
  87. package/hedhog/frontend/app/_components/collaborator-timesheets-tab.tsx.ejs +242 -0
  88. package/hedhog/frontend/app/_components/my-project-summary-screen.tsx.ejs +167 -59
  89. package/hedhog/frontend/app/_components/person-select-with-create.tsx.ejs +1 -853
  90. package/hedhog/frontend/app/_components/project-assignments-tab.tsx.ejs +450 -0
  91. package/hedhog/frontend/app/_components/project-cost-report-screen.tsx.ejs +602 -0
  92. package/hedhog/frontend/app/_components/project-costs-section.tsx.ejs +1401 -0
  93. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +2003 -1846
  94. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +56 -11
  95. package/hedhog/frontend/app/_components/task-detail-sheet.tsx.ejs +297 -2
  96. package/hedhog/frontend/app/_components/task-form-sheet.tsx.ejs +530 -0
  97. package/hedhog/frontend/app/_lib/api.ts.ejs +247 -0
  98. package/hedhog/frontend/app/_lib/types.ts.ejs +196 -7
  99. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +9 -3
  100. package/hedhog/frontend/app/collaborators/page.tsx.ejs +18 -7
  101. package/hedhog/frontend/app/my-tasks/page.tsx.ejs +219 -122
  102. package/hedhog/frontend/app/project-cost-categories/page.tsx.ejs +674 -0
  103. package/hedhog/frontend/app/project-cost-types/page.tsx.ejs +845 -0
  104. package/hedhog/frontend/app/projects/[id]/costs-report/page.tsx.ejs +10 -0
  105. package/hedhog/frontend/app/reports/collaborators/page.tsx.ejs +20 -349
  106. package/hedhog/frontend/app/reports/projects/page.tsx.ejs +192 -484
  107. package/hedhog/frontend/messages/en.json +279 -10
  108. package/hedhog/frontend/messages/en.json.ejs +2043 -0
  109. package/hedhog/frontend/messages/operations/en.json +2068 -0
  110. package/hedhog/frontend/messages/operations/operations/en.json +2102 -0
  111. package/hedhog/frontend/messages/operations/operations/pt.json +2111 -0
  112. package/hedhog/frontend/messages/operations/pt.json +2072 -0
  113. package/hedhog/frontend/messages/pt.json +284 -13
  114. package/hedhog/frontend/messages/pt.json.ejs +2056 -0
  115. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.d.ts +29 -0
  116. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.d.ts.map +1 -0
  117. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.js +95 -0
  118. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.js.map +1 -0
  119. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/async-options-combobox.tsx +233 -0
  120. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.d.ts +10 -0
  121. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.d.ts.map +1 -0
  122. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.js +577 -0
  123. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.js.map +1 -0
  124. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-costs-section.tsx +868 -0
  125. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.d.ts +4 -0
  126. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.d.ts.map +1 -0
  127. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.js +337 -0
  128. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.js.map +1 -0
  129. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-details-screen.tsx +476 -0
  130. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.d.ts +9 -0
  131. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.d.ts.map +1 -0
  132. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.js +1348 -0
  133. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.js.map +1 -0
  134. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-form-screen.tsx +2233 -0
  135. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.d.ts +12 -0
  136. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.d.ts.map +1 -0
  137. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.js +162 -0
  138. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.js.map +1 -0
  139. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/collaborator-select-with-create.tsx +261 -0
  140. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.d.ts +18 -0
  141. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.d.ts.map +1 -0
  142. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.js +145 -0
  143. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.js.map +1 -0
  144. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-content-editor.tsx +258 -0
  145. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.d.ts +4 -0
  146. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.d.ts.map +1 -0
  147. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.js +223 -0
  148. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.js.map +1 -0
  149. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-details-screen.tsx +342 -0
  150. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.d.ts +58 -0
  151. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.d.ts.map +1 -0
  152. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.js +438 -0
  153. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.js.map +1 -0
  154. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/contract-form-screen.tsx +698 -0
  155. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.d.ts +20 -0
  156. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.d.ts.map +1 -0
  157. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.js +233 -0
  158. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.js.map +1 -0
  159. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/department-select-with-create.tsx +392 -0
  160. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.d.ts +4 -0
  161. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.d.ts.map +1 -0
  162. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.js +814 -0
  163. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.js.map +1 -0
  164. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/my-project-summary-screen.tsx +1288 -0
  165. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.d.ts +21 -0
  166. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.d.ts.map +1 -0
  167. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.js +174 -0
  168. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.js.map +1 -0
  169. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-calendar-view.tsx +306 -0
  170. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.d.ts +10 -0
  171. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.d.ts.map +1 -0
  172. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.js +12 -0
  173. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.js.map +1 -0
  174. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/operations-header.tsx +29 -0
  175. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.d.ts +15 -0
  176. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.d.ts.map +1 -0
  177. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.js +501 -0
  178. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.js.map +1 -0
  179. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/person-select-with-create.tsx +853 -0
  180. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.d.ts +6 -0
  181. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.d.ts.map +1 -0
  182. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.js +847 -0
  183. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.js.map +1 -0
  184. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-costs-section.tsx +1340 -0
  185. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.d.ts +4 -0
  186. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.d.ts.map +1 -0
  187. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.js +2930 -0
  188. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.js.map +1 -0
  189. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-details-screen.tsx +4378 -0
  190. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.d.ts +9 -0
  191. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.d.ts.map +1 -0
  192. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.js +1013 -0
  193. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.js.map +1 -0
  194. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/project-form-screen.tsx +1745 -0
  195. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.d.ts +13 -0
  196. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.d.ts.map +1 -0
  197. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.js +38 -0
  198. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.js.map +1 -0
  199. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/section-card.tsx +74 -0
  200. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.d.ts +7 -0
  201. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.d.ts.map +1 -0
  202. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.js +11 -0
  203. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.js.map +1 -0
  204. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/status-badge.tsx +15 -0
  205. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.d.ts +18 -0
  206. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.d.ts.map +1 -0
  207. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.js +406 -0
  208. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.js.map +1 -0
  209. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/system-user-select-with-create.tsx +660 -0
  210. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.d.ts +26 -0
  211. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.d.ts.map +1 -0
  212. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.js +332 -0
  213. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.js.map +1 -0
  214. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-detail-sheet.tsx +518 -0
  215. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.d.ts +6 -0
  216. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.d.ts.map +1 -0
  217. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.js +255 -0
  218. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.js.map +1 -0
  219. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/task-file-attachments.tsx +388 -0
  220. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.d.ts +10 -0
  221. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.d.ts.map +1 -0
  222. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.js +131 -0
  223. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.js.map +1 -0
  224. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_components/timesheet-task-create-sheet.tsx +214 -0
  225. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.d.ts +108 -0
  226. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.d.ts.map +1 -0
  227. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.js +162 -0
  228. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.js.map +1 -0
  229. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/api.ts +428 -0
  230. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.d.ts +8 -0
  231. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.d.ts.map +1 -0
  232. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.js +36 -0
  233. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.js.map +1 -0
  234. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/hooks/use-operations-access.ts +44 -0
  235. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.d.ts +836 -0
  236. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.d.ts.map +1 -0
  237. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.js +3 -0
  238. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.js.map +1 -0
  239. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/types.ts +860 -0
  240. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.d.ts +16 -0
  241. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.d.ts.map +1 -0
  242. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.js +182 -0
  243. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.js.map +1 -0
  244. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/format.ts +250 -0
  245. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.d.ts +4 -0
  246. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.d.ts.map +1 -0
  247. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.js +51 -0
  248. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.js.map +1 -0
  249. package/hedhog/frontend/src/app/(app)/(libraries)/operations/_lib/utils/forms.ts +61 -0
  250. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.d.ts +2 -0
  251. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.d.ts.map +1 -0
  252. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.js +954 -0
  253. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.js.map +1 -0
  254. package/hedhog/frontend/src/app/(app)/(libraries)/operations/approvals/page.tsx +1277 -0
  255. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.d.ts +2 -0
  256. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.d.ts.map +1 -0
  257. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.js +488 -0
  258. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.js.map +1 -0
  259. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborator-types/page.tsx +805 -0
  260. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.d.ts +6 -0
  261. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.d.ts.map +1 -0
  262. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.js +9 -0
  263. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.js.map +1 -0
  264. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/edit/page.tsx +11 -0
  265. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.d.ts +6 -0
  266. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.d.ts.map +1 -0
  267. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.js +9 -0
  268. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.js.map +1 -0
  269. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/[id]/page.tsx +11 -0
  270. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.d.ts +2 -0
  271. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.d.ts.map +1 -0
  272. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.js +8 -0
  273. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.js.map +1 -0
  274. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/new/page.tsx +5 -0
  275. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.d.ts +2 -0
  276. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.d.ts.map +1 -0
  277. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.js +612 -0
  278. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.js.map +1 -0
  279. package/hedhog/frontend/src/app/(app)/(libraries)/operations/collaborators/page.tsx +939 -0
  280. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.d.ts +6 -0
  281. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.d.ts.map +1 -0
  282. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.js +9 -0
  283. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.js.map +1 -0
  284. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/edit/page.tsx +11 -0
  285. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.d.ts +6 -0
  286. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.d.ts.map +1 -0
  287. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.js +9 -0
  288. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.js.map +1 -0
  289. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/[id]/page.tsx +11 -0
  290. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.d.ts +6 -0
  291. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.d.ts.map +1 -0
  292. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.js +9 -0
  293. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.js.map +1 -0
  294. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/new/page.tsx +17 -0
  295. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.d.ts +2 -0
  296. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.d.ts.map +1 -0
  297. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.js +348 -0
  298. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.js.map +1 -0
  299. package/hedhog/frontend/src/app/(app)/(libraries)/operations/contracts/page.tsx +536 -0
  300. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.d.ts +2 -0
  301. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.d.ts.map +1 -0
  302. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.js +401 -0
  303. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.js.map +1 -0
  304. package/hedhog/frontend/src/app/(app)/(libraries)/operations/departments/page.tsx +607 -0
  305. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.d.ts +5 -0
  306. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.d.ts.map +1 -0
  307. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.js +7 -0
  308. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.js.map +1 -0
  309. package/hedhog/frontend/src/app/(app)/(libraries)/operations/layout.tsx +9 -0
  310. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.d.ts +6 -0
  311. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.d.ts.map +1 -0
  312. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.js +9 -0
  313. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.js.map +1 -0
  314. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/[id]/page.tsx +11 -0
  315. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.d.ts +2 -0
  316. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.d.ts.map +1 -0
  317. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.js +321 -0
  318. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.js.map +1 -0
  319. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-projects/page.tsx +440 -0
  320. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.d.ts +2 -0
  321. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.d.ts.map +1 -0
  322. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.js +939 -0
  323. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.js.map +1 -0
  324. package/hedhog/frontend/src/app/(app)/(libraries)/operations/my-tasks/page.tsx +1499 -0
  325. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.d.ts +29 -0
  326. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.d.ts.map +1 -0
  327. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.js +95 -0
  328. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.js.map +1 -0
  329. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/async-options-combobox.tsx +233 -0
  330. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.d.ts +10 -0
  331. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.d.ts.map +1 -0
  332. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.js +577 -0
  333. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.js.map +1 -0
  334. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-costs-section.tsx +868 -0
  335. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.d.ts +4 -0
  336. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.d.ts.map +1 -0
  337. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.js +337 -0
  338. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.js.map +1 -0
  339. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-details-screen.tsx +476 -0
  340. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.d.ts +9 -0
  341. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.d.ts.map +1 -0
  342. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.js +1348 -0
  343. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.js.map +1 -0
  344. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-form-screen.tsx +2233 -0
  345. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.d.ts +12 -0
  346. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.d.ts.map +1 -0
  347. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.js +162 -0
  348. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.js.map +1 -0
  349. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/collaborator-select-with-create.tsx +261 -0
  350. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.d.ts +18 -0
  351. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.d.ts.map +1 -0
  352. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.js +145 -0
  353. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.js.map +1 -0
  354. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-content-editor.tsx +258 -0
  355. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.d.ts +4 -0
  356. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.d.ts.map +1 -0
  357. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.js +223 -0
  358. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.js.map +1 -0
  359. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-details-screen.tsx +342 -0
  360. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.d.ts +58 -0
  361. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.d.ts.map +1 -0
  362. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.js +438 -0
  363. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.js.map +1 -0
  364. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/contract-form-screen.tsx +698 -0
  365. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.d.ts +20 -0
  366. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.d.ts.map +1 -0
  367. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.js +233 -0
  368. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.js.map +1 -0
  369. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/department-select-with-create.tsx +392 -0
  370. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.d.ts +4 -0
  371. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.d.ts.map +1 -0
  372. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.js +814 -0
  373. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.js.map +1 -0
  374. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/my-project-summary-screen.tsx +1288 -0
  375. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.d.ts +21 -0
  376. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.d.ts.map +1 -0
  377. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.js +174 -0
  378. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.js.map +1 -0
  379. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-calendar-view.tsx +306 -0
  380. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.d.ts +10 -0
  381. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.d.ts.map +1 -0
  382. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.js +12 -0
  383. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.js.map +1 -0
  384. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/operations-header.tsx +29 -0
  385. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.d.ts +15 -0
  386. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.d.ts.map +1 -0
  387. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.js +501 -0
  388. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.js.map +1 -0
  389. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/person-select-with-create.tsx +853 -0
  390. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.d.ts +6 -0
  391. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.d.ts.map +1 -0
  392. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.js +459 -0
  393. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.js.map +1 -0
  394. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-cost-report-screen.tsx +598 -0
  395. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.d.ts +6 -0
  396. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.d.ts.map +1 -0
  397. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.js +876 -0
  398. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.js.map +1 -0
  399. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-costs-section.tsx +1368 -0
  400. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.d.ts +4 -0
  401. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.d.ts.map +1 -0
  402. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.js +2930 -0
  403. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.js.map +1 -0
  404. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-details-screen.tsx +4378 -0
  405. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.d.ts +9 -0
  406. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.d.ts.map +1 -0
  407. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.js +1013 -0
  408. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.js.map +1 -0
  409. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/project-form-screen.tsx +1745 -0
  410. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.d.ts +13 -0
  411. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.d.ts.map +1 -0
  412. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.js +38 -0
  413. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.js.map +1 -0
  414. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/section-card.tsx +74 -0
  415. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.d.ts +7 -0
  416. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.d.ts.map +1 -0
  417. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.js +11 -0
  418. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.js.map +1 -0
  419. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/status-badge.tsx +15 -0
  420. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.d.ts +18 -0
  421. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.d.ts.map +1 -0
  422. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.js +406 -0
  423. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.js.map +1 -0
  424. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/system-user-select-with-create.tsx +660 -0
  425. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.d.ts +26 -0
  426. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.d.ts.map +1 -0
  427. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.js +332 -0
  428. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.js.map +1 -0
  429. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-detail-sheet.tsx +518 -0
  430. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.d.ts +6 -0
  431. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.d.ts.map +1 -0
  432. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.js +255 -0
  433. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.js.map +1 -0
  434. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/task-file-attachments.tsx +388 -0
  435. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.d.ts +10 -0
  436. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.d.ts.map +1 -0
  437. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.js +131 -0
  438. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.js.map +1 -0
  439. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_components/timesheet-task-create-sheet.tsx +214 -0
  440. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.d.ts +108 -0
  441. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.d.ts.map +1 -0
  442. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.js +162 -0
  443. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.js.map +1 -0
  444. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/api.ts +428 -0
  445. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.d.ts +8 -0
  446. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.d.ts.map +1 -0
  447. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.js +36 -0
  448. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.js.map +1 -0
  449. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/hooks/use-operations-access.ts +44 -0
  450. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.d.ts +836 -0
  451. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.d.ts.map +1 -0
  452. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.js +3 -0
  453. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.js.map +1 -0
  454. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/types.ts +860 -0
  455. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.d.ts +16 -0
  456. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.d.ts.map +1 -0
  457. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.js +182 -0
  458. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.js.map +1 -0
  459. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/format.ts +250 -0
  460. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.d.ts +4 -0
  461. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.d.ts.map +1 -0
  462. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.js +51 -0
  463. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.js.map +1 -0
  464. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/_lib/utils/forms.ts +61 -0
  465. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.d.ts +2 -0
  466. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.d.ts.map +1 -0
  467. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.js +954 -0
  468. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.js.map +1 -0
  469. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/approvals/page.tsx +1277 -0
  470. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.d.ts +2 -0
  471. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.d.ts.map +1 -0
  472. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.js +488 -0
  473. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.js.map +1 -0
  474. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborator-types/page.tsx +805 -0
  475. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.d.ts +6 -0
  476. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.d.ts.map +1 -0
  477. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.js +9 -0
  478. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.js.map +1 -0
  479. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/edit/page.tsx +11 -0
  480. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.d.ts +6 -0
  481. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.d.ts.map +1 -0
  482. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.js +9 -0
  483. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.js.map +1 -0
  484. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/[id]/page.tsx +11 -0
  485. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.d.ts +2 -0
  486. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.d.ts.map +1 -0
  487. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.js +8 -0
  488. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.js.map +1 -0
  489. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/new/page.tsx +5 -0
  490. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.d.ts +2 -0
  491. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.d.ts.map +1 -0
  492. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.js +612 -0
  493. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.js.map +1 -0
  494. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/collaborators/page.tsx +939 -0
  495. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.d.ts +6 -0
  496. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.d.ts.map +1 -0
  497. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.js +9 -0
  498. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.js.map +1 -0
  499. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/edit/page.tsx +11 -0
  500. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.d.ts +6 -0
  501. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.d.ts.map +1 -0
  502. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.js +9 -0
  503. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.js.map +1 -0
  504. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/[id]/page.tsx +11 -0
  505. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.d.ts +6 -0
  506. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.d.ts.map +1 -0
  507. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.js +9 -0
  508. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.js.map +1 -0
  509. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/new/page.tsx +17 -0
  510. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.d.ts +2 -0
  511. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.d.ts.map +1 -0
  512. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.js +348 -0
  513. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.js.map +1 -0
  514. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/contracts/page.tsx +536 -0
  515. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.d.ts +2 -0
  516. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.d.ts.map +1 -0
  517. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.js +401 -0
  518. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.js.map +1 -0
  519. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/departments/page.tsx +607 -0
  520. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.d.ts +5 -0
  521. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.d.ts.map +1 -0
  522. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.js +7 -0
  523. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.js.map +1 -0
  524. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/layout.tsx +9 -0
  525. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.d.ts +6 -0
  526. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.d.ts.map +1 -0
  527. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.js +9 -0
  528. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.js.map +1 -0
  529. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/[id]/page.tsx +11 -0
  530. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.d.ts +2 -0
  531. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.d.ts.map +1 -0
  532. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.js +321 -0
  533. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.js.map +1 -0
  534. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-projects/page.tsx +440 -0
  535. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.d.ts +2 -0
  536. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.d.ts.map +1 -0
  537. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.js +939 -0
  538. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.js.map +1 -0
  539. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/my-tasks/page.tsx +1499 -0
  540. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.d.ts +2 -0
  541. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.d.ts.map +1 -0
  542. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.js +8 -0
  543. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.js.map +1 -0
  544. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/page.tsx +5 -0
  545. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.d.ts +2 -0
  546. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.d.ts.map +1 -0
  547. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.js +436 -0
  548. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.js.map +1 -0
  549. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-categories/page.tsx +675 -0
  550. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.d.ts +2 -0
  551. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.d.ts.map +1 -0
  552. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.js +563 -0
  553. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.js.map +1 -0
  554. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/project-cost-types/page.tsx +846 -0
  555. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.d.ts +6 -0
  556. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.d.ts.map +1 -0
  557. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.js +9 -0
  558. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.js.map +1 -0
  559. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/costs-report/page.tsx +10 -0
  560. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.d.ts +6 -0
  561. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.d.ts.map +1 -0
  562. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.js +9 -0
  563. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.js.map +1 -0
  564. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/edit/page.tsx +11 -0
  565. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.d.ts +6 -0
  566. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.d.ts.map +1 -0
  567. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.js +9 -0
  568. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.js.map +1 -0
  569. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/[id]/page.tsx +11 -0
  570. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.d.ts +2 -0
  571. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.d.ts.map +1 -0
  572. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.js +8 -0
  573. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.js.map +1 -0
  574. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/new/page.tsx +5 -0
  575. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.d.ts +2 -0
  576. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.d.ts.map +1 -0
  577. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.js +492 -0
  578. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.js.map +1 -0
  579. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/projects/page.tsx +757 -0
  580. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.d.ts +2 -0
  581. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.d.ts.map +1 -0
  582. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.js +342 -0
  583. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.js.map +1 -0
  584. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/collaborators/page.tsx +430 -0
  585. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.d.ts +2 -0
  586. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.d.ts.map +1 -0
  587. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.js +338 -0
  588. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.js.map +1 -0
  589. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/reports/projects/page.tsx +428 -0
  590. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.d.ts +2 -0
  591. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.d.ts.map +1 -0
  592. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.js +660 -0
  593. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.js.map +1 -0
  594. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/schedule-adjustments/page.tsx +992 -0
  595. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.d.ts +2 -0
  596. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.d.ts.map +1 -0
  597. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.js +515 -0
  598. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.js.map +1 -0
  599. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/time-off/page.tsx +707 -0
  600. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.d.ts +2 -0
  601. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.d.ts.map +1 -0
  602. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.js +1141 -0
  603. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.js.map +1 -0
  604. package/hedhog/frontend/src/app/(app)/(libraries)/operations/operations/timesheets/page.tsx +1705 -0
  605. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.d.ts +2 -0
  606. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.d.ts.map +1 -0
  607. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.js +8 -0
  608. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.js.map +1 -0
  609. package/hedhog/frontend/src/app/(app)/(libraries)/operations/page.tsx +5 -0
  610. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.d.ts +2 -0
  611. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.d.ts.map +1 -0
  612. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.js +436 -0
  613. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.js.map +1 -0
  614. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-categories/page.tsx +675 -0
  615. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.d.ts +2 -0
  616. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.d.ts.map +1 -0
  617. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.js +563 -0
  618. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.js.map +1 -0
  619. package/hedhog/frontend/src/app/(app)/(libraries)/operations/project-cost-types/page.tsx +846 -0
  620. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.d.ts +6 -0
  621. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.d.ts.map +1 -0
  622. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.js +9 -0
  623. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.js.map +1 -0
  624. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/edit/page.tsx +11 -0
  625. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.d.ts +6 -0
  626. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.d.ts.map +1 -0
  627. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.js +9 -0
  628. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.js.map +1 -0
  629. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/[id]/page.tsx +11 -0
  630. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.d.ts +2 -0
  631. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.d.ts.map +1 -0
  632. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.js +8 -0
  633. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.js.map +1 -0
  634. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/new/page.tsx +5 -0
  635. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.d.ts +2 -0
  636. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.d.ts.map +1 -0
  637. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.js +492 -0
  638. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.js.map +1 -0
  639. package/hedhog/frontend/src/app/(app)/(libraries)/operations/projects/page.tsx +757 -0
  640. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.d.ts +2 -0
  641. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.d.ts.map +1 -0
  642. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.js +342 -0
  643. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.js.map +1 -0
  644. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/collaborators/page.tsx +430 -0
  645. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.d.ts +2 -0
  646. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.d.ts.map +1 -0
  647. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.js +338 -0
  648. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.js.map +1 -0
  649. package/hedhog/frontend/src/app/(app)/(libraries)/operations/reports/projects/page.tsx +428 -0
  650. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.d.ts +2 -0
  651. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.d.ts.map +1 -0
  652. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.js +660 -0
  653. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.js.map +1 -0
  654. package/hedhog/frontend/src/app/(app)/(libraries)/operations/schedule-adjustments/page.tsx +992 -0
  655. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.d.ts +2 -0
  656. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.d.ts.map +1 -0
  657. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.js +515 -0
  658. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.js.map +1 -0
  659. package/hedhog/frontend/src/app/(app)/(libraries)/operations/time-off/page.tsx +707 -0
  660. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.d.ts +2 -0
  661. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.d.ts.map +1 -0
  662. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.js +1141 -0
  663. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.js.map +1 -0
  664. package/hedhog/frontend/src/app/(app)/(libraries)/operations/timesheets/page.tsx +1705 -0
  665. package/hedhog/table/operations_project_assignment.yaml +1 -0
  666. package/hedhog/table/operations_project_cost.yaml +93 -0
  667. package/hedhog/table/operations_project_cost_category.yaml +37 -0
  668. package/hedhog/table/operations_project_cost_type.yaml +55 -0
  669. package/hedhog/table/operations_task_comment.yaml +26 -0
  670. package/package.json +6 -6
  671. package/src/controllers/operations-collaborators.controller.ts +26 -0
  672. package/src/controllers/operations-project-costs.controller.ts +249 -0
  673. package/src/controllers/operations-tasks.controller.ts +49 -0
  674. package/src/dto/create-collaborator-project-assignment.dto.ts +14 -0
  675. package/src/dto/create-project-cost-category.dto.ts +37 -0
  676. package/src/dto/create-project-cost-type.dto.ts +64 -0
  677. package/src/dto/create-project-cost.dto.ts +126 -0
  678. package/src/dto/get-project-cost-report.dto.ts +46 -0
  679. package/src/dto/list-project-cost-categories.dto.ts +17 -0
  680. package/src/dto/list-project-cost-types.dto.ts +28 -0
  681. package/src/dto/list-project-costs.dto.ts +59 -0
  682. package/src/dto/list-tasks.dto.ts +7 -0
  683. package/src/dto/list-timesheets.dto.ts +7 -1
  684. package/src/dto/update-collaborator-project-assignment.dto.ts +58 -0
  685. package/src/dto/update-project-cost-category.dto.ts +4 -0
  686. package/src/dto/update-project-cost-type.dto.ts +4 -0
  687. package/src/dto/update-project-cost.dto.ts +4 -0
  688. package/src/operations.module.ts +2 -0
  689. package/src/operations.service.ts +2274 -39
@@ -0,0 +1,1401 @@
1
+ 'use client';
2
+
3
+ import {
4
+ AlertDialog,
5
+ AlertDialogAction,
6
+ AlertDialogCancel,
7
+ AlertDialogContent,
8
+ AlertDialogDescription,
9
+ AlertDialogFooter,
10
+ AlertDialogHeader,
11
+ AlertDialogTitle,
12
+ } from '@/components/ui/alert-dialog';
13
+ import { Badge } from '@/components/ui/badge';
14
+ import { Button } from '@/components/ui/button';
15
+ import {
16
+ ChartContainer,
17
+ ChartTooltip,
18
+ ChartTooltipContent,
19
+ type ChartConfig,
20
+ } from '@/components/ui/chart';
21
+ import { Checkbox } from '@/components/ui/checkbox';
22
+ import {
23
+ EntityPicker,
24
+ type EntityPickerValue,
25
+ } from '@/components/ui/entity-picker';
26
+ import { Input } from '@/components/ui/input';
27
+ import { InputMoney } from '@/components/ui/input-money';
28
+ import { Label } from '@/components/ui/label';
29
+ import {
30
+ Select,
31
+ SelectContent,
32
+ SelectItem,
33
+ SelectTrigger,
34
+ SelectValue,
35
+ } from '@/components/ui/select';
36
+ import {
37
+ Sheet,
38
+ SheetContent,
39
+ SheetDescription,
40
+ SheetHeader,
41
+ SheetTitle,
42
+ } from '@/components/ui/sheet';
43
+ import { Skeleton } from '@/components/ui/skeleton';
44
+ import {
45
+ Table,
46
+ TableBody,
47
+ TableCell,
48
+ TableHead,
49
+ TableHeader,
50
+ TableRow,
51
+ } from '@/components/ui/table';
52
+ import { Textarea } from '@/components/ui/textarea';
53
+ import { cn } from '@/lib/utils';
54
+ import { useApp, useQuery } from '@hed-hog/next-app-provider';
55
+ import { useQueryClient } from '@tanstack/react-query';
56
+ import {
57
+ CheckCircle2,
58
+ DollarSign,
59
+ Pencil,
60
+ Percent,
61
+ PiggyBank,
62
+ Plus,
63
+ Receipt,
64
+ Trash2,
65
+ TrendingUp,
66
+ Wallet,
67
+ } from 'lucide-react';
68
+ import { useTranslations } from 'next-intl';
69
+ import Link from 'next/link';
70
+ import { useState } from 'react';
71
+ import {
72
+ Area,
73
+ AreaChart,
74
+ Bar,
75
+ BarChart,
76
+ CartesianGrid,
77
+ Cell,
78
+ Pie,
79
+ PieChart,
80
+ XAxis,
81
+ YAxis,
82
+ } from 'recharts';
83
+ import {
84
+ createProjectCost,
85
+ createProjectCostCategory,
86
+ createProjectCostType,
87
+ deleteProjectCost,
88
+ getFullProjectCostSummary,
89
+ getProjectCostsSummary,
90
+ listCurrencies,
91
+ listProjectCostCategories,
92
+ listProjectCostTypes,
93
+ updateProjectCost,
94
+ type Currency,
95
+ } from '../_lib/api';
96
+ import type {
97
+ FullCostSummary,
98
+ PaginatedResponse,
99
+ ProjectCost,
100
+ ProjectCostCategory,
101
+ ProjectCostSummary,
102
+ ProjectCostType,
103
+ } from '../_lib/types';
104
+ import { formatCurrency, formatDate } from '../_lib/utils/format';
105
+
106
+ const CALCULATION_TYPE_OPTIONS = [
107
+ 'fixed',
108
+ 'unit',
109
+ 'hourly',
110
+ 'monthly',
111
+ 'percentage',
112
+ ] as const;
113
+
114
+ const RECURRENCE_TYPE_OPTIONS = [
115
+ 'none',
116
+ 'daily',
117
+ 'weekly',
118
+ 'monthly',
119
+ 'yearly',
120
+ ] as const;
121
+
122
+ const STATUS_OPTIONS = [
123
+ 'planned',
124
+ 'approved',
125
+ 'realized',
126
+ 'cancelled',
127
+ ] as const;
128
+
129
+ type CostFormState = {
130
+ cost_type_id: number | null;
131
+ category_id: number | null;
132
+ description: string;
133
+ amount: string;
134
+ currency: string;
135
+ quantity: string;
136
+ unit_amount: string;
137
+ cost_date: string;
138
+ period_start: string;
139
+ period_end: string;
140
+ calculation_type: string;
141
+ recurrence_type: string;
142
+ is_billable: boolean;
143
+ is_reimbursable: boolean;
144
+ notes: string;
145
+ status: string;
146
+ };
147
+
148
+ function emptyCostForm(): CostFormState {
149
+ return {
150
+ cost_type_id: null,
151
+ category_id: null,
152
+ description: '',
153
+ amount: '',
154
+ currency: 'BRL',
155
+ quantity: '1',
156
+ unit_amount: '',
157
+ cost_date: '',
158
+ period_start: '',
159
+ period_end: '',
160
+ calculation_type: 'fixed',
161
+ recurrence_type: 'none',
162
+ is_billable: false,
163
+ is_reimbursable: false,
164
+ notes: '',
165
+ status: 'planned',
166
+ };
167
+ }
168
+
169
+ function costToForm(cost: ProjectCost): CostFormState {
170
+ return {
171
+ cost_type_id: cost.cost_type_id ?? null,
172
+ category_id: cost.category_id ?? null,
173
+ description: cost.description ?? '',
174
+ amount: String(cost.amount ?? ''),
175
+ currency: cost.currency ?? 'BRL',
176
+ quantity: String(cost.quantity ?? 1),
177
+ unit_amount: cost.unit_amount != null ? String(cost.unit_amount) : '',
178
+ cost_date: cost.cost_date ?? '',
179
+ period_start: cost.period_start ?? '',
180
+ period_end: cost.period_end ?? '',
181
+ calculation_type: cost.calculation_type ?? 'fixed',
182
+ recurrence_type: cost.recurrence_type ?? 'none',
183
+ is_billable: cost.is_billable ?? false,
184
+ is_reimbursable: cost.is_reimbursable ?? false,
185
+ notes: cost.notes ?? '',
186
+ status: cost.status ?? 'planned',
187
+ };
188
+ }
189
+
190
+ type Props = {
191
+ projectId: number;
192
+ };
193
+
194
+ export function ProjectCostsSection({ projectId }: Props) {
195
+ const t = useTranslations('operations.ProjectCostsSection');
196
+ const commonT = useTranslations('operations.Common');
197
+ const { request, showToastHandler, getSettingValue, currentLocaleCode } =
198
+ useApp();
199
+
200
+ const queryClient = useQueryClient();
201
+ const [isSheetOpen, setIsSheetOpen] = useState(false);
202
+ const [editingCost, setEditingCost] = useState<ProjectCost | null>(null);
203
+ const [form, setForm] = useState<CostFormState>(emptyCostForm());
204
+ const [isSaving, setIsSaving] = useState(false);
205
+ const [deleteTarget, setDeleteTarget] = useState<ProjectCost | null>(null);
206
+ const [isDeleting, setIsDeleting] = useState(false);
207
+
208
+ const {
209
+ data: summaryRaw,
210
+ isLoading,
211
+ refetch,
212
+ } = useQuery<ProjectCostSummary>({
213
+ queryKey: ['operations-project-costs-summary', projectId],
214
+ queryFn: () =>
215
+ getProjectCostsSummary(request, projectId) as Promise<ProjectCostSummary>,
216
+ });
217
+
218
+ const summary: ProjectCostSummary | null = summaryRaw ?? null;
219
+
220
+ const { data: fullSummary, isLoading: summaryLoading } = useQuery({
221
+ queryKey: ['operations-project-cost-summary', projectId],
222
+ queryFn: () =>
223
+ getFullProjectCostSummary(request, projectId) as Promise<FullCostSummary>,
224
+ });
225
+
226
+ // Auto-calculate amount when calculation_type is unit/hourly/monthly
227
+ const isCalculatedType = (calcType: string) =>
228
+ ['unit', 'hourly', 'monthly'].includes(calcType);
229
+
230
+ const updateForm = <K extends keyof CostFormState>(
231
+ field: K,
232
+ value: CostFormState[K]
233
+ ) => {
234
+ setForm((current) => {
235
+ const next = { ...current, [field]: value };
236
+ // Auto-calculate amount
237
+ if (
238
+ (field === 'quantity' ||
239
+ field === 'unit_amount' ||
240
+ field === 'calculation_type') &&
241
+ isCalculatedType(next.calculation_type)
242
+ ) {
243
+ const qty = parseFloat(next.quantity) || 0;
244
+ const ua = parseFloat(next.unit_amount) || 0;
245
+ if (qty > 0 && ua > 0) {
246
+ next.amount = (qty * ua).toFixed(2);
247
+ }
248
+ }
249
+ return next;
250
+ });
251
+ };
252
+
253
+ // When cost_type changes: auto-fill category and default_calculation_type
254
+ const handleCostTypeChange = (
255
+ value: EntityPickerValue,
256
+ option: ProjectCostType | null
257
+ ) => {
258
+ setForm((current) => {
259
+ const next: CostFormState = {
260
+ ...current,
261
+ cost_type_id: value as number | null,
262
+ };
263
+ if (option) {
264
+ if (option.category_id) next.category_id = option.category_id;
265
+ if (option.default_calculation_type) {
266
+ next.calculation_type = option.default_calculation_type;
267
+ }
268
+ }
269
+ return next;
270
+ });
271
+ };
272
+
273
+ const openCreateSheet = () => {
274
+ setEditingCost(null);
275
+ setForm(emptyCostForm());
276
+ setIsSheetOpen(true);
277
+ };
278
+
279
+ const openEditSheet = (cost: ProjectCost) => {
280
+ setEditingCost(cost);
281
+ setForm(costToForm(cost));
282
+ setIsSheetOpen(true);
283
+ };
284
+
285
+ const saveCost = async () => {
286
+ const amountNum = parseFloat(
287
+ String(form.amount).replace(/\./g, '').replace(',', '.')
288
+ );
289
+ if (!form.amount || isNaN(amountNum) || amountNum <= 0) {
290
+ showToastHandler?.('error', t('validation.amountRequired'));
291
+ return;
292
+ }
293
+
294
+ setIsSaving(true);
295
+ try {
296
+ const payload = {
297
+ cost_type_id: form.cost_type_id,
298
+ category_id: form.category_id,
299
+ description: form.description.trim() || null,
300
+ amount: amountNum,
301
+ currency: form.currency.trim() || 'BRL',
302
+ quantity: parseFloat(form.quantity) || 1,
303
+ unit_amount: form.unit_amount ? parseFloat(form.unit_amount) : null,
304
+ cost_date: form.cost_date || null,
305
+ period_start: form.period_start || null,
306
+ period_end: form.period_end || null,
307
+ calculation_type: form.calculation_type,
308
+ recurrence_type: form.recurrence_type,
309
+ is_billable: form.is_billable,
310
+ is_reimbursable: form.is_reimbursable,
311
+ notes: form.notes.trim() || null,
312
+ status: form.status,
313
+ };
314
+
315
+ if (editingCost) {
316
+ await updateProjectCost(request, projectId, editingCost.id, payload);
317
+ showToastHandler?.('success', t('messages.updateSuccess'));
318
+ } else {
319
+ await createProjectCost(request, projectId, payload);
320
+ showToastHandler?.('success', t('messages.createSuccess'));
321
+ }
322
+
323
+ setIsSheetOpen(false);
324
+ setEditingCost(null);
325
+ setForm(emptyCostForm());
326
+ await refetch();
327
+ await queryClient.invalidateQueries({
328
+ queryKey: ['operations-project-cost-summary', projectId],
329
+ });
330
+ } catch {
331
+ showToastHandler?.('error', t('messages.saveError'));
332
+ } finally {
333
+ setIsSaving(false);
334
+ }
335
+ };
336
+
337
+ const confirmDelete = async () => {
338
+ if (!deleteTarget) return;
339
+ setIsDeleting(true);
340
+ try {
341
+ await deleteProjectCost(request, projectId, deleteTarget.id);
342
+ showToastHandler?.('success', t('messages.deleteSuccess'));
343
+ setDeleteTarget(null);
344
+ await refetch();
345
+ } catch {
346
+ showToastHandler?.('error', t('messages.deleteError'));
347
+ } finally {
348
+ setIsDeleting(false);
349
+ }
350
+ };
351
+
352
+ const recurrenceTypeLabel = (value: string) => {
353
+ const map: Record<string, string> = {
354
+ none: t('recurrenceType.none'),
355
+ daily: t('recurrenceType.daily'),
356
+ weekly: t('recurrenceType.weekly'),
357
+ monthly: t('recurrenceType.monthly'),
358
+ yearly: t('recurrenceType.yearly'),
359
+ };
360
+ return map[value] ?? value;
361
+ };
362
+
363
+ const calculationTypeLabel = (value: string) => {
364
+ const map: Record<string, string> = {
365
+ fixed: t('calculationType.fixed'),
366
+ unit: t('calculationType.unit'),
367
+ hourly: t('calculationType.hourly'),
368
+ monthly: t('calculationType.monthly'),
369
+ percentage: t('calculationType.percentage'),
370
+ };
371
+ return map[value] ?? value;
372
+ };
373
+
374
+ const statusLabel = (value: string) => {
375
+ const map: Record<string, string> = {
376
+ planned: t('status.planned'),
377
+ approved: t('status.approved'),
378
+ realized: t('status.realized'),
379
+ cancelled: t('status.cancelled'),
380
+ };
381
+ return map[value] ?? value;
382
+ };
383
+
384
+ const statusBadgeClass = (value: string) => {
385
+ const map: Record<string, string> = {
386
+ approved: 'bg-emerald-500/15 text-emerald-700',
387
+ realized: 'bg-blue-500/15 text-blue-700',
388
+ cancelled: 'bg-red-500/15 text-red-700',
389
+ planned: 'bg-amber-500/15 text-amber-700',
390
+ };
391
+ return map[value] ?? '';
392
+ };
393
+
394
+ const costChartConfig: ChartConfig = {
395
+ total: { label: 'Total', color: 'hsl(201 96% 32%)' },
396
+ value: { label: 'Valor', color: 'hsl(201 96% 32%)' },
397
+ planned: { label: t('status.planned'), color: 'hsl(215 16% 47%)' },
398
+ approved: { label: t('status.approved'), color: 'hsl(166 72% 28%)' },
399
+ realized: { label: t('status.realized'), color: 'hsl(201 96% 32%)' },
400
+ };
401
+
402
+ const grandTotal = summary?.grand_total ?? 0;
403
+
404
+ return (
405
+ <div className="space-y-4">
406
+ {/* Header */}
407
+ <div className="flex items-center justify-between gap-3">
408
+ <div className="flex items-center gap-2">
409
+ <div className="flex size-8 items-center justify-center rounded-xl bg-primary/10 text-primary">
410
+ <DollarSign className="size-4" />
411
+ </div>
412
+ <div>
413
+ <h3 className="text-sm font-semibold">{t('title')}</h3>
414
+ {grandTotal > 0 ? (
415
+ <p className="text-xs text-muted-foreground">
416
+ {t('grandTotal')}:{' '}
417
+ <span className="font-medium text-foreground">
418
+ {formatCurrency(
419
+ grandTotal,
420
+ getSettingValue,
421
+ currentLocaleCode
422
+ )}
423
+ </span>
424
+ </p>
425
+ ) : null}
426
+ </div>
427
+ </div>
428
+ <div className="flex items-center gap-2">
429
+ <Link href={`/operations/projects/${projectId}/costs-report`}>
430
+ <Button variant="outline" size="sm" className="gap-1.5">
431
+ {t('actions.viewReport')}
432
+ </Button>
433
+ </Link>
434
+ <Button size="sm" onClick={openCreateSheet} className="gap-1.5">
435
+ <Plus className="size-3.5" />
436
+ {t('actions.add')}
437
+ </Button>
438
+ </div>
439
+ </div>
440
+
441
+ {/* Financial Summary Cards & Charts */}
442
+ {summaryLoading ? (
443
+ <div className="grid grid-cols-2 gap-3 sm:grid-cols-3">
444
+ {Array.from({ length: 6 }).map((_, i) => (
445
+ <div key={i} className="animate-pulse bg-muted rounded-lg h-24" />
446
+ ))}
447
+ </div>
448
+ ) : fullSummary ? (
449
+ <div className="space-y-4">
450
+ {/* Summary Cards */}
451
+ <div className="grid grid-cols-2 gap-3 sm:grid-cols-3">
452
+ <div className="rounded-xl border bg-card p-3">
453
+ <div className="mb-1 flex items-center gap-2">
454
+ <Wallet className="size-4 text-muted-foreground" />
455
+ <span className="text-xs text-muted-foreground">
456
+ {t('summary.budgetAmount')}
457
+ </span>
458
+ </div>
459
+ <p className="text-sm font-semibold tabular-nums">
460
+ {formatCurrency(
461
+ fullSummary.budget_amount,
462
+ getSettingValue,
463
+ currentLocaleCode
464
+ )}
465
+ </p>
466
+ </div>
467
+ <div className="rounded-xl border bg-card p-3">
468
+ <div className="mb-1 flex items-center gap-2">
469
+ <Receipt className="size-4 text-muted-foreground" />
470
+ <span className="text-xs text-muted-foreground">
471
+ {t('summary.extraCostTotal')}
472
+ </span>
473
+ </div>
474
+ <p className="text-sm font-semibold tabular-nums">
475
+ {formatCurrency(
476
+ fullSummary.extra_cost_total,
477
+ getSettingValue,
478
+ currentLocaleCode
479
+ )}
480
+ </p>
481
+ </div>
482
+ <div className="rounded-xl border bg-card p-3">
483
+ <div className="mb-1 flex items-center gap-2">
484
+ <TrendingUp className="size-4 text-muted-foreground" />
485
+ <span className="text-xs text-muted-foreground">
486
+ {t('summary.totalProjectCost')}
487
+ </span>
488
+ </div>
489
+ <p className="text-sm font-semibold tabular-nums">
490
+ {formatCurrency(
491
+ fullSummary.total_project_cost,
492
+ getSettingValue,
493
+ currentLocaleCode
494
+ )}
495
+ </p>
496
+ </div>
497
+ <div className="rounded-xl border bg-card p-3">
498
+ <div className="mb-1 flex items-center gap-2">
499
+ <PiggyBank
500
+ className={cn(
501
+ 'size-4',
502
+ fullSummary.remaining_budget < 0
503
+ ? 'text-destructive'
504
+ : 'text-muted-foreground'
505
+ )}
506
+ />
507
+ <span className="text-xs text-muted-foreground">
508
+ {t('summary.remainingBudget')}
509
+ </span>
510
+ </div>
511
+ <p
512
+ className={cn(
513
+ 'text-sm font-semibold tabular-nums',
514
+ fullSummary.remaining_budget < 0 ? 'text-destructive' : ''
515
+ )}
516
+ >
517
+ {formatCurrency(
518
+ fullSummary.remaining_budget,
519
+ getSettingValue,
520
+ currentLocaleCode
521
+ )}
522
+ </p>
523
+ </div>
524
+ <div className="rounded-xl border bg-card p-3">
525
+ <div className="mb-1 flex items-center gap-2">
526
+ <Percent
527
+ className={cn(
528
+ 'size-4',
529
+ fullSummary.budget_usage_percent > 80
530
+ ? 'text-amber-500'
531
+ : 'text-muted-foreground'
532
+ )}
533
+ />
534
+ <span className="text-xs text-muted-foreground">
535
+ {t('summary.budgetUsagePercent')}
536
+ </span>
537
+ </div>
538
+ <p
539
+ className={cn(
540
+ 'text-sm font-semibold tabular-nums',
541
+ fullSummary.budget_usage_percent > 80 ? 'text-amber-600' : ''
542
+ )}
543
+ >
544
+ {fullSummary.budget_usage_percent.toFixed(2)}%
545
+ </p>
546
+ </div>
547
+ <div className="rounded-xl border bg-card p-3">
548
+ <div className="mb-1 flex items-center gap-2">
549
+ <CheckCircle2 className="size-4 text-muted-foreground" />
550
+ <span className="text-xs text-muted-foreground">
551
+ {t('summary.realizedTotal')}
552
+ </span>
553
+ </div>
554
+ <p className="text-sm font-semibold tabular-nums">
555
+ {formatCurrency(
556
+ fullSummary.realized_total,
557
+ getSettingValue,
558
+ currentLocaleCode
559
+ )}
560
+ </p>
561
+ </div>
562
+ </div>
563
+
564
+ {/* Charts Grid */}
565
+ <div className="grid grid-cols-1 gap-4 md:grid-cols-2">
566
+ {/* Chart 1: Custo por Categoria (PieChart) */}
567
+ <div className="rounded-xl border bg-card p-4">
568
+ <h4 className="mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
569
+ {t('summary.costByCategory')}
570
+ </h4>
571
+ {fullSummary.cost_by_category.length === 0 ? (
572
+ <div className="flex h-40 items-center justify-center text-sm text-muted-foreground">
573
+ {t('summary.noData')}
574
+ </div>
575
+ ) : (
576
+ <div className="flex items-start gap-4">
577
+ <ChartContainer
578
+ className="h-40 w-40 shrink-0"
579
+ config={costChartConfig}
580
+ >
581
+ <PieChart>
582
+ <ChartTooltip content={<ChartTooltipContent />} />
583
+ <Pie
584
+ data={fullSummary.cost_by_category}
585
+ dataKey="total"
586
+ nameKey="category_name"
587
+ cx="50%"
588
+ cy="50%"
589
+ outerRadius={68}
590
+ innerRadius={32}
591
+ >
592
+ {fullSummary.cost_by_category.map((entry, i) => (
593
+ <Cell
594
+ key={`cell-cat-${i}`}
595
+ fill={
596
+ entry.category_color ||
597
+ `hsl(${(i * 47) % 360} 70% 50%)`
598
+ }
599
+ />
600
+ ))}
601
+ </Pie>
602
+ </PieChart>
603
+ </ChartContainer>
604
+ <div className="flex-1 space-y-1.5 overflow-hidden">
605
+ {fullSummary.cost_by_category.map((entry, i) => (
606
+ <div key={i} className="flex min-w-0 items-center gap-2">
607
+ <span
608
+ className="inline-block size-2.5 shrink-0 rounded-full"
609
+ style={{
610
+ backgroundColor:
611
+ entry.category_color ||
612
+ `hsl(${(i * 47) % 360} 70% 50%)`,
613
+ }}
614
+ />
615
+ <span className="truncate text-xs text-muted-foreground">
616
+ {entry.category_name}
617
+ </span>
618
+ <span className="ml-auto shrink-0 text-xs font-medium tabular-nums">
619
+ {formatCurrency(
620
+ entry.total,
621
+ getSettingValue,
622
+ currentLocaleCode
623
+ )}
624
+ </span>
625
+ </div>
626
+ ))}
627
+ </div>
628
+ </div>
629
+ )}
630
+ </div>
631
+
632
+ {/* Chart 2: Custo por Tipo (BarChart horizontal) */}
633
+ <div className="rounded-xl border bg-card p-4">
634
+ <h4 className="mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
635
+ {t('summary.costByType')}
636
+ </h4>
637
+ {fullSummary.cost_by_type.length === 0 ? (
638
+ <div className="flex h-40 items-center justify-center text-sm text-muted-foreground">
639
+ {t('summary.noData')}
640
+ </div>
641
+ ) : (
642
+ <ChartContainer
643
+ className="h-40 w-full"
644
+ config={costChartConfig}
645
+ >
646
+ <BarChart
647
+ layout="vertical"
648
+ data={fullSummary.cost_by_type.slice(0, 5).map((ct) => ({
649
+ name: ct.cost_type_name,
650
+ total: ct.total,
651
+ }))}
652
+ margin={{ left: 8, right: 8, top: 0, bottom: 0 }}
653
+ >
654
+ <CartesianGrid horizontal={false} strokeDasharray="3 3" />
655
+ <YAxis
656
+ type="category"
657
+ dataKey="name"
658
+ tickLine={false}
659
+ axisLine={false}
660
+ width={80}
661
+ tick={{ fontSize: 11 }}
662
+ />
663
+ <XAxis
664
+ type="number"
665
+ tickLine={false}
666
+ axisLine={false}
667
+ tickFormatter={(v) =>
668
+ Intl.NumberFormat('pt-BR', {
669
+ notation: 'compact',
670
+ maximumFractionDigits: 1,
671
+ }).format(Number(v))
672
+ }
673
+ />
674
+ <ChartTooltip content={<ChartTooltipContent />} />
675
+ <Bar dataKey="total" fill="hsl(201 96% 32%)" radius={4} />
676
+ </BarChart>
677
+ </ChartContainer>
678
+ )}
679
+ </div>
680
+
681
+ {/* Chart 3: Evolução Mensal (AreaChart) */}
682
+ <div className="rounded-xl border bg-card p-4">
683
+ <h4 className="mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
684
+ {t('summary.costByMonth')}
685
+ </h4>
686
+ {fullSummary.cost_by_month.length === 0 ? (
687
+ <div className="flex h-40 items-center justify-center text-sm text-muted-foreground">
688
+ {t('summary.noData')}
689
+ </div>
690
+ ) : (
691
+ <ChartContainer
692
+ className="h-40 w-full"
693
+ config={costChartConfig}
694
+ >
695
+ <AreaChart
696
+ data={fullSummary.cost_by_month}
697
+ margin={{ left: 8, right: 8, top: 0, bottom: 0 }}
698
+ >
699
+ <defs>
700
+ <linearGradient
701
+ id="costMonthGradient"
702
+ x1="0"
703
+ y1="0"
704
+ x2="0"
705
+ y2="1"
706
+ >
707
+ <stop
708
+ offset="5%"
709
+ stopColor="hsl(201 96% 32%)"
710
+ stopOpacity={0.3}
711
+ />
712
+ <stop
713
+ offset="95%"
714
+ stopColor="hsl(201 96% 32%)"
715
+ stopOpacity={0}
716
+ />
717
+ </linearGradient>
718
+ </defs>
719
+ <CartesianGrid vertical={false} strokeDasharray="3 3" />
720
+ <XAxis
721
+ dataKey="month"
722
+ tickLine={false}
723
+ axisLine={false}
724
+ tick={{ fontSize: 11 }}
725
+ />
726
+ <YAxis
727
+ tickLine={false}
728
+ axisLine={false}
729
+ width={40}
730
+ tickFormatter={(v) =>
731
+ Intl.NumberFormat('pt-BR', {
732
+ notation: 'compact',
733
+ maximumFractionDigits: 1,
734
+ }).format(Number(v))
735
+ }
736
+ />
737
+ <ChartTooltip content={<ChartTooltipContent />} />
738
+ <Area
739
+ type="monotone"
740
+ dataKey="total"
741
+ stroke="hsl(201 96% 32%)"
742
+ strokeWidth={2}
743
+ fill="url(#costMonthGradient)"
744
+ />
745
+ </AreaChart>
746
+ </ChartContainer>
747
+ )}
748
+ </div>
749
+
750
+ {/* Chart 4: Planejado × Aprovado × Realizado */}
751
+ <div className="rounded-xl border bg-card p-4">
752
+ <h4 className="mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
753
+ {t('summary.statusBreakdown')}
754
+ </h4>
755
+ <ChartContainer className="h-40 w-full" config={costChartConfig}>
756
+ <BarChart
757
+ data={[
758
+ {
759
+ name: t('status.planned'),
760
+ value: fullSummary.planned_total,
761
+ },
762
+ {
763
+ name: t('status.approved'),
764
+ value: fullSummary.approved_total,
765
+ },
766
+ {
767
+ name: t('status.realized'),
768
+ value: fullSummary.realized_total,
769
+ },
770
+ ]}
771
+ margin={{ left: 8, right: 8, top: 0, bottom: 0 }}
772
+ >
773
+ <CartesianGrid vertical={false} strokeDasharray="3 3" />
774
+ <XAxis
775
+ dataKey="name"
776
+ tickLine={false}
777
+ axisLine={false}
778
+ tick={{ fontSize: 11 }}
779
+ />
780
+ <YAxis
781
+ tickLine={false}
782
+ axisLine={false}
783
+ width={40}
784
+ tickFormatter={(v) =>
785
+ Intl.NumberFormat('pt-BR', {
786
+ notation: 'compact',
787
+ maximumFractionDigits: 1,
788
+ }).format(Number(v))
789
+ }
790
+ />
791
+ <ChartTooltip content={<ChartTooltipContent />} />
792
+ <Bar dataKey="value" radius={4}>
793
+ {[
794
+ 'hsl(215 16% 47%)',
795
+ 'hsl(166 72% 28%)',
796
+ 'hsl(201 96% 32%)',
797
+ ].map((color, i) => (
798
+ <Cell key={`cell-status-${i}`} fill={color} />
799
+ ))}
800
+ </Bar>
801
+ </BarChart>
802
+ </ChartContainer>
803
+ </div>
804
+ </div>
805
+ </div>
806
+ ) : null}
807
+
808
+ {/* Content */}
809
+ {isLoading ? (
810
+ <div className="space-y-2">
811
+ <Skeleton className="h-8 w-full" />
812
+ <Skeleton className="h-8 w-full" />
813
+ <Skeleton className="h-8 w-3/4" />
814
+ </div>
815
+ ) : !summary || summary.categories.length === 0 ? (
816
+ <div className="flex min-h-40 flex-col items-center justify-center rounded-2xl border border-dashed bg-background p-6 text-center">
817
+ <div className="flex size-10 items-center justify-center rounded-xl bg-muted text-muted-foreground">
818
+ <DollarSign className="size-5" />
819
+ </div>
820
+ <p className="mt-2 text-sm font-medium">{t('empty')}</p>
821
+ <p className="mt-1 text-xs text-muted-foreground">
822
+ {t('emptyDescription')}
823
+ </p>
824
+ </div>
825
+ ) : (
826
+ <div className="space-y-4">
827
+ {summary.categories.map((group, index) => (
828
+ <div
829
+ key={group.category?.id ?? `uncategorized-${index}`}
830
+ className="overflow-hidden rounded-xl border bg-card"
831
+ >
832
+ {/* Category subheader */}
833
+ <div className="flex items-center justify-between gap-2 border-b bg-muted/30 px-4 py-2">
834
+ <div className="flex items-center gap-2">
835
+ {group.category?.color ? (
836
+ <span
837
+ className="inline-block size-2.5 rounded-full"
838
+ style={{ backgroundColor: group.category.color }}
839
+ />
840
+ ) : null}
841
+ <span className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
842
+ {group.category?.name ?? t('uncategorized')}
843
+ </span>
844
+ <Badge variant="secondary" className="text-[10px]">
845
+ {group.count}
846
+ </Badge>
847
+ </div>
848
+ <span className="text-xs font-medium text-muted-foreground">
849
+ {formatCurrency(
850
+ group.total_amount,
851
+ getSettingValue,
852
+ currentLocaleCode
853
+ )}
854
+ </span>
855
+ </div>
856
+
857
+ {/* Costs table */}
858
+ <Table>
859
+ <TableHeader>
860
+ <TableRow>
861
+ <TableHead>{t('columns.description')}</TableHead>
862
+ <TableHead className="hidden sm:table-cell">
863
+ {t('columns.type')}
864
+ </TableHead>
865
+ <TableHead className="hidden md:table-cell">
866
+ {t('columns.calculationType')}
867
+ </TableHead>
868
+ <TableHead className="text-right">
869
+ {t('columns.quantityAmount')}
870
+ </TableHead>
871
+ <TableHead className="text-right hidden sm:table-cell">
872
+ {t('columns.total')}
873
+ </TableHead>
874
+ <TableHead>{t('columns.status')}</TableHead>
875
+ <TableHead className="text-right">
876
+ {commonT('labels.actions')}
877
+ </TableHead>
878
+ </TableRow>
879
+ </TableHeader>
880
+ <TableBody>
881
+ {group.items.map((cost) => {
882
+ const total =
883
+ Number(cost.amount) * Number(cost.quantity ?? 1);
884
+ return (
885
+ <TableRow
886
+ key={cost.id}
887
+ className="cursor-pointer"
888
+ onClick={() => openEditSheet(cost)}
889
+ >
890
+ <TableCell>
891
+ <div>
892
+ <span className="font-medium">
893
+ {cost.description || cost.cost_type?.name || '-'}
894
+ </span>
895
+ {cost.cost_date ? (
896
+ <p className="mt-0.5 text-xs text-muted-foreground">
897
+ {formatDate(
898
+ cost.cost_date,
899
+ getSettingValue,
900
+ currentLocaleCode
901
+ )}
902
+ </p>
903
+ ) : null}
904
+ </div>
905
+ </TableCell>
906
+ <TableCell className="hidden sm:table-cell">
907
+ {cost.cost_type ? (
908
+ <Badge variant="outline" className="text-[10px]">
909
+ {cost.cost_type.name}
910
+ </Badge>
911
+ ) : (
912
+ <span className="text-muted-foreground">-</span>
913
+ )}
914
+ </TableCell>
915
+ <TableCell className="hidden md:table-cell">
916
+ <Badge variant="secondary" className="text-[10px]">
917
+ {calculationTypeLabel(cost.calculation_type)}
918
+ </Badge>
919
+ </TableCell>
920
+ <TableCell className="text-right tabular-nums">
921
+ <span className="text-xs text-muted-foreground">
922
+ {Number(cost.quantity ?? 1)} ×{' '}
923
+ {formatCurrency(
924
+ Number(cost.amount),
925
+ getSettingValue,
926
+ currentLocaleCode
927
+ )}
928
+ </span>
929
+ </TableCell>
930
+ <TableCell className="hidden text-right tabular-nums sm:table-cell">
931
+ <span className="font-medium">
932
+ {formatCurrency(
933
+ total,
934
+ getSettingValue,
935
+ currentLocaleCode
936
+ )}
937
+ </span>
938
+ </TableCell>
939
+ <TableCell>
940
+ <Badge
941
+ variant="secondary"
942
+ className={statusBadgeClass(cost.status)}
943
+ >
944
+ {statusLabel(cost.status)}
945
+ </Badge>
946
+ </TableCell>
947
+ <TableCell
948
+ className="text-right"
949
+ onClick={(e) => e.stopPropagation()}
950
+ >
951
+ <div className="flex justify-end gap-1">
952
+ <Button
953
+ variant="ghost"
954
+ size="icon"
955
+ className="size-7"
956
+ onClick={() => openEditSheet(cost)}
957
+ >
958
+ <Pencil className="size-3" />
959
+ </Button>
960
+ <Button
961
+ variant="ghost"
962
+ size="icon"
963
+ className="size-7 text-destructive hover:text-destructive"
964
+ onClick={() => setDeleteTarget(cost)}
965
+ >
966
+ <Trash2 className="size-3" />
967
+ </Button>
968
+ </div>
969
+ </TableCell>
970
+ </TableRow>
971
+ );
972
+ })}
973
+ </TableBody>
974
+ </Table>
975
+ </div>
976
+ ))}
977
+ </div>
978
+ )}
979
+
980
+ {/* Create / Edit Sheet */}
981
+ <Sheet open={isSheetOpen} onOpenChange={setIsSheetOpen}>
982
+ <SheetContent className="flex w-full flex-col overflow-hidden sm:max-w-lg">
983
+ <SheetHeader>
984
+ <SheetTitle>
985
+ {editingCost ? t('sheet.editTitle') : t('sheet.createTitle')}
986
+ </SheetTitle>
987
+ <SheetDescription>{t('sheet.description')}</SheetDescription>
988
+ </SheetHeader>
989
+
990
+ <div className="flex-1 space-y-4 overflow-y-auto px-4 py-4">
991
+ {/* Cost type */}
992
+ <div className="space-y-1.5">
993
+ <Label>{t('fields.costType')}</Label>
994
+ <EntityPicker<ProjectCostType>
995
+ placeholder={t('fields.costTypePlaceholder')}
996
+ value={form.cost_type_id}
997
+ onChange={handleCostTypeChange}
998
+ valueType="number"
999
+ clearable
1000
+ loadOptions={async ({ search, page, pageSize }) => {
1001
+ const res = await listProjectCostTypes(request, {
1002
+ search,
1003
+ page: String(page),
1004
+ pageSize: String(pageSize),
1005
+ });
1006
+ const items = Array.isArray(res)
1007
+ ? res
1008
+ : ((res as PaginatedResponse<ProjectCostType>).data ?? []);
1009
+ return { items, hasMore: false };
1010
+ }}
1011
+ getOptionValue={(o) => o.id}
1012
+ getOptionLabel={(o) => o.name}
1013
+ getOptionDescription={(o) => o.code}
1014
+ showCreateButton
1015
+ createTitle={t('fields.costTypeCreateTitle')}
1016
+ createFields={[
1017
+ {
1018
+ name: 'name',
1019
+ label: t('fields.costTypeNameLabel'),
1020
+ placeholder: t('fields.costTypeNamePlaceholder'),
1021
+ required: true,
1022
+ },
1023
+ {
1024
+ name: 'code',
1025
+ label: t('fields.costTypeCodeLabel'),
1026
+ placeholder: t('fields.costTypeCodePlaceholder'),
1027
+ },
1028
+ ]}
1029
+ mapSearchToCreateValues={(search) => ({ name: search })}
1030
+ onCreate={async (values) => {
1031
+ const name = values.name?.trim() ?? '';
1032
+ const slug = name
1033
+ .toLowerCase()
1034
+ .replace(/\s+/g, '-')
1035
+ .replace(/[^a-z0-9-]/g, '');
1036
+ const code =
1037
+ values.code?.trim() ||
1038
+ name
1039
+ .toUpperCase()
1040
+ .replace(/\s+/g, '-')
1041
+ .replace(/[^A-Z0-9-]/g, '')
1042
+ .slice(0, 40);
1043
+ const created = await createProjectCostType(request, {
1044
+ name,
1045
+ code,
1046
+ slug,
1047
+ });
1048
+ return (created as ProjectCostType) ?? null;
1049
+ }}
1050
+ initialSelectedLabel={editingCost?.cost_type?.name}
1051
+ />
1052
+ </div>
1053
+
1054
+ {/* Category (auto-filled from type, or manual) */}
1055
+ <div className="space-y-1.5">
1056
+ <Label>{t('fields.category')}</Label>
1057
+ <EntityPicker<ProjectCostCategory>
1058
+ placeholder={t('fields.categoryPlaceholder')}
1059
+ value={form.category_id}
1060
+ onChange={(v) => updateForm('category_id', v as number | null)}
1061
+ valueType="number"
1062
+ clearable
1063
+ loadOptions={async ({ search, page, pageSize }) => {
1064
+ const res = await listProjectCostCategories(request, {
1065
+ search,
1066
+ page: String(page),
1067
+ pageSize: String(pageSize),
1068
+ });
1069
+ const items = Array.isArray(res)
1070
+ ? res
1071
+ : ((res as PaginatedResponse<ProjectCostCategory>).data ??
1072
+ []);
1073
+ return { items, hasMore: false };
1074
+ }}
1075
+ getOptionValue={(o) => o.id}
1076
+ getOptionLabel={(o) => o.name}
1077
+ showCreateButton
1078
+ createTitle={t('fields.categoryCreateTitle')}
1079
+ createFields={[
1080
+ {
1081
+ name: 'name',
1082
+ label: t('fields.categoryNameLabel'),
1083
+ placeholder: t('fields.categoryNamePlaceholder'),
1084
+ required: true,
1085
+ },
1086
+ ]}
1087
+ mapSearchToCreateValues={(search) => ({ name: search })}
1088
+ onCreate={async (values) => {
1089
+ const name = values.name?.trim() ?? '';
1090
+ const slug = name
1091
+ .toLowerCase()
1092
+ .replace(/\s+/g, '-')
1093
+ .replace(/[^a-z0-9-]/g, '');
1094
+ const created = await createProjectCostCategory(request, {
1095
+ name,
1096
+ slug,
1097
+ });
1098
+ return (created as ProjectCostCategory) ?? null;
1099
+ }}
1100
+ initialSelectedLabel={editingCost?.category?.name}
1101
+ />
1102
+ {form.cost_type_id !== null && form.category_id !== null && (
1103
+ <p className="text-xs text-muted-foreground">
1104
+ {t('fields.categoryAutoFilled')}
1105
+ </p>
1106
+ )}
1107
+ </div>
1108
+
1109
+ {/* Description */}
1110
+ <div className="space-y-1.5">
1111
+ <Label htmlFor="pc-description">{t('fields.description')}</Label>
1112
+ <Input
1113
+ id="pc-description"
1114
+ value={form.description}
1115
+ onChange={(e) => updateForm('description', e.target.value)}
1116
+ placeholder={t('fields.descriptionPlaceholder')}
1117
+ />
1118
+ </div>
1119
+
1120
+ {/* Calculation type */}
1121
+ <div className="space-y-1.5">
1122
+ <Label htmlFor="pc-calc-type-top">
1123
+ {t('fields.calculationType')}
1124
+ </Label>
1125
+ <Select
1126
+ value={form.calculation_type}
1127
+ onValueChange={(v) => updateForm('calculation_type', v)}
1128
+ >
1129
+ <SelectTrigger id="pc-calc-type-top" className="w-full">
1130
+ <SelectValue />
1131
+ </SelectTrigger>
1132
+ <SelectContent>
1133
+ {CALCULATION_TYPE_OPTIONS.map((ct) => (
1134
+ <SelectItem key={ct} value={ct}>
1135
+ {calculationTypeLabel(ct)}
1136
+ </SelectItem>
1137
+ ))}
1138
+ </SelectContent>
1139
+ </Select>
1140
+ </div>
1141
+
1142
+ {/* Quantity + Unit Amount (only when calculated type) */}
1143
+ {isCalculatedType(form.calculation_type) && (
1144
+ <div className="grid grid-cols-2 gap-3">
1145
+ <div className="space-y-1.5">
1146
+ <Label htmlFor="pc-quantity">{t('fields.quantity')}</Label>
1147
+ <Input
1148
+ id="pc-quantity"
1149
+ type="number"
1150
+ min="0.0001"
1151
+ step="0.0001"
1152
+ value={form.quantity}
1153
+ onChange={(e) => updateForm('quantity', e.target.value)}
1154
+ />
1155
+ </div>
1156
+ <div className="space-y-1.5">
1157
+ <Label htmlFor="pc-unit-amount">
1158
+ {t('fields.unitAmount')}
1159
+ </Label>
1160
+ <Input
1161
+ id="pc-unit-amount"
1162
+ type="number"
1163
+ min="0"
1164
+ step="0.01"
1165
+ value={form.unit_amount}
1166
+ onChange={(e) => updateForm('unit_amount', e.target.value)}
1167
+ placeholder="0,00"
1168
+ />
1169
+ </div>
1170
+ </div>
1171
+ )}
1172
+
1173
+ {/* Amount + Currency */}
1174
+ <div className="grid grid-cols-3 gap-3">
1175
+ <div className="col-span-2 space-y-1.5">
1176
+ <Label htmlFor="pc-amount">
1177
+ {t('fields.amount')}{' '}
1178
+ <span className="text-destructive">*</span>
1179
+ </Label>
1180
+ <InputMoney
1181
+ id="pc-amount"
1182
+ value={form.amount}
1183
+ onChange={(e) => updateForm('amount', e.target.value)}
1184
+ placeholder="0,00"
1185
+ readOnly={
1186
+ isCalculatedType(form.calculation_type) &&
1187
+ !!form.unit_amount &&
1188
+ !!form.quantity
1189
+ }
1190
+ className={
1191
+ isCalculatedType(form.calculation_type) &&
1192
+ !!form.unit_amount &&
1193
+ !!form.quantity
1194
+ ? 'bg-muted text-muted-foreground'
1195
+ : ''
1196
+ }
1197
+ />
1198
+ {isCalculatedType(form.calculation_type) && (
1199
+ <p className="text-xs text-muted-foreground">
1200
+ {t('fields.amountCalculated') ??
1201
+ 'Calculado automaticamente: quantidade × valor unitário'}
1202
+ </p>
1203
+ )}
1204
+ </div>
1205
+ <div className="space-y-1.5">
1206
+ <Label>{t('fields.currency')}</Label>
1207
+ <EntityPicker<Currency>
1208
+ placeholder={t('fields.currencyPlaceholder')}
1209
+ value={form.currency}
1210
+ onChange={(v) =>
1211
+ updateForm('currency', (v as string | null) ?? 'BRL')
1212
+ }
1213
+ valueType="string"
1214
+ clearable={false}
1215
+ loadOptions={async ({ search, page, pageSize }) => {
1216
+ const res = await listCurrencies(request, {
1217
+ search,
1218
+ page: String(page),
1219
+ pageSize: String(pageSize),
1220
+ });
1221
+ const items = Array.isArray(res)
1222
+ ? res
1223
+ : ((res as { data?: Currency[] }).data ?? []);
1224
+ return { items, hasMore: false };
1225
+ }}
1226
+ getOptionValue={(o) => o.code}
1227
+ getOptionLabel={(o) => `${o.code} – ${o.name}`}
1228
+ getOptionDescription={(o) => o.symbol}
1229
+ showCreateButton={false}
1230
+ initialSelectedLabel={
1231
+ form.currency ? `${form.currency}` : undefined
1232
+ }
1233
+ />
1234
+ </div>
1235
+ </div>
1236
+
1237
+ {/* Recurrence Type + Status */}
1238
+ <div className="grid grid-cols-2 gap-3">
1239
+ <div className="space-y-1.5">
1240
+ <Label htmlFor="pc-recurrence-type">
1241
+ {t('fields.recurrenceType')}
1242
+ </Label>
1243
+ <Select
1244
+ value={form.recurrence_type}
1245
+ onValueChange={(v) => updateForm('recurrence_type', v)}
1246
+ >
1247
+ <SelectTrigger id="pc-recurrence-type" className="w-full">
1248
+ <SelectValue />
1249
+ </SelectTrigger>
1250
+ <SelectContent>
1251
+ {RECURRENCE_TYPE_OPTIONS.map((r) => (
1252
+ <SelectItem key={r} value={r}>
1253
+ {recurrenceTypeLabel(r)}
1254
+ </SelectItem>
1255
+ ))}
1256
+ </SelectContent>
1257
+ </Select>
1258
+ </div>
1259
+
1260
+ <div className="space-y-1.5">
1261
+ <Label htmlFor="pc-status">{t('fields.status')}</Label>
1262
+ <Select
1263
+ value={form.status}
1264
+ onValueChange={(v) => updateForm('status', v)}
1265
+ >
1266
+ <SelectTrigger id="pc-status" className="w-full">
1267
+ <SelectValue />
1268
+ </SelectTrigger>
1269
+ <SelectContent>
1270
+ {STATUS_OPTIONS.map((s) => (
1271
+ <SelectItem key={s} value={s}>
1272
+ {statusLabel(s)}
1273
+ </SelectItem>
1274
+ ))}
1275
+ </SelectContent>
1276
+ </Select>
1277
+ </div>
1278
+ </div>
1279
+
1280
+ {/* Dates */}
1281
+ <div className="grid grid-cols-2 gap-3">
1282
+ <div className="space-y-1.5">
1283
+ <Label htmlFor="pc-cost-date">{t('fields.costDate')}</Label>
1284
+ <Input
1285
+ id="pc-cost-date"
1286
+ type="date"
1287
+ value={form.cost_date}
1288
+ onChange={(e) => updateForm('cost_date', e.target.value)}
1289
+ />
1290
+ </div>
1291
+ <div />
1292
+ </div>
1293
+
1294
+ <div className="grid grid-cols-2 gap-3">
1295
+ <div className="space-y-1.5">
1296
+ <Label htmlFor="pc-period-start">
1297
+ {t('fields.periodStart')}
1298
+ </Label>
1299
+ <Input
1300
+ id="pc-period-start"
1301
+ type="date"
1302
+ value={form.period_start}
1303
+ onChange={(e) => updateForm('period_start', e.target.value)}
1304
+ />
1305
+ </div>
1306
+ <div className="space-y-1.5">
1307
+ <Label htmlFor="pc-period-end">{t('fields.periodEnd')}</Label>
1308
+ <Input
1309
+ id="pc-period-end"
1310
+ type="date"
1311
+ value={form.period_end}
1312
+ onChange={(e) => updateForm('period_end', e.target.value)}
1313
+ />
1314
+ </div>
1315
+ </div>
1316
+
1317
+ {/* Flags */}
1318
+ <div className="flex gap-6">
1319
+ <div className="flex items-center gap-2">
1320
+ <Checkbox
1321
+ id="pc-is-billable"
1322
+ checked={form.is_billable}
1323
+ onCheckedChange={(checked) =>
1324
+ updateForm('is_billable', checked === true)
1325
+ }
1326
+ />
1327
+ <Label htmlFor="pc-is-billable">{t('fields.isBillable')}</Label>
1328
+ </div>
1329
+ <div className="flex items-center gap-2">
1330
+ <Checkbox
1331
+ id="pc-is-reimbursable"
1332
+ checked={form.is_reimbursable}
1333
+ onCheckedChange={(checked) =>
1334
+ updateForm('is_reimbursable', checked === true)
1335
+ }
1336
+ />
1337
+ <Label htmlFor="pc-is-reimbursable">
1338
+ {t('fields.isReimbursable')}
1339
+ </Label>
1340
+ </div>
1341
+ </div>
1342
+
1343
+ {/* Notes */}
1344
+ <div className="space-y-1.5">
1345
+ <Label htmlFor="pc-notes">{t('fields.notes')}</Label>
1346
+ <Textarea
1347
+ id="pc-notes"
1348
+ value={form.notes}
1349
+ onChange={(e) => updateForm('notes', e.target.value)}
1350
+ placeholder={t('fields.notesPlaceholder')}
1351
+ rows={3}
1352
+ />
1353
+ </div>
1354
+ </div>
1355
+
1356
+ <div className="flex justify-end gap-2 border-t p-4">
1357
+ <Button
1358
+ variant="outline"
1359
+ onClick={() => setIsSheetOpen(false)}
1360
+ disabled={isSaving}
1361
+ >
1362
+ {commonT('actions.cancel')}
1363
+ </Button>
1364
+ <Button onClick={saveCost} disabled={isSaving}>
1365
+ {isSaving ? t('messages.saving') : commonT('actions.save')}
1366
+ </Button>
1367
+ </div>
1368
+ </SheetContent>
1369
+ </Sheet>
1370
+
1371
+ {/* Delete Confirmation */}
1372
+ <AlertDialog
1373
+ open={deleteTarget !== null}
1374
+ onOpenChange={(open) => {
1375
+ if (!open) setDeleteTarget(null);
1376
+ }}
1377
+ >
1378
+ <AlertDialogContent>
1379
+ <AlertDialogHeader>
1380
+ <AlertDialogTitle>{t('deleteDialog.title')}</AlertDialogTitle>
1381
+ <AlertDialogDescription>
1382
+ {t('deleteDialog.description')}
1383
+ </AlertDialogDescription>
1384
+ </AlertDialogHeader>
1385
+ <AlertDialogFooter>
1386
+ <AlertDialogCancel disabled={isDeleting}>
1387
+ {commonT('actions.cancel')}
1388
+ </AlertDialogCancel>
1389
+ <AlertDialogAction
1390
+ onClick={confirmDelete}
1391
+ disabled={isDeleting}
1392
+ className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
1393
+ >
1394
+ {isDeleting ? t('messages.deleting') : commonT('actions.delete')}
1395
+ </AlertDialogAction>
1396
+ </AlertDialogFooter>
1397
+ </AlertDialogContent>
1398
+ </AlertDialog>
1399
+ </div>
1400
+ );
1401
+ }