@ministryofjustice/hmpps-prison-permissions-lib 0.4.0 → 1.0.0

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 (27) hide show
  1. package/CHANGELOG.md +47 -5
  2. package/README.md +2 -1
  3. package/dist/contractTests/prisonerProfile/scenarios/domains/prisonerSpecific/prisonerIncentives/{PrisonerIncentivesReadScenarios.d.ts → IncentiveLevelHistoryReadScenarios.d.ts} +1 -1
  4. package/dist/contractTests/prisonerProfile/scenarios/domains/prisonerSpecific/prisonerSpecificRisks/CsraAssessmentHistoryReadScenarios.d.ts +2 -0
  5. package/dist/index.cjs +100 -41
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.ts +41 -30
  8. package/dist/index.esm.js +100 -42
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/incentiveLevelHistoryRead/IncentiveLevelHistoryReadCheck.d.ts +2 -0
  11. package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/{prisonerIncentivesRead/PrisonerIncentivesReadScenarios.d.ts → incentiveLevelHistoryRead/IncentiveLevelHistoryReadScenarios.d.ts} +1 -1
  12. package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksCheck.d.ts +3 -0
  13. package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerSpecificRisks/csraRead/CsraAssessmentHistoryReadCheck.d.ts +2 -0
  14. package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerSpecificRisks/csraRead/CsraAssessmentHistoryReadScenarios.d.ts +2 -0
  15. package/dist/services/permissions/utils/PermissionUtils.d.ts +4 -1
  16. package/dist/testUtils/PrisonerPermissionsMock.d.ts +3 -0
  17. package/dist/types/public/permissions/domains/prisonerSpecific/PrisonerSpecificDomainPermissions.d.ts +3 -1
  18. package/dist/types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissions.d.ts +1 -0
  19. package/dist/types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissions.d.ts +2 -1
  20. package/dist/types/public/permissions/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksPermissionPaths.d.ts +4 -0
  21. package/dist/types/public/permissions/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksPermissions.d.ts +5 -0
  22. package/package.json +16 -16
  23. package/dist/services/permissions/checks/domains/interventions/personInterventions/csipRead/CSIPReadCheck.d.ts +0 -2
  24. package/dist/services/permissions/checks/domains/interventions/personInterventions/csipRead/CSIPReadScenarios.d.ts +0 -1
  25. package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/prisonerIncentivesRead/PrisonerIncentivesReadCheck.d.ts +0 -2
  26. /package/dist/services/permissions/checks/domains/{interventions/personInterventions/csipRead/CSIPReadCheck.test.d.ts → prisonerSpecific/prisonerIncentives/incentiveLevelHistoryRead/IncentiveLevelHistoryReadCheck.test.d.ts} +0 -0
  27. /package/dist/services/permissions/checks/domains/prisonerSpecific/{prisonerIncentives/prisonerIncentivesRead/PrisonerIncentivesReadCheck.test.d.ts → prisonerSpecificRisks/csraRead/CsraAssessmentHistoryReadCheck.test.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -2,9 +2,45 @@
2
2
 
3
3
  Please use this to capture reasoning behind changes:
4
4
 
5
+ ## 1.0.0
6
+
7
+ ### Breaking changes:
8
+
9
+ * Renamed `PrisonerIncentivesPermission.read` to `PrisonerIncentivesPermission.read_incentive_level` to distinguish
10
+ between reading just the incentive level vs the incentives history and comments. This only affected the Prisoner
11
+ Profile contract tests.
12
+
13
+ ### New features:
14
+
15
+ * Introduction of `PrisonerIncentivesPermission.read_incentive_level_history`.
16
+
17
+ We reviewed the permissions around incentives and found that there were conflicting permissions between
18
+ displaying the incentive level in the Prisoner Profile banner, the incentives card in the Prisoner Profile overview
19
+ and the incentives service itself. Connect DPS and the Incentives team agreed that just reading the incentive level
20
+ should follow the base checks for the profile, whilst reading the incentives history and comments should not
21
+ be allowed for prisoners in a prison outside the user's caseload.
22
+
23
+ We have therefore introduced a new permission to capture the incentive level history permission.
24
+
25
+ * Introduction of CSRA permissions for reading the CSRA rating of a prisoner and also the history and details of
26
+ CSRA assessments.
27
+
28
+ It was decided (see Slack #hmpps-data-domains on 17/11/25) that CSRA should sit in the 'Prisoner Specific Risks'
29
+ domain, `as it is solely an assessment of their suitability to share a cell and who with`
30
+
31
+ The permissions mirror the logic that was used in the Prisoner Profile.
32
+
33
+ * Introduction of a `PersonPrisonCategoryPermission.read` permission that matches the base checks. This matched the
34
+ existing logic in the Prisoner Profile for reading a prisoner's category.
35
+
36
+ ## 0.5.0
37
+
38
+ No functionality changes. Dependencies updated and support for node 24 has been added.
39
+
5
40
  ## 0.4.0
6
41
 
7
- Access period for users with both the `POM` and `GLOBAL_SEARCH` roles to access prisoner case notes after a transfer extended from 30 to 90 days.
42
+ Access period for users with both the `POM` and `GLOBAL_SEARCH` roles to access prisoner case notes after a transfer
43
+ extended from 30 to 90 days.
8
44
 
9
45
  ## 0.3.0
10
46
 
@@ -12,9 +48,15 @@ Official release for updates to the Case Notes and Religion permissions.
12
48
 
13
49
  **Case Notes Permissions:**
14
50
 
15
- Previously if a user had both the `POM` and `GLOBAL_SEARCH` roles they would be able read/write case notes any prisoner. The case notes permissions have now been updated so that users with both the `POM` and `GLOBAL_SEARCH` roles will only be able to read/write a prisoner's case notes if the prisoner has been in the users establishment within the last 30 days.
51
+ Previously if a user had both the `POM` and `GLOBAL_SEARCH` roles they would be able read/write case notes any prisoner.
52
+ The case notes permissions have now been updated so that users with both the `POM` and `GLOBAL_SEARCH` roles will only
53
+ be able to read/write a prisoner's case notes if the prisoner has been in the users establishment within the last 30
54
+ days.
16
55
 
17
- The permissions check requires additional data to be passed in via the `Prisoner` which now expects the `previousPrisonId` and `previousPrisonLeavingDate` fields to be present. This data has been added to the prisoner search API so clients using the permissions library will need to ensure the following fields are present in the `Prisoner` interface.
56
+ The permissions check requires additional data to be passed in via the `Prisoner` which now expects the
57
+ `previousPrisonId` and `previousPrisonLeavingDate` fields to be present. This data has been added to the prisoner search
58
+ API so clients using the permissions library will need to ensure the following fields are present in the `Prisoner`
59
+ interface.
18
60
 
19
61
  ```
20
62
  export default interface Prisoner {
@@ -29,8 +71,8 @@ export default interface Prisoner {
29
71
 
30
72
  **Religion and Belief Permissions:**
31
73
 
32
- The permissions check for `PersonProtectedCharacteristicsPermission.read_religion_and_belief` updated to only allow read access to a
33
- prisoner's religion data to users who are part of the prisoner's caseload.
74
+ The permissions check for `PersonProtectedCharacteristicsPermission.read_religion_and_belief` updated to only allow read
75
+ access to a prisoner's religion data to users who are part of the prisoner's caseload.
34
76
 
35
77
  ## 0.3.0-alpha.1
36
78
 
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # hmpps-prison-permissions-lib
2
2
 
3
3
  [![repo standards badge](https://img.shields.io/badge/endpoint.svg?&style=flat&logo=github&url=https%3A%2F%2Foperations-engineering-reports.cloud-platform.service.justice.gov.uk%2Fapi%2Fv1%2Fcompliant_public_repositories%2Fhmpps-prison-permissions-lib)](https://operations-engineering-reports.cloud-platform.service.justice.gov.uk/public-report/hmpps-prison-permissions-lib "Link to report")
4
+ [![Test, lint & publish](https://github.com/ministryofjustice/hmpps-prison-permissions-lib/actions/workflows/pipeline.yml/badge.svg?branch=main)](https://github.com/ministryofjustice/hmpps-prison-permissions-lib/actions/workflows/pipeline.yml)
4
5
 
5
6
  A Node.js client library to centralise the process of determining user permissions for prison services and data.
6
7
 
@@ -143,7 +144,7 @@ setupNunjucksPermissions(njkEnv)
143
144
 
144
145
  * Using the permissions check in the template, for example:
145
146
 
146
- ```
147
+ ```nunjucks
147
148
  {% if isGranted(PrisonerMoneyPermission.read, res.locals.prisonerPermissions) %}
148
149
  ...
149
150
  {% endif %}
@@ -1,2 +1,2 @@
1
1
  import { TestScenarios } from '../../../../../../testUtils/TestScenario';
2
- export declare const prisonerIncentivesReadScenarios: TestScenarios;
2
+ export declare const incentiveLevelHistoryReadScenarios: TestScenarios;
@@ -0,0 +1,2 @@
1
+ import { TestScenarios } from '../../../../../../testUtils/TestScenario';
2
+ export declare const csraAssessmentHistoryReadScenarios: TestScenarios;
package/dist/index.cjs CHANGED
@@ -113,8 +113,14 @@ const isActiveCaseLoad = (prisonId, user) => user.authSource === 'nomis' && user
113
113
  function isInUsersCaseLoad(prisonId, user) {
114
114
  return user.authSource === 'nomis' && user.caseLoads?.some(caseLoad => caseLoad.caseLoadId === prisonId);
115
115
  }
116
- function isReleasedOrTransferring(prisonId) {
117
- return ['OUT', 'TRN'].includes(prisonId);
116
+ const isReleased = (prisoner) => {
117
+ return !!prisoner?.prisonId && ['OUT'].includes(prisoner.prisonId);
118
+ };
119
+ const isTransferring = (prisoner) => {
120
+ return !!prisoner?.prisonId && ['TRN'].includes(prisoner.prisonId);
121
+ };
122
+ function isReleasedOrTransferring(prisoner) {
123
+ return isReleased(prisoner) || isTransferring(prisoner);
118
124
  }
119
125
  function userHasSomeRolesFrom(rolesToCheck, user) {
120
126
  return (rolesToCheck.length === 0 ||
@@ -221,9 +227,9 @@ function baseCheckStatus(user, prisoner) {
221
227
  return exports.PermissionCheckStatus.NOT_PRISON_USER;
222
228
  if (prisoner.restrictedPatient)
223
229
  return restrictedPatientStatus(user, prisoner);
224
- if (prisoner.prisonId === 'OUT')
230
+ if (isReleased(prisoner))
225
231
  return releasedPrisonerStatus(user);
226
- if (prisoner.prisonId === 'TRN')
232
+ if (isTransferring(prisoner))
227
233
  return transferringPrisonerStatus(user);
228
234
  if (inUsersCaseLoad || globalSearchUser)
229
235
  return exports.PermissionCheckStatus.OK;
@@ -259,14 +265,14 @@ exports.PrisonerAdjudicationsPermission = void 0;
259
265
  PrisonerAdjudicationsPermission["read"] = "prisoner:prisoner-adjudications:read";
260
266
  })(exports.PrisonerAdjudicationsPermission || (exports.PrisonerAdjudicationsPermission = {}));
261
267
 
262
- const permission$f = exports.PrisonerAdjudicationsPermission.read;
268
+ const permission$g = exports.PrisonerAdjudicationsPermission.read;
263
269
  function prisonerAdjudicationsReadCheck(request) {
264
270
  const { user, prisoner, baseCheckStatus } = request;
265
271
  const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
266
272
  const check = baseCheckPassed &&
267
273
  (isInUsersCaseLoad(prisoner.prisonId, user) || userHasSomeRolesFrom([exports.Role.PomUser, exports.Role.ReceptionUser], user));
268
274
  if (!check)
269
- logDeniedPermissionCheck(permission$f, request, exports.PermissionCheckStatus.NOT_IN_CASELOAD);
275
+ logDeniedPermissionCheck(permission$g, request, exports.PermissionCheckStatus.NOT_IN_CASELOAD);
270
276
  return check;
271
277
  }
272
278
 
@@ -278,43 +284,64 @@ function prisonerAdjudicationsCheck(request) {
278
284
 
279
285
  exports.PrisonerIncentivesPermission = void 0;
280
286
  (function (PrisonerIncentivesPermission) {
281
- PrisonerIncentivesPermission["read"] = "prisoner:prisoner-incentives:read";
287
+ PrisonerIncentivesPermission["read_incentive_level"] = "prisoner:prisoner-incentives:read_incentive_level";
288
+ PrisonerIncentivesPermission["read_incentive_level_history"] = "prisoner:prisoner-incentives:read_incentive_level_history";
282
289
  })(exports.PrisonerIncentivesPermission || (exports.PrisonerIncentivesPermission = {}));
283
290
 
284
- const permission$e = exports.PrisonerIncentivesPermission.read;
285
- function prisonerIncentivesReadCheck(request) {
286
- const { user, prisoner, baseCheckStatus } = request;
287
- const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
288
- const check = baseCheckPassed && (isInUsersCaseLoad(prisoner.prisonId, user) || userHasRole(exports.Role.GlobalSearch, user));
291
+ const permission$f = exports.PrisonerIncentivesPermission.read_incentive_level_history;
292
+ function incentiveLevelHistoryReadCheck(request) {
293
+ const baseCheckPassed = request.baseCheckStatus === exports.PermissionCheckStatus.OK;
294
+ const incentiveLevelHistoryAccess = checkIncentiveLevelHistoryAccess(request);
295
+ const incentiveLevelHistoryCheckPassed = incentiveLevelHistoryAccess === exports.PermissionCheckStatus.OK;
296
+ const check = baseCheckPassed && incentiveLevelHistoryCheckPassed;
289
297
  if (!check)
290
- logDeniedPermissionCheck(permission$e, request, exports.PermissionCheckStatus.NOT_IN_CASELOAD);
298
+ logDeniedPermissionCheck(permission$f, request, incentiveLevelHistoryAccess);
291
299
  return check;
292
300
  }
301
+ function checkIncentiveLevelHistoryAccess(request) {
302
+ const { user, prisoner } = request;
303
+ // Restricted patients follows the base check rules:
304
+ if (prisoner.restrictedPatient)
305
+ return restrictedPatientStatus(user, prisoner);
306
+ // Released prisoners follows the base check rules:
307
+ if (isReleased(prisoner))
308
+ return releasedPrisonerStatus(user);
309
+ // Transferring prisoner incentive history can only be accessed by users with the Global Search role:
310
+ if (isTransferring(prisoner))
311
+ return userHasSomeRolesFrom([exports.Role.GlobalSearch], user)
312
+ ? exports.PermissionCheckStatus.OK
313
+ : exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING;
314
+ // Global search is not sufficient for incentive level history access:
315
+ return isInUsersCaseLoad(prisoner.prisonId, user) ? exports.PermissionCheckStatus.OK : exports.PermissionCheckStatus.NOT_IN_CASELOAD;
316
+ }
293
317
 
294
318
  function prisonerIncentivesCheck(request) {
295
319
  return {
296
- [exports.PrisonerIncentivesPermission.read]: prisonerIncentivesReadCheck(request),
320
+ [exports.PrisonerIncentivesPermission.read_incentive_level]: baseCheck(exports.PrisonerIncentivesPermission.read_incentive_level, request),
321
+ [exports.PrisonerIncentivesPermission.read_incentive_level_history]: incentiveLevelHistoryReadCheck(request),
297
322
  };
298
323
  }
299
324
 
300
325
  exports.PersonPrisonCategoryPermission = void 0;
301
326
  (function (PersonPrisonCategoryPermission) {
327
+ PersonPrisonCategoryPermission["read"] = "prisoner:person-prison-category:read";
302
328
  PersonPrisonCategoryPermission["edit"] = "prisoner:person-prison-category:edit";
303
329
  })(exports.PersonPrisonCategoryPermission || (exports.PersonPrisonCategoryPermission = {}));
304
330
 
305
- const permission$d = exports.PersonPrisonCategoryPermission.edit;
331
+ const permission$e = exports.PersonPrisonCategoryPermission.edit;
306
332
  function personPrisonCategoryEditCheck(request) {
307
333
  const { user, baseCheckStatus } = request;
308
334
  const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
309
335
  const check = baseCheckPassed &&
310
336
  userHasSomeRolesFrom([exports.Role.CreateCategorisation, exports.Role.CreateRecategorisation, exports.Role.ApproveCategorisation, exports.Role.CategorisationSecurity], user);
311
337
  if (!check)
312
- logDeniedPermissionCheck(permission$d, request, exports.PermissionCheckStatus.ROLE_NOT_PRESENT);
338
+ logDeniedPermissionCheck(permission$e, request, exports.PermissionCheckStatus.ROLE_NOT_PRESENT);
313
339
  return check;
314
340
  }
315
341
 
316
342
  function personPrisonCategoryCheck(request) {
317
343
  return {
344
+ [exports.PersonPrisonCategoryPermission.read]: baseCheck(exports.PersonPrisonCategoryPermission.read, request),
318
345
  [exports.PersonPrisonCategoryPermission.edit]: personPrisonCategoryEditCheck(request),
319
346
  };
320
347
  }
@@ -325,17 +352,17 @@ exports.PrisonerSchedulePermission = void 0;
325
352
  PrisonerSchedulePermission["edit_activity"] = "prisoner:activity:edit";
326
353
  })(exports.PrisonerSchedulePermission || (exports.PrisonerSchedulePermission = {}));
327
354
 
328
- const permission$c = exports.PrisonerSchedulePermission.edit_appointment;
355
+ const permission$d = exports.PrisonerSchedulePermission.edit_appointment;
329
356
  function prisonerAppointmentEditCheck(request) {
330
357
  const { user, prisoner, baseCheckStatus } = request;
331
358
  const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
332
359
  const check = baseCheckPassed && isActiveCaseLoad(prisoner.prisonId, user) && !prisoner.restrictedPatient;
333
360
  if (!check)
334
- logDeniedPermissionCheck(permission$c, request, exports.PermissionCheckStatus.NOT_ACTIVE_CASELOAD);
361
+ logDeniedPermissionCheck(permission$d, request, exports.PermissionCheckStatus.NOT_ACTIVE_CASELOAD);
335
362
  return check;
336
363
  }
337
364
 
338
- const permission$b = exports.PrisonerSchedulePermission.edit_activity;
365
+ const permission$c = exports.PrisonerSchedulePermission.edit_activity;
339
366
  function prisonerActivityEditCheck(request) {
340
367
  const { user, prisoner, baseCheckStatus } = request;
341
368
  const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
@@ -345,7 +372,7 @@ function prisonerActivityEditCheck(request) {
345
372
  isActiveCaseLoad(prisoner.prisonId, user) &&
346
373
  !prisoner.restrictedPatient;
347
374
  if (!check)
348
- logDeniedPermissionCheck(permission$b, request, userHasActivityHubRole ? exports.PermissionCheckStatus.NOT_ACTIVE_CASELOAD : exports.PermissionCheckStatus.ROLE_NOT_PRESENT);
375
+ logDeniedPermissionCheck(permission$c, request, userHasActivityHubRole ? exports.PermissionCheckStatus.NOT_ACTIVE_CASELOAD : exports.PermissionCheckStatus.ROLE_NOT_PRESENT);
349
376
  return check;
350
377
  }
351
378
 
@@ -361,16 +388,16 @@ exports.UseOfForcePermission = void 0;
361
388
  UseOfForcePermission["edit"] = "prisoner:use-of-force:edit";
362
389
  })(exports.UseOfForcePermission || (exports.UseOfForcePermission = {}));
363
390
 
364
- const permission$a = exports.UseOfForcePermission.edit;
391
+ const permission$b = exports.UseOfForcePermission.edit;
365
392
  function useOfForceEditCheck(request) {
366
393
  const { user, prisoner, baseCheckStatus } = request;
367
394
  const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
368
395
  const check = baseCheckPassed &&
369
396
  !prisoner.restrictedPatient &&
370
397
  (isInUsersCaseLoad(prisoner.prisonId, user) ||
371
- (isReleasedOrTransferring(prisoner.prisonId) && userHasRole(exports.Role.InactiveBookings, user)));
398
+ (isReleasedOrTransferring(prisoner) && userHasRole(exports.Role.InactiveBookings, user)));
372
399
  if (!check)
373
- logDeniedPermissionCheck(permission$a, request, exports.PermissionCheckStatus.NOT_IN_CASELOAD);
400
+ logDeniedPermissionCheck(permission$b, request, exports.PermissionCheckStatus.NOT_IN_CASELOAD);
374
401
  return check;
375
402
  }
376
403
 
@@ -385,14 +412,14 @@ exports.PrisonerAlertsPermission = void 0;
385
412
  PrisonerAlertsPermission["edit"] = "prisoner:prisoner-alerts:edit";
386
413
  })(exports.PrisonerAlertsPermission || (exports.PrisonerAlertsPermission = {}));
387
414
 
388
- const permission$9 = exports.PrisonerAlertsPermission.edit;
415
+ const permission$a = exports.PrisonerAlertsPermission.edit;
389
416
  function prisonerAlertsEditCheck(request) {
390
417
  const baseCheckPassed = request.baseCheckStatus === exports.PermissionCheckStatus.OK;
391
418
  const alertsEditCheck = checkAlertsEditAccess(request);
392
419
  const alertsEditCheckPassed = alertsEditCheck === exports.PermissionCheckStatus.OK;
393
420
  const check = baseCheckPassed && alertsEditCheckPassed;
394
421
  if (!check)
395
- logDeniedPermissionCheck(permission$9, request, alertsEditCheck);
422
+ logDeniedPermissionCheck(permission$a, request, alertsEditCheck);
396
423
  return check;
397
424
  }
398
425
  function checkAlertsEditAccess(request) {
@@ -405,11 +432,11 @@ function checkAlertsEditAccess(request) {
405
432
  if (prisoner.restrictedPatient)
406
433
  return restrictedPatientStatus(user, prisoner);
407
434
  // Released prisoners follow base check:
408
- if (prisoner.prisonId === 'OUT')
435
+ if (isReleased(prisoner))
409
436
  return releasedPrisonerStatus(user);
410
437
  // For transferring prisoners, only the Inactive Bookings role is acceptable,
411
438
  // Global Search role is not sufficient:
412
- if (prisoner.prisonId === 'TRN') {
439
+ if (isTransferring(prisoner)) {
413
440
  return userHasRole(exports.Role.InactiveBookings, user)
414
441
  ? exports.PermissionCheckStatus.OK
415
442
  : exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING;
@@ -426,6 +453,30 @@ function prisonerAlertsCheck(request) {
426
453
  };
427
454
  }
428
455
 
456
+ exports.PrisonerSpecificRisksPermission = void 0;
457
+ (function (PrisonerSpecificRisksPermission) {
458
+ PrisonerSpecificRisksPermission["read_csra_rating"] = "prisoner:csra-rating:read";
459
+ PrisonerSpecificRisksPermission["read_csra_assessment_history"] = "prisoner:csra-assessment-history:read";
460
+ })(exports.PrisonerSpecificRisksPermission || (exports.PrisonerSpecificRisksPermission = {}));
461
+
462
+ const permission$9 = exports.PrisonerSpecificRisksPermission.read_csra_assessment_history;
463
+ function csraAssessmentHistoryReadCheck(request) {
464
+ const { user, prisoner } = request;
465
+ const baseCheckPassed = request.baseCheckStatus === exports.PermissionCheckStatus.OK;
466
+ const inUsersCaseLoad = isInUsersCaseLoad(prisoner.prisonId, user);
467
+ const check = baseCheckPassed && (inUsersCaseLoad || (isTransferring(prisoner) && userHasRole(exports.Role.GlobalSearch, user)));
468
+ if (!check)
469
+ logDeniedPermissionCheck(permission$9, request, isTransferring(prisoner) ? exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING : exports.PermissionCheckStatus.NOT_IN_CASELOAD);
470
+ return check;
471
+ }
472
+
473
+ function prisonerSpecificRisksCheck(request) {
474
+ return {
475
+ [exports.PrisonerSpecificRisksPermission.read_csra_rating]: baseCheck(exports.PrisonerSpecificRisksPermission.read_csra_rating, request),
476
+ [exports.PrisonerSpecificRisksPermission.read_csra_assessment_history]: csraAssessmentHistoryReadCheck(request),
477
+ };
478
+ }
479
+
429
480
  function prisonerSpecificCheck(request) {
430
481
  return {
431
482
  prisonerMoney: prisonerMoneyCheck(request),
@@ -435,6 +486,7 @@ function prisonerSpecificCheck(request) {
435
486
  prisonerSchedule: prisonerScheduleCheck(request),
436
487
  useOfForce: useOfForceCheck(request),
437
488
  prisonerAlerts: prisonerAlertsCheck(request),
489
+ prisonerSpecificRisks: prisonerSpecificRisksCheck(request),
438
490
  };
439
491
  }
440
492
 
@@ -468,9 +520,9 @@ function checkLocationDetailsAndHistoryAccess(request) {
468
520
  // Follows the base check:
469
521
  if (prisoner.restrictedPatient)
470
522
  return restrictedPatientStatus(user, prisoner);
471
- if (prisoner.prisonId === 'OUT')
523
+ if (isReleased(prisoner))
472
524
  return releasedPrisonerStatus(user);
473
- if (prisoner.prisonId === 'TRN')
525
+ if (isTransferring(prisoner))
474
526
  return transferringPrisonerStatus(user);
475
527
  if (inUsersCaseLoad)
476
528
  return exports.PermissionCheckStatus.OK;
@@ -551,10 +603,10 @@ function checkCaseNotesAccess(request) {
551
603
  if (prisoner.restrictedPatient)
552
604
  return restrictedPatientStatus(user, prisoner);
553
605
  // Released prisoners follows the base check rules:
554
- if (prisoner.prisonId === 'OUT')
606
+ if (isReleased(prisoner))
555
607
  return releasedPrisonerStatus(user);
556
608
  // Case notes are only accessible for transferring prisoners if the user has the Inactive Bookings role:
557
- if (prisoner.prisonId === 'TRN') {
609
+ if (isTransferring(prisoner)) {
558
610
  return userHasRole(exports.Role.InactiveBookings, user)
559
611
  ? exports.PermissionCheckStatus.OK
560
612
  : exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING;
@@ -688,11 +740,11 @@ function checkPhotoAccess(request) {
688
740
  if (prisoner.restrictedPatient)
689
741
  return restrictedPatientStatus(user, prisoner);
690
742
  // Released prisoners follows the base check rules:
691
- if (prisoner.prisonId === 'OUT')
743
+ if (isReleased(prisoner))
692
744
  return releasedPrisonerStatus(user);
693
745
  // Photos are only accessible for transferring prisoners if the user has the Inactive Bookings role
694
746
  // (Global Search is NOT sufficient):
695
- if (prisoner.prisonId === 'TRN') {
747
+ if (isTransferring(prisoner)) {
696
748
  return userHasRole(exports.Role.InactiveBookings, user)
697
749
  ? exports.PermissionCheckStatus.OK
698
750
  : exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING;
@@ -967,10 +1019,10 @@ function checkProbationDocumentsReadAccess(request) {
967
1019
  if (prisoner.restrictedPatient)
968
1020
  return restrictedPatientStatus(user, prisoner);
969
1021
  // Released prisoners follow the base check rules:
970
- if (prisoner.prisonId === 'OUT')
1022
+ if (isReleased(prisoner))
971
1023
  return releasedPrisonerStatus(user);
972
1024
  // Transferring prisoners follow the base check rules:
973
- if (prisoner.prisonId === 'TRN')
1025
+ if (isTransferring(prisoner))
974
1026
  return transferringPrisonerStatus(user);
975
1027
  if (isInUsersCaseLoad(prisoner.prisonId, user))
976
1028
  return exports.PermissionCheckStatus.OK;
@@ -995,13 +1047,9 @@ exports.PersonInterventionsPermission = void 0;
995
1047
  PersonInterventionsPermission["read_csip"] = "prisoner:csip:read";
996
1048
  })(exports.PersonInterventionsPermission || (exports.PersonInterventionsPermission = {}));
997
1049
 
998
- function csipReadCheck(request) {
999
- return inUsersCaseLoad(exports.PersonInterventionsPermission.read_csip, request);
1000
- }
1001
-
1002
1050
  function personInterventionsCheck(request) {
1003
1051
  return {
1004
- [exports.PersonInterventionsPermission.read_csip]: csipReadCheck(request),
1052
+ [exports.PersonInterventionsPermission.read_csip]: inUsersCaseLoad(exports.PersonInterventionsPermission.read_csip, request),
1005
1053
  };
1006
1054
  }
1007
1055
 
@@ -1100,11 +1148,13 @@ const prisonerMoneyPermissionPaths = {
1100
1148
 
1101
1149
  // eslint-disable-next-line import/prefer-default-export
1102
1150
  const prisonerIncentivesPermissionPaths = {
1103
- [exports.PrisonerIncentivesPermission.read]: `domainGroups.prisonerSpecific.prisonerIncentives.${exports.PrisonerIncentivesPermission.read}`,
1151
+ [exports.PrisonerIncentivesPermission.read_incentive_level]: `domainGroups.prisonerSpecific.prisonerIncentives.${exports.PrisonerIncentivesPermission.read_incentive_level}`,
1152
+ [exports.PrisonerIncentivesPermission.read_incentive_level_history]: `domainGroups.prisonerSpecific.prisonerIncentives.${exports.PrisonerIncentivesPermission.read_incentive_level_history}`,
1104
1153
  };
1105
1154
 
1106
1155
  // eslint-disable-next-line import/prefer-default-export
1107
1156
  const personPrisonCategoryPermissionPaths = {
1157
+ [exports.PersonPrisonCategoryPermission.read]: `domainGroups.prisonerSpecific.personPrisonCategory.${exports.PersonPrisonCategoryPermission.read}`,
1108
1158
  [exports.PersonPrisonCategoryPermission.edit]: `domainGroups.prisonerSpecific.personPrisonCategory.${exports.PersonPrisonCategoryPermission.edit}`,
1109
1159
  };
1110
1160
 
@@ -1124,6 +1174,12 @@ const prisonerAlertsPermissionPaths = {
1124
1174
  [exports.PrisonerAlertsPermission.edit]: `domainGroups.prisonerSpecific.prisonerAlerts.${exports.PrisonerAlertsPermission.edit}`,
1125
1175
  };
1126
1176
 
1177
+ // eslint-disable-next-line import/prefer-default-export
1178
+ const prisonerSpecificRisksPermissionPaths = {
1179
+ [exports.PrisonerSpecificRisksPermission.read_csra_rating]: `domainGroups.prisonerSpecific.prisonerSpecificRisks.${exports.PrisonerSpecificRisksPermission.read_csra_rating}`,
1180
+ [exports.PrisonerSpecificRisksPermission.read_csra_assessment_history]: `domainGroups.prisonerSpecific.prisonerSpecificRisks.${exports.PrisonerSpecificRisksPermission.read_csra_assessment_history}`,
1181
+ };
1182
+
1127
1183
  // eslint-disable-next-line import/prefer-default-export
1128
1184
  const prisonerSpecificDomainPermissionPaths = {
1129
1185
  ...prisonerMoneyPermissionPaths,
@@ -1133,6 +1189,7 @@ const prisonerSpecificDomainPermissionPaths = {
1133
1189
  ...prisonerSchedulePermissionPaths,
1134
1190
  ...useOfForcePermissionPaths,
1135
1191
  ...prisonerAlertsPermissionPaths,
1192
+ ...prisonerSpecificRisksPermissionPaths,
1136
1193
  };
1137
1194
 
1138
1195
  // eslint-disable-next-line import/prefer-default-export
@@ -1374,6 +1431,7 @@ const nunjucksEnums = {
1374
1431
  ...nunjucksEnum({ PrisonerIncentivesPermission: exports.PrisonerIncentivesPermission }),
1375
1432
  ...nunjucksEnum({ PrisonerMoneyPermission: exports.PrisonerMoneyPermission }),
1376
1433
  ...nunjucksEnum({ PrisonerSchedulePermission: exports.PrisonerSchedulePermission }),
1434
+ ...nunjucksEnum({ PrisonerSpecificRisksPermission: exports.PrisonerSpecificRisksPermission }),
1377
1435
  ...nunjucksEnum({ PrisonerVisitsAndVisitorsPermission: exports.PrisonerVisitsAndVisitorsPermission }),
1378
1436
  ...nunjucksEnum({ ProbationDocumentsPermission: exports.ProbationDocumentsPermission }),
1379
1437
  ...nunjucksEnum({ SOCPermission: exports.SOCPermission }),
@@ -1411,6 +1469,7 @@ exports.prisonerPermissionPaths = prisonerPermissionPaths;
1411
1469
  exports.prisonerPermissionsGuard = prisonerPermissionsGuard;
1412
1470
  exports.prisonerSchedulePermissionPaths = prisonerSchedulePermissionPaths;
1413
1471
  exports.prisonerSpecificDomainPermissionPaths = prisonerSpecificDomainPermissionPaths;
1472
+ exports.prisonerSpecificRisksPermissionPaths = prisonerSpecificRisksPermissionPaths;
1414
1473
  exports.prisonerVisitsAndVisitorsPermissionPaths = prisonerVisitsAndVisitorsPermissionPaths;
1415
1474
  exports.probationDocumentsPermissionPaths = probationDocumentsPermissionPaths;
1416
1475
  exports.probationDomainPermissionPaths = probationDomainPermissionPaths;