@hed-hog/operations 0.0.318 → 0.0.321
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.
- package/dist/controllers/operations-collaborator-costs.controller.d.ts +144 -0
- package/dist/controllers/operations-collaborator-costs.controller.d.ts.map +1 -0
- package/dist/controllers/operations-collaborator-costs.controller.js +162 -0
- package/dist/controllers/operations-collaborator-costs.controller.js.map +1 -0
- package/dist/controllers/operations-collaborators.controller.d.ts +14 -0
- package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
- package/dist/controllers/operations-collaborators.controller.js +11 -0
- package/dist/controllers/operations-collaborators.controller.js.map +1 -1
- package/dist/controllers/operations-contracts.controller.d.ts +9 -9
- package/dist/controllers/operations-projects.controller.d.ts +31 -0
- package/dist/controllers/operations-projects.controller.d.ts.map +1 -1
- package/dist/controllers/operations-projects.controller.js +23 -0
- package/dist/controllers/operations-projects.controller.js.map +1 -1
- package/dist/controllers/operations-reports.controller.d.ts +199 -0
- package/dist/controllers/operations-reports.controller.d.ts.map +1 -0
- package/dist/controllers/operations-reports.controller.js +53 -0
- package/dist/controllers/operations-reports.controller.js.map +1 -0
- package/dist/controllers/operations-tasks.controller.d.ts +41 -2
- package/dist/controllers/operations-tasks.controller.d.ts.map +1 -1
- package/dist/controllers/operations-tasks.controller.js +17 -5
- package/dist/controllers/operations-tasks.controller.js.map +1 -1
- package/dist/dto/create-collaborator-cost.dto.d.ts +16 -0
- package/dist/dto/create-collaborator-cost.dto.d.ts.map +1 -0
- package/dist/dto/create-collaborator-cost.dto.js +88 -0
- package/dist/dto/create-collaborator-cost.dto.js.map +1 -0
- package/dist/dto/create-collaborator.dto.d.ts +0 -1
- package/dist/dto/create-collaborator.dto.d.ts.map +1 -1
- package/dist/dto/create-collaborator.dto.js +0 -6
- package/dist/dto/create-collaborator.dto.js.map +1 -1
- package/dist/dto/create-cost-type.dto.d.ts +13 -0
- package/dist/dto/create-cost-type.dto.d.ts.map +1 -0
- package/dist/dto/create-cost-type.dto.js +87 -0
- package/dist/dto/create-cost-type.dto.js.map +1 -0
- package/dist/dto/list-approvals.dto.d.ts +2 -0
- package/dist/dto/list-approvals.dto.d.ts.map +1 -1
- package/dist/dto/list-approvals.dto.js +10 -0
- package/dist/dto/list-approvals.dto.js.map +1 -1
- package/dist/dto/list-collaborator-costs.dto.d.ts +5 -0
- package/dist/dto/list-collaborator-costs.dto.d.ts.map +1 -0
- package/dist/dto/list-collaborator-costs.dto.js +23 -0
- package/dist/dto/list-collaborator-costs.dto.js.map +1 -0
- package/dist/dto/list-cost-types.dto.d.ts +6 -0
- package/dist/dto/list-cost-types.dto.d.ts.map +1 -0
- package/dist/dto/list-cost-types.dto.js +35 -0
- package/dist/dto/list-cost-types.dto.js.map +1 -0
- package/dist/dto/list-my-projects.dto.d.ts +5 -0
- package/dist/dto/list-my-projects.dto.d.ts.map +1 -0
- package/dist/dto/list-my-projects.dto.js +23 -0
- package/dist/dto/list-my-projects.dto.js.map +1 -0
- package/dist/dto/list-my-tasks.dto.d.ts +6 -0
- package/dist/dto/list-my-tasks.dto.d.ts.map +1 -0
- package/dist/dto/list-my-tasks.dto.js +33 -0
- package/dist/dto/list-my-tasks.dto.js.map +1 -0
- package/dist/dto/list-projects.dto.d.ts +1 -0
- package/dist/dto/list-projects.dto.d.ts.map +1 -1
- package/dist/dto/list-projects.dto.js +7 -0
- package/dist/dto/list-projects.dto.js.map +1 -1
- package/dist/dto/list-reports.dto.d.ts +16 -0
- package/dist/dto/list-reports.dto.d.ts.map +1 -0
- package/dist/dto/list-reports.dto.js +75 -0
- package/dist/dto/list-reports.dto.js.map +1 -0
- package/dist/dto/list-tasks.dto.d.ts +2 -0
- package/dist/dto/list-tasks.dto.d.ts.map +1 -1
- package/dist/dto/list-tasks.dto.js +12 -0
- package/dist/dto/list-tasks.dto.js.map +1 -1
- package/dist/dto/list-timesheets.dto.d.ts +2 -0
- package/dist/dto/list-timesheets.dto.d.ts.map +1 -1
- package/dist/dto/list-timesheets.dto.js +10 -0
- package/dist/dto/list-timesheets.dto.js.map +1 -1
- package/dist/dto/update-collaborator-cost.dto.d.ts +6 -0
- package/dist/dto/update-collaborator-cost.dto.d.ts.map +1 -0
- package/dist/dto/update-collaborator-cost.dto.js +9 -0
- package/dist/dto/update-collaborator-cost.dto.js.map +1 -0
- package/dist/dto/update-task.dto.d.ts +1 -0
- package/dist/dto/update-task.dto.d.ts.map +1 -1
- package/dist/dto/update-task.dto.js +6 -0
- package/dist/dto/update-task.dto.js.map +1 -1
- package/dist/operations.module.d.ts.map +1 -1
- package/dist/operations.module.js +4 -0
- package/dist/operations.module.js.map +1 -1
- package/dist/operations.service.d.ts +457 -3
- package/dist/operations.service.d.ts.map +1 -1
- package/dist/operations.service.js +1445 -208
- package/dist/operations.service.js.map +1 -1
- package/dist/operations.service.spec.js +31 -7
- package/dist/operations.service.spec.js.map +1 -1
- package/hedhog/data/menu.yaml +112 -7
- package/hedhog/data/operations_cost_type.yaml +166 -0
- package/hedhog/data/route.yaml +185 -0
- package/hedhog/frontend/app/_components/collaborator-costs-section.tsx.ejs +884 -0
- package/hedhog/frontend/app/_components/collaborator-details-screen.tsx.ejs +80 -1
- package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +219 -94
- package/hedhog/frontend/app/_components/contract-details-screen.tsx.ejs +21 -32
- package/hedhog/frontend/app/_components/contract-form-screen.tsx.ejs +178 -89
- package/hedhog/frontend/app/_components/my-project-summary-screen.tsx.ejs +1185 -0
- package/hedhog/frontend/app/_components/operations-calendar-view.tsx.ejs +306 -0
- package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +943 -782
- package/hedhog/frontend/app/_components/task-detail-sheet.tsx.ejs +223 -0
- package/hedhog/frontend/app/_lib/api.ts.ejs +162 -0
- package/hedhog/frontend/app/_lib/types.ts.ejs +227 -1
- package/hedhog/frontend/app/_lib/utils/format.ts.ejs +11 -3
- package/hedhog/frontend/app/approvals/page.tsx.ejs +191 -46
- package/hedhog/frontend/app/collaborators/page.tsx.ejs +133 -25
- package/hedhog/frontend/app/my-projects/[id]/page.tsx.ejs +11 -0
- package/hedhog/frontend/app/my-projects/page.tsx.ejs +440 -0
- package/hedhog/frontend/app/my-tasks/page.tsx.ejs +1304 -0
- package/hedhog/frontend/app/reports/collaborators/page.tsx.ejs +771 -0
- package/hedhog/frontend/app/reports/projects/page.tsx.ejs +809 -0
- package/hedhog/frontend/app/timesheets/page.tsx.ejs +322 -58
- package/hedhog/frontend/messages/en.json +234 -25
- package/hedhog/frontend/messages/pt.json +234 -25
- package/hedhog/table/operations_collaborator.yaml +0 -4
- package/hedhog/table/operations_collaborator_compensation_history.yaml +28 -0
- package/hedhog/table/operations_collaborator_cost.yaml +56 -0
- package/hedhog/table/operations_cost_type.yaml +38 -0
- package/package.json +7 -7
- package/src/controllers/operations-collaborator-costs.controller.ts +147 -0
- package/src/controllers/operations-collaborators.controller.ts +19 -8
- package/src/controllers/operations-projects.controller.ts +19 -8
- package/src/controllers/operations-reports.controller.ts +32 -0
- package/src/controllers/operations-tasks.controller.ts +32 -12
- package/src/dto/create-collaborator-cost.dto.ts +78 -0
- package/src/dto/create-collaborator.dto.ts +9 -14
- package/src/dto/create-cost-type.dto.ts +62 -0
- package/src/dto/list-approvals.dto.ts +8 -0
- package/src/dto/list-collaborator-costs.dto.ts +8 -0
- package/src/dto/list-cost-types.dto.ts +19 -0
- package/src/dto/list-my-projects.dto.ts +8 -0
- package/src/dto/list-my-tasks.dto.ts +17 -0
- package/src/dto/list-projects.dto.ts +7 -1
- package/src/dto/list-reports.dto.ts +51 -0
- package/src/dto/list-tasks.dto.ts +11 -1
- package/src/dto/list-timesheets.dto.ts +8 -0
- package/src/dto/update-collaborator-cost.dto.ts +4 -0
- package/src/dto/update-task.dto.ts +6 -0
- package/src/operations.module.ts +4 -0
- package/src/operations.service.spec.ts +45 -7
- package/src/operations.service.ts +1988 -221
|
@@ -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
|
}
|
package/src/operations.module.ts
CHANGED
|
@@ -5,10 +5,12 @@ 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
12
|
import { OperationsProjectsController } from './controllers/operations-projects.controller';
|
|
13
|
+
import { OperationsReportsController } from './controllers/operations-reports.controller';
|
|
12
14
|
import { OperationsTasksController } from './controllers/operations-tasks.controller';
|
|
13
15
|
import { OperationsTimesheetsController } from './controllers/operations-timesheets.controller';
|
|
14
16
|
import { OperationsController } from './operations.controller';
|
|
@@ -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
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
|
|
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
|
|
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('
|
|
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,
|
|
587
|
+
await expect(service.removeTimesheetEntry(15, 94)).rejects.toThrow(
|
|
550
588
|
BadRequestException,
|
|
551
589
|
);
|
|
552
590
|
});
|