@hed-hog/operations 0.0.305 → 0.0.309

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 (138) hide show
  1. package/dist/controllers/operations-approvals.controller.d.ts +114 -1
  2. package/dist/controllers/operations-approvals.controller.d.ts.map +1 -1
  3. package/dist/controllers/operations-approvals.controller.js +16 -3
  4. package/dist/controllers/operations-approvals.controller.js.map +1 -1
  5. package/dist/controllers/operations-collaborators.controller.d.ts +16 -1
  6. package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
  7. package/dist/controllers/operations-collaborators.controller.js +16 -3
  8. package/dist/controllers/operations-collaborators.controller.js.map +1 -1
  9. package/dist/controllers/operations-contracts.controller.d.ts +14 -453
  10. package/dist/controllers/operations-contracts.controller.d.ts.map +1 -1
  11. package/dist/controllers/operations-contracts.controller.js +11 -112
  12. package/dist/controllers/operations-contracts.controller.js.map +1 -1
  13. package/dist/controllers/operations-org-structure.controller.d.ts +65 -2
  14. package/dist/controllers/operations-org-structure.controller.d.ts.map +1 -1
  15. package/dist/controllers/operations-org-structure.controller.js +18 -5
  16. package/dist/controllers/operations-org-structure.controller.js.map +1 -1
  17. package/dist/controllers/operations-projects.controller.d.ts +28 -4
  18. package/dist/controllers/operations-projects.controller.d.ts.map +1 -1
  19. package/dist/controllers/operations-projects.controller.js +17 -5
  20. package/dist/controllers/operations-projects.controller.js.map +1 -1
  21. package/dist/controllers/operations-timesheets.controller.d.ts +52 -4
  22. package/dist/controllers/operations-timesheets.controller.d.ts.map +1 -1
  23. package/dist/controllers/operations-timesheets.controller.js +28 -11
  24. package/dist/controllers/operations-timesheets.controller.js.map +1 -1
  25. package/dist/dto/list-approvals.dto.d.ts +6 -0
  26. package/dist/dto/list-approvals.dto.d.ts.map +1 -0
  27. package/dist/dto/list-approvals.dto.js +28 -0
  28. package/dist/dto/list-approvals.dto.js.map +1 -0
  29. package/dist/dto/list-collaborator-types.dto.d.ts +3 -1
  30. package/dist/dto/list-collaborator-types.dto.d.ts.map +1 -1
  31. package/dist/dto/list-collaborator-types.dto.js +7 -1
  32. package/dist/dto/list-collaborator-types.dto.js.map +1 -1
  33. package/dist/dto/list-collaborators.dto.d.ts +1 -0
  34. package/dist/dto/list-collaborators.dto.d.ts.map +1 -1
  35. package/dist/dto/list-collaborators.dto.js +5 -0
  36. package/dist/dto/list-collaborators.dto.js.map +1 -1
  37. package/dist/dto/list-contracts.dto.d.ts +8 -0
  38. package/dist/dto/list-contracts.dto.d.ts.map +1 -0
  39. package/dist/dto/list-contracts.dto.js +38 -0
  40. package/dist/dto/list-contracts.dto.js.map +1 -0
  41. package/dist/dto/list-departments.dto.d.ts +5 -0
  42. package/dist/dto/list-departments.dto.d.ts.map +1 -0
  43. package/dist/dto/list-departments.dto.js +23 -0
  44. package/dist/dto/list-departments.dto.js.map +1 -0
  45. package/dist/dto/list-projects.dto.d.ts +5 -0
  46. package/dist/dto/list-projects.dto.d.ts.map +1 -0
  47. package/dist/dto/list-projects.dto.js +23 -0
  48. package/dist/dto/list-projects.dto.js.map +1 -0
  49. package/dist/dto/list-schedule-adjustments.dto.d.ts +5 -0
  50. package/dist/dto/list-schedule-adjustments.dto.d.ts.map +1 -0
  51. package/dist/dto/list-schedule-adjustments.dto.js +23 -0
  52. package/dist/dto/list-schedule-adjustments.dto.js.map +1 -0
  53. package/dist/dto/list-time-off-requests.dto.d.ts +5 -0
  54. package/dist/dto/list-time-off-requests.dto.d.ts.map +1 -0
  55. package/dist/dto/list-time-off-requests.dto.js +23 -0
  56. package/dist/dto/list-time-off-requests.dto.js.map +1 -0
  57. package/dist/dto/list-timesheets.dto.d.ts +5 -0
  58. package/dist/dto/list-timesheets.dto.d.ts.map +1 -0
  59. package/dist/dto/list-timesheets.dto.js +23 -0
  60. package/dist/dto/list-timesheets.dto.js.map +1 -0
  61. package/dist/dto/reorder-collaborator-types.dto.d.ts +4 -0
  62. package/dist/dto/reorder-collaborator-types.dto.d.ts.map +1 -0
  63. package/dist/dto/reorder-collaborator-types.dto.js +25 -0
  64. package/dist/dto/reorder-collaborator-types.dto.js.map +1 -0
  65. package/dist/dto/update-collaborator-type.dto.d.ts +3 -1
  66. package/dist/dto/update-collaborator-type.dto.d.ts.map +1 -1
  67. package/dist/dto/update-collaborator-type.dto.js +2 -1
  68. package/dist/dto/update-collaborator-type.dto.js.map +1 -1
  69. package/dist/operations.service.d.ts +362 -271
  70. package/dist/operations.service.d.ts.map +1 -1
  71. package/dist/operations.service.js +1195 -1098
  72. package/dist/operations.service.js.map +1 -1
  73. package/dist/operations.service.spec.js +73 -22
  74. package/dist/operations.service.spec.js.map +1 -1
  75. package/hedhog/data/menu.yaml +19 -55
  76. package/hedhog/data/operations_collaborator_type.yaml +76 -76
  77. package/hedhog/data/route.yaml +52 -70
  78. package/hedhog/frontend/app/_components/async-options-combobox.tsx.ejs +5 -3
  79. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +8 -1
  80. package/hedhog/frontend/app/_components/collaborator-select-with-create.tsx.ejs +15 -10
  81. package/hedhog/frontend/app/_components/contract-details-screen.tsx.ejs +108 -213
  82. package/hedhog/frontend/app/_components/contract-form-screen.tsx.ejs +251 -2039
  83. package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +167 -60
  84. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +70 -301
  85. package/hedhog/frontend/app/_components/system-user-select-with-create.tsx.ejs +102 -51
  86. package/hedhog/frontend/app/_components/timesheet-task-create-sheet.tsx.ejs +1 -0
  87. package/hedhog/frontend/app/_lib/types.ts.ejs +19 -24
  88. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +14 -9
  89. package/hedhog/frontend/app/approvals/page.tsx.ejs +843 -151
  90. package/hedhog/frontend/app/collaborator-types/page.tsx.ejs +457 -154
  91. package/hedhog/frontend/app/collaborators/page.tsx.ejs +118 -49
  92. package/hedhog/frontend/app/contracts/[id]/page.tsx.ejs +2 -2
  93. package/hedhog/frontend/app/contracts/page.tsx.ejs +215 -617
  94. package/hedhog/frontend/app/departments/page.tsx.ejs +257 -113
  95. package/hedhog/frontend/app/projects/page.tsx.ejs +90 -51
  96. package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +546 -118
  97. package/hedhog/frontend/app/time-off/page.tsx.ejs +400 -123
  98. package/hedhog/frontend/app/timesheets/page.tsx.ejs +647 -342
  99. package/hedhog/frontend/messages/en.json +148 -14
  100. package/hedhog/frontend/messages/pt.json +199 -56
  101. package/hedhog/table/operations_collaborator.yaml +18 -18
  102. package/hedhog/table/operations_collaborator_equity_participation.yaml +43 -43
  103. package/hedhog/table/operations_collaborator_type.yaml +33 -33
  104. package/hedhog/table/operations_contract.yaml +0 -9
  105. package/hedhog/table/operations_contract_document.yaml +33 -33
  106. package/package.json +4 -4
  107. package/src/controllers/operations-approvals.controller.ts +9 -3
  108. package/src/controllers/operations-collaborators.controller.ts +15 -2
  109. package/src/controllers/operations-contracts.controller.ts +8 -92
  110. package/src/controllers/operations-org-structure.controller.ts +17 -4
  111. package/src/controllers/operations-projects.controller.ts +10 -4
  112. package/src/controllers/operations-timesheets.controller.ts +30 -8
  113. package/src/dto/create-collaborator-type.dto.ts +43 -43
  114. package/src/dto/create-collaborator.dto.ts +223 -223
  115. package/src/dto/list-approvals.dto.ts +12 -0
  116. package/src/dto/list-collaborator-types.dto.ts +20 -15
  117. package/src/dto/list-collaborators.dto.ts +34 -30
  118. package/src/dto/list-contracts.dto.ts +20 -0
  119. package/src/dto/list-departments.dto.ts +8 -0
  120. package/src/dto/list-projects.dto.ts +8 -0
  121. package/src/dto/list-schedule-adjustments.dto.ts +8 -0
  122. package/src/dto/list-time-off-requests.dto.ts +8 -0
  123. package/src/dto/list-timesheets.dto.ts +8 -0
  124. package/src/dto/reorder-collaborator-types.dto.ts +10 -0
  125. package/src/dto/update-collaborator-type.dto.ts +4 -3
  126. package/src/dto/update-collaborator.dto.ts +3 -3
  127. package/src/operations.service.spec.ts +96 -30
  128. package/src/operations.service.ts +1738 -1777
  129. package/hedhog/frontend/app/_components/contract-creation-wizard.tsx.ejs +0 -631
  130. package/hedhog/frontend/app/_components/contract-template-form-screen.tsx.ejs +0 -526
  131. package/hedhog/frontend/app/_components/contract-template-select-with-create.tsx.ejs +0 -247
  132. package/hedhog/frontend/app/_components/contract-wizard-sheet.tsx.ejs +0 -3520
  133. package/hedhog/frontend/app/contracts/templates/page.tsx.ejs +0 -380
  134. package/hedhog/frontend/app/team/page.tsx.ejs +0 -352
  135. package/hedhog/table/operations_contract_financial_term.yaml +0 -40
  136. package/hedhog/table/operations_contract_revision.yaml +0 -38
  137. package/hedhog/table/operations_contract_signature.yaml +0 -38
  138. package/hedhog/table/operations_contract_template.yaml +0 -58
@@ -0,0 +1,8 @@
1
+ import { PaginationDTO } from '@hed-hog/api-pagination';
2
+ import { IsOptional, IsString } from 'class-validator';
3
+
4
+ export class ListScheduleAdjustmentsDto extends PaginationDTO {
5
+ @IsOptional()
6
+ @IsString()
7
+ status?: string;
8
+ }
@@ -0,0 +1,8 @@
1
+ import { PaginationDTO } from '@hed-hog/api-pagination';
2
+ import { IsOptional, IsString } from 'class-validator';
3
+
4
+ export class ListTimeOffRequestsDto extends PaginationDTO {
5
+ @IsOptional()
6
+ @IsString()
7
+ status?: string;
8
+ }
@@ -0,0 +1,8 @@
1
+ import { PaginationDTO } from '@hed-hog/api-pagination';
2
+ import { IsOptional, IsString } from 'class-validator';
3
+
4
+ export class ListTimesheetsDto extends PaginationDTO {
5
+ @IsOptional()
6
+ @IsString()
7
+ status?: string;
8
+ }
@@ -0,0 +1,10 @@
1
+ import { Type } from 'class-transformer';
2
+ import { ArrayMinSize, IsArray, IsInt } from 'class-validator';
3
+
4
+ export class ReorderCollaboratorTypesDto {
5
+ @IsArray()
6
+ @ArrayMinSize(1)
7
+ @Type(() => Number)
8
+ @IsInt({ each: true })
9
+ ids!: number[];
10
+ }
@@ -1,3 +1,4 @@
1
- import { CreateCollaboratorTypeDto } from './create-collaborator-type.dto';
2
-
3
- export class UpdateCollaboratorTypeDto extends CreateCollaboratorTypeDto {}
1
+ import { PartialType } from '@nestjs/mapped-types';
2
+ import { CreateCollaboratorTypeDto } from './create-collaborator-type.dto';
3
+
4
+ export class UpdateCollaboratorTypeDto extends PartialType(CreateCollaboratorTypeDto) {}
@@ -1,3 +1,3 @@
1
- import { CreateCollaboratorDto } from './create-collaborator.dto';
2
-
3
- export class UpdateCollaboratorDto extends CreateCollaboratorDto {}
1
+ import { CreateCollaboratorDto } from './create-collaborator.dto';
2
+
3
+ export class UpdateCollaboratorDto extends CreateCollaboratorDto {}
@@ -29,10 +29,6 @@ describe('OperationsService proposal integration', () => {
29
29
 
30
30
  jest.spyOn(service as any, 'generateContractCode').mockResolvedValue('CTR-001');
31
31
  jest.spyOn(service as any, 'replaceContractParties').mockResolvedValue(undefined);
32
- jest
33
- .spyOn(service as any, 'replaceContractFinancialTerms')
34
- .mockResolvedValue(undefined);
35
- jest.spyOn(service as any, 'replaceContractRevisions').mockResolvedValue(undefined);
36
32
  jest.spyOn(service as any, 'insertContractHistory').mockResolvedValue(undefined);
37
33
  });
38
34
 
@@ -156,32 +152,6 @@ describe('OperationsService proposal integration', () => {
156
152
  }),
157
153
  ],
158
154
  );
159
- expect((service as any).replaceContractFinancialTerms).toHaveBeenCalledWith(
160
- tx,
161
- 77,
162
- expect.arrayContaining([
163
- expect.objectContaining({
164
- label: 'Monthly retainer',
165
- amount: 1000,
166
- recurrence: 'monthly',
167
- }),
168
- expect.objectContaining({
169
- label: 'Setup fee',
170
- amount: 234,
171
- recurrence: 'one_time',
172
- }),
173
- ]),
174
- );
175
- expect((service as any).replaceContractRevisions).toHaveBeenCalledWith(
176
- tx,
177
- 77,
178
- [
179
- expect.objectContaining({
180
- title: 'Revision 1',
181
- status: 'draft',
182
- }),
183
- ],
184
- );
185
155
  expect((service as any).insertContractHistory).toHaveBeenCalledWith(
186
156
  tx,
187
157
  77,
@@ -472,6 +442,102 @@ describe('OperationsService quick-entry timesheets', () => {
472
442
  expect((service as any).refreshTimesheetTotal).toHaveBeenCalledWith(tx, 55);
473
443
  });
474
444
 
445
+ it('updates quick entries and moves them to the correct weekly timesheet', async () => {
446
+ const tx = {
447
+ $executeRawUnsafe: jest.fn().mockResolvedValue(undefined),
448
+ $queryRawUnsafe: jest.fn().mockResolvedValue([]),
449
+ };
450
+
451
+ (service as any).prisma.$transaction.mockImplementation(
452
+ async (callback: (client: unknown) => unknown) => callback(tx),
453
+ );
454
+
455
+ jest
456
+ .spyOn(service as any, 'getTimesheetEntryByIdForActor')
457
+ .mockResolvedValueOnce({
458
+ id: 93,
459
+ timesheetId: 55,
460
+ collaboratorId: 7,
461
+ projectId: 11,
462
+ projectAssignmentId: 33,
463
+ taskId: 44,
464
+ status: 'draft',
465
+ weekStartDate: '2026-04-06',
466
+ weekEndDate: '2026-04-12',
467
+ workDate: '2026-04-09',
468
+ hours: 1,
469
+ durationMinutes: 60,
470
+ })
471
+ .mockResolvedValueOnce({
472
+ id: 93,
473
+ timesheetId: 77,
474
+ collaboratorId: 7,
475
+ projectId: 12,
476
+ projectAssignmentId: 34,
477
+ taskId: 45,
478
+ status: 'draft',
479
+ weekStartDate: '2026-04-13',
480
+ weekEndDate: '2026-04-19',
481
+ workDate: '2026-04-14',
482
+ hours: 2,
483
+ durationMinutes: 120,
484
+ taskName: 'Review backlog',
485
+ });
486
+ jest.spyOn(service as any, 'resolveOwnedProjectAssignment').mockResolvedValue({
487
+ id: 34,
488
+ projectId: 12,
489
+ projectName: 'Project Boreal',
490
+ projectCode: 'OPS-12',
491
+ roleLabel: 'Engineer',
492
+ });
493
+ jest.spyOn(service as any, 'getOwnedTaskRecord').mockResolvedValue({
494
+ id: 45,
495
+ name: 'Review backlog',
496
+ projectAssignmentId: 34,
497
+ projectId: 12,
498
+ projectName: 'Project Boreal',
499
+ projectCode: 'OPS-12',
500
+ });
501
+ jest.spyOn(service as any, 'getOrCreateTimesheetForWorkDate').mockResolvedValue(77);
502
+ jest.spyOn(service as any, 'refreshTimesheetTotal').mockResolvedValue(undefined);
503
+ jest.spyOn(service as any, 'cleanupEmptyEditableTimesheet').mockResolvedValue(undefined);
504
+
505
+ const result = await service.updateTimesheetEntry(15, 93, {
506
+ projectId: 12,
507
+ projectAssignmentId: 34,
508
+ taskId: 45,
509
+ workDate: '2026-04-14',
510
+ duration: 2,
511
+ unit: 'hours',
512
+ description: 'Backlog refinement',
513
+ } as any);
514
+
515
+ expect(result).toEqual(
516
+ expect.objectContaining({
517
+ id: 93,
518
+ timesheetId: 77,
519
+ }),
520
+ );
521
+ expect(tx.$executeRawUnsafe).toHaveBeenCalledWith(
522
+ expect.stringContaining('UPDATE operations_timesheet_entry'),
523
+ 77,
524
+ 34,
525
+ 45,
526
+ 'Review backlog',
527
+ '2026-04-14',
528
+ 120,
529
+ 2,
530
+ 'Backlog refinement',
531
+ 93,
532
+ );
533
+ expect((service as any).refreshTimesheetTotal).toHaveBeenCalledWith(tx, 55);
534
+ expect((service as any).refreshTimesheetTotal).toHaveBeenCalledWith(tx, 77);
535
+ expect((service as any).cleanupEmptyEditableTimesheet).toHaveBeenCalledWith(
536
+ tx,
537
+ 55,
538
+ );
539
+ });
540
+
475
541
  it('rejects deleting entries from submitted timesheets', async () => {
476
542
  jest.spyOn(service as any, 'getTimesheetEntryByIdForActor').mockResolvedValue({
477
543
  id: 92,