@hed-hog/operations 0.0.317 → 0.0.319

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 (137) hide show
  1. package/dist/controllers/operations-collaborator-costs.controller.d.ts +144 -0
  2. package/dist/controllers/operations-collaborator-costs.controller.d.ts.map +1 -0
  3. package/dist/controllers/operations-collaborator-costs.controller.js +162 -0
  4. package/dist/controllers/operations-collaborator-costs.controller.js.map +1 -0
  5. package/dist/controllers/operations-collaborators.controller.d.ts +14 -0
  6. package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
  7. package/dist/controllers/operations-collaborators.controller.js +11 -0
  8. package/dist/controllers/operations-collaborators.controller.js.map +1 -1
  9. package/dist/controllers/operations-projects.controller.d.ts +31 -0
  10. package/dist/controllers/operations-projects.controller.d.ts.map +1 -1
  11. package/dist/controllers/operations-projects.controller.js +23 -0
  12. package/dist/controllers/operations-projects.controller.js.map +1 -1
  13. package/dist/controllers/operations-reports.controller.d.ts +199 -0
  14. package/dist/controllers/operations-reports.controller.d.ts.map +1 -0
  15. package/dist/controllers/operations-reports.controller.js +53 -0
  16. package/dist/controllers/operations-reports.controller.js.map +1 -0
  17. package/dist/controllers/operations-tasks.controller.d.ts +41 -2
  18. package/dist/controllers/operations-tasks.controller.d.ts.map +1 -1
  19. package/dist/controllers/operations-tasks.controller.js +17 -5
  20. package/dist/controllers/operations-tasks.controller.js.map +1 -1
  21. package/dist/dto/create-collaborator-cost.dto.d.ts +16 -0
  22. package/dist/dto/create-collaborator-cost.dto.d.ts.map +1 -0
  23. package/dist/dto/create-collaborator-cost.dto.js +88 -0
  24. package/dist/dto/create-collaborator-cost.dto.js.map +1 -0
  25. package/dist/dto/create-collaborator.dto.d.ts +0 -1
  26. package/dist/dto/create-collaborator.dto.d.ts.map +1 -1
  27. package/dist/dto/create-collaborator.dto.js +0 -6
  28. package/dist/dto/create-collaborator.dto.js.map +1 -1
  29. package/dist/dto/create-cost-type.dto.d.ts +13 -0
  30. package/dist/dto/create-cost-type.dto.d.ts.map +1 -0
  31. package/dist/dto/create-cost-type.dto.js +87 -0
  32. package/dist/dto/create-cost-type.dto.js.map +1 -0
  33. package/dist/dto/list-approvals.dto.d.ts +2 -0
  34. package/dist/dto/list-approvals.dto.d.ts.map +1 -1
  35. package/dist/dto/list-approvals.dto.js +10 -0
  36. package/dist/dto/list-approvals.dto.js.map +1 -1
  37. package/dist/dto/list-collaborator-costs.dto.d.ts +5 -0
  38. package/dist/dto/list-collaborator-costs.dto.d.ts.map +1 -0
  39. package/dist/dto/list-collaborator-costs.dto.js +23 -0
  40. package/dist/dto/list-collaborator-costs.dto.js.map +1 -0
  41. package/dist/dto/list-cost-types.dto.d.ts +6 -0
  42. package/dist/dto/list-cost-types.dto.d.ts.map +1 -0
  43. package/dist/dto/list-cost-types.dto.js +35 -0
  44. package/dist/dto/list-cost-types.dto.js.map +1 -0
  45. package/dist/dto/list-my-projects.dto.d.ts +5 -0
  46. package/dist/dto/list-my-projects.dto.d.ts.map +1 -0
  47. package/dist/dto/list-my-projects.dto.js +23 -0
  48. package/dist/dto/list-my-projects.dto.js.map +1 -0
  49. package/dist/dto/list-my-tasks.dto.d.ts +6 -0
  50. package/dist/dto/list-my-tasks.dto.d.ts.map +1 -0
  51. package/dist/dto/list-my-tasks.dto.js +33 -0
  52. package/dist/dto/list-my-tasks.dto.js.map +1 -0
  53. package/dist/dto/list-projects.dto.d.ts +1 -0
  54. package/dist/dto/list-projects.dto.d.ts.map +1 -1
  55. package/dist/dto/list-projects.dto.js +7 -0
  56. package/dist/dto/list-projects.dto.js.map +1 -1
  57. package/dist/dto/list-reports.dto.d.ts +16 -0
  58. package/dist/dto/list-reports.dto.d.ts.map +1 -0
  59. package/dist/dto/list-reports.dto.js +75 -0
  60. package/dist/dto/list-reports.dto.js.map +1 -0
  61. package/dist/dto/list-tasks.dto.d.ts +2 -0
  62. package/dist/dto/list-tasks.dto.d.ts.map +1 -1
  63. package/dist/dto/list-tasks.dto.js +12 -0
  64. package/dist/dto/list-tasks.dto.js.map +1 -1
  65. package/dist/dto/list-timesheets.dto.d.ts +2 -0
  66. package/dist/dto/list-timesheets.dto.d.ts.map +1 -1
  67. package/dist/dto/list-timesheets.dto.js +10 -0
  68. package/dist/dto/list-timesheets.dto.js.map +1 -1
  69. package/dist/dto/update-collaborator-cost.dto.d.ts +6 -0
  70. package/dist/dto/update-collaborator-cost.dto.d.ts.map +1 -0
  71. package/dist/dto/update-collaborator-cost.dto.js +9 -0
  72. package/dist/dto/update-collaborator-cost.dto.js.map +1 -0
  73. package/dist/dto/update-task.dto.d.ts +1 -0
  74. package/dist/dto/update-task.dto.d.ts.map +1 -1
  75. package/dist/dto/update-task.dto.js +6 -0
  76. package/dist/dto/update-task.dto.js.map +1 -1
  77. package/dist/operations.module.d.ts.map +1 -1
  78. package/dist/operations.module.js +4 -0
  79. package/dist/operations.module.js.map +1 -1
  80. package/dist/operations.service.d.ts +457 -3
  81. package/dist/operations.service.d.ts.map +1 -1
  82. package/dist/operations.service.js +1445 -208
  83. package/dist/operations.service.js.map +1 -1
  84. package/dist/operations.service.spec.js +31 -7
  85. package/dist/operations.service.spec.js.map +1 -1
  86. package/hedhog/data/menu.yaml +112 -7
  87. package/hedhog/data/operations_cost_type.yaml +166 -0
  88. package/hedhog/data/route.yaml +185 -0
  89. package/hedhog/frontend/app/_components/collaborator-costs-section.tsx.ejs +884 -0
  90. package/hedhog/frontend/app/_components/collaborator-details-screen.tsx.ejs +94 -15
  91. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +219 -94
  92. package/hedhog/frontend/app/_components/contract-details-screen.tsx.ejs +21 -32
  93. package/hedhog/frontend/app/_components/contract-form-screen.tsx.ejs +178 -89
  94. package/hedhog/frontend/app/_components/my-project-summary-screen.tsx.ejs +1185 -0
  95. package/hedhog/frontend/app/_components/operations-calendar-view.tsx.ejs +306 -0
  96. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +943 -782
  97. package/hedhog/frontend/app/_components/task-detail-sheet.tsx.ejs +223 -0
  98. package/hedhog/frontend/app/_lib/api.ts.ejs +162 -0
  99. package/hedhog/frontend/app/_lib/types.ts.ejs +229 -3
  100. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +11 -3
  101. package/hedhog/frontend/app/approvals/page.tsx.ejs +191 -46
  102. package/hedhog/frontend/app/collaborators/page.tsx.ejs +133 -25
  103. package/hedhog/frontend/app/my-projects/[id]/page.tsx.ejs +11 -0
  104. package/hedhog/frontend/app/my-projects/page.tsx.ejs +440 -0
  105. package/hedhog/frontend/app/my-tasks/page.tsx.ejs +1304 -0
  106. package/hedhog/frontend/app/reports/collaborators/page.tsx.ejs +771 -0
  107. package/hedhog/frontend/app/reports/projects/page.tsx.ejs +809 -0
  108. package/hedhog/frontend/app/timesheets/page.tsx.ejs +322 -58
  109. package/hedhog/frontend/messages/en.json +234 -25
  110. package/hedhog/frontend/messages/pt.json +234 -25
  111. package/hedhog/table/operations_collaborator.yaml +0 -4
  112. package/hedhog/table/operations_collaborator_compensation_history.yaml +28 -0
  113. package/hedhog/table/operations_collaborator_cost.yaml +56 -0
  114. package/hedhog/table/operations_cost_type.yaml +38 -0
  115. package/package.json +6 -6
  116. package/src/controllers/operations-collaborator-costs.controller.ts +147 -0
  117. package/src/controllers/operations-collaborators.controller.ts +19 -8
  118. package/src/controllers/operations-projects.controller.ts +19 -8
  119. package/src/controllers/operations-reports.controller.ts +32 -0
  120. package/src/controllers/operations-tasks.controller.ts +32 -12
  121. package/src/dto/create-collaborator-cost.dto.ts +78 -0
  122. package/src/dto/create-collaborator.dto.ts +9 -14
  123. package/src/dto/create-cost-type.dto.ts +62 -0
  124. package/src/dto/list-approvals.dto.ts +8 -0
  125. package/src/dto/list-collaborator-costs.dto.ts +8 -0
  126. package/src/dto/list-cost-types.dto.ts +19 -0
  127. package/src/dto/list-my-projects.dto.ts +8 -0
  128. package/src/dto/list-my-tasks.dto.ts +17 -0
  129. package/src/dto/list-projects.dto.ts +7 -1
  130. package/src/dto/list-reports.dto.ts +51 -0
  131. package/src/dto/list-tasks.dto.ts +11 -1
  132. package/src/dto/list-timesheets.dto.ts +8 -0
  133. package/src/dto/update-collaborator-cost.dto.ts +4 -0
  134. package/src/dto/update-task.dto.ts +6 -0
  135. package/src/operations.module.ts +7 -3
  136. package/src/operations.service.spec.ts +45 -7
  137. package/src/operations.service.ts +1992 -225
@@ -1,5 +1,6 @@
1
1
  import { Transform } from 'class-transformer';
2
2
  import {
3
+ IsBoolean,
3
4
  IsIn,
4
5
  IsInt,
5
6
  IsNumber,
@@ -73,4 +74,9 @@ export class UpdateOperationsTaskDto {
73
74
  @IsOptional()
74
75
  @IsString({ message: 'tags must be a string' })
75
76
  tags?: string;
77
+
78
+ @IsOptional()
79
+ @Transform(({ value }) => value === 'true' || value === true)
80
+ @IsBoolean({ message: 'archived must be a boolean' })
81
+ archived?: boolean;
76
82
  }
@@ -5,11 +5,13 @@ import { AiModule, FileModule, IntegrationModule, SettingModule } from '@hed-hog
5
5
  import { forwardRef, Module } from '@nestjs/common';
6
6
  import { ConfigModule } from '@nestjs/config';
7
7
  import { OperationsApprovalsController } from './controllers/operations-approvals.controller';
8
+ import { OperationsCollaboratorCostsController } from './controllers/operations-collaborator-costs.controller';
8
9
  import { OperationsCollaboratorsController } from './controllers/operations-collaborators.controller';
9
10
  import { OperationsContractsController } from './controllers/operations-contracts.controller';
10
11
  import { OperationsOrgStructureController } from './controllers/operations-org-structure.controller';
11
- import { OperationsProjectsController } from './controllers/operations-projects.controller';
12
- import { OperationsTasksController } from './controllers/operations-tasks.controller';
12
+ import { OperationsProjectsController } from './controllers/operations-projects.controller';
13
+ import { OperationsReportsController } from './controllers/operations-reports.controller';
14
+ import { OperationsTasksController } from './controllers/operations-tasks.controller';
13
15
  import { OperationsTimesheetsController } from './controllers/operations-timesheets.controller';
14
16
  import { OperationsController } from './operations.controller';
15
17
  import { OperationsProposalSubscriber } from './operations.proposal.subscriber';
@@ -30,8 +32,10 @@ import { OperationsAccessService } from './services/shared/operations-access.ser
30
32
  controllers: [
31
33
  OperationsController,
32
34
  OperationsCollaboratorsController,
35
+ OperationsCollaboratorCostsController,
33
36
  OperationsOrgStructureController,
34
- OperationsProjectsController,
37
+ OperationsProjectsController,
38
+ OperationsReportsController,
35
39
  OperationsTasksController,
36
40
  OperationsContractsController,
37
41
  OperationsTimesheetsController,
@@ -263,6 +263,7 @@ describe('OperationsService quick-entry timesheets', () => {
263
263
  });
264
264
  jest.spyOn(service as any, 'getOrCreateTimesheetForWorkDate').mockResolvedValue(55);
265
265
  jest.spyOn(service as any, 'refreshTimesheetTotal').mockResolvedValue(undefined);
266
+ jest.spyOn(service as any, 'submitTimesheetForApproval').mockResolvedValue(undefined);
266
267
  jest.spyOn(service as any, 'getTimesheetEntryByIdForActor').mockResolvedValue({
267
268
  id: 91,
268
269
  durationMinutes: 90,
@@ -296,6 +297,11 @@ describe('OperationsService quick-entry timesheets', () => {
296
297
  1.5,
297
298
  'Worked on the API layer',
298
299
  );
300
+ expect((service as any).submitTimesheetForApproval).toHaveBeenCalledWith(
301
+ tx,
302
+ 55,
303
+ 7,
304
+ );
299
305
  });
300
306
 
301
307
  it('uses the task assignment when full timesheet entries omit projectAssignmentId', async () => {
@@ -356,7 +362,10 @@ describe('OperationsService quick-entry timesheets', () => {
356
362
  it('rejects submitting a timesheet without a resolved approver', async () => {
357
363
  const tx = {
358
364
  $executeRawUnsafe: jest.fn().mockResolvedValue(undefined),
359
- $queryRawUnsafe: jest.fn().mockResolvedValue([{ id: 1 }]),
365
+ $queryRawUnsafe: jest
366
+ .fn()
367
+ .mockResolvedValueOnce([])
368
+ .mockResolvedValueOnce([{ exists: true }]),
360
369
  };
361
370
 
362
371
  (service as any).prisma.$transaction.mockImplementation(
@@ -373,7 +382,6 @@ describe('OperationsService quick-entry timesheets', () => {
373
382
  id: 7,
374
383
  supervisorId: null,
375
384
  });
376
- jest.spyOn(service as any, 'upsertApproval').mockResolvedValue(undefined);
377
385
  jest.spyOn(service as any, 'listSingleTimesheet').mockResolvedValue({
378
386
  id: 55,
379
387
  status: 'submitted',
@@ -386,7 +394,10 @@ describe('OperationsService quick-entry timesheets', () => {
386
394
  it('rejects submitting a timesheet without active entries', async () => {
387
395
  const tx = {
388
396
  $executeRawUnsafe: jest.fn().mockResolvedValue(undefined),
389
- $queryRawUnsafe: jest.fn().mockResolvedValue([]),
397
+ $queryRawUnsafe: jest
398
+ .fn()
399
+ .mockResolvedValueOnce([{ managerCollaboratorId: 18 }])
400
+ .mockResolvedValueOnce([{ exists: false }]),
390
401
  };
391
402
 
392
403
  (service as any).prisma.$transaction.mockImplementation(
@@ -403,8 +414,6 @@ describe('OperationsService quick-entry timesheets', () => {
403
414
  id: 7,
404
415
  supervisorId: 18,
405
416
  });
406
- jest.spyOn(service as any, 'querySingle').mockResolvedValue({ exists: false });
407
- jest.spyOn(service as any, 'upsertApproval').mockResolvedValue(undefined);
408
417
  jest.spyOn(service as any, 'listSingleTimesheet').mockResolvedValue({
409
418
  id: 56,
410
419
  status: 'submitted',
@@ -501,6 +510,7 @@ describe('OperationsService quick-entry timesheets', () => {
501
510
  jest.spyOn(service as any, 'getOrCreateTimesheetForWorkDate').mockResolvedValue(77);
502
511
  jest.spyOn(service as any, 'refreshTimesheetTotal').mockResolvedValue(undefined);
503
512
  jest.spyOn(service as any, 'cleanupEmptyEditableTimesheet').mockResolvedValue(undefined);
513
+ jest.spyOn(service as any, 'submitTimesheetForApproval').mockResolvedValue(undefined);
504
514
 
505
515
  const result = await service.updateTimesheetEntry(15, 93, {
506
516
  projectId: 12,
@@ -536,17 +546,45 @@ describe('OperationsService quick-entry timesheets', () => {
536
546
  tx,
537
547
  55,
538
548
  );
549
+ expect((service as any).submitTimesheetForApproval).toHaveBeenCalledWith(
550
+ tx,
551
+ 77,
552
+ 7,
553
+ );
539
554
  });
540
555
 
541
- it('rejects deleting entries from submitted timesheets', async () => {
556
+ it('allows deleting entries from submitted timesheets until approval', async () => {
557
+ const tx = {
558
+ $executeRawUnsafe: jest.fn().mockResolvedValue(undefined),
559
+ };
560
+
561
+ (service as any).prisma.$transaction.mockImplementation(
562
+ async (callback: (client: unknown) => unknown) => callback(tx),
563
+ );
564
+
542
565
  jest.spyOn(service as any, 'getTimesheetEntryByIdForActor').mockResolvedValue({
543
566
  id: 92,
544
567
  timesheetId: 56,
545
568
  collaboratorId: 7,
546
569
  status: 'submitted',
547
570
  });
571
+ jest.spyOn(service as any, 'refreshTimesheetTotal').mockResolvedValue(undefined);
572
+ jest.spyOn(service as any, 'cleanupEmptyEditableTimesheet').mockResolvedValue(undefined);
573
+
574
+ await expect(service.removeTimesheetEntry(15, 92)).resolves.toEqual({
575
+ success: true,
576
+ });
577
+ });
578
+
579
+ it('rejects deleting entries from approved timesheets', async () => {
580
+ jest.spyOn(service as any, 'getTimesheetEntryByIdForActor').mockResolvedValue({
581
+ id: 94,
582
+ timesheetId: 57,
583
+ collaboratorId: 7,
584
+ status: 'approved',
585
+ });
548
586
 
549
- await expect(service.removeTimesheetEntry(15, 92)).rejects.toThrow(
587
+ await expect(service.removeTimesheetEntry(15, 94)).rejects.toThrow(
550
588
  BadRequestException,
551
589
  );
552
590
  });