@hed-hog/operations 0.0.299 → 0.0.301

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 (97) hide show
  1. package/dist/operations.controller.d.ts +713 -31
  2. package/dist/operations.controller.d.ts.map +1 -1
  3. package/dist/operations.controller.js +157 -0
  4. package/dist/operations.controller.js.map +1 -1
  5. package/dist/operations.module.d.ts.map +1 -1
  6. package/dist/operations.module.js +5 -1
  7. package/dist/operations.module.js.map +1 -1
  8. package/dist/operations.proposal.subscriber.d.ts +11 -0
  9. package/dist/operations.proposal.subscriber.d.ts.map +1 -0
  10. package/dist/operations.proposal.subscriber.js +80 -0
  11. package/dist/operations.proposal.subscriber.js.map +1 -0
  12. package/dist/operations.proposal.subscriber.spec.d.ts +2 -0
  13. package/dist/operations.proposal.subscriber.spec.d.ts.map +1 -0
  14. package/dist/operations.proposal.subscriber.spec.js +88 -0
  15. package/dist/operations.proposal.subscriber.spec.js.map +1 -0
  16. package/dist/operations.service.d.ts +490 -46
  17. package/dist/operations.service.d.ts.map +1 -1
  18. package/dist/operations.service.js +3590 -1267
  19. package/dist/operations.service.js.map +1 -1
  20. package/dist/operations.service.spec.d.ts +2 -0
  21. package/dist/operations.service.spec.d.ts.map +1 -0
  22. package/dist/operations.service.spec.js +159 -0
  23. package/dist/operations.service.spec.js.map +1 -0
  24. package/hedhog/data/menu.yaml +232 -198
  25. package/hedhog/data/role.yaml +23 -23
  26. package/hedhog/data/role_route.yaml +39 -0
  27. package/hedhog/data/route.yaml +447 -317
  28. package/hedhog/frontend/app/_components/collaborator-details-screen.tsx.ejs +8 -6
  29. package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +1163 -327
  30. package/hedhog/frontend/app/_components/collaborator-select-with-create.tsx.ejs +256 -0
  31. package/hedhog/frontend/app/_components/contract-content-editor.tsx.ejs +258 -0
  32. package/hedhog/frontend/app/_components/contract-creation-wizard.tsx.ejs +631 -0
  33. package/hedhog/frontend/app/_components/contract-details-screen.tsx.ejs +353 -27
  34. package/hedhog/frontend/app/_components/contract-form-screen.tsx.ejs +1926 -87
  35. package/hedhog/frontend/app/_components/contract-template-form-screen.tsx.ejs +526 -0
  36. package/hedhog/frontend/app/_components/contract-template-select-with-create.tsx.ejs +247 -0
  37. package/hedhog/frontend/app/_components/contract-wizard-sheet.tsx.ejs +3520 -0
  38. package/hedhog/frontend/app/_components/department-select-with-create.tsx.ejs +370 -0
  39. package/hedhog/frontend/app/_components/person-select-with-create.tsx.ejs +826 -0
  40. package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +1251 -364
  41. package/hedhog/frontend/app/_components/section-card.tsx.ejs +48 -13
  42. package/hedhog/frontend/app/_lib/api.ts.ejs +2 -5
  43. package/hedhog/frontend/app/_lib/types.ts.ejs +76 -33
  44. package/hedhog/frontend/app/_lib/utils/format.ts.ejs +85 -8
  45. package/hedhog/frontend/app/approvals/page.tsx.ejs +90 -54
  46. package/hedhog/frontend/app/collaborators/[id]/edit/page.tsx.ejs +2 -2
  47. package/hedhog/frontend/app/collaborators/[id]/page.tsx.ejs +2 -2
  48. package/hedhog/frontend/app/collaborators/page.tsx.ejs +597 -140
  49. package/hedhog/frontend/app/contracts/[id]/edit/page.tsx.ejs +2 -2
  50. package/hedhog/frontend/app/contracts/[id]/page.tsx.ejs +2 -2
  51. package/hedhog/frontend/app/contracts/page.tsx.ejs +941 -262
  52. package/hedhog/frontend/app/contracts/templates/page.tsx.ejs +384 -0
  53. package/hedhog/frontend/app/departments/page.tsx.ejs +442 -0
  54. package/hedhog/frontend/app/page.tsx.ejs +36 -12
  55. package/hedhog/frontend/app/projects/[id]/edit/page.tsx.ejs +2 -2
  56. package/hedhog/frontend/app/projects/new/page.tsx.ejs +2 -2
  57. package/hedhog/frontend/app/projects/page.tsx.ejs +264 -102
  58. package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +50 -28
  59. package/hedhog/frontend/app/time-off/page.tsx.ejs +57 -31
  60. package/hedhog/frontend/app/timesheets/page.tsx.ejs +85 -42
  61. package/hedhog/frontend/messages/en.json +473 -12
  62. package/hedhog/frontend/messages/pt.json +528 -66
  63. package/hedhog/table/operations_approval.yaml +49 -49
  64. package/hedhog/table/operations_approval_history.yaml +29 -29
  65. package/hedhog/table/operations_collaborator.yaml +87 -67
  66. package/hedhog/table/operations_collaborator_schedule_day.yaml +34 -34
  67. package/hedhog/table/operations_contract.yaml +121 -100
  68. package/hedhog/table/operations_contract_document.yaml +40 -23
  69. package/hedhog/table/operations_contract_financial_term.yaml +40 -40
  70. package/hedhog/table/operations_contract_history.yaml +27 -27
  71. package/hedhog/table/operations_contract_party.yaml +46 -46
  72. package/hedhog/table/operations_contract_revision.yaml +38 -38
  73. package/hedhog/table/operations_contract_signature.yaml +38 -38
  74. package/hedhog/table/operations_contract_template.yaml +58 -0
  75. package/hedhog/table/operations_department.yaml +24 -0
  76. package/hedhog/table/operations_project.yaml +54 -54
  77. package/hedhog/table/operations_project_assignment.yaml +55 -55
  78. package/hedhog/table/operations_schedule_adjustment_day.yaml +34 -34
  79. package/hedhog/table/operations_schedule_adjustment_request.yaml +53 -53
  80. package/hedhog/table/operations_time_off_request.yaml +57 -57
  81. package/hedhog/table/operations_timesheet.yaml +41 -41
  82. package/hedhog/table/operations_timesheet_entry.yaml +40 -40
  83. package/package.json +5 -3
  84. package/src/operations.controller.ts +304 -182
  85. package/src/operations.module.ts +26 -22
  86. package/src/operations.proposal.subscriber.spec.ts +121 -0
  87. package/src/operations.proposal.subscriber.ts +86 -0
  88. package/src/operations.service.spec.ts +210 -0
  89. package/src/operations.service.ts +7317 -3595
  90. package/dist/operations-data.controller.d.ts +0 -139
  91. package/dist/operations-data.controller.d.ts.map +0 -1
  92. package/dist/operations-data.controller.js +0 -113
  93. package/dist/operations-data.controller.js.map +0 -1
  94. package/dist/operations-growth.controller.d.ts +0 -48
  95. package/dist/operations-growth.controller.d.ts.map +0 -1
  96. package/dist/operations-growth.controller.js +0 -90
  97. package/dist/operations-growth.controller.js.map +0 -1
@@ -12,7 +12,12 @@
12
12
  "addLine": "Add line",
13
13
  "approve": "Approve",
14
14
  "reject": "Reject",
15
- "cancel": "Cancel"
15
+ "cancel": "Cancel",
16
+ "loadMore": "Load more",
17
+ "clearSelection": "Clear selection",
18
+ "manageDepartments": "Manage departments",
19
+ "manageTemplates": "Manage templates",
20
+ "useTemplate": "Use template"
16
21
  },
17
22
  "filters": {
18
23
  "allStatuses": "All statuses",
@@ -74,8 +79,7 @@
74
79
  "pendingApprovals": "Pending approvals",
75
80
  "startDate": "Start date",
76
81
  "endDate": "End date",
77
- "monthlyHourCap": "Monthly hour cap"
78
- ,
82
+ "monthlyHourCap": "Monthly hour cap",
79
83
  "title": "Title",
80
84
  "role": "Role",
81
85
  "total": "Total",
@@ -144,6 +148,15 @@
144
148
  "profileTitle": "My collaborator profile",
145
149
  "profileDescription": "Self-service view of the operational profile linked to your user.",
146
150
  "emptyDescription": "No collaborator records match the current filters.",
151
+ "viewMode": "View",
152
+ "viewModeTable": "Table",
153
+ "viewModeCards": "Grid",
154
+ "cards": {
155
+ "total": "Total collaborators",
156
+ "active": "Active collaborators",
157
+ "onLeave": "On leave",
158
+ "withContracts": "With contract"
159
+ },
147
160
  "sheet": {
148
161
  "createTitle": "Create collaborator",
149
162
  "editTitle": "Edit collaborator",
@@ -168,6 +181,44 @@
168
181
  "statusError": "Unable to update collaborator status."
169
182
  }
170
183
  },
184
+ "DepartmentsPage": {
185
+ "title": "Departments",
186
+ "description": "Manage the operational departments used by collaborator profiles and reporting structure.",
187
+ "breadcrumb": "Departments",
188
+ "searchPlaceholder": "Search department, code, or description...",
189
+ "emptyDescription": "No departments match the current filters.",
190
+ "noAccessDescription": "Director permissions are required to manage departments.",
191
+ "cards": {
192
+ "total": "Total departments",
193
+ "active": "Active departments",
194
+ "linkedCollaborators": "Linked collaborators",
195
+ "inactive": "Inactive departments"
196
+ },
197
+ "columns": {
198
+ "name": "Name",
199
+ "code": "Code",
200
+ "description": "Description",
201
+ "collaborators": "Collaborators"
202
+ },
203
+ "sheet": {
204
+ "createTitle": "Create department",
205
+ "editTitle": "Edit department",
206
+ "description": "Keep the operations department catalog clean and ready for collaborator assignment."
207
+ },
208
+ "form": {
209
+ "name": "Department name",
210
+ "code": "Code",
211
+ "description": "Description",
212
+ "status": "Status"
213
+ },
214
+ "messages": {
215
+ "requiredFields": "Department name is required.",
216
+ "saveSuccess": "Department saved successfully.",
217
+ "saveError": "Unable to save the department.",
218
+ "statusSuccess": "Department status updated successfully.",
219
+ "statusError": "Unable to update department status."
220
+ }
221
+ },
171
222
  "CollaboratorFormPage": {
172
223
  "newTitle": "New Collaborator",
173
224
  "editTitle": "Edit Collaborator",
@@ -175,6 +226,12 @@
175
226
  "description": "Register collaborators with the right employment profile and optionally generate a draft contract from the hiring flow.",
176
227
  "noAccessDescription": "Director permissions are required to manage collaborator registration.",
177
228
  "loading": "Loading collaborator data...",
229
+ "tabs": {
230
+ "profile": "Profile",
231
+ "contract": "Contract",
232
+ "schedule": "Schedule",
233
+ "activity": "Activity"
234
+ },
178
235
  "sections": {
179
236
  "basicInfo": "Basic info",
180
237
  "basicInfoDescription": "Core identity and profile data used across operations.",
@@ -188,10 +245,16 @@
188
245
  "scheduleDescription": "Define the expected recurring work schedule used by operations and approvals."
189
246
  },
190
247
  "fields": {
248
+ "person": "Person",
249
+ "personEntityLabel": "person",
250
+ "personDescription": "Select an existing person or register a new one without leaving this screen.",
191
251
  "userId": "User ID",
252
+ "userIdOptional": "User ID (optional)",
253
+ "userIdDescription": "Use this only when you need to bind a platform account after the person record is created.",
192
254
  "code": "Code",
193
255
  "displayName": "Display name",
194
256
  "department": "Department",
257
+ "departmentDescription": "Select an existing department or create a new one for this collaborator.",
195
258
  "title": "Role / position",
196
259
  "levelLabel": "Level",
197
260
  "notes": "Notes",
@@ -199,12 +262,39 @@
199
262
  "weeklyCapacityHours": "Weekly workload",
200
263
  "compensationAmount": "Compensation amount",
201
264
  "contractDescription": "Contract draft notes",
265
+ "startTime": "Start",
266
+ "endTime": "End",
267
+ "breakMinutes": "Break (min)",
268
+ "breakMinutesDescription": "The last numeric field defines the daily break in minutes. Example: 60 = a 1-hour lunch break.",
202
269
  "autoGenerateContractDraft": "Generate contract draft automatically",
203
270
  "autoGenerateContractDraftDescription": "Creates a related draft contract classified from the collaborator type and linked to the hiring origin."
204
271
  },
272
+ "options": {
273
+ "collaboratorTypes": {
274
+ "clt": "CLT",
275
+ "pj": "PJ",
276
+ "freelancer": "Freelancer",
277
+ "intern": "Intern",
278
+ "other": "Other"
279
+ },
280
+ "statuses": {
281
+ "active": "Active",
282
+ "on_leave": "On Leave",
283
+ "inactive": "Inactive",
284
+ "draft": "Draft"
285
+ }
286
+ },
287
+ "placeholders": {
288
+ "person": "Select or create a person",
289
+ "department": "Select or create a department",
290
+ "departmentCreate": "Department name",
291
+ "supervisor": "Search a collaborator",
292
+ "userIdOptional": "Link a user later if needed"
293
+ },
205
294
  "messages": {
206
- "userRequired": "A user ID is required for new collaborators.",
207
- "requiredFields": "Code and display name are required.",
295
+ "userRequired": "The user binding can be completed after the initial collaborator setup.",
296
+ "personRequired": "Select or create a person for the collaborator.",
297
+ "requiredFields": "The collaborator code is required.",
208
298
  "createSuccess": "Collaborator created successfully.",
209
299
  "createError": "Unable to create the collaborator.",
210
300
  "updateSuccess": "Collaborator updated successfully.",
@@ -248,6 +338,12 @@
248
338
  "breadcrumb": "Projects",
249
339
  "searchPlaceholder": "Search project, client, manager, or contract...",
250
340
  "emptyDescription": "No projects match the current filters.",
341
+ "cards": {
342
+ "total": "Projects",
343
+ "active": "Active",
344
+ "atRisk": "At risk",
345
+ "upcomingDeliveries": "With deadline"
346
+ },
251
347
  "actions": {
252
348
  "archive": "Archive"
253
349
  },
@@ -284,11 +380,11 @@
284
380
  "governance": "Responsible and dates",
285
381
  "governanceDescription": "Set the project owner, lifecycle status, and date range.",
286
382
  "team": "Team assignment",
287
- "teamDescription": "Select the collaborators that should start linked to this project.",
383
+ "teamDescription": "{count} collaborators selected for the initial team.",
288
384
  "financials": "Financial and contract basis",
289
385
  "financialsDescription": "Baseline data used for project controls and draft contract creation.",
290
386
  "contract": "Contract generation settings",
291
- "contractDescription": "Choose whether to reuse an existing contract or generate a project-origin draft."
387
+ "contractDescription": "Choose a reusable template, link an existing contract, or generate a new draft from the project flow."
292
388
  },
293
389
  "fields": {
294
390
  "code": "Project code",
@@ -296,16 +392,71 @@
296
392
  "clientName": "Client name",
297
393
  "deliveryModel": "Delivery model",
298
394
  "summary": "Operational summary",
395
+ "progressPercent": "Progress %",
299
396
  "roleLabel": "Role / responsibility",
300
397
  "weeklyHours": "Weekly hours",
301
398
  "allocationPercent": "Allocation %",
399
+ "isBillable": "Billable",
400
+ "isBillableDescription": "Include this assignment in billable capacity.",
302
401
  "contractCode": "Draft contract code",
303
402
  "contractName": "Draft contract name",
304
403
  "contractDescription": "Draft contract notes",
404
+ "contractTemplate": "Contract template",
305
405
  "autoGenerateContractDraft": "Generate contract draft automatically",
306
406
  "autoGenerateContractDraftDescription": "Creates a draft project/service contract with originType client_project linked to this project.",
307
407
  "existingContractSelected": "An existing contract is already selected for this project."
308
408
  },
409
+ "labels": {
410
+ "enabled": "Enabled",
411
+ "disabled": "Disabled",
412
+ "templateSelected": "Template selected for new drafts"
413
+ },
414
+ "hints": {
415
+ "summary": "Keep this short: scope, goal, and any delivery context.",
416
+ "progressPercent": "Use a simple estimate from 0 to 100.",
417
+ "monthlyHourCap": "Optional cap used for planning and draft contract generation.",
418
+ "contract": "Selecting an existing contract disables automatic draft generation.",
419
+ "contractTemplate": "Use a template to prefill the next contract or the automatic draft for this project.",
420
+ "contractCode": "Used only if a draft contract is generated from this project.",
421
+ "contractName": "Visible title for the generated draft contract.",
422
+ "contractDescription": "Optional commercial notes or clauses for the generated draft."
423
+ },
424
+ "placeholders": {
425
+ "code": "Ex: PRJ-2026-001",
426
+ "name": "Enter the project name",
427
+ "clientName": "Enter the client or account name",
428
+ "summary": "Describe scope, goals, and relevant delivery context",
429
+ "progressPercent": "0 to 100",
430
+ "managerSearch": "Search manager...",
431
+ "assignmentSearch": "Search collaborator by name, department, or role",
432
+ "contractSearch": "Search existing contract...",
433
+ "contractTemplateSearch": "Search contract template...",
434
+ "monthlyHourCap": "Monthly hour cap",
435
+ "contractCode": "Used only when creating a draft contract",
436
+ "contractName": "Visible name for the generated draft",
437
+ "contractDescription": "Add commercial notes or delivery clauses"
438
+ },
439
+ "options": {
440
+ "deliveryModels": {
441
+ "project_delivery": "Project delivery",
442
+ "dedicated_team": "Dedicated team",
443
+ "shared_team": "Shared team",
444
+ "support": "Support"
445
+ },
446
+ "statuses": {
447
+ "planning": "Planning",
448
+ "active": "Active",
449
+ "at_risk": "At risk",
450
+ "paused": "Paused",
451
+ "completed": "Completed",
452
+ "archived": "Archived"
453
+ },
454
+ "billingModels": {
455
+ "time_and_material": "Time and material",
456
+ "monthly_retainer": "Monthly retainer",
457
+ "fixed_price": "Fixed price"
458
+ }
459
+ },
309
460
  "messages": {
310
461
  "requiredFields": "Project code, project name, and client name are required.",
311
462
  "createSuccess": "Project created successfully.",
@@ -353,29 +504,181 @@
353
504
  "breadcrumb": "Contracts",
354
505
  "searchPlaceholder": "Search contract, party, client, type, or code...",
355
506
  "emptyDescription": "No contracts match the current filters.",
507
+ "cards": {
508
+ "total": "Total contracts",
509
+ "active": "Active contracts",
510
+ "underReview": "Under review",
511
+ "withTemplate": "With template"
512
+ },
513
+ "viewMode": "View mode",
514
+ "viewModeTable": "Table",
515
+ "viewModeCards": "Cards",
356
516
  "columns": {
357
517
  "title": "Title",
358
518
  "code": "Code",
359
519
  "type": "Type",
360
520
  "origin": "Origin",
521
+ "template": "Template",
361
522
  "party": "Main related party",
362
523
  "signatureStatus": "Signature status",
363
524
  "active": "Active",
364
525
  "financials": "Financial summary"
365
526
  },
366
527
  "actions": {
528
+ "downloadPdf": "Download PDF",
529
+ "uploadPdf": "Upload PDF",
367
530
  "duplicate": "Duplicate",
368
- "archive": "Archive"
531
+ "archive": "Archive",
532
+ "delete": "Delete"
369
533
  },
370
534
  "filters": {
371
535
  "originType": "Origin type"
372
536
  },
537
+ "sheet": {
538
+ "createTitle": "New Contract",
539
+ "editTitle": "Edit Contract",
540
+ "duplicateTitle": "Duplicate Contract",
541
+ "description": "Manage the contract in a side panel without leaving the main list."
542
+ },
543
+ "wizard": {
544
+ "title": "Contract creation assistant",
545
+ "description": "Choose how to start: upload an existing document, use a saved template, or create the contract from scratch.",
546
+ "options": {
547
+ "upload": {
548
+ "title": "I already have a PDF or Word file",
549
+ "description": "Upload an existing contract so the system can extract data and let you review it before saving."
550
+ },
551
+ "template": {
552
+ "title": "I want to use a template",
553
+ "description": "Start from a saved template and adjust the form as needed."
554
+ },
555
+ "blank": {
556
+ "title": "I want to create it from scratch",
557
+ "description": "Open a blank form for a fully custom contract."
558
+ }
559
+ },
560
+ "upload": {
561
+ "title": "Upload an existing contract",
562
+ "description": "Add a PDF or DOCX file. AI can suggest a draft, but you still review everything before saving.",
563
+ "selectFile": "Select file",
564
+ "supportedFiles": "Supported formats: PDF, DOC, and DOCX.",
565
+ "aiReady": "AI-assisted extraction is ready with {provider}.",
566
+ "aiUnavailable": "No AI provider is configured yet. You can still continue manually with the file attached.",
567
+ "promptMessage": "Analyze the attached contract and extract a structured draft for the contract form."
568
+ },
569
+ "template": {
570
+ "title": "Start with a template",
571
+ "description": "Select a saved template to open the form with an initial structure already filled in.",
572
+ "placeholder": "Select a template",
573
+ "noDescription": "This template does not have a description yet."
574
+ },
575
+ "blank": {
576
+ "title": "Custom creation",
577
+ "description": "Open an empty form and fill in the contract manually.",
578
+ "helper": "Best for brand-new agreements, uncommon scenarios, or when you want full control from the start."
579
+ },
580
+ "review": {
581
+ "title": "Mandatory review before saving",
582
+ "description": "Check the AI suggestions in the form before you finish creating the contract.",
583
+ "missingFields": "Fields that still need attention",
584
+ "warnings": "Extraction warnings"
585
+ },
586
+ "actions": {
587
+ "extractWithAi": "Extract with AI",
588
+ "reviewInForm": "Review in form",
589
+ "continueManual": "Continue manually",
590
+ "skipToBlank": "Skip to blank form",
591
+ "useTemplate": "Use template",
592
+ "startBlank": "Open blank form"
593
+ },
594
+ "messages": {
595
+ "missingFile": "Select a PDF, DOC, or DOCX file to continue.",
596
+ "missingAiConfiguration": "Configure OpenAI or Gemini to use assisted extraction.",
597
+ "extractSuccess": "Draft extracted successfully using {provider}.",
598
+ "extractError": "Unable to extract data from the document. You can still continue manually."
599
+ }
600
+ },
373
601
  "messages": {
374
602
  "statusSuccess": "Contract status updated successfully.",
375
603
  "statusError": "Unable to update contract status.",
376
604
  "uploadSuccess": "Contract PDF uploaded successfully.",
377
605
  "uploadError": "Unable to upload the contract PDF.",
378
- "noPdf": "No PDF is currently available for this contract."
606
+ "noPdf": "No PDF is currently available for this contract.",
607
+ "deleteSuccess": "Contract deleted successfully.",
608
+ "deleteError": "Unable to delete the contract.",
609
+ "confirmDeleteTitle": "Delete contract?",
610
+ "confirmDeleteDescription": "This action will remove \"{name}\" from the contract list."
611
+ }
612
+ },
613
+ "ContractTemplatesPage": {
614
+ "title": "Contract Templates",
615
+ "description": "Manage reusable RichText templates with default metadata and AI assistance.",
616
+ "breadcrumb": "Contract Templates",
617
+ "searchPlaceholder": "Search template, code, description, or type...",
618
+ "emptyDescription": "No templates match the current filters.",
619
+ "noAccessDescription": "Director permissions are required to manage contract templates.",
620
+ "cards": {
621
+ "total": "Total templates",
622
+ "active": "Active templates",
623
+ "draft": "Draft templates",
624
+ "archived": "Archived"
625
+ },
626
+ "columns": {
627
+ "name": "Template",
628
+ "code": "Code",
629
+ "type": "Type",
630
+ "usageCount": "Usage",
631
+ "updatedAt": "Updated at"
632
+ },
633
+ "filters": {
634
+ "type": "Contract type"
635
+ },
636
+ "sheet": {
637
+ "createTitle": "New Contract Template",
638
+ "editTitle": "Edit Contract Template",
639
+ "description": "Keep reusable models ready for faster project contracts and drafts."
640
+ },
641
+ "messages": {
642
+ "statusSuccess": "Template status updated successfully.",
643
+ "statusError": "Unable to update template status."
644
+ }
645
+ },
646
+ "ContractTemplateFormPage": {
647
+ "newTitle": "New Contract Template",
648
+ "editTitle": "Edit Contract Template",
649
+ "breadcrumb": "Contract Template Form",
650
+ "description": "Define reusable base text and default metadata for future project contracts.",
651
+ "noAccessDescription": "Director permissions are required to manage contract templates.",
652
+ "loading": "Loading template...",
653
+ "sections": {
654
+ "overview": "Template details",
655
+ "overviewDescription": "Default metadata that will be applied when a new contract starts from this template.",
656
+ "editor": "Template content",
657
+ "editorDescription": "Edit the reusable RichText base and keep placeholders like client_name and project_name when useful.",
658
+ "preview": "Preview",
659
+ "previewDescription": "Live preview of the reusable template content."
660
+ },
661
+ "fields": {
662
+ "code": "Code",
663
+ "name": "Template name",
664
+ "description": "Description",
665
+ "contractCategory": "Category",
666
+ "contractType": "Type",
667
+ "signatureStatus": "Default signature status",
668
+ "isActive": "Active template",
669
+ "isActiveDescription": "Disable it to hide the template from selectors without losing its history."
670
+ },
671
+ "placeholders": {
672
+ "code": "Ex: MSA-SAAS",
673
+ "name": "Ex: Standard service agreement",
674
+ "description": "Explain when this template should be used and which data it covers"
675
+ },
676
+ "messages": {
677
+ "requiredFields": "Template name is required.",
678
+ "createSuccess": "Template created successfully.",
679
+ "createError": "Unable to create the template.",
680
+ "updateSuccess": "Template updated successfully.",
681
+ "updateError": "Unable to update the template."
379
682
  }
380
683
  },
381
684
  "ContractFormPage": {
@@ -405,7 +708,7 @@
405
708
  "financials": "Financial terms",
406
709
  "financialsDescription": "Track values, revenues, payments, and fines.",
407
710
  "documents": "Documents",
408
- "documentsDescription": "Upload or replace the current contract PDF.",
711
+ "documentsDescription": "Upload or replace the current contract document (PDF, DOC, or DOCX).",
409
712
  "revisions": "Amendments / renewals",
410
713
  "revisionsDescription": "Track addendums, amendments, and renewals.",
411
714
  "editor": "Contract editor",
@@ -417,6 +720,8 @@
417
720
  "code": "Code",
418
721
  "name": "Contract title",
419
722
  "clientName": "Client name",
723
+ "contractTemplate": "Contract template",
724
+ "contractTemplateDescription": "Select a reusable template to prefill the initial metadata and content for this contract.",
420
725
  "contractCategory": "Category",
421
726
  "contractType": "Type",
422
727
  "originType": "Origin type",
@@ -426,6 +731,8 @@
426
731
  "isActiveDescription": "Use this to deactivate or reactivate the contract without deleting its registry entry.",
427
732
  "budgetAmount": "Budget amount",
428
733
  "monthlyHourCap": "Monthly hour cap",
734
+ "effectiveDate": "Effective date",
735
+ "signedAt": "Signed at",
429
736
  "partyDisplayName": "Party name",
430
737
  "partyRole": "Party role",
431
738
  "partyType": "Party type",
@@ -448,14 +755,115 @@
448
755
  "revisionStatus": "Revision status",
449
756
  "summary": "Summary"
450
757
  },
758
+ "options": {
759
+ "contractCategories": {
760
+ "employee": "Employee",
761
+ "contractor": "Contractor",
762
+ "client": "Client",
763
+ "supplier": "Supplier",
764
+ "vendor": "Vendor",
765
+ "partner": "Partner",
766
+ "internal": "Internal",
767
+ "other": "Other"
768
+ },
769
+ "contractTypes": {
770
+ "clt": "CLT",
771
+ "pj": "PJ",
772
+ "freelancer_agreement": "Freelancer agreement",
773
+ "service_agreement": "Service agreement",
774
+ "fixed_term": "Fixed term",
775
+ "recurring_service": "Recurring service",
776
+ "nda": "NDA",
777
+ "amendment": "Amendment",
778
+ "addendum": "Addendum",
779
+ "other": "Other"
780
+ },
781
+ "signatureStatuses": {
782
+ "not_started": "Not started",
783
+ "pending": "Pending",
784
+ "partially_signed": "Partially signed",
785
+ "signed": "Signed",
786
+ "expired": "Expired",
787
+ "rejected": "Rejected"
788
+ },
789
+ "billingModels": {
790
+ "time_and_material": "Time and material",
791
+ "monthly_retainer": "Monthly retainer",
792
+ "fixed_price": "Fixed price"
793
+ },
794
+ "statuses": {
795
+ "draft": "Draft",
796
+ "under_review": "Under review",
797
+ "active": "Active",
798
+ "renewal": "Renewal",
799
+ "expired": "Expired",
800
+ "closed": "Closed",
801
+ "archived": "Archived"
802
+ },
803
+ "partyRoles": {
804
+ "employee": "Employee",
805
+ "employer": "Employer",
806
+ "client": "Client",
807
+ "supplier": "Supplier",
808
+ "vendor": "Vendor",
809
+ "partner": "Partner",
810
+ "witness": "Witness",
811
+ "internal_owner": "Internal owner",
812
+ "other": "Other"
813
+ },
814
+ "financialTermTypes": {
815
+ "value": "Value",
816
+ "payment": "Payment",
817
+ "revenue": "Revenue",
818
+ "fine": "Fine",
819
+ "other": "Other"
820
+ },
821
+ "recurrences": {
822
+ "one_time": "One time",
823
+ "monthly": "Monthly",
824
+ "quarterly": "Quarterly",
825
+ "yearly": "Yearly",
826
+ "other": "Other"
827
+ },
828
+ "creationModes": {
829
+ "blank": "Blank",
830
+ "template": "Template",
831
+ "upload": "Upload",
832
+ "duplicate": "Duplicate"
833
+ },
834
+ "extractionStatuses": {
835
+ "pending": "Pending",
836
+ "processing": "Processing",
837
+ "completed": "Completed",
838
+ "failed": "Failed",
839
+ "skipped": "Skipped"
840
+ }
841
+ },
451
842
  "messages": {
452
843
  "requiredFields": "Code, contract title, and client name are required.",
453
844
  "createSuccess": "Contract created successfully.",
454
845
  "createError": "Unable to create the contract.",
455
846
  "updateSuccess": "Contract updated successfully.",
456
847
  "updateError": "Unable to update the contract.",
457
- "pdfHint": "Upload a PDF to attach it as the current contract document.",
458
- "pdfReady": "PDF ready to save: {name}"
848
+ "pdfHint": "Upload a PDF, DOC, or DOCX file to attach it as the current contract document.",
849
+ "pdfReady": "Document ready to save: {name}"
850
+ }
851
+ },
852
+ "ContractContentEditor": {
853
+ "assistantTitle": "AI content assistant",
854
+ "assistantDescription": "Describe what you need and the text will be generated automatically using {provider}.",
855
+ "promptPlaceholder": "Example: Draft a monthly service agreement with scope, payment, confidentiality, SLA, and termination clauses.",
856
+ "emptyPreview": "There is no contract content yet.",
857
+ "suggestedPrompt": "Create a professional draft for {subject} with clear language and concise sections.",
858
+ "actions": {
859
+ "useSuggestion": "Suggest prompt",
860
+ "generate": "Generate text"
861
+ },
862
+ "messages": {
863
+ "missingConfiguration": "Configure an AI provider in settings to use this action.",
864
+ "missingPrompt": "Enter a prompt before generating the text.",
865
+ "generateSuccess": "Content updated with {provider}.",
866
+ "generateError": "Unable to generate the content with AI."
459
867
  }
460
868
  },
461
869
  "ContractDetailsPage": {
@@ -560,6 +968,30 @@
560
968
  "rejectTitle": "Reject request",
561
969
  "description": "Add an optional note for {requester}'s request: {target}."
562
970
  },
971
+ "options": {
972
+ "statuses": {
973
+ "pending": "Pending",
974
+ "approved": "Approved",
975
+ "rejected": "Rejected",
976
+ "cancelled": "Cancelled"
977
+ },
978
+ "targetTypes": {
979
+ "timesheet": "Timesheet",
980
+ "time_off_request": "Time-off request",
981
+ "schedule_adjustment_request": "Schedule adjustment"
982
+ },
983
+ "timeOffTypes": {
984
+ "vacation": "Vacation",
985
+ "personal_time": "Personal time",
986
+ "sick_leave": "Sick leave",
987
+ "unpaid_leave": "Unpaid leave",
988
+ "other": "Other"
989
+ },
990
+ "scheduleScopes": {
991
+ "temporary": "Temporary",
992
+ "permanent": "Permanent"
993
+ }
994
+ },
563
995
  "messages": {
564
996
  "approveSuccess": "Approval completed successfully.",
565
997
  "approveError": "Unable to approve the request.",
@@ -582,6 +1014,22 @@
582
1014
  "approved": "Approved requests",
583
1015
  "days": "Requested days"
584
1016
  },
1017
+ "options": {
1018
+ "requestTypes": {
1019
+ "vacation": "Vacation",
1020
+ "personal_time": "Personal time",
1021
+ "sick_leave": "Sick leave",
1022
+ "unpaid_leave": "Unpaid leave",
1023
+ "other": "Other"
1024
+ },
1025
+ "statuses": {
1026
+ "draft": "Draft",
1027
+ "submitted": "Submitted",
1028
+ "approved": "Approved",
1029
+ "rejected": "Rejected",
1030
+ "cancelled": "Cancelled"
1031
+ }
1032
+ },
585
1033
  "messages": {
586
1034
  "requiredFields": "Start date and end date are required.",
587
1035
  "saveSuccess": "Time-off request submitted successfully.",
@@ -603,6 +1051,19 @@
603
1051
  "approved": "Approved requests",
604
1052
  "permanent": "Permanent requests"
605
1053
  },
1054
+ "options": {
1055
+ "requestScopes": {
1056
+ "temporary": "Temporary",
1057
+ "permanent": "Permanent"
1058
+ },
1059
+ "statuses": {
1060
+ "draft": "Draft",
1061
+ "submitted": "Submitted",
1062
+ "approved": "Approved",
1063
+ "rejected": "Rejected",
1064
+ "cancelled": "Cancelled"
1065
+ }
1066
+ },
606
1067
  "table": {
607
1068
  "currentSchedule": "Current schedule"
608
1069
  },