{"version":3,"file":"index.cjs","sources":["../src/types/internal/permissions/PermissionCheckStatus.ts","../src/services/permissions/PermissionsLogger.ts","../src/data/hmppsPrisonerSearch/PrisonerSearchClient.ts","../src/types/public/permissions/domains/sentenceAndOffence/personSentenceCalculation/PersonSentenceCalculationPermissions.ts","../src/types/internal/user/Role.ts","../src/services/permissions/utils/PermissionUtils.ts","../src/services/permissions/checks/sharedChecks/baseCheckAndUserHasAllRoles/BaseCheckAndUserHasAllRoles.ts","../src/services/permissions/checks/sharedChecks/baseCheckAndUserHasRole/BaseCheckAndUserHasRole.ts","../src/services/permissions/checks/domains/sentenceAndOffence/personSentenceCalculation/sentenceCalculationRead/SentenceCalculationReadCheck.ts","../src/services/permissions/checks/domains/sentenceAndOffence/personSentenceCalculation/sentenceCalculationAdjustmentEdit/SentenceCalculationEditAdjustmentCheck.ts","../src/services/permissions/checks/domains/sentenceAndOffence/personSentenceCalculation/PersonSentenceCalculationCheck.ts","../src/services/permissions/checks/domains/sentenceAndOffence/SentenceAndOffenceCheck.ts","../src/services/permissions/checks/baseCheck/BaseCheck.ts","../src/services/permissions/checks/baseCheck/status/RestrictedPatientStatus.ts","../src/services/permissions/checks/baseCheck/status/ReleasedPrisonerStatus.ts","../src/services/permissions/checks/baseCheck/status/TransferringPrisonerStatus.ts","../src/services/permissions/checks/baseCheck/status/BaseCheckStatus.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyPermissions.ts","../src/services/permissions/checks/sharedChecks/inUsersCaseLoad/InUsersCaseLoad.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerMoney/prisonerMoneyRead/PrisonerMoneyReadCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyCheck.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsPermissions.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerAdjudications/prisonerAdjudicationsRead/PrisonerAdjudicationsReadCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsCheck.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissions.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/prisonerIncentivesRead/PrisonerIncentivesReadCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesCheck.ts","../src/types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissions.ts","../src/services/permissions/checks/domains/prisonerSpecific/personPrisonCategory/personPrisonCategoryEdit/PersonPrisonCategoryEditCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryCheck.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissions.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerSchedule/prisonerAppointmentEdit/PrisonerAppointmentEditCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerSchedule/prisonerActivityEdit/PrisonerActivityEditCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerSchedule/PrisonerScheduleCheck.ts","../src/types/public/permissions/domains/prisonerSpecific/useOfForce/UseOfForcePermissions.ts","../src/services/permissions/checks/domains/prisonerSpecific/useOfForce/useOfForceEdit/UseOfForceEditCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/useOfForce/UseOfForceCheck.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerAlerts/PrisonerAlertsPermissions.ts","../src/services/permissions/checks/domains/prisonerSpecific/personAlerts/prisonerAlertsEdit/PrisonerAlertsEditCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/personAlerts/PrisonerAlertsCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/PrisonerSpecificCheck.ts","../src/types/public/permissions/domains/runningAPrison/prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsPermissions.ts","../src/services/permissions/checks/domains/runningAPrison/prisonerVisitsAndVisitors/prisonerVisitsAndVisitorsRead/PrisonerVisitsAndVisitorsReadCheck.ts","../src/services/permissions/checks/domains/runningAPrison/prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsCheck.ts","../src/services/permissions/checks/domains/runningAPrison/prisonerBaseLocation/locationDetailsAndHistoryRead/LocationDetailsAndHistoryReadCheck.ts","../src/types/public/permissions/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationPermissions.ts","../src/services/permissions/checks/domains/runningAPrison/prisonerBaseLocation/moveCell/MoveCellCheck.ts","../src/services/permissions/checks/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationCheck.ts","../src/services/permissions/checks/domains/runningAPrison/RunningAPrisonCheck.ts","../src/types/public/permissions/domains/person/caseNotes/CaseNotesPermissions.ts","../src/services/permissions/checks/domains/person/caseNotes/CaseNotesReadAndEditCheck.ts","../src/services/permissions/checks/domains/person/caseNotes/caseNotesRead/CaseNotesReadCheck.ts","../src/services/permissions/checks/sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom.ts","../src/services/permissions/checks/domains/person/caseNotes/sensitiveCaseNotesRead/SensitiveCaseNotesReadCheck.ts","../src/services/permissions/checks/domains/person/caseNotes/sensitiveCaseNotesDelete/SensitiveCaseNotesDeleteCheck.ts","../src/services/permissions/checks/domains/person/caseNotes/sensitiveCaseNotesEdit/SensitiveCaseNotesEditCheck.ts","../src/services/permissions/checks/domains/person/caseNotes/caseNotesEdit/CaseNotesEditCheck.ts","../src/services/permissions/checks/domains/person/caseNotes/CaseNotesCheck.ts","../src/types/public/permissions/domains/person/corePersonRecord/CorePersonRecordPermissions.ts","../src/services/permissions/checks/sharedChecks/inActiveCaseLoadAndUserHasSomeRolesFrom/InActiveCaseLoadAndUserHasSomeRolesFrom.ts","../src/services/permissions/checks/sharedChecks/inActiveCaseLoad/InActiveCaseLoad.ts","../src/services/permissions/checks/sharedChecks/prisonerProfileEditCheck/PrisonerProfileEditCheck.ts","../src/services/permissions/checks/sharedChecks/inActiveCaseLoadAndUserHasRole/InActiveCaseLoadAndUserHasRole.ts","../src/services/permissions/checks/sharedChecks/prisonerProfileSensitiveEditCheck/PrisonerProfileSensitiveEditCheck.ts","../src/services/permissions/checks/domains/person/corePersonRecord/photo/PhotoReadCheck.ts","../src/services/permissions/checks/domains/person/corePersonRecord/CorePersonRecordCheck.ts","../src/types/public/permissions/domains/person/personProtectedCharacteristics/PersonProtectedCharacteristicsPermissions.ts","../src/services/permissions/checks/domains/person/personProtectedCharacteristics/PersonProtectedCharacteristicsCheck.ts","../src/types/public/permissions/domains/person/personHealthAndMedication/PersonHealthAndMedicationPermissions.ts","../src/services/permissions/checks/domains/person/personHealthAndMedication/dietEdit/DietEditCheck.ts","../src/services/permissions/checks/domains/person/personHealthAndMedication/PersonHealthAndMedicationCheck.ts","../src/types/public/permissions/domains/person/personalRelationships/PersonalRelationshipsPermissions.ts","../src/services/permissions/checks/sharedChecks/inUsersCaseLoadAndUserHasSomeRolesFrom/InUsersCaseLoadAndUserHasSomeRolesFrom.ts","../src/services/permissions/checks/sharedChecks/inUsersCaseLoadAndUserHasRole/InUsersCaseLoadAndUserHasRole.ts","../src/services/permissions/checks/domains/person/personalRelationships/PersonalRelationshipsCheck.ts","../src/services/permissions/checks/domains/person/PersonCheck.ts","../src/types/public/permissions/domains/security/pathfinder/PathfinderPermissions.ts","../src/services/permissions/checks/domains/security/pathfinder/pathfinderRead/PathfinderReadCheck.ts","../src/services/permissions/checks/domains/security/pathfinder/pathfinderEdit/PathfinderEditCheck.ts","../src/services/permissions/checks/domains/security/pathfinder/PathfinderCheck.ts","../src/types/public/permissions/domains/security/soc/SOCPermissions.ts","../src/services/permissions/checks/domains/security/soc/socRead/SOCReadCheck.ts","../src/services/permissions/checks/domains/security/soc/socEdit/SOCEditCheck.ts","../src/services/permissions/checks/domains/security/soc/SOCCheck.ts","../src/services/permissions/checks/domains/security/SecurityCheck.ts","../src/types/public/permissions/domains/probation/probationDocuments/ProbationDocumentsPermissions.ts","../src/services/permissions/checks/domains/probation/probationDocuments/probationDocumentsRead/ProbationDocumentsReadCheck.ts","../src/services/permissions/checks/domains/probation/probationDocuments/ProbationDocumentsCheck.ts","../src/services/permissions/checks/domains/probation/ProbationCheck.ts","../src/types/public/permissions/domains/interventions/personInterventions/PersonInterventionsPermissions.ts","../src/services/permissions/checks/domains/interventions/personInterventions/csipRead/CSIPReadCheck.ts","../src/services/permissions/checks/domains/interventions/personInterventions/PersonInterventionsCheck.ts","../src/services/permissions/checks/domains/interventions/InterventionsCheck.ts","../src/types/public/permissions/prisoner/PrisonerPermissions.ts","../src/types/public/permissions/domains/personPlanAndNeeds/personCommunicationNeeds/PersonCommunicationNeedsPermissions.ts","../src/services/permissions/checks/domains/personPlanAndNeeds/personCommunicationNeeds/PersonCommunicationNeedsCheck.ts","../src/services/permissions/checks/domains/personPlanAndNeeds/PersonPlanAndNeedsCheck.ts","../src/services/permissions/PermissionsService.ts","../src/types/public/errors/PrisonerPermissionError.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/useOfForce/UseOfForcePermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerAlerts/PrisonerAlertsPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/PrisonerSpecificDomainPermissionPaths.ts","../src/types/public/permissions/domains/sentenceAndOffence/personSentenceCalculation/PersonSentenceCalculationPermissionPaths.ts","../src/types/public/permissions/domains/sentenceAndOffence/SentenceAndOffenceDomainPermissionPaths.ts","../src/types/public/permissions/domains/runningAPrison/prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsPermissionPaths.ts","../src/types/public/permissions/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationPermissionPaths.ts","../src/types/public/permissions/domains/runningAPrison/RunningAPrisonDomainPermissionPaths.ts","../src/types/public/permissions/domains/person/caseNotes/CaseNotesPermissionPaths.ts","../src/types/public/permissions/domains/person/corePersonRecord/CorePersonRecordPermissionPaths.ts","../src/types/public/permissions/domains/person/personProtectedCharacteristics/PersonProtectedCharacteristicsPermissionPaths.ts","../src/types/public/permissions/domains/person/personHealthAndMedication/PersonHealthAndMedicationPermissionPaths.ts","../src/types/public/permissions/domains/person/personalRelationships/PersonalRelationshipsPermissionPaths.ts","../src/types/public/permissions/domains/person/PersonDomainPermissionPaths.ts","../src/types/public/permissions/domains/security/pathfinder/PathfinderPermissionPaths.ts","../src/types/public/permissions/domains/security/soc/SOCPermissionPaths.ts","../src/types/public/permissions/domains/security/SecurityDomainPermissionPaths.ts","../src/types/public/permissions/domains/probation/probationDocuments/ProbationDocumentsPermissionPaths.ts","../src/types/public/permissions/domains/probation/ProbationDomainPermissionPaths.ts","../src/types/public/permissions/domains/interventions/personInterventions/PersonInterventionsPermissionPaths.ts","../src/types/public/permissions/domains/interventions/InterventionsDomainPermissionPaths.ts","../src/types/public/permissions/domains/personPlanAndNeeds/personCommunicationNeeds/PersonCommunicationNeedsPermissionPaths.ts","../src/types/public/permissions/domains/personPlanAndNeeds/PersonPlanAndNeedsDomainPermissionPaths.ts","../src/types/public/permissions/prisoner/PrisonerPermissionPaths.ts","../src/types/public/permissions/prisoner/PrisonerPermissionsUtils.ts","../src/middleware/PrisonerPermissionsGuard.ts","../src/view/SetupNunjucksPermissions.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport enum PermissionCheckStatus {\n  NOT_PERMITTED = 'NOT_PERMITTED', // Generic not permitted status - default\n  NOT_IN_CASELOAD = 'NOT_IN_CASELOAD',\n  NOT_ACTIVE_CASELOAD = 'NOT_ACTIVE_CASELOAD',\n  RESTRICTED_PATIENT = 'RESTRICTED_PATIENT',\n  PRISONER_IS_RELEASED = 'PRISONER_IS_RELEASED',\n  PRISONER_IS_TRANSFERRING = 'PRISONER_IS_TRANSFERRING',\n  ROLE_NOT_PRESENT = 'ROLE_NOT_PRESENT',\n  NOT_PRISON_USER = 'NOT_PRISON_USER',\n  OK = 'OK',\n}\n","import { TelemetryClient } from 'applicationinsights'\nimport type Logger from 'bunyan'\nimport { PermissionCheckStatus } from '../../types/internal/permissions/PermissionCheckStatus'\nimport { HmppsUser } from '../../types/internal/user/HmppsUser'\nimport Prisoner from '../../data/hmppsPrisonerSearch/interfaces/Prisoner'\nimport { PrisonerPermission } from '../../types/public/permissions/prisoner/PrisonerPermissions'\n\nexport default class PermissionsLogger {\n  constructor(\n    private readonly logger: Logger | Console,\n    private readonly telemetryClient?: TelemetryClient,\n  ) {}\n\n  logPermissionCheckStatus(\n    user: HmppsUser,\n    prisoner: Prisoner,\n    permission: PrisonerPermission,\n    permissionCheckStatus: PermissionCheckStatus,\n  ) {\n    if (permissionCheckStatus === PermissionCheckStatus.OK) return\n\n    if (this.telemetryClient) {\n      this.telemetryClient.trackEvent({\n        name: 'prisoner-permission-denied',\n        properties: {\n          username: user.username,\n          prisonerNumber: prisoner.prisonerNumber,\n          activeCaseLoad: user.authSource === 'nomis' && user.activeCaseLoadId,\n          permissionChecked: permission,\n          status: permissionCheckStatus,\n        },\n      })\n    } else {\n      this.logger.info(`Prisoner permission denied: ${permission} (${permissionCheckStatus}) for user ${user.username}`)\n    }\n  }\n}\n","import { RestClient, ApiConfig, AuthenticationClient, asSystem } from '@ministryofjustice/hmpps-rest-client'\nimport type Logger from 'bunyan'\nimport Prisoner from './interfaces/Prisoner'\n\nexport default class PrisonerSearchClient extends RestClient {\n  constructor(logger: Logger | Console, config: ApiConfig, authenticationClient: AuthenticationClient) {\n    super('Prisoner Search', config, logger, authenticationClient)\n  }\n\n  getPrisonerDetails(prisonerNumber: string): Promise<Prisoner> {\n    return this.get<Prisoner>({ path: `/prisoner/${prisonerNumber}` }, asSystem())\n  }\n}\n","export enum PersonSentenceCalculationPermission {\n  read = 'prisoner:person-sentence-calculation:read',\n  edit_adjustments = 'prisoner:person-sentence-calculation:adjustments:edit',\n}\n\nexport type PersonSentenceCalculationPermissions = Record<PersonSentenceCalculationPermission, boolean>\n","// eslint-disable-next-line import/prefer-default-export\nexport enum Role {\n  ActivityHub = 'ROLE_ACTIVITY_HUB',\n  AddSensitiveCaseNotes = 'ROLE_ADD_SENSITIVE_CASE_NOTES',\n  AdjustmentsMaintainer = 'ROLE_ADJUSTMENTS_MAINTAINER',\n  ApproveCategorisation = 'ROLE_APPROVE_CATEGORISATION',\n  CategorisationSecurity = 'ROLE_CATEGORISATION_SECURITY',\n  CellMove = 'ROLE_CELL_MOVE',\n  ContactsAdministrator = 'ROLE_CONTACTS_ADMINISTRATOR',\n  ContactsAuthoriser = 'ROLE_CONTACTS_AUTHORISER',\n  CreateCategorisation = 'ROLE_CREATE_CATEGORISATION',\n  CreateRecategorisation = 'ROLE_CREATE_RECATEGORISATION',\n  DeleteSensitiveCaseNotes = 'ROLE_DELETE_SENSITIVE_CASE_NOTES',\n  DietAndAllergiesEdit = 'ROLE_DIET_AND_FOOD_ALLERGIES_EDIT',\n  GlobalSearch = 'ROLE_GLOBAL_SEARCH',\n  InactiveBookings = 'ROLE_INACTIVE_BOOKINGS',\n  PathfinderApproval = 'ROLE_PF_APPROVAL',\n  PathfinderHQ = 'ROLE_PF_HQ',\n  PathfinderLocalReader = 'ROLE_PF_LOCAL_READER',\n  PathfinderNationalReader = 'ROLE_PF_NATIONAL_READER',\n  PathfinderPolice = 'ROLE_PF_POLICE',\n  PathfinderPsychologist = 'ROLE_PF_PSYCHOLOGIST',\n  PathfinderStdPrison = 'ROLE_PF_STD_PRISON',\n  PathfinderStdProbation = 'ROLE_PF_STD_PROBATION',\n  PathfinderUser = 'ROLE_PF_USER',\n  PomUser = 'ROLE_POM',\n  PrisonerProfilePhotoUpload = 'ROLE_PRISONER_PROFILE_PHOTO_UPLOAD',\n  PrisonerProfileSensitiveEdit = 'ROLE_PRISONER_PROFILE_SENSITIVE_RW',\n  ReceptionUser = 'ROLE_PRISON_RECEPTION',\n  ReleaseDatesCalculator = 'ROLE_RELEASE_DATES_CALCULATOR',\n  SocCommunity = 'ROLE_SOC_COMMUNITY',\n  SocCustody = 'ROLE_SOC_CUSTODY',\n  SocDataAnalyst = 'ROLE_SOC_DATA_ANALYST',\n  SocDataManager = 'ROLE_SOC_DATA_MANAGER',\n  UpdateAlert = 'ROLE_UPDATE_ALERT',\n  ViewProbationDocuments = 'ROLE_VIEW_PROBATION_DOCUMENTS',\n  ViewSensitiveCaseNotes = 'ROLE_VIEW_SENSITIVE_CASE_NOTES',\n}\n","import { HmppsUser } from '../../../types/internal/user/HmppsUser'\nimport { PrisonerPermission } from '../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport { Role } from '../../../types/internal/user/Role'\nimport { PermissionCheckStatus } from '../../../types/internal/permissions/PermissionCheckStatus'\nimport PermissionsCheckRequest from '../checks/PermissionsCheckRequest'\n\nexport function isRequiredPermission(\n  permission: PrisonerPermission,\n  requiredPermissions: PrisonerPermission[],\n): boolean {\n  return requiredPermissions.includes(permission)\n}\n\nexport function logDeniedPermissionCheck(\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n  status: PermissionCheckStatus,\n) {\n  const { user, prisoner, baseCheckStatus, requestDependentOn, permissionsLogger } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n\n  if (isRequiredPermission(permission, requestDependentOn)) {\n    permissionsLogger.logPermissionCheckStatus(user, prisoner, permission, baseCheckPassed ? status : baseCheckStatus)\n  }\n}\n\nexport const isActiveCaseLoad = (prisonId: string | undefined, user: HmppsUser) =>\n  user.authSource === 'nomis' && user.activeCaseLoadId === prisonId\n\nexport function isInUsersCaseLoad(prisonId: string | undefined, user: HmppsUser): boolean {\n  return user.authSource === 'nomis' && user.caseLoads?.some(caseLoad => caseLoad.caseLoadId === prisonId)\n}\n\nexport function isReleasedOrTransferring(prisonId: string | undefined): boolean {\n  return ['OUT', 'TRN'].includes(prisonId as string)\n}\n\nexport function userHasSomeRolesFrom(rolesToCheck: Role[], user: HmppsUser): boolean {\n  return (\n    rolesToCheck.length === 0 ||\n    rolesToCheck.map(normaliseRoleText).some(role => user.userRoles.map(normaliseRoleText).includes(role))\n  )\n}\n\nexport function userHasAllRoles(rolesToCheck: Role[], user: HmppsUser): boolean {\n  return rolesToCheck.map(normaliseRoleText).every(role => user.userRoles.map(normaliseRoleText).includes(role))\n}\n\nexport const userHasRole = (roleToCheck: Role, user: HmppsUser): boolean => {\n  return userHasAllRoles([roleToCheck], user)\n}\n\nconst normaliseRoleText = (role: string): string => role.replace(/ROLE_/, '')\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { logDeniedPermissionCheck, userHasAllRoles } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\n\nexport default function baseCheckAndUserHasAllRoles(\n  roles: Role[],\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  const { user, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const check = baseCheckPassed && userHasAllRoles(roles, user)\n\n  if (!check) logDeniedPermissionCheck(permission, request, PermissionCheckStatus.ROLE_NOT_PRESENT)\n\n  return check\n}\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport baseCheckAndUserHasAllRoles from '../baseCheckAndUserHasAllRoles/BaseCheckAndUserHasAllRoles'\n\nexport default function baseCheckAndUserHasRole(\n  role: Role,\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  return baseCheckAndUserHasAllRoles([role], permission, request)\n}\n","import { PersonSentenceCalculationPermission } from '../../../../../../../types/public/permissions/domains/sentenceAndOffence/personSentenceCalculation/PersonSentenceCalculationPermissions'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport baseCheckAndUserHasRole from '../../../../sharedChecks/baseCheckAndUserHasRole/BaseCheckAndUserHasRole'\n\nexport default function sentenceCalculationReadCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasRole(Role.ReleaseDatesCalculator, PersonSentenceCalculationPermission.read, request)\n}\n","import { PersonSentenceCalculationPermission } from '../../../../../../../types/public/permissions/domains/sentenceAndOffence/personSentenceCalculation/PersonSentenceCalculationPermissions'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport baseCheckAndUserHasRole from '../../../../sharedChecks/baseCheckAndUserHasRole/BaseCheckAndUserHasRole'\n\nexport default function sentenceCalculationEditAdjustmentCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasRole(\n    Role.AdjustmentsMaintainer,\n    PersonSentenceCalculationPermission.edit_adjustments,\n    request,\n  )\n}\n","import {\n  PersonSentenceCalculationPermission,\n  PersonSentenceCalculationPermissions,\n} from '../../../../../../types/public/permissions/domains/sentenceAndOffence/personSentenceCalculation/PersonSentenceCalculationPermissions'\nimport sentenceCalculationReadCheck from './sentenceCalculationRead/SentenceCalculationReadCheck'\nimport PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport sentenceCalculationEditAdjustmentCheck from './sentenceCalculationAdjustmentEdit/SentenceCalculationEditAdjustmentCheck'\n\nexport default function personSentenceCalculationCheck(\n  request: PermissionsCheckRequest,\n): PersonSentenceCalculationPermissions {\n  return {\n    [PersonSentenceCalculationPermission.read]: sentenceCalculationReadCheck(request),\n    [PersonSentenceCalculationPermission.edit_adjustments]: sentenceCalculationEditAdjustmentCheck(request),\n  }\n}\n","import { SentenceAndOffenceDomainPermissions } from '../../../../../types/public/permissions/domains/sentenceAndOffence/SentenceAndOffenceDomainPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport personSentenceCalculationCheck from './personSentenceCalculation/PersonSentenceCalculationCheck'\n\nexport default function sentenceAndOffenceCheck(request: PermissionsCheckRequest): SentenceAndOffenceDomainPermissions {\n  return {\n    personSentenceCalculation: personSentenceCalculationCheck(request),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../types/internal/permissions/PermissionCheckStatus'\nimport { PrisonerPermission } from '../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport { isRequiredPermission } from '../../utils/PermissionUtils'\nimport PermissionsCheckRequest from '../PermissionsCheckRequest'\n\nexport default function baseCheck(permission: PrisonerPermission, request: PermissionsCheckRequest) {\n  const { user, prisoner, baseCheckStatus, requestDependentOn, permissionsLogger } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n\n  if (!baseCheckPassed && isRequiredPermission(permission, requestDependentOn)) {\n    permissionsLogger.logPermissionCheckStatus(user, prisoner, permission, baseCheckStatus)\n  }\n\n  return baseCheckPassed\n}\n","import { HmppsUser } from '../../../../../types/internal/user/HmppsUser'\nimport Prisoner from '../../../../../data/hmppsPrisonerSearch/interfaces/Prisoner'\nimport { isInUsersCaseLoad, userHasRole } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\n\n/*\n * Restricted patients can be accessed in the following circumstances:\n * - The user has the \"Inactive Bookings\" role\n * - The user is a POM user and has the supporting prison ID in their caseloads\n */\nexport default function restrictedPatientStatus(user: HmppsUser, prisoner: Prisoner): PermissionCheckStatus {\n  const pomUser = userHasRole(Role.PomUser, user)\n  const inactiveBookingsUser = userHasRole(Role.InactiveBookings, user)\n\n  const userHasPrisonersSupportingPrisonInTheirCaseLoad = isInUsersCaseLoad(prisoner.supportingPrisonId, user)\n  const userIsPomUserWithSupportingPrisonInTheirCaseLoad = pomUser && userHasPrisonersSupportingPrisonInTheirCaseLoad\n\n  if (userIsPomUserWithSupportingPrisonInTheirCaseLoad) return PermissionCheckStatus.OK\n  if (inactiveBookingsUser) return PermissionCheckStatus.OK\n\n  return PermissionCheckStatus.RESTRICTED_PATIENT\n}\n","import { HmppsUser } from '../../../../../types/internal/user/HmppsUser'\nimport { userHasRole } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\n\n/*\n * Released prisoners can be accessed in the following circumstances:\n * - The user has the \"Inactive Bookings\" role\n */\nexport default function releasedPrisonerStatus(user: HmppsUser): PermissionCheckStatus {\n  const inactiveBookingsUser = userHasRole(Role.InactiveBookings, user)\n\n  if (inactiveBookingsUser) return PermissionCheckStatus.OK\n\n  return PermissionCheckStatus.PRISONER_IS_RELEASED\n}\n","import { HmppsUser } from '../../../../../types/internal/user/HmppsUser'\nimport { userHasRole, userHasSomeRolesFrom } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\n\n/*\n * Transferring prisoners can be accessed in the following circumstances:\n * - The user has the \"Global search\" role\n * - The user has the \"Inactive Bookings\" role\n */\nexport default function transferringPrisonerStatus(user: HmppsUser): PermissionCheckStatus {\n  const inactiveBookingsUser = userHasRole(Role.InactiveBookings, user)\n  const globalSearchUser = userHasSomeRolesFrom([Role.GlobalSearch], user)\n\n  if (globalSearchUser) return PermissionCheckStatus.OK\n  if (inactiveBookingsUser) return PermissionCheckStatus.OK\n\n  return PermissionCheckStatus.PRISONER_IS_TRANSFERRING\n}\n","/*\n * The \"default\" access checks for accessing information about a prisoner.\n *\n * This function can be used for checking what we consider the \"base checks\" for accessing a page on the prisoner profile\n * when no other special cases are given.\n */\nimport { HmppsUser } from '../../../../../types/internal/user/HmppsUser'\nimport Prisoner from '../../../../../data/hmppsPrisonerSearch/interfaces/Prisoner'\nimport { isInUsersCaseLoad, userHasSomeRolesFrom } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport restrictedPatientStatus from './RestrictedPatientStatus'\nimport releasedPrisonerStatus from './ReleasedPrisonerStatus'\nimport transferringPrisonerStatus from './TransferringPrisonerStatus'\n\nexport default function baseCheckStatus(user: HmppsUser, prisoner: Prisoner): PermissionCheckStatus {\n  const inUsersCaseLoad = isInUsersCaseLoad(prisoner.prisonId, user)\n  const globalSearchUser = userHasSomeRolesFrom([Role.GlobalSearch], user)\n\n  if (user.authSource !== 'nomis') return PermissionCheckStatus.NOT_PRISON_USER\n  if (prisoner.restrictedPatient) return restrictedPatientStatus(user, prisoner)\n  if (prisoner.prisonId === 'OUT') return releasedPrisonerStatus(user)\n  if (prisoner.prisonId === 'TRN') return transferringPrisonerStatus(user)\n  if (inUsersCaseLoad || globalSearchUser) return PermissionCheckStatus.OK\n\n  return PermissionCheckStatus.NOT_IN_CASELOAD\n}\n","export enum PrisonerMoneyPermission {\n  read = 'prisoner:prisoner-money:read',\n}\n\nexport type PrisonerMoneyPermissions = Record<PrisonerMoneyPermission, boolean>\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, logDeniedPermissionCheck } from '../../../utils/PermissionUtils'\n\nexport default function inUsersCaseLoad(permission: PrisonerPermission, request: PermissionsCheckRequest) {\n  const { user, prisoner, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const check = baseCheckPassed && isInUsersCaseLoad(prisoner.prisonId, user)\n\n  if (!check) logDeniedPermissionCheck(permission, request, PermissionCheckStatus.NOT_IN_CASELOAD)\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PrisonerMoneyPermission } from '../../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyPermissions'\nimport inUsersCaseLoad from '../../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\n\nexport default function prisonerMoneyReadCheck(request: PermissionsCheckRequest) {\n  return inUsersCaseLoad(PrisonerMoneyPermission.read, request)\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport {\n  PrisonerMoneyPermission,\n  PrisonerMoneyPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyPermissions'\nimport prisonerMoneyReadCheck from './prisonerMoneyRead/PrisonerMoneyReadCheck'\n\nexport default function prisonerMoneyCheck(request: PermissionsCheckRequest): PrisonerMoneyPermissions {\n  return {\n    [PrisonerMoneyPermission.read]: prisonerMoneyReadCheck(request),\n  }\n}\n","export enum PrisonerAdjudicationsPermission {\n  read = 'prisoner:prisoner-adjudications:read',\n}\n\nexport type PrisonerAdjudicationsPermissions = Record<PrisonerAdjudicationsPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, logDeniedPermissionCheck, userHasSomeRolesFrom } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { PrisonerAdjudicationsPermission } from '../../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsPermissions'\n\nconst permission = PrisonerAdjudicationsPermission.read\n\nexport default function prisonerAdjudicationsReadCheck(request: PermissionsCheckRequest) {\n  const { user, prisoner, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const check =\n    baseCheckPassed &&\n    (isInUsersCaseLoad(prisoner.prisonId, user) || userHasSomeRolesFrom([Role.PomUser, Role.ReceptionUser], user))\n\n  if (!check) logDeniedPermissionCheck(permission, request, PermissionCheckStatus.NOT_IN_CASELOAD)\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport prisonerAdjudicationsReadCheck from './prisonerAdjudicationsRead/PrisonerAdjudicationsReadCheck'\nimport {\n  PrisonerAdjudicationsPermission,\n  PrisonerAdjudicationsPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsPermissions'\n\nexport default function prisonerAdjudicationsCheck(request: PermissionsCheckRequest): PrisonerAdjudicationsPermissions {\n  return {\n    [PrisonerAdjudicationsPermission.read]: prisonerAdjudicationsReadCheck(request),\n  }\n}\n","export enum PrisonerIncentivesPermission {\n  read = 'prisoner:prisoner-incentives:read',\n}\n\nexport type PrisonerIncentivesPermissions = Record<PrisonerIncentivesPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, logDeniedPermissionCheck, userHasRole } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { PrisonerIncentivesPermission } from '../../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissions'\n\nconst permission = PrisonerIncentivesPermission.read\n\nexport default function prisonerIncentivesReadCheck(request: PermissionsCheckRequest) {\n  const { user, prisoner, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const check = baseCheckPassed && (isInUsersCaseLoad(prisoner.prisonId, user) || userHasRole(Role.GlobalSearch, user))\n\n  if (!check) logDeniedPermissionCheck(permission, request, PermissionCheckStatus.NOT_IN_CASELOAD)\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport prisonerIncentivesReadCheck from './prisonerIncentivesRead/PrisonerIncentivesReadCheck'\nimport {\n  PrisonerIncentivesPermission,\n  PrisonerIncentivesPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissions'\n\nexport default function prisonerIncentivesCheck(request: PermissionsCheckRequest): PrisonerIncentivesPermissions {\n  return {\n    [PrisonerIncentivesPermission.read]: prisonerIncentivesReadCheck(request),\n  }\n}\n","export enum PersonPrisonCategoryPermission {\n  edit = 'prisoner:person-prison-category:edit',\n}\n\nexport type PersonPrisonCategoryPermissions = Record<PersonPrisonCategoryPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { logDeniedPermissionCheck, userHasSomeRolesFrom } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { PersonPrisonCategoryPermission } from '../../../../../../../types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissions'\n\nconst permission = PersonPrisonCategoryPermission.edit\n\nexport default function personPrisonCategoryEditCheck(request: PermissionsCheckRequest) {\n  const { user, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const check =\n    baseCheckPassed &&\n    userHasSomeRolesFrom(\n      [Role.CreateCategorisation, Role.CreateRecategorisation, Role.ApproveCategorisation, Role.CategorisationSecurity],\n      user,\n    )\n\n  if (!check) logDeniedPermissionCheck(permission, request, PermissionCheckStatus.ROLE_NOT_PRESENT)\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport personPrisonCategoryEditCheck from './personPrisonCategoryEdit/PersonPrisonCategoryEditCheck'\nimport {\n  PersonPrisonCategoryPermission,\n  PersonPrisonCategoryPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissions'\n\nexport default function personPrisonCategoryCheck(request: PermissionsCheckRequest): PersonPrisonCategoryPermissions {\n  return {\n    [PersonPrisonCategoryPermission.edit]: personPrisonCategoryEditCheck(request),\n  }\n}\n","export enum PrisonerSchedulePermission {\n  edit_appointment = 'prisoner:appointment:edit',\n  edit_activity = 'prisoner:activity:edit',\n}\n\nexport type PrisonerSchedulePermissions = Record<PrisonerSchedulePermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isActiveCaseLoad, logDeniedPermissionCheck } from '../../../../../utils/PermissionUtils'\nimport { PrisonerSchedulePermission } from '../../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissions'\n\nconst permission = PrisonerSchedulePermission.edit_appointment\n\nexport default function prisonerAppointmentEditCheck(request: PermissionsCheckRequest) {\n  const { user, prisoner, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const check = baseCheckPassed && isActiveCaseLoad(prisoner.prisonId, user) && !prisoner.restrictedPatient\n\n  if (!check) logDeniedPermissionCheck(permission, request, PermissionCheckStatus.NOT_ACTIVE_CASELOAD)\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isActiveCaseLoad, logDeniedPermissionCheck, userHasRole } from '../../../../../utils/PermissionUtils'\nimport { PrisonerSchedulePermission } from '../../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissions'\nimport { Role } from '../../../../../../../types/internal/user/Role'\n\nconst permission = PrisonerSchedulePermission.edit_activity\n\nexport default function prisonerActivityEditCheck(request: PermissionsCheckRequest) {\n  const { user, prisoner, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const userHasActivityHubRole = userHasRole(Role.ActivityHub, user)\n\n  const check =\n    baseCheckPassed &&\n    userHasActivityHubRole &&\n    isActiveCaseLoad(prisoner.prisonId, user) &&\n    !prisoner.restrictedPatient\n\n  if (!check)\n    logDeniedPermissionCheck(\n      permission,\n      request,\n      userHasActivityHubRole ? PermissionCheckStatus.NOT_ACTIVE_CASELOAD : PermissionCheckStatus.ROLE_NOT_PRESENT,\n    )\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport prisonerAppointmentEditCheck from './prisonerAppointmentEdit/PrisonerAppointmentEditCheck'\nimport {\n  PrisonerSchedulePermission,\n  PrisonerSchedulePermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissions'\nimport prisonerActivityEditCheck from './prisonerActivityEdit/PrisonerActivityEditCheck'\n\nexport default function prisonerScheduleCheck(request: PermissionsCheckRequest): PrisonerSchedulePermissions {\n  return {\n    [PrisonerSchedulePermission.edit_appointment]: prisonerAppointmentEditCheck(request),\n    [PrisonerSchedulePermission.edit_activity]: prisonerActivityEditCheck(request),\n  }\n}\n","export enum UseOfForcePermission {\n  edit = 'prisoner:use-of-force:edit',\n}\n\nexport type UseOfForcePermissions = Record<UseOfForcePermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport {\n  isInUsersCaseLoad,\n  isReleasedOrTransferring,\n  logDeniedPermissionCheck,\n  userHasRole,\n} from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { UseOfForcePermission } from '../../../../../../../types/public/permissions/domains/prisonerSpecific/useOfForce/UseOfForcePermissions'\n\nconst permission = UseOfForcePermission.edit\n\nexport default function useOfForceEditCheck(request: PermissionsCheckRequest) {\n  const { user, prisoner, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const check =\n    baseCheckPassed &&\n    !prisoner.restrictedPatient &&\n    (isInUsersCaseLoad(prisoner.prisonId, user) ||\n      (isReleasedOrTransferring(prisoner.prisonId) && userHasRole(Role.InactiveBookings, user)))\n\n  if (!check) logDeniedPermissionCheck(permission, request, PermissionCheckStatus.NOT_IN_CASELOAD)\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport useOfForceEditCheck from './useOfForceEdit/UseOfForceEditCheck'\nimport {\n  UseOfForcePermission,\n  UseOfForcePermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/useOfForce/UseOfForcePermissions'\n\nexport default function useOfForceCheck(request: PermissionsCheckRequest): UseOfForcePermissions {\n  return {\n    [UseOfForcePermission.edit]: useOfForceEditCheck(request),\n  }\n}\n","export enum PrisonerAlertsPermission {\n  edit = 'prisoner:prisoner-alerts:edit',\n}\n\nexport type PrisonerAlertsPermissions = Record<PrisonerAlertsPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PrisonerAlertsPermission } from '../../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerAlerts/PrisonerAlertsPermissions'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { isInUsersCaseLoad, logDeniedPermissionCheck, userHasRole } from '../../../../../utils/PermissionUtils'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport releasedPrisonerStatus from '../../../../baseCheck/status/ReleasedPrisonerStatus'\nimport restrictedPatientStatus from '../../../../baseCheck/status/RestrictedPatientStatus'\n\nconst permission = PrisonerAlertsPermission.edit\n\nexport default function prisonerAlertsEditCheck(request: PermissionsCheckRequest) {\n  const baseCheckPassed = request.baseCheckStatus === PermissionCheckStatus.OK\n\n  const alertsEditCheck = checkAlertsEditAccess(request)\n  const alertsEditCheckPassed = alertsEditCheck === PermissionCheckStatus.OK\n\n  const check = baseCheckPassed && alertsEditCheckPassed\n\n  if (!check) logDeniedPermissionCheck(permission, request, alertsEditCheck)\n\n  return check\n}\n\nfunction checkAlertsEditAccess(request: PermissionsCheckRequest): PermissionCheckStatus {\n  const { user, prisoner } = request\n  const inUsersCaseLoad = isInUsersCaseLoad(prisoner.prisonId, user)\n\n  // User must have Update Alert role:\n  if (!userHasRole(Role.UpdateAlert, user)) return PermissionCheckStatus.ROLE_NOT_PRESENT\n\n  // Restricted patients follow the base check:\n  if (prisoner.restrictedPatient) return restrictedPatientStatus(user, prisoner)\n\n  // Released prisoners follow base check:\n  if (prisoner.prisonId === 'OUT') return releasedPrisonerStatus(user)\n\n  // For transferring prisoners, only the Inactive Bookings role is acceptable,\n  // Global Search role is not sufficient:\n  if (prisoner.prisonId === 'TRN') {\n    return userHasRole(Role.InactiveBookings, user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.PRISONER_IS_TRANSFERRING\n  }\n\n  if (inUsersCaseLoad) return PermissionCheckStatus.OK\n\n  // Global Search role is not sufficient for prisoners outside of user's caseload:\n  return PermissionCheckStatus.NOT_IN_CASELOAD\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport prisonerAlertsEditCheck from './prisonerAlertsEdit/PrisonerAlertsEditCheck'\nimport {\n  PrisonerAlertsPermission,\n  PrisonerAlertsPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerAlerts/PrisonerAlertsPermissions'\n\nexport default function prisonerAlertsCheck(request: PermissionsCheckRequest): PrisonerAlertsPermissions {\n  return {\n    [PrisonerAlertsPermission.edit]: prisonerAlertsEditCheck(request),\n  }\n}\n","import PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { PrisonerSpecificDomainPermissions } from '../../../../../types/public/permissions/domains/prisonerSpecific/PrisonerSpecificDomainPermissions'\nimport prisonerMoneyCheck from './prisonerMoney/PrisonerMoneyCheck'\nimport prisonerAdjudicationsCheck from './prisonerAdjudications/PrisonerAdjudicationsCheck'\nimport prisonerIncentivesCheck from './prisonerIncentives/PrisonerIncentivesCheck'\nimport personPrisonCategoryCheck from './personPrisonCategory/PersonPrisonCategoryCheck'\nimport prisonerScheduleCheck from './prisonerSchedule/PrisonerScheduleCheck'\nimport useOfForceCheck from './useOfForce/UseOfForceCheck'\nimport prisonerAlertsCheck from './personAlerts/PrisonerAlertsCheck'\n\nexport default function prisonerSpecificCheck(request: PermissionsCheckRequest): PrisonerSpecificDomainPermissions {\n  return {\n    prisonerMoney: prisonerMoneyCheck(request),\n    prisonerAdjudications: prisonerAdjudicationsCheck(request),\n    prisonerIncentives: prisonerIncentivesCheck(request),\n    personPrisonCategory: personPrisonCategoryCheck(request),\n    prisonerSchedule: prisonerScheduleCheck(request),\n    useOfForce: useOfForceCheck(request),\n    prisonerAlerts: prisonerAlertsCheck(request),\n  }\n}\n","export enum PrisonerVisitsAndVisitorsPermission {\n  read = 'prisoner:prisoner-visits-and-visitors:read',\n}\n\nexport type PrisonerVisitsAndVisitorsPermissions = Record<PrisonerVisitsAndVisitorsPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport inUsersCaseLoad from '../../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\nimport { PrisonerVisitsAndVisitorsPermission } from '../../../../../../../types/public/permissions/domains/runningAPrison/prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsPermissions'\n\nexport default function prisonerVisitsAndVisitorsReadCheck(request: PermissionsCheckRequest) {\n  return inUsersCaseLoad(PrisonerVisitsAndVisitorsPermission.read, request)\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport prisonerVisitsAndVisitorsReadCheck from './prisonerVisitsAndVisitorsRead/PrisonerVisitsAndVisitorsReadCheck'\nimport {\n  PrisonerVisitsAndVisitorsPermission,\n  PrisonerVisitsAndVisitorsPermissions,\n} from '../../../../../../types/public/permissions/domains/runningAPrison/prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsPermissions'\n\nexport default function prisonerVisitsAndVisitorsCheck(\n  request: PermissionsCheckRequest,\n): PrisonerVisitsAndVisitorsPermissions {\n  return {\n    [PrisonerVisitsAndVisitorsPermission.read]: prisonerVisitsAndVisitorsReadCheck(request),\n  }\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, logDeniedPermissionCheck } from '../../../../../utils/PermissionUtils'\nimport { PrisonerPermission } from '../../../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport restrictedPatientStatus from '../../../../baseCheck/status/RestrictedPatientStatus'\nimport releasedPrisonerStatus from '../../../../baseCheck/status/ReleasedPrisonerStatus'\nimport transferringPrisonerStatus from '../../../../baseCheck/status/TransferringPrisonerStatus'\n\nexport default function locationDetailsAndHistoryReadCheck(\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  const baseCheckPassed = request.baseCheckStatus === PermissionCheckStatus.OK\n\n  const locationDetailsAndHistoryCheckStatus = checkLocationDetailsAndHistoryAccess(request)\n  const locationDetailsAndHistoryCheckPassed = locationDetailsAndHistoryCheckStatus === PermissionCheckStatus.OK\n\n  const check = baseCheckPassed && locationDetailsAndHistoryCheckPassed\n\n  if (!check) logDeniedPermissionCheck(permission, request, locationDetailsAndHistoryCheckStatus)\n\n  return check\n}\n\nexport function checkLocationDetailsAndHistoryAccess(request: PermissionsCheckRequest) {\n  const { user, prisoner } = request\n  const inUsersCaseLoad = isInUsersCaseLoad(prisoner.prisonId, user)\n\n  // Follows the base check:\n  if (prisoner.restrictedPatient) return restrictedPatientStatus(user, prisoner)\n  if (prisoner.prisonId === 'OUT') return releasedPrisonerStatus(user)\n  if (prisoner.prisonId === 'TRN') return transferringPrisonerStatus(user)\n\n  if (inUsersCaseLoad) return PermissionCheckStatus.OK\n\n  // Global Search access not allowed:\n  return PermissionCheckStatus.NOT_IN_CASELOAD\n}\n","export enum PrisonerBaseLocationPermission {\n  read_location_details = 'prisoner:location-details:read',\n  read_location_history = 'prisoner:location-history:read',\n  move_cell = 'prisoner:location-cell:edit',\n}\n\nexport type PrisonerBaseLocationPermissions = Record<PrisonerBaseLocationPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { logDeniedPermissionCheck, userHasRole } from '../../../../../utils/PermissionUtils'\nimport { checkLocationDetailsAndHistoryAccess } from '../locationDetailsAndHistoryRead/LocationDetailsAndHistoryReadCheck'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { PrisonerBaseLocationPermission } from '../../../../../../../types/public/permissions/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationPermissions'\n\nconst permission = PrisonerBaseLocationPermission.move_cell\n\nexport default function moveCellCheck(request: PermissionsCheckRequest) {\n  const baseCheckPassed = request.baseCheckStatus === PermissionCheckStatus.OK\n\n  const hasCellMoveRole = userHasRole(Role.CellMove, request.user)\n  const locationDetailsAndHistoryCheckStatus = checkLocationDetailsAndHistoryAccess(request)\n  const locationDetailsAndHistoryCheckPassed = locationDetailsAndHistoryCheckStatus === PermissionCheckStatus.OK\n\n  const check = baseCheckPassed && hasCellMoveRole && locationDetailsAndHistoryCheckPassed\n\n  if (!check)\n    logDeniedPermissionCheck(\n      permission,\n      request,\n      hasCellMoveRole ? locationDetailsAndHistoryCheckStatus : PermissionCheckStatus.ROLE_NOT_PRESENT,\n    )\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport moveCellCheck from './moveCell/MoveCellCheck'\nimport {\n  PrisonerBaseLocationPermission,\n  PrisonerBaseLocationPermissions,\n} from '../../../../../../types/public/permissions/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationPermissions'\nimport locationDetailsAndHistoryReadCheck from './locationDetailsAndHistoryRead/LocationDetailsAndHistoryReadCheck'\n\nexport default function prisonerBaseLocationCheck(request: PermissionsCheckRequest): PrisonerBaseLocationPermissions {\n  return {\n    [PrisonerBaseLocationPermission.read_location_details]: locationDetailsAndHistoryReadCheck(\n      PrisonerBaseLocationPermission.read_location_details,\n      request,\n    ),\n    [PrisonerBaseLocationPermission.read_location_history]: locationDetailsAndHistoryReadCheck(\n      PrisonerBaseLocationPermission.read_location_history,\n      request,\n    ),\n\n    [PrisonerBaseLocationPermission.move_cell]: moveCellCheck(request),\n  }\n}\n","import PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { RunningAPrisonDomainPermissions } from '../../../../../types/public/permissions/domains/runningAPrison/RunningAPrisonDomainPermissions'\nimport prisonerVisitsAndVisitorsCheck from './prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsCheck'\nimport prisonerBaseLocationCheck from './prisonerBaseLocation/PrisonerBaseLocationCheck'\n\nexport default function runningAPrisonCheck(request: PermissionsCheckRequest): RunningAPrisonDomainPermissions {\n  return {\n    prisonerVisitsAndVisitors: prisonerVisitsAndVisitorsCheck(request),\n    prisonerBaseLocation: prisonerBaseLocationCheck(request),\n  }\n}\n","export enum CaseNotesPermission {\n  read = 'prisoner:case-notes:read',\n  edit = 'prisoner:case-notes:edit',\n  read_sensitive = 'prisoner:case-notes:sensitive:read',\n  delete_sensitive = 'prisoner:case-notes:sensitive:delete',\n  edit_sensitive = 'prisoner:case-notes:sensitive:edit',\n}\n\nexport type CaseNotesPermissions = Record<CaseNotesPermission, boolean>\n","import { CaseNotesPermission } from '../../../../../../types/public/permissions/domains/person/caseNotes/CaseNotesPermissions'\nimport { PermissionCheckStatus } from '../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport {\n  isInUsersCaseLoad,\n  logDeniedPermissionCheck,\n  userHasAllRoles,\n  userHasRole,\n} from '../../../../utils/PermissionUtils'\nimport restrictedPatientStatus from '../../../baseCheck/status/RestrictedPatientStatus'\nimport releasedPrisonerStatus from '../../../baseCheck/status/ReleasedPrisonerStatus'\nimport { Role } from '../../../../../../types/internal/user/Role'\n\nexport default function caseNotesReadAndEditCheck(permission: CaseNotesPermission, request: PermissionsCheckRequest) {\n  const baseCheckPassed = request.baseCheckStatus === PermissionCheckStatus.OK\n\n  const caseNotesCheckStatus = checkCaseNotesAccess(request)\n  const caseNotesCheckPassed = caseNotesCheckStatus === PermissionCheckStatus.OK\n\n  const check = baseCheckPassed && caseNotesCheckPassed\n\n  if (!check) logDeniedPermissionCheck(permission, request, caseNotesCheckStatus)\n\n  return check\n}\n\nfunction checkCaseNotesAccess(request: PermissionsCheckRequest): PermissionCheckStatus {\n  const { user, prisoner } = request\n\n  // Restricted patients follows the base check rules:\n  if (prisoner.restrictedPatient) return restrictedPatientStatus(user, prisoner)\n\n  // Released prisoners follows the base check rules:\n  if (prisoner.prisonId === 'OUT') return releasedPrisonerStatus(user)\n\n  // Case notes are only accessible for transferring prisoners if the user has the Inactive Bookings role:\n  if (prisoner.prisonId === 'TRN') {\n    return userHasRole(Role.InactiveBookings, user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.PRISONER_IS_TRANSFERRING\n  }\n\n  // Case notes are accessible if the prisoner's prison is in the user's caseload:\n  if (isInUsersCaseLoad(prisoner.prisonId, user)) return PermissionCheckStatus.OK\n\n  // Case notes for prisoners outside the user's caseload are only accessible with both Global Search and POM roles:\n  return userHasAllRoles([Role.GlobalSearch, Role.PomUser], user)\n    ? PermissionCheckStatus.OK\n    : PermissionCheckStatus.ROLE_NOT_PRESENT\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { CaseNotesPermission } from '../../../../../../../types/public/permissions/domains/person/caseNotes/CaseNotesPermissions'\nimport caseNotesReadAndEditCheck from '../CaseNotesReadAndEditCheck'\n\nconst permission = CaseNotesPermission.read\n\nexport default function caseNotesReadCheck(request: PermissionsCheckRequest) {\n  return caseNotesReadAndEditCheck(permission, request)\n}\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { logDeniedPermissionCheck, userHasSomeRolesFrom } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\n\nexport default function baseCheckAndUserHasSomeRolesFrom(\n  roles: Role[],\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  const { user, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const check = baseCheckPassed && userHasSomeRolesFrom(roles, user)\n\n  if (!check) logDeniedPermissionCheck(permission, request, PermissionCheckStatus.ROLE_NOT_PRESENT)\n\n  return check\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { CaseNotesPermission } from '../../../../../../../types/public/permissions/domains/person/caseNotes/CaseNotesPermissions'\nimport baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\n\nconst permission = CaseNotesPermission.read_sensitive\n\nexport default function sensitiveCaseNotesReadCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasSomeRolesFrom(\n    [Role.PomUser, Role.ViewSensitiveCaseNotes, Role.AddSensitiveCaseNotes],\n    permission,\n    request,\n  )\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { CaseNotesPermission } from '../../../../../../../types/public/permissions/domains/person/caseNotes/CaseNotesPermissions'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport baseCheckAndUserHasRole from '../../../../sharedChecks/baseCheckAndUserHasRole/BaseCheckAndUserHasRole'\n\nconst permission = CaseNotesPermission.delete_sensitive\n\nexport default function sensitiveCaseNotesDeleteCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasRole(Role.DeleteSensitiveCaseNotes, permission, request)\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { CaseNotesPermission } from '../../../../../../../types/public/permissions/domains/person/caseNotes/CaseNotesPermissions'\nimport baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\n\nconst permission = CaseNotesPermission.edit_sensitive\n\nexport default function sensitiveCaseNotesEditCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasSomeRolesFrom([Role.PomUser, Role.AddSensitiveCaseNotes], permission, request)\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { CaseNotesPermission } from '../../../../../../../types/public/permissions/domains/person/caseNotes/CaseNotesPermissions'\nimport caseNotesReadAndEditCheck from '../CaseNotesReadAndEditCheck'\n\nconst permission = CaseNotesPermission.edit\n\nexport default function caseNotesEditCheck(request: PermissionsCheckRequest) {\n  return caseNotesReadAndEditCheck(permission, request)\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport caseNotesReadCheck from './caseNotesRead/CaseNotesReadCheck'\nimport {\n  CaseNotesPermission,\n  CaseNotesPermissions,\n} from '../../../../../../types/public/permissions/domains/person/caseNotes/CaseNotesPermissions'\nimport sensitiveCaseNotesReadCheck from './sensitiveCaseNotesRead/SensitiveCaseNotesReadCheck'\nimport sensitiveCaseNotesDeleteCheck from './sensitiveCaseNotesDelete/SensitiveCaseNotesDeleteCheck'\nimport sensitiveCaseNotesEditCheck from './sensitiveCaseNotesEdit/SensitiveCaseNotesEditCheck'\nimport caseNotesEditCheck from './caseNotesEdit/CaseNotesEditCheck'\n\nexport default function caseNotesCheck(request: PermissionsCheckRequest): CaseNotesPermissions {\n  return {\n    [CaseNotesPermission.read]: caseNotesReadCheck(request),\n    [CaseNotesPermission.edit]: caseNotesEditCheck(request),\n    [CaseNotesPermission.read_sensitive]: sensitiveCaseNotesReadCheck(request),\n    [CaseNotesPermission.delete_sensitive]: sensitiveCaseNotesDeleteCheck(request),\n    [CaseNotesPermission.edit_sensitive]: sensitiveCaseNotesEditCheck(request),\n  }\n}\n","export enum CorePersonRecordPermission {\n  read_physical_characteristics = 'prisoner:physical_characteristics:read',\n  edit_physical_characteristics = 'prisoner:physical_characteristics:edit',\n\n  read_photo = 'prisoner:photo:read',\n  edit_photo = 'prisoner:photo:edit',\n\n  read_place_of_birth = 'prisoner:place-of-birth:read',\n  edit_place_of_birth = 'prisoner:place-of-birth:edit',\n\n  read_military_history = 'prisoner:military-history:read',\n  edit_military_history = 'prisoner:military-history:edit',\n\n  read_name_and_aliases = 'prisoner:name-and-aliases:read',\n  edit_name_and_aliases = 'prisoner:name-and-aliases:edit',\n\n  read_date_of_birth = 'prisoner:date-of-birth:read',\n  edit_date_of_birth = 'prisoner:date-of-birth:edit',\n\n  // (Prisoner's address)\n  read_address = 'prisoner:address:read',\n  edit_address = 'prisoner:address:edit',\n\n  read_nationality = 'prisoner:nationality:read',\n  edit_nationality = 'prisoner:nationality:edit',\n\n  // (Such as PNC / CRO / NI number...)\n  read_identifiers = 'prisoner:identifiers:read',\n  edit_identifiers = 'prisoner:identifiers:edit',\n\n  read_phone_numbers = 'prisoner:phone-numbers:read',\n  edit_phone_numbers = 'prisoner:phone-numbers:edit',\n\n  read_email_addresses = 'prisoner:email-addresses:read',\n  edit_email_addresses = 'prisoner:email-addresses:edit',\n\n  read_distinguishing_marks = 'prisoner:distinguishing-marks:read',\n  edit_distinguishing_marks = 'prisoner:distinguishing-marks:edit',\n}\n\nexport type CorePersonRecordPermissions = Record<CorePersonRecordPermission, boolean>\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isActiveCaseLoad, logDeniedPermissionCheck, userHasSomeRolesFrom } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\n\nexport default function inActiveCaseLoadAndUserHasSomeRolesFrom(\n  roles: Role[],\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  const { user, prisoner, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const inActiveCaseLoad = isActiveCaseLoad(prisoner.prisonId, user)\n  const hasRole = userHasSomeRolesFrom(roles, user)\n\n  const check = baseCheckPassed && inActiveCaseLoad && hasRole\n\n  if (!check)\n    logDeniedPermissionCheck(\n      permission,\n      request,\n      inActiveCaseLoad ? PermissionCheckStatus.ROLE_NOT_PRESENT : PermissionCheckStatus.NOT_ACTIVE_CASELOAD,\n    )\n\n  return check\n}\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport inActiveCaseLoadAndUserHasSomeRolesFrom from '../inActiveCaseLoadAndUserHasSomeRolesFrom/InActiveCaseLoadAndUserHasSomeRolesFrom'\n\nexport default function inActiveCaseLoad(permission: PrisonerPermission, request: PermissionsCheckRequest) {\n  return inActiveCaseLoadAndUserHasSomeRolesFrom([], permission, request)\n}\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport inActiveCaseLoad from '../inActiveCaseLoad/InActiveCaseLoad'\n\nexport default function prisonerProfileEditCheck(permission: PrisonerPermission, request: PermissionsCheckRequest) {\n  return inActiveCaseLoad(permission, request)\n}\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport inActiveCaseLoadAndUserHasSomeRolesFrom from '../inActiveCaseLoadAndUserHasSomeRolesFrom/InActiveCaseLoadAndUserHasSomeRolesFrom'\n\nexport default function inActiveCaseLoadAndUserHasRole(\n  role: Role,\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  return inActiveCaseLoadAndUserHasSomeRolesFrom([role], permission, request)\n}\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport inActiveCaseLoadAndUserHasRole from '../inActiveCaseLoadAndUserHasRole/InActiveCaseLoadAndUserHasRole'\n\nexport default function prisonerProfileSensitiveEditCheck(\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  return inActiveCaseLoadAndUserHasRole(Role.PrisonerProfileSensitiveEdit, permission, request)\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, logDeniedPermissionCheck, userHasRole } from '../../../../../utils/PermissionUtils'\nimport restrictedPatientStatus from '../../../../baseCheck/status/RestrictedPatientStatus'\nimport releasedPrisonerStatus from '../../../../baseCheck/status/ReleasedPrisonerStatus'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { CorePersonRecordPermission } from '../../../../../../../types/public/permissions/domains/person/corePersonRecord/CorePersonRecordPermissions'\n\nconst permission = CorePersonRecordPermission.read_photo\n\nexport default function photoReadCheck(request: PermissionsCheckRequest) {\n  const baseCheckPassed = request.baseCheckStatus === PermissionCheckStatus.OK\n\n  const photoCheckStatus = checkPhotoAccess(request)\n  const photoCheckPassed = photoCheckStatus === PermissionCheckStatus.OK\n\n  const check = baseCheckPassed && photoCheckPassed\n\n  if (!check) logDeniedPermissionCheck(permission, request, photoCheckStatus)\n\n  return check\n}\n\nfunction checkPhotoAccess(request: PermissionsCheckRequest): PermissionCheckStatus {\n  const { user, prisoner } = request\n\n  // Restricted patients follows the base check rules:\n  if (prisoner.restrictedPatient) return restrictedPatientStatus(user, prisoner)\n\n  // Released prisoners follows the base check rules:\n  if (prisoner.prisonId === 'OUT') return releasedPrisonerStatus(user)\n\n  // Photos are only accessible for transferring prisoners if the user has the Inactive Bookings role\n  // (Global Search is NOT sufficient):\n  if (prisoner.prisonId === 'TRN') {\n    return userHasRole(Role.InactiveBookings, user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.PRISONER_IS_TRANSFERRING\n  }\n\n  // Global search does NOT permit access to photo:\n  return isInUsersCaseLoad(prisoner.prisonId, user) ? PermissionCheckStatus.OK : PermissionCheckStatus.NOT_IN_CASELOAD\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport {\n  CorePersonRecordPermission,\n  CorePersonRecordPermissions,\n} from '../../../../../../types/public/permissions/domains/person/corePersonRecord/CorePersonRecordPermissions'\nimport baseCheck from '../../../baseCheck/BaseCheck'\nimport prisonerProfileEditCheck from '../../../sharedChecks/prisonerProfileEditCheck/PrisonerProfileEditCheck'\nimport prisonerProfileSensitiveEditCheck from '../../../sharedChecks/prisonerProfileSensitiveEditCheck/PrisonerProfileSensitiveEditCheck'\nimport photoReadCheck from './photo/PhotoReadCheck'\nimport { Role } from '../../../../../../types/internal/user/Role'\nimport inActiveCaseLoadAndUserHasSomeRolesFrom from '../../../sharedChecks/inActiveCaseLoadAndUserHasSomeRolesFrom/InActiveCaseLoadAndUserHasSomeRolesFrom'\n\nexport default function corePersonRecordCheck(request: PermissionsCheckRequest): CorePersonRecordPermissions {\n  return {\n    [CorePersonRecordPermission.read_photo]: photoReadCheck(request),\n    [CorePersonRecordPermission.edit_photo]: inActiveCaseLoadAndUserHasSomeRolesFrom(\n      [Role.PrisonerProfileSensitiveEdit, Role.PrisonerProfilePhotoUpload],\n      CorePersonRecordPermission.edit_photo,\n      request,\n    ),\n\n    ...readCheck(CorePersonRecordPermission.read_physical_characteristics, request),\n    ...editCheck(CorePersonRecordPermission.edit_physical_characteristics, request),\n\n    ...readCheck(CorePersonRecordPermission.read_place_of_birth, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_place_of_birth, request),\n\n    ...readCheck(CorePersonRecordPermission.read_military_history, request),\n    ...editCheck(CorePersonRecordPermission.edit_military_history, request),\n\n    ...readCheck(CorePersonRecordPermission.read_name_and_aliases, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_name_and_aliases, request),\n\n    ...readCheck(CorePersonRecordPermission.read_date_of_birth, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_date_of_birth, request),\n\n    ...readCheck(CorePersonRecordPermission.read_address, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_address, request),\n\n    ...readCheck(CorePersonRecordPermission.read_nationality, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_nationality, request),\n\n    ...readCheck(CorePersonRecordPermission.read_identifiers, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_identifiers, request),\n\n    ...readCheck(CorePersonRecordPermission.read_phone_numbers, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_phone_numbers, request),\n\n    ...readCheck(CorePersonRecordPermission.read_email_addresses, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_email_addresses, request),\n\n    ...readCheck(CorePersonRecordPermission.read_distinguishing_marks, request),\n    ...sensitiveEditCheck(CorePersonRecordPermission.edit_distinguishing_marks, request),\n  }\n}\n\nfunction readCheck<P extends keyof CorePersonRecordPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<CorePersonRecordPermissions, P> {\n  return { [permission]: baseCheck(permission, request) } as Pick<CorePersonRecordPermissions, P>\n}\n\nfunction editCheck<P extends keyof CorePersonRecordPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<CorePersonRecordPermissions, P> {\n  return { [permission]: prisonerProfileEditCheck(permission, request) } as Pick<CorePersonRecordPermissions, P>\n}\n\nfunction sensitiveEditCheck<P extends keyof CorePersonRecordPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<CorePersonRecordPermissions, P> {\n  return { [permission]: prisonerProfileSensitiveEditCheck(permission, request) } as Pick<\n    CorePersonRecordPermissions,\n    P\n  >\n}\n","export enum PersonProtectedCharacteristicsPermission {\n  read_sexual_orientation = 'prisoner:sexual-orientation:read',\n  edit_sexual_orientation = 'prisoner:sexual-orientation:edit',\n\n  read_religion_and_belief = 'prisoner:religion-and-belief:read',\n  edit_religion_and_belief = 'prisoner:religion-and-belief:edit',\n\n  read_ethnicity = 'prisoner:ethnicity:read',\n  edit_ethnicity = 'prisoner:ethnicity:edit',\n}\n\nexport type PersonProtectedCharacteristicsPermissions = Record<PersonProtectedCharacteristicsPermission, boolean>\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport baseCheck from '../../../baseCheck/BaseCheck'\nimport prisonerProfileEditCheck from '../../../sharedChecks/prisonerProfileEditCheck/PrisonerProfileEditCheck'\nimport {\n  PersonProtectedCharacteristicsPermission,\n  PersonProtectedCharacteristicsPermissions,\n} from '../../../../../../types/public/permissions/domains/person/personProtectedCharacteristics/PersonProtectedCharacteristicsPermissions'\nimport prisonerProfileSensitiveEditCheck from '../../../sharedChecks/prisonerProfileSensitiveEditCheck/PrisonerProfileSensitiveEditCheck'\n\nexport default function personProtectedCharacteristicsCheck(\n  request: PermissionsCheckRequest,\n): PersonProtectedCharacteristicsPermissions {\n  return {\n    ...readCheck(PersonProtectedCharacteristicsPermission.read_sexual_orientation, request),\n    ...sensitiveEditCheck(PersonProtectedCharacteristicsPermission.edit_sexual_orientation, request),\n\n    ...readCheck(PersonProtectedCharacteristicsPermission.read_religion_and_belief, request),\n    ...editCheck(PersonProtectedCharacteristicsPermission.edit_religion_and_belief, request),\n\n    ...readCheck(PersonProtectedCharacteristicsPermission.read_ethnicity, request),\n    ...sensitiveEditCheck(PersonProtectedCharacteristicsPermission.edit_ethnicity, request),\n  }\n}\n\nfunction readCheck<P extends keyof PersonProtectedCharacteristicsPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonProtectedCharacteristicsPermissions, P> {\n  return { [permission]: baseCheck(permission, request) } as Pick<PersonProtectedCharacteristicsPermissions, P>\n}\n\nfunction editCheck<P extends keyof PersonProtectedCharacteristicsPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonProtectedCharacteristicsPermissions, P> {\n  return { [permission]: prisonerProfileEditCheck(permission, request) } as Pick<\n    PersonProtectedCharacteristicsPermissions,\n    P\n  >\n}\n\nfunction sensitiveEditCheck<P extends keyof PersonProtectedCharacteristicsPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonProtectedCharacteristicsPermissions, P> {\n  return { [permission]: prisonerProfileSensitiveEditCheck(permission, request) } as Pick<\n    PersonProtectedCharacteristicsPermissions,\n    P\n  >\n}\n","export enum PersonHealthAndMedicationPermission {\n  read_pregnancy = 'prisoner:pregnancy:read',\n  edit_pregnancy = 'prisoner:pregnancy:edit',\n\n  read_diet = 'prisoner:diet:read',\n  edit_diet = 'prisoner:diet:edit',\n\n  read_smoker = 'prisoner:smoker:read',\n  edit_smoker = 'prisoner:smoker:edit',\n}\n\nexport type PersonHealthAndMedicationPermissions = Record<PersonHealthAndMedicationPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PersonHealthAndMedicationPermission } from '../../../../../../../types/public/permissions/domains/person/personHealthAndMedication/PersonHealthAndMedicationPermissions'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport inActiveCaseLoadAndUserHasRole from '../../../../sharedChecks/inActiveCaseLoadAndUserHasRole/InActiveCaseLoadAndUserHasRole'\n\nconst permission = PersonHealthAndMedicationPermission.edit_diet\n\nexport default function dietEditCheck(request: PermissionsCheckRequest) {\n  return inActiveCaseLoadAndUserHasRole(Role.DietAndAllergiesEdit, permission, request)\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport baseCheck from '../../../baseCheck/BaseCheck'\nimport prisonerProfileEditCheck from '../../../sharedChecks/prisonerProfileEditCheck/PrisonerProfileEditCheck'\nimport {\n  PersonHealthAndMedicationPermission,\n  PersonHealthAndMedicationPermissions,\n} from '../../../../../../types/public/permissions/domains/person/personHealthAndMedication/PersonHealthAndMedicationPermissions'\nimport dietEditCheck from './dietEdit/DietEditCheck'\n\nexport default function personHealthAndMedicationCheck(\n  request: PermissionsCheckRequest,\n): PersonHealthAndMedicationPermissions {\n  return {\n    ...readCheck(PersonHealthAndMedicationPermission.read_pregnancy, request),\n    ...editCheck(PersonHealthAndMedicationPermission.edit_pregnancy, request),\n\n    ...readCheck(PersonHealthAndMedicationPermission.read_smoker, request),\n    ...editCheck(PersonHealthAndMedicationPermission.edit_smoker, request),\n\n    ...readCheck(PersonHealthAndMedicationPermission.read_diet, request),\n    [PersonHealthAndMedicationPermission.edit_diet]: dietEditCheck(request),\n  }\n}\n\nfunction readCheck<P extends keyof PersonHealthAndMedicationPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonHealthAndMedicationPermissions, P> {\n  return { [permission]: baseCheck(permission, request) } as Pick<PersonHealthAndMedicationPermissions, P>\n}\n\nfunction editCheck<P extends keyof PersonHealthAndMedicationPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonHealthAndMedicationPermissions, P> {\n  return { [permission]: prisonerProfileEditCheck(permission, request) } as Pick<\n    PersonHealthAndMedicationPermissions,\n    P\n  >\n}\n","export enum PersonalRelationshipsPermission {\n  read_number_of_children = 'prisoner:number-of-children:read',\n  edit_number_of_children = 'prisoner:number-of-children:edit',\n\n  read_domestic_status = 'prisoner:domestic-status:read',\n  edit_domestic_status = 'prisoner:domestic-status:edit',\n\n  // Next of kin & emergency contacts (via prisoner profile)\n  // This needs a review once both the contacts service and the\n  // profile edit have been rolled out wider:\n  read_emergency_contacts = 'prisoner:emergency-contacts:read',\n  edit_emergency_contacts = 'prisoner:emergency-contacts:edit',\n\n  // All social and official contacts:\n  read_contacts = 'prisoner:contacts:read',\n  edit_contacts = 'prisoner:contacts:edit',\n  edit_contact_restrictions = 'prisoner:contact-restrictions:edit',\n  edit_contact_visit_approval = 'prisoner:contact-visit-approval:edit',\n}\n\nexport type PersonalRelationshipsPermissions = Record<PersonalRelationshipsPermission, boolean>\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, logDeniedPermissionCheck, userHasSomeRolesFrom } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\n\nexport default function inUsersCaseLoadAndUserHasSomeRolesFrom(\n  roles: Role[],\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  const { user, prisoner, baseCheckStatus } = request\n\n  const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n  const inUsersCaseLoad = isInUsersCaseLoad(prisoner.prisonId, user)\n  const hasRole = userHasSomeRolesFrom(roles, user)\n\n  const check = baseCheckPassed && inUsersCaseLoad && hasRole\n\n  if (!check)\n    logDeniedPermissionCheck(\n      permission,\n      request,\n      inUsersCaseLoad ? PermissionCheckStatus.ROLE_NOT_PRESENT : PermissionCheckStatus.NOT_IN_CASELOAD,\n    )\n\n  return check\n}\n","import { PrisonerPermission } from '../../../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport inUsersCaseLoadAndUserHasSomeRolesFrom from '../inUsersCaseLoadAndUserHasSomeRolesFrom/InUsersCaseLoadAndUserHasSomeRolesFrom'\n\nexport default function inUsersCaseLoadAndUserHasRole(\n  role: Role,\n  permission: PrisonerPermission,\n  request: PermissionsCheckRequest,\n) {\n  return inUsersCaseLoadAndUserHasSomeRolesFrom([role], permission, request)\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport baseCheck from '../../../baseCheck/BaseCheck'\nimport {\n  PersonalRelationshipsPermission,\n  PersonalRelationshipsPermissions,\n} from '../../../../../../types/public/permissions/domains/person/personalRelationships/PersonalRelationshipsPermissions'\nimport prisonerProfileEditCheck from '../../../sharedChecks/prisonerProfileEditCheck/PrisonerProfileEditCheck'\nimport inUsersCaseLoad from '../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\nimport inUsersCaseLoadAndUserHasSomeRolesFrom from '../../../sharedChecks/inUsersCaseLoadAndUserHasSomeRolesFrom/InUsersCaseLoadAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../types/internal/user/Role'\nimport prisonerProfileSensitiveEditCheck from '../../../sharedChecks/prisonerProfileSensitiveEditCheck/PrisonerProfileSensitiveEditCheck'\nimport inUsersCaseLoadAndUserHasRole from '../../../sharedChecks/inUsersCaseLoadAndUserHasRole/InUsersCaseLoadAndUserHasRole'\n\nexport default function personalRelationshipsCheck(request: PermissionsCheckRequest): PersonalRelationshipsPermissions {\n  return {\n    ...readCheck(PersonalRelationshipsPermission.read_number_of_children, request),\n    ...editCheck(PersonalRelationshipsPermission.edit_number_of_children, request),\n\n    ...readCheck(PersonalRelationshipsPermission.read_domestic_status, request),\n    ...editCheck(PersonalRelationshipsPermission.edit_domestic_status, request),\n\n    ...readCheck(PersonalRelationshipsPermission.read_emergency_contacts, request),\n    ...sensitiveEditCheck(PersonalRelationshipsPermission.edit_emergency_contacts, request),\n\n    [PersonalRelationshipsPermission.read_contacts]: inUsersCaseLoad(\n      PersonalRelationshipsPermission.read_contacts,\n      request,\n    ),\n\n    [PersonalRelationshipsPermission.edit_contacts]: inUsersCaseLoadAndUserHasSomeRolesFrom(\n      [Role.ContactsAdministrator, Role.ContactsAuthoriser],\n      PersonalRelationshipsPermission.edit_contacts,\n      request,\n    ),\n\n    [PersonalRelationshipsPermission.edit_contact_restrictions]: inUsersCaseLoadAndUserHasRole(\n      Role.ContactsAuthoriser,\n      PersonalRelationshipsPermission.edit_contact_restrictions,\n      request,\n    ),\n\n    [PersonalRelationshipsPermission.edit_contact_visit_approval]: inUsersCaseLoadAndUserHasRole(\n      Role.ContactsAuthoriser,\n      PersonalRelationshipsPermission.edit_contact_visit_approval,\n      request,\n    ),\n  }\n}\n\nfunction readCheck<P extends keyof PersonalRelationshipsPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonalRelationshipsPermissions, P> {\n  return { [permission]: baseCheck(permission, request) } as Pick<PersonalRelationshipsPermissions, P>\n}\n\nfunction editCheck<P extends keyof PersonalRelationshipsPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonalRelationshipsPermissions, P> {\n  return { [permission]: prisonerProfileEditCheck(permission, request) } as Pick<PersonalRelationshipsPermissions, P>\n}\n\nfunction sensitiveEditCheck<P extends keyof PersonalRelationshipsPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonalRelationshipsPermissions, P> {\n  return { [permission]: prisonerProfileSensitiveEditCheck(permission, request) } as Pick<\n    PersonalRelationshipsPermissions,\n    P\n  >\n}\n","import PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport caseNotesCheck from './caseNotes/CaseNotesCheck'\nimport { PersonDomainPermissions } from '../../../../../types/public/permissions/domains/person/PersonDomainPermissions'\nimport corePersonRecordCheck from './corePersonRecord/CorePersonRecordCheck'\nimport personProtectedCharacteristicsCheck from './personProtectedCharacteristics/PersonProtectedCharacteristicsCheck'\nimport personHealthAndMedicationCheck from './personHealthAndMedication/PersonHealthAndMedicationCheck'\nimport personalRelationshipsCheck from './personalRelationships/PersonalRelationshipsCheck'\n\nexport default function personCheck(request: PermissionsCheckRequest): PersonDomainPermissions {\n  return {\n    caseNotes: caseNotesCheck(request),\n    corePersonRecord: corePersonRecordCheck(request),\n    personProtectedCharacteristics: personProtectedCharacteristicsCheck(request),\n    personHealthAndMedication: personHealthAndMedicationCheck(request),\n    personalRelationships: personalRelationshipsCheck(request),\n  }\n}\n","export enum PathfinderPermission {\n  read = 'prisoner:pathfinder:read',\n  edit = 'prisoner:pathfinder:edit',\n}\n\nexport type PathfinderPermissions = Record<PathfinderPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { PathfinderPermission } from '../../../../../../../types/public/permissions/domains/security/pathfinder/PathfinderPermissions'\n\nexport default function pathfinderReadCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasSomeRolesFrom(\n    [\n      Role.PathfinderApproval,\n      Role.PathfinderStdPrison,\n      Role.PathfinderStdProbation,\n      Role.PathfinderHQ,\n      Role.PathfinderUser,\n      Role.PathfinderLocalReader,\n      Role.PathfinderNationalReader,\n      Role.PathfinderPolice,\n      Role.PathfinderPsychologist,\n    ],\n    PathfinderPermission.read,\n    request,\n  )\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { PathfinderPermission } from '../../../../../../../types/public/permissions/domains/security/pathfinder/PathfinderPermissions'\n\nexport default function pathfinderEditCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasSomeRolesFrom(\n    [\n      Role.PathfinderApproval,\n      Role.PathfinderStdPrison,\n      Role.PathfinderStdProbation,\n      Role.PathfinderHQ,\n      Role.PathfinderUser,\n    ],\n    PathfinderPermission.edit,\n    request,\n  )\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport pathfinderReadCheck from './pathfinderRead/PathfinderReadCheck'\nimport {\n  PathfinderPermission,\n  PathfinderPermissions,\n} from '../../../../../../types/public/permissions/domains/security/pathfinder/PathfinderPermissions'\nimport pathfinderEditCheck from './pathfinderEdit/PathfinderEditCheck'\n\nexport default function pathfinderCheck(request: PermissionsCheckRequest): PathfinderPermissions {\n  return {\n    [PathfinderPermission.read]: pathfinderReadCheck(request),\n    [PathfinderPermission.edit]: pathfinderEditCheck(request),\n  }\n}\n","export enum SOCPermission {\n  read = 'prisoner:soc:read',\n  edit = 'prisoner:soc:edit',\n}\n\nexport type SOCPermissions = Record<SOCPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { SOCPermission } from '../../../../../../../types/public/permissions/domains/security/soc/SOCPermissions'\n\nexport default function socReadCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasSomeRolesFrom([Role.SocCommunity, Role.SocCustody], SOCPermission.read, request)\n}\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { SOCPermission } from '../../../../../../../types/public/permissions/domains/security/soc/SOCPermissions'\n\nexport default function socEditCheck(request: PermissionsCheckRequest) {\n  return baseCheckAndUserHasSomeRolesFrom(\n    [Role.SocCustody, Role.SocCommunity, Role.SocDataAnalyst, Role.SocDataManager],\n    SOCPermission.edit,\n    request,\n  )\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport socReadCheck from './socRead/SOCReadCheck'\nimport {\n  SOCPermission,\n  SOCPermissions,\n} from '../../../../../../types/public/permissions/domains/security/soc/SOCPermissions'\nimport socEditCheck from './socEdit/SOCEditCheck'\n\nexport default function socCheck(request: PermissionsCheckRequest): SOCPermissions {\n  return {\n    [SOCPermission.read]: socReadCheck(request),\n    [SOCPermission.edit]: socEditCheck(request),\n  }\n}\n","import PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { SecurityDomainPermissions } from '../../../../../types/public/permissions/domains/security/SecurityDomainPermissions'\nimport pathfinderCheck from './pathfinder/PathfinderCheck'\nimport socCheck from './soc/SOCCheck'\n\nexport default function securityCheck(request: PermissionsCheckRequest): SecurityDomainPermissions {\n  return {\n    pathfinder: pathfinderCheck(request),\n    soc: socCheck(request),\n  }\n}\n","export enum ProbationDocumentsPermission {\n  read = 'prisoner:probation-documents:read',\n}\n\nexport type ProbationDocumentsPermissions = Record<ProbationDocumentsPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, logDeniedPermissionCheck, userHasSomeRolesFrom } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { ProbationDocumentsPermission } from '../../../../../../../types/public/permissions/domains/probation/probationDocuments/ProbationDocumentsPermissions'\nimport releasedPrisonerStatus from '../../../../baseCheck/status/ReleasedPrisonerStatus'\nimport transferringPrisonerStatus from '../../../../baseCheck/status/TransferringPrisonerStatus'\nimport restrictedPatientStatus from '../../../../baseCheck/status/RestrictedPatientStatus'\n\nconst permission = ProbationDocumentsPermission.read\n\nexport default function probationDocumentsReadCheck(request: PermissionsCheckRequest) {\n  const baseCheckPassed = request.baseCheckStatus === PermissionCheckStatus.OK\n\n  const probationDocumentsCheckStatus = checkProbationDocumentsReadAccess(request)\n  const probationDocumentsCheckPassed = probationDocumentsCheckStatus === PermissionCheckStatus.OK\n\n  const check = baseCheckPassed && probationDocumentsCheckPassed\n\n  if (!check) logDeniedPermissionCheck(permission, request, probationDocumentsCheckStatus)\n\n  return check\n}\n\nfunction checkProbationDocumentsReadAccess(request: PermissionsCheckRequest): PermissionCheckStatus {\n  const { user, prisoner } = request\n\n  // User must firstly have one of the following roles:\n  if (!userHasSomeRolesFrom([Role.PomUser, Role.ViewProbationDocuments], user)) {\n    return PermissionCheckStatus.ROLE_NOT_PRESENT\n  }\n\n  // Restricted patients follow the base check rules:\n  if (prisoner.restrictedPatient) return restrictedPatientStatus(user, prisoner)\n\n  // Released prisoners follow the base check rules:\n  if (prisoner.prisonId === 'OUT') return releasedPrisonerStatus(user)\n\n  // Transferring prisoners follow the base check rules:\n  if (prisoner.prisonId === 'TRN') return transferringPrisonerStatus(user)\n\n  if (isInUsersCaseLoad(prisoner.prisonId, user)) return PermissionCheckStatus.OK\n\n  // Global search access is not allowed:\n  return PermissionCheckStatus.NOT_IN_CASELOAD\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport probationDocumentsReadCheck from './probationDocumentsRead/ProbationDocumentsReadCheck'\nimport {\n  ProbationDocumentsPermission,\n  ProbationDocumentsPermissions,\n} from '../../../../../../types/public/permissions/domains/probation/probationDocuments/ProbationDocumentsPermissions'\n\nexport default function probationDocumentsCheck(request: PermissionsCheckRequest): ProbationDocumentsPermissions {\n  return {\n    [ProbationDocumentsPermission.read]: probationDocumentsReadCheck(request),\n  }\n}\n","import PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { ProbationDomainPermissions } from '../../../../../types/public/permissions/domains/probation/ProbationDomainPermissions'\nimport probationDocumentsCheck from './probationDocuments/ProbationDocumentsCheck'\n\nexport default function probationCheck(request: PermissionsCheckRequest): ProbationDomainPermissions {\n  return {\n    probationDocuments: probationDocumentsCheck(request),\n  }\n}\n","export enum PersonInterventionsPermission {\n  read_csip = 'prisoner:csip:read',\n}\n\nexport type PersonInterventionsPermissions = Record<PersonInterventionsPermission, boolean>\n","import PermissionsCheckRequest from '../../../../PermissionsCheckRequest'\nimport { PersonInterventionsPermission } from '../../../../../../../types/public/permissions/domains/interventions/personInterventions/PersonInterventionsPermissions'\nimport inUsersCaseLoad from '../../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\n\nexport default function csipReadCheck(request: PermissionsCheckRequest) {\n  return inUsersCaseLoad(PersonInterventionsPermission.read_csip, request)\n}\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport {\n  PersonInterventionsPermission,\n  PersonInterventionsPermissions,\n} from '../../../../../../types/public/permissions/domains/interventions/personInterventions/PersonInterventionsPermissions'\nimport csipReadCheck from './csipRead/CSIPReadCheck'\n\nexport default function personInterventionsCheck(request: PermissionsCheckRequest): PersonInterventionsPermissions {\n  return {\n    [PersonInterventionsPermission.read_csip]: csipReadCheck(request),\n  }\n}\n","import PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport { InterventionsDomainPermissions } from '../../../../../types/public/permissions/domains/interventions/InterventionsDomainPermissions'\nimport personInterventionsCheck from './personInterventions/PersonInterventionsCheck'\n\nexport default function interventionsCheck(request: PermissionsCheckRequest): InterventionsDomainPermissions {\n  return {\n    personInterventions: personInterventionsCheck(request),\n  }\n}\n","import {\n  SentenceAndOffenceDomainPermission,\n  SentenceAndOffenceDomainPermissions,\n} from '../domains/sentenceAndOffence/SentenceAndOffenceDomainPermissions'\nimport {\n  PrisonerSpecificDomainPermission,\n  PrisonerSpecificDomainPermissions,\n} from '../domains/prisonerSpecific/PrisonerSpecificDomainPermissions'\nimport {\n  RunningAPrisonDomainPermission,\n  RunningAPrisonDomainPermissions,\n} from '../domains/runningAPrison/RunningAPrisonDomainPermissions'\nimport { PersonDomainPermission, PersonDomainPermissions } from '../domains/person/PersonDomainPermissions'\nimport { SecurityDomainPermission, SecurityDomainPermissions } from '../domains/security/SecurityDomainPermissions'\nimport { ProbationDomainPermissions } from '../domains/probation/ProbationDomainPermissions'\nimport { ProbationDocumentsPermission } from '../domains/probation/probationDocuments/ProbationDocumentsPermissions'\nimport {\n  InterventionsDomainPermission,\n  InterventionsDomainPermissions,\n} from '../domains/interventions/InterventionsDomainPermissions'\nimport {\n  PersonPlanAndNeedsDomainPermission,\n  PersonPlanAndNeedsDomainPermissions,\n} from '../domains/personPlanAndNeeds/PersonPlanAndNeedsDomainPermissions'\n\nexport enum PrisonerBasePermission {\n  read = 'prisoner:base-record:read',\n}\n\n/**\n * These permissions define what a HMPPS user can do with respect to data held about a prisoner.\n */\nexport interface PrisonerPermissions {\n  [PrisonerBasePermission.read]: boolean\n\n  domainGroups: {\n    interventions: InterventionsDomainPermissions\n    person: PersonDomainPermissions\n    personPlanAndNeeds: PersonPlanAndNeedsDomainPermissions\n    prisonerSpecific: PrisonerSpecificDomainPermissions\n    probation: ProbationDomainPermissions\n    runningAPrison: RunningAPrisonDomainPermissions\n    security: SecurityDomainPermissions\n    sentenceAndOffence: SentenceAndOffenceDomainPermissions\n  }\n}\n\nexport type PrisonerPermission =\n  | PrisonerBasePermission\n  | InterventionsDomainPermission\n  | PersonDomainPermission\n  | PersonPlanAndNeedsDomainPermission\n  | PrisonerSpecificDomainPermission\n  | ProbationDocumentsPermission\n  | RunningAPrisonDomainPermission\n  | SecurityDomainPermission\n  | SentenceAndOffenceDomainPermission\n","export enum PersonCommunicationNeedsPermission {\n  read_language = 'prisoner:language:read',\n  edit_language = 'prisoner:language:edit',\n}\n\nexport type PersonCommunicationNeedsPermissions = Record<PersonCommunicationNeedsPermission, boolean>\n","import PermissionsCheckRequest from '../../../PermissionsCheckRequest'\nimport baseCheck from '../../../baseCheck/BaseCheck'\nimport prisonerProfileEditCheck from '../../../sharedChecks/prisonerProfileEditCheck/PrisonerProfileEditCheck'\nimport {\n  PersonCommunicationNeedsPermission,\n  PersonCommunicationNeedsPermissions,\n} from '../../../../../../types/public/permissions/domains/personPlanAndNeeds/personCommunicationNeeds/PersonCommunicationNeedsPermissions'\n\nexport default function personCommunicationNeedsCheck(\n  request: PermissionsCheckRequest,\n): PersonCommunicationNeedsPermissions {\n  return {\n    ...readCheck(PersonCommunicationNeedsPermission.read_language, request),\n    ...editCheck(PersonCommunicationNeedsPermission.edit_language, request),\n  }\n}\n\nfunction readCheck<P extends keyof PersonCommunicationNeedsPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonCommunicationNeedsPermissions, P> {\n  return { [permission]: baseCheck(permission, request) } as Pick<PersonCommunicationNeedsPermissions, P>\n}\n\nfunction editCheck<P extends keyof PersonCommunicationNeedsPermissions>(\n  permission: P,\n  request: PermissionsCheckRequest,\n): Pick<PersonCommunicationNeedsPermissions, P> {\n  return { [permission]: prisonerProfileEditCheck(permission, request) } as Pick<PersonCommunicationNeedsPermissions, P>\n}\n","import PermissionsCheckRequest from '../../PermissionsCheckRequest'\nimport personCommunicationNeedsCheck from './personCommunicationNeeds/PersonCommunicationNeedsCheck'\nimport { PersonPlanAndNeedsDomainPermissions } from '../../../../../types/public/permissions/domains/personPlanAndNeeds/PersonPlanAndNeedsDomainPermissions'\n\nexport default function personPlanAndNeedsCheck(request: PermissionsCheckRequest): PersonPlanAndNeedsDomainPermissions {\n  return {\n    personCommunicationNeeds: personCommunicationNeedsCheck(request),\n  }\n}\n","import type bunyan from 'bunyan'\nimport { ApiConfig, AuthenticationClient } from '@ministryofjustice/hmpps-rest-client'\nimport { TelemetryClient } from 'applicationinsights'\nimport Prisoner from '../../data/hmppsPrisonerSearch/interfaces/Prisoner'\nimport { HmppsUser } from '../../types/internal/user/HmppsUser'\nimport PermissionsLogger from './PermissionsLogger'\nimport PrisonerSearchClient from '../../data/hmppsPrisonerSearch/PrisonerSearchClient'\nimport sentenceAndOffenceCheck from './checks/domains/sentenceAndOffence/SentenceAndOffenceCheck'\nimport baseCheck from './checks/baseCheck/BaseCheck'\nimport PermissionsCheckRequest from './checks/PermissionsCheckRequest'\nimport baseCheckStatus from './checks/baseCheck/status/BaseCheckStatus'\nimport prisonerSpecificCheck from './checks/domains/prisonerSpecific/PrisonerSpecificCheck'\nimport runningAPrisonCheck from './checks/domains/runningAPrison/RunningAPrisonCheck'\nimport personCheck from './checks/domains/person/PersonCheck'\nimport securityCheck from './checks/domains/security/SecurityCheck'\nimport probationCheck from './checks/domains/probation/ProbationCheck'\nimport interventionsCheck from './checks/domains/interventions/InterventionsCheck'\nimport {\n  PrisonerBasePermission,\n  PrisonerPermission,\n  PrisonerPermissions,\n} from '../../types/public/permissions/prisoner/PrisonerPermissions'\nimport personPlanAndNeedsCheck from './checks/domains/personPlanAndNeeds/PersonPlanAndNeedsCheck'\n\nexport default class PermissionsService {\n  private readonly prisonerSearchClient: PrisonerSearchClient\n\n  readonly permissionsLogger: PermissionsLogger\n\n  static create({\n    prisonerSearchConfig,\n    authenticationClient,\n    logger = console,\n    telemetryClient,\n  }: {\n    prisonerSearchConfig: ApiConfig\n    authenticationClient: AuthenticationClient\n    logger?: bunyan | typeof console\n    telemetryClient?: TelemetryClient\n  }): PermissionsService {\n    return new PermissionsService(\n      new PrisonerSearchClient(logger, prisonerSearchConfig, authenticationClient),\n      new PermissionsLogger(logger, telemetryClient),\n    )\n  }\n\n  private constructor(prisonerSearchClient: PrisonerSearchClient, permissionsLogger: PermissionsLogger) {\n    this.prisonerSearchClient = prisonerSearchClient\n    this.permissionsLogger = permissionsLogger\n  }\n\n  public getPrisonerPermissions({\n    user,\n    prisoner,\n    requestDependentOn,\n  }: {\n    user: HmppsUser\n    prisoner: Prisoner\n    requestDependentOn: PrisonerPermission[]\n  }): PrisonerPermissions {\n    const request: PermissionsCheckRequest = {\n      user,\n      prisoner,\n      baseCheckStatus: baseCheckStatus(user, prisoner),\n      requestDependentOn,\n      permissionsLogger: this.permissionsLogger,\n    }\n\n    return {\n      [PrisonerBasePermission.read]: baseCheck(PrisonerBasePermission.read, request),\n\n      domainGroups: {\n        interventions: interventionsCheck(request),\n        person: personCheck(request),\n        personPlanAndNeeds: personPlanAndNeedsCheck(request),\n        prisonerSpecific: prisonerSpecificCheck(request),\n        probation: probationCheck(request),\n        runningAPrison: runningAPrisonCheck(request),\n        security: securityCheck(request),\n        sentenceAndOffence: sentenceAndOffenceCheck(request),\n      },\n    }\n  }\n\n  public getPrisonerDetails(prisonerNumber: string): Promise<Prisoner> {\n    return this.prisonerSearchClient.getPrisonerDetails(prisonerNumber)\n  }\n}\n","import { PrisonerPermission } from '../permissions/prisoner/PrisonerPermissions'\n\nexport default class PrisonerPermissionError extends Error {\n  public status = 403\n\n  public deniedPermissionChecks: PrisonerPermission[]\n\n  constructor(message = 'Access not permitted', failedPermissionChecks: PrisonerPermission[] = []) {\n    super(message)\n    this.name = 'NotFoundError'\n    this.deniedPermissionChecks = failedPermissionChecks\n  }\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PrisonerAdjudicationsPermission } from './PrisonerAdjudicationsPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerAdjudicationsPermissionPaths: Record<\n  PrisonerAdjudicationsPermission,\n  Path<PrisonerPermissions>\n> = {\n  [PrisonerAdjudicationsPermission.read]: `domainGroups.prisonerSpecific.prisonerAdjudications.${PrisonerAdjudicationsPermission.read}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { PrisonerMoneyPermission } from './PrisonerMoneyPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerMoneyPermissionPaths: Record<PrisonerMoneyPermission, Path<PrisonerPermissions>> = {\n  [PrisonerMoneyPermission.read]: `domainGroups.prisonerSpecific.prisonerMoney.${PrisonerMoneyPermission.read}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PrisonerIncentivesPermission } from './PrisonerIncentivesPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerIncentivesPermissionPaths: Record<PrisonerIncentivesPermission, Path<PrisonerPermissions>> = {\n  [PrisonerIncentivesPermission.read]: `domainGroups.prisonerSpecific.prisonerIncentives.${PrisonerIncentivesPermission.read}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PersonPrisonCategoryPermission } from './PersonPrisonCategoryPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personPrisonCategoryPermissionPaths: Record<PersonPrisonCategoryPermission, Path<PrisonerPermissions>> = {\n  [PersonPrisonCategoryPermission.edit]: `domainGroups.prisonerSpecific.personPrisonCategory.${PersonPrisonCategoryPermission.edit}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PrisonerSchedulePermission } from './PrisonerSchedulePermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerSchedulePermissionPaths: Record<PrisonerSchedulePermission, Path<PrisonerPermissions>> = {\n  [PrisonerSchedulePermission.edit_appointment]: `domainGroups.prisonerSpecific.prisonerSchedule.${PrisonerSchedulePermission.edit_appointment}`,\n  [PrisonerSchedulePermission.edit_activity]: `domainGroups.prisonerSpecific.prisonerSchedule.${PrisonerSchedulePermission.edit_activity}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { UseOfForcePermission } from './UseOfForcePermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const useOfForcePermissionPaths: Record<UseOfForcePermission, Path<PrisonerPermissions>> = {\n  [UseOfForcePermission.edit]: `domainGroups.prisonerSpecific.useOfForce.${UseOfForcePermission.edit}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PrisonerAlertsPermission } from './PrisonerAlertsPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerAlertsPermissionPaths: Record<PrisonerAlertsPermission, Path<PrisonerPermissions>> = {\n  [PrisonerAlertsPermission.edit]: `domainGroups.prisonerSpecific.prisonerAlerts.${PrisonerAlertsPermission.edit}`,\n}\n","import { PrisonerSpecificDomainPermission } from './PrisonerSpecificDomainPermissions'\nimport { PrisonerPermissions } from '../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../internal/utils/Path'\nimport { prisonerAdjudicationsPermissionPaths } from './prisonerAdjudications/PrisonerAdjudicationsPermissionPaths'\nimport { prisonerMoneyPermissionPaths } from './prisonerMoney/PrisonerMoneyPermissionPaths'\nimport { prisonerIncentivesPermissionPaths } from './prisonerIncentives/PrisonerIncentivesPermissionPaths'\nimport { personPrisonCategoryPermissionPaths } from './personPrisonCategory/PersonPrisonCategoryPermissionPaths'\nimport { prisonerSchedulePermissionPaths } from './prisonerSchedule/PrisonerSchedulePermissionPaths'\nimport { useOfForcePermissionPaths } from './useOfForce/UseOfForcePermissionPaths'\nimport { prisonerAlertsPermissionPaths } from './prisonerAlerts/PrisonerAlertsPermissionPaths'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerSpecificDomainPermissionPaths: Record<\n  PrisonerSpecificDomainPermission,\n  Path<PrisonerPermissions>\n> = {\n  ...prisonerMoneyPermissionPaths,\n  ...prisonerAdjudicationsPermissionPaths,\n  ...prisonerIncentivesPermissionPaths,\n  ...personPrisonCategoryPermissionPaths,\n  ...prisonerSchedulePermissionPaths,\n  ...useOfForcePermissionPaths,\n  ...prisonerAlertsPermissionPaths,\n}\n","import { Path } from '../../../../../internal/utils/Path'\nimport { PersonSentenceCalculationPermission } from './PersonSentenceCalculationPermissions'\nimport { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personSentenceCalculationPermissionPaths: Record<\n  PersonSentenceCalculationPermission,\n  Path<PrisonerPermissions>\n> = {\n  [PersonSentenceCalculationPermission.read]: `domainGroups.sentenceAndOffence.personSentenceCalculation.${PersonSentenceCalculationPermission.read}`,\n  [PersonSentenceCalculationPermission.edit_adjustments]: `domainGroups.sentenceAndOffence.personSentenceCalculation.${PersonSentenceCalculationPermission.edit_adjustments}`,\n}\n","import { SentenceAndOffenceDomainPermission } from './SentenceAndOffenceDomainPermissions'\nimport { Path } from '../../../../internal/utils/Path'\nimport { PrisonerPermissions } from '../../prisoner/PrisonerPermissions'\nimport { personSentenceCalculationPermissionPaths } from './personSentenceCalculation/PersonSentenceCalculationPermissionPaths'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const sentenceAndOffenceDomainPermissionPaths: Record<\n  SentenceAndOffenceDomainPermission,\n  Path<PrisonerPermissions>\n> = {\n  ...personSentenceCalculationPermissionPaths,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PrisonerVisitsAndVisitorsPermission } from './PrisonerVisitsAndVisitorsPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerVisitsAndVisitorsPermissionPaths: Record<\n  PrisonerVisitsAndVisitorsPermission,\n  Path<PrisonerPermissions>\n> = {\n  [PrisonerVisitsAndVisitorsPermission.read]: `domainGroups.runningAPrison.prisonerVisitsAndVisitors.${PrisonerVisitsAndVisitorsPermission.read}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PrisonerBaseLocationPermission } from './PrisonerBaseLocationPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerBaseLocationPermissionPaths: Record<PrisonerBaseLocationPermission, Path<PrisonerPermissions>> = {\n  [PrisonerBaseLocationPermission.read_location_details]: `domainGroups.runningAPrison.prisonerBaseLocation.${PrisonerBaseLocationPermission.read_location_details}`,\n  [PrisonerBaseLocationPermission.read_location_history]: `domainGroups.runningAPrison.prisonerBaseLocation.${PrisonerBaseLocationPermission.read_location_history}`,\n  [PrisonerBaseLocationPermission.move_cell]: `domainGroups.runningAPrison.prisonerBaseLocation.${PrisonerBaseLocationPermission.move_cell}`,\n}\n","import { PrisonerPermissions } from '../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../internal/utils/Path'\nimport { RunningAPrisonDomainPermission } from './RunningAPrisonDomainPermissions'\nimport { prisonerVisitsAndVisitorsPermissionPaths } from './prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsPermissionPaths'\nimport { prisonerBaseLocationPermissionPaths } from './prisonerBaseLocation/PrisonerBaseLocationPermissionPaths'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const runningAPrisonDomainPermissionPaths: Record<RunningAPrisonDomainPermission, Path<PrisonerPermissions>> = {\n  ...prisonerVisitsAndVisitorsPermissionPaths,\n  ...prisonerBaseLocationPermissionPaths,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { CaseNotesPermission } from './CaseNotesPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const caseNotesPermissionPaths: Record<CaseNotesPermission, Path<PrisonerPermissions>> = {\n  [CaseNotesPermission.read]: `domainGroups.person.caseNotes.${CaseNotesPermission.read}`,\n  [CaseNotesPermission.edit]: `domainGroups.person.caseNotes.${CaseNotesPermission.edit}`,\n  [CaseNotesPermission.read_sensitive]: `domainGroups.person.caseNotes.${CaseNotesPermission.read_sensitive}`,\n  [CaseNotesPermission.delete_sensitive]: `domainGroups.person.caseNotes.${CaseNotesPermission.delete_sensitive}`,\n  [CaseNotesPermission.edit_sensitive]: `domainGroups.person.caseNotes.${CaseNotesPermission.edit_sensitive}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { CorePersonRecordPermission } from './CorePersonRecordPermissions'\n\nconst basePath: Path<PrisonerPermissions> = 'domainGroups.person.corePersonRecord'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const corePersonRecordPermissionPaths: Record<CorePersonRecordPermission, Path<PrisonerPermissions>> = {\n  [CorePersonRecordPermission.read_physical_characteristics]: `${basePath}.${CorePersonRecordPermission.read_physical_characteristics}`,\n  [CorePersonRecordPermission.edit_physical_characteristics]: `${basePath}.${CorePersonRecordPermission.edit_physical_characteristics}`,\n\n  [CorePersonRecordPermission.read_photo]: `${basePath}.${CorePersonRecordPermission.read_photo}`,\n  [CorePersonRecordPermission.edit_photo]: `${basePath}.${CorePersonRecordPermission.edit_photo}`,\n\n  [CorePersonRecordPermission.read_place_of_birth]: `${basePath}.${CorePersonRecordPermission.read_place_of_birth}`,\n  [CorePersonRecordPermission.edit_place_of_birth]: `${basePath}.${CorePersonRecordPermission.edit_place_of_birth}`,\n\n  [CorePersonRecordPermission.read_military_history]: `${basePath}.${CorePersonRecordPermission.read_military_history}`,\n  [CorePersonRecordPermission.edit_military_history]: `${basePath}.${CorePersonRecordPermission.edit_military_history}`,\n\n  [CorePersonRecordPermission.read_name_and_aliases]: `${basePath}.${CorePersonRecordPermission.read_name_and_aliases}`,\n  [CorePersonRecordPermission.edit_name_and_aliases]: `${basePath}.${CorePersonRecordPermission.edit_name_and_aliases}`,\n\n  [CorePersonRecordPermission.read_date_of_birth]: `${basePath}.${CorePersonRecordPermission.read_date_of_birth}`,\n  [CorePersonRecordPermission.edit_date_of_birth]: `${basePath}.${CorePersonRecordPermission.edit_date_of_birth}`,\n\n  [CorePersonRecordPermission.read_address]: `${basePath}.${CorePersonRecordPermission.read_address}`,\n  [CorePersonRecordPermission.edit_address]: `${basePath}.${CorePersonRecordPermission.edit_address}`,\n\n  [CorePersonRecordPermission.read_nationality]: `${basePath}.${CorePersonRecordPermission.read_nationality}`,\n  [CorePersonRecordPermission.edit_nationality]: `${basePath}.${CorePersonRecordPermission.edit_nationality}`,\n\n  [CorePersonRecordPermission.read_identifiers]: `${basePath}.${CorePersonRecordPermission.read_identifiers}`,\n  [CorePersonRecordPermission.edit_identifiers]: `${basePath}.${CorePersonRecordPermission.edit_identifiers}`,\n\n  [CorePersonRecordPermission.read_phone_numbers]: `${basePath}.${CorePersonRecordPermission.read_phone_numbers}`,\n  [CorePersonRecordPermission.edit_phone_numbers]: `${basePath}.${CorePersonRecordPermission.edit_phone_numbers}`,\n\n  [CorePersonRecordPermission.read_email_addresses]: `${basePath}.${CorePersonRecordPermission.read_email_addresses}`,\n  [CorePersonRecordPermission.edit_email_addresses]: `${basePath}.${CorePersonRecordPermission.edit_email_addresses}`,\n\n  [CorePersonRecordPermission.read_distinguishing_marks]: `${basePath}.${CorePersonRecordPermission.read_distinguishing_marks}`,\n  [CorePersonRecordPermission.edit_distinguishing_marks]: `${basePath}.${CorePersonRecordPermission.edit_distinguishing_marks}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PersonProtectedCharacteristicsPermission } from './PersonProtectedCharacteristicsPermissions'\n\nconst basePath: Path<PrisonerPermissions> = 'domainGroups.person.personProtectedCharacteristics'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personProtectedCharacteristicsPermissionPaths: Record<\n  PersonProtectedCharacteristicsPermission,\n  Path<PrisonerPermissions>\n> = {\n  [PersonProtectedCharacteristicsPermission.read_sexual_orientation]: `${basePath}.${PersonProtectedCharacteristicsPermission.read_sexual_orientation}`,\n  [PersonProtectedCharacteristicsPermission.edit_sexual_orientation]: `${basePath}.${PersonProtectedCharacteristicsPermission.edit_sexual_orientation}`,\n\n  [PersonProtectedCharacteristicsPermission.read_religion_and_belief]: `${basePath}.${PersonProtectedCharacteristicsPermission.read_religion_and_belief}`,\n  [PersonProtectedCharacteristicsPermission.edit_religion_and_belief]: `${basePath}.${PersonProtectedCharacteristicsPermission.edit_religion_and_belief}`,\n\n  [PersonProtectedCharacteristicsPermission.read_ethnicity]: `${basePath}.${PersonProtectedCharacteristicsPermission.read_ethnicity}`,\n  [PersonProtectedCharacteristicsPermission.edit_ethnicity]: `${basePath}.${PersonProtectedCharacteristicsPermission.edit_ethnicity}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PersonHealthAndMedicationPermission } from './PersonHealthAndMedicationPermissions'\n\nconst basePath: Path<PrisonerPermissions> = 'domainGroups.person.personHealthAndMedication'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personHealthAndMedicationPermissionPaths: Record<\n  PersonHealthAndMedicationPermission,\n  Path<PrisonerPermissions>\n> = {\n  [PersonHealthAndMedicationPermission.read_pregnancy]: `${basePath}.${PersonHealthAndMedicationPermission.read_pregnancy}`,\n  [PersonHealthAndMedicationPermission.edit_pregnancy]: `${basePath}.${PersonHealthAndMedicationPermission.edit_pregnancy}`,\n\n  [PersonHealthAndMedicationPermission.read_diet]: `${basePath}.${PersonHealthAndMedicationPermission.read_diet}`,\n  [PersonHealthAndMedicationPermission.edit_diet]: `${basePath}.${PersonHealthAndMedicationPermission.edit_diet}`,\n\n  [PersonHealthAndMedicationPermission.read_smoker]: `${basePath}.${PersonHealthAndMedicationPermission.read_smoker}`,\n  [PersonHealthAndMedicationPermission.edit_smoker]: `${basePath}.${PersonHealthAndMedicationPermission.edit_smoker}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PersonalRelationshipsPermission } from './PersonalRelationshipsPermissions'\n\nconst basePath: Path<PrisonerPermissions> = 'domainGroups.person.personalRelationships'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personalRelationshipsPermissionPaths: Record<\n  PersonalRelationshipsPermission,\n  Path<PrisonerPermissions>\n> = {\n  [PersonalRelationshipsPermission.read_number_of_children]: `${basePath}.${PersonalRelationshipsPermission.read_number_of_children}`,\n  [PersonalRelationshipsPermission.edit_number_of_children]: `${basePath}.${PersonalRelationshipsPermission.edit_number_of_children}`,\n  [PersonalRelationshipsPermission.read_domestic_status]: `${basePath}.${PersonalRelationshipsPermission.read_domestic_status}`,\n  [PersonalRelationshipsPermission.edit_domestic_status]: `${basePath}.${PersonalRelationshipsPermission.edit_domestic_status}`,\n  [PersonalRelationshipsPermission.read_contacts]: `${basePath}.${PersonalRelationshipsPermission.read_contacts}`,\n  [PersonalRelationshipsPermission.edit_contacts]: `${basePath}.${PersonalRelationshipsPermission.edit_contacts}`,\n  [PersonalRelationshipsPermission.edit_contact_restrictions]: `${basePath}.${PersonalRelationshipsPermission.edit_contact_restrictions}`,\n  [PersonalRelationshipsPermission.edit_contact_visit_approval]: `${basePath}.${PersonalRelationshipsPermission.edit_contact_visit_approval}`,\n  [PersonalRelationshipsPermission.read_emergency_contacts]: `${basePath}.${PersonalRelationshipsPermission.read_emergency_contacts}`,\n  [PersonalRelationshipsPermission.edit_emergency_contacts]: `${basePath}.${PersonalRelationshipsPermission.edit_emergency_contacts}`,\n}\n","import { PrisonerPermissions } from '../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../internal/utils/Path'\nimport { caseNotesPermissionPaths } from './caseNotes/CaseNotesPermissionPaths'\nimport { PersonDomainPermission } from './PersonDomainPermissions'\nimport { corePersonRecordPermissionPaths } from './corePersonRecord/CorePersonRecordPermissionPaths'\nimport { personProtectedCharacteristicsPermissionPaths } from './personProtectedCharacteristics/PersonProtectedCharacteristicsPermissionPaths'\nimport { personHealthAndMedicationPermissionPaths } from './personHealthAndMedication/PersonHealthAndMedicationPermissionPaths'\nimport { personalRelationshipsPermissionPaths } from './personalRelationships/PersonalRelationshipsPermissionPaths'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personDomainPermissionPaths: Record<PersonDomainPermission, Path<PrisonerPermissions>> = {\n  ...caseNotesPermissionPaths,\n  ...corePersonRecordPermissionPaths,\n  ...personProtectedCharacteristicsPermissionPaths,\n  ...personHealthAndMedicationPermissionPaths,\n  ...personalRelationshipsPermissionPaths,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PathfinderPermission } from './PathfinderPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const pathfinderPermissionPaths: Record<PathfinderPermission, Path<PrisonerPermissions>> = {\n  [PathfinderPermission.read]: `domainGroups.security.pathfinder.${PathfinderPermission.read}`,\n  [PathfinderPermission.edit]: `domainGroups.security.pathfinder.${PathfinderPermission.edit}`,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { SOCPermission } from './SOCPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const socPermissionPaths: Record<SOCPermission, Path<PrisonerPermissions>> = {\n  [SOCPermission.read]: `domainGroups.security.soc.${SOCPermission.read}`,\n  [SOCPermission.edit]: `domainGroups.security.soc.${SOCPermission.edit}`,\n}\n","import { PrisonerPermissions } from '../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../internal/utils/Path'\nimport { pathfinderPermissionPaths } from './pathfinder/PathfinderPermissionPaths'\nimport { SecurityDomainPermission } from './SecurityDomainPermissions'\nimport { socPermissionPaths } from './soc/SOCPermissionPaths'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const securityDomainPermissionPaths: Record<SecurityDomainPermission, Path<PrisonerPermissions>> = {\n  ...pathfinderPermissionPaths,\n  ...socPermissionPaths,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { ProbationDocumentsPermission } from './ProbationDocumentsPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const probationDocumentsPermissionPaths: Record<ProbationDocumentsPermission, Path<PrisonerPermissions>> = {\n  [ProbationDocumentsPermission.read]: `domainGroups.probation.probationDocuments.${ProbationDocumentsPermission.read}`,\n}\n","import { PrisonerPermissions } from '../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../internal/utils/Path'\nimport { probationDocumentsPermissionPaths } from './probationDocuments/ProbationDocumentsPermissionPaths'\nimport { ProbationDomainPermission } from './ProbationDomainPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const probationDomainPermissionPaths: Record<ProbationDomainPermission, Path<PrisonerPermissions>> = {\n  ...probationDocumentsPermissionPaths,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PersonInterventionsPermission } from './PersonInterventionsPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personInterventionsPermissionPaths: Record<PersonInterventionsPermission, Path<PrisonerPermissions>> = {\n  [PersonInterventionsPermission.read_csip]: `domainGroups.interventions.personInterventions.${PersonInterventionsPermission.read_csip}`,\n}\n","import { PrisonerPermissions } from '../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../internal/utils/Path'\nimport { personInterventionsPermissionPaths } from './personInterventions/PersonInterventionsPermissionPaths'\nimport { InterventionsDomainPermission } from './InterventionsDomainPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const interventionsDomainPermissionPaths: Record<InterventionsDomainPermission, Path<PrisonerPermissions>> = {\n  ...personInterventionsPermissionPaths,\n}\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PersonCommunicationNeedsPermission } from './PersonCommunicationNeedsPermissions'\n\nconst basePath: Path<PrisonerPermissions> = 'domainGroups.personPlanAndNeeds.personCommunicationNeeds'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personCommunicationNeedsPermissionPaths: Record<\n  PersonCommunicationNeedsPermission,\n  Path<PrisonerPermissions>\n> = {\n  [PersonCommunicationNeedsPermission.read_language]: `${basePath}.${PersonCommunicationNeedsPermission.read_language}`,\n  [PersonCommunicationNeedsPermission.edit_language]: `${basePath}.${PersonCommunicationNeedsPermission.edit_language}`,\n}\n","import { PrisonerPermissions } from '../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../internal/utils/Path'\nimport { personCommunicationNeedsPermissionPaths } from './personCommunicationNeeds/PersonCommunicationNeedsPermissionPaths'\nimport { PersonPlanAndNeedsDomainPermission } from './PersonPlanAndNeedsDomainPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const personPlanAndNeedsDomainPermissionPaths: Record<\n  PersonPlanAndNeedsDomainPermission,\n  Path<PrisonerPermissions>\n> = {\n  ...personCommunicationNeedsPermissionPaths,\n}\n","import { PrisonerBasePermission, PrisonerPermission, PrisonerPermissions } from './PrisonerPermissions'\nimport { Path } from '../../../internal/utils/Path'\nimport { prisonerSpecificDomainPermissionPaths } from '../domains/prisonerSpecific/PrisonerSpecificDomainPermissionPaths'\nimport { sentenceAndOffenceDomainPermissionPaths } from '../domains/sentenceAndOffence/SentenceAndOffenceDomainPermissionPaths'\nimport { runningAPrisonDomainPermissionPaths } from '../domains/runningAPrison/RunningAPrisonDomainPermissionPaths'\nimport { personDomainPermissionPaths } from '../domains/person/PersonDomainPermissionPaths'\nimport { securityDomainPermissionPaths } from '../domains/security/SecurityDomainPermissionPaths'\nimport { probationDomainPermissionPaths } from '../domains/probation/ProbationDomainPermissionPaths'\nimport { interventionsDomainPermissionPaths } from '../domains/interventions/InterventionsDomainPermissionPaths'\nimport { personPlanAndNeedsDomainPermissionPaths } from '../domains/personPlanAndNeeds/PersonPlanAndNeedsDomainPermissionPaths'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerPermissionPaths: Record<PrisonerPermission, Path<PrisonerPermissions>> = {\n  [PrisonerBasePermission.read]: PrisonerBasePermission.read,\n  ...interventionsDomainPermissionPaths,\n  ...personDomainPermissionPaths,\n  ...personPlanAndNeedsDomainPermissionPaths,\n  ...prisonerSpecificDomainPermissionPaths,\n  ...probationDomainPermissionPaths,\n  ...runningAPrisonDomainPermissionPaths,\n  ...securityDomainPermissionPaths,\n  ...sentenceAndOffenceDomainPermissionPaths,\n}\n","import { PrisonerPermission, PrisonerPermissions } from './PrisonerPermissions'\nimport { prisonerPermissionPaths } from './PrisonerPermissionPaths'\n\n// eslint-disable-next-line import/prefer-default-export\nexport function isGranted(permission: PrisonerPermission, permissions: PrisonerPermissions | undefined): boolean {\n  // @ts-expect-error TS cannot guarantee the path ends with a boolean\n  return prisonerPermissionPaths[permission].split('.').reduce((o, key) => o && o[key], permissions || {})\n}\n","import type { NextFunction, Request, Response } from 'express'\nimport { PrisonerPermission } from '../types/public/permissions/prisoner/PrisonerPermissions'\nimport PermissionsService from '../services/permissions/PermissionsService'\nimport PrisonerPermissionError from '../types/public/errors/PrisonerPermissionError'\nimport Prisoner from '../data/hmppsPrisonerSearch/interfaces/Prisoner'\nimport { isGranted } from '../types/public/permissions/prisoner/PrisonerPermissionsUtils'\n\nexport default function prisonerPermissionsGuard(\n  permissionsService: PermissionsService,\n  options: {\n    requestDependentOn: PrisonerPermission[]\n    getPrisonerNumberFunction?: (req: Request) => string | undefined\n  },\n) {\n  const { requestDependentOn, getPrisonerNumberFunction = getPrisonerNumberFrom } = options\n\n  if (!requestDependentOn?.length) throw Error('Unprotected route, must provide at least one dependent permission')\n\n  return async (req: Request, res: Response, next: NextFunction) => {\n    const prisonerData = await getPrisonerData(req, permissionsService, getPrisonerNumberFunction)\n    if (!prisonerData) return next(Error('Could not retrieve prisoner data'))\n\n    const prisonerPermissions = permissionsService.getPrisonerPermissions({\n      user: res.locals.user,\n      prisoner: prisonerData,\n      requestDependentOn,\n    })\n\n    const deniedPermissions = requestDependentOn.filter(permission => !isGranted(permission, prisonerPermissions))\n\n    if (deniedPermissions.length) return next(new PrisonerPermissionError('Denied permissions', deniedPermissions))\n\n    req.middleware = { ...req.middleware, prisonerData }\n    res.locals.prisonerPermissions = prisonerPermissions\n    return next()\n  }\n}\n\nfunction getPrisonerNumberFrom(req: Request): string | undefined {\n  if (req.params?.prisonerNumber) {\n    return req.params.prisonerNumber\n  }\n  if (req.query?.prisonerNumber) {\n    return req.query.prisonerNumber as string\n  }\n  return undefined\n}\n\nasync function getPrisonerData(\n  req: Request,\n  permissionsService: PermissionsService,\n  getPrisonerNumberFunction: (req: Request) => string | undefined,\n): Promise<Prisoner | undefined> {\n  if (req.middleware?.prisonerData) return req.middleware?.prisonerData\n  const prisonerNumber = getPrisonerNumberFunction(req)\n  return prisonerNumber ? permissionsService.getPrisonerDetails(prisonerNumber) : undefined\n}\n","import { PrisonerBasePermission, PrisonerPermission } from '../types/public/permissions/prisoner/PrisonerPermissions'\nimport { CaseNotesPermission } from '../types/public/permissions/domains/person/caseNotes/CaseNotesPermissions'\nimport { CorePersonRecordPermission } from '../types/public/permissions/domains/person/corePersonRecord/CorePersonRecordPermissions'\nimport { PersonalRelationshipsPermission } from '../types/public/permissions/domains/person/personalRelationships/PersonalRelationshipsPermissions'\nimport { PersonHealthAndMedicationPermission } from '../types/public/permissions/domains/person/personHealthAndMedication/PersonHealthAndMedicationPermissions'\nimport { PersonProtectedCharacteristicsPermission } from '../types/public/permissions/domains/person/personProtectedCharacteristics/PersonProtectedCharacteristicsPermissions'\nimport { PersonPrisonCategoryPermission } from '../types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissions'\nimport { PrisonerAdjudicationsPermission } from '../types/public/permissions/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsPermissions'\nimport { PrisonerAlertsPermission } from '../types/public/permissions/domains/prisonerSpecific/prisonerAlerts/PrisonerAlertsPermissions'\nimport { PrisonerIncentivesPermission } from '../types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissions'\nimport { PrisonerMoneyPermission } from '../types/public/permissions/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyPermissions'\nimport { PrisonerSchedulePermission } from '../types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissions'\nimport { UseOfForcePermission } from '../types/public/permissions/domains/prisonerSpecific/useOfForce/UseOfForcePermissions'\nimport { ProbationDocumentsPermission } from '../types/public/permissions/domains/probation/probationDocuments/ProbationDocumentsPermissions'\nimport { PrisonerBaseLocationPermission } from '../types/public/permissions/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationPermissions'\nimport { PrisonerVisitsAndVisitorsPermission } from '../types/public/permissions/domains/runningAPrison/prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsPermissions'\nimport { PathfinderPermission } from '../types/public/permissions/domains/security/pathfinder/PathfinderPermissions'\nimport { SOCPermission } from '../types/public/permissions/domains/security/soc/SOCPermissions'\nimport { PersonSentenceCalculationPermission } from '../types/public/permissions/domains/sentenceAndOffence/personSentenceCalculation/PersonSentenceCalculationPermissions'\nimport { PersonInterventionsPermission } from '../types/public/permissions/domains/interventions/personInterventions/PersonInterventionsPermissions'\nimport { isGranted } from '../types/public/permissions/prisoner/PrisonerPermissionsUtils'\nimport { PersonCommunicationNeedsPermission } from '../types/public/permissions/domains/personPlanAndNeeds/personCommunicationNeeds/PersonCommunicationNeedsPermissions'\n\n// Add all permissions enums here to enable them to be referenced in\n// nunjucks templates:\nconst nunjucksEnums: Record<PrisonerPermission, object> = {\n  ...nunjucksEnum({ CaseNotesPermission }),\n  ...nunjucksEnum({ CorePersonRecordPermission }),\n  ...nunjucksEnum({ PathfinderPermission }),\n  ...nunjucksEnum({ PersonCommunicationNeedsPermission }),\n  ...nunjucksEnum({ PersonHealthAndMedicationPermission }),\n  ...nunjucksEnum({ PersonInterventionsPermission }),\n  ...nunjucksEnum({ PersonPrisonCategoryPermission }),\n  ...nunjucksEnum({ PersonProtectedCharacteristicsPermission }),\n  ...nunjucksEnum({ PersonSentenceCalculationPermission }),\n  ...nunjucksEnum({ PersonalRelationshipsPermission }),\n  ...nunjucksEnum({ PrisonerAdjudicationsPermission }),\n  ...nunjucksEnum({ PrisonerAlertsPermission }),\n  ...nunjucksEnum({ PrisonerBaseLocationPermission }),\n  ...nunjucksEnum({ PrisonerBasePermission }),\n  ...nunjucksEnum({ PrisonerIncentivesPermission }),\n  ...nunjucksEnum({ PrisonerMoneyPermission }),\n  ...nunjucksEnum({ PrisonerSchedulePermission }),\n  ...nunjucksEnum({ PrisonerVisitsAndVisitorsPermission }),\n  ...nunjucksEnum({ ProbationDocumentsPermission }),\n  ...nunjucksEnum({ SOCPermission }),\n  ...nunjucksEnum({ UseOfForcePermission }),\n}\n\ninterface NunjucksEnvironment {\n  addGlobal: (name: string, value: unknown) => NunjucksEnvironment\n}\n\nexport default function setupNunjucksPermissions(njkEnv: NunjucksEnvironment) {\n  njkEnv.addGlobal('isGranted', isGranted)\n  Object.entries(nunjucksEnums).forEach(([key, value]) => njkEnv.addGlobal(key, value))\n}\n\nfunction nunjucksEnum<T extends Record<string, string>>(object: Record<string, T>): Record<T[keyof T], object> {\n  return object\n}\n"],"names":["PermissionCheckStatus","RestClient","asSystem","PersonSentenceCalculationPermission","Role","PrisonerMoneyPermission","PrisonerAdjudicationsPermission","permission","PrisonerIncentivesPermission","PersonPrisonCategoryPermission","PrisonerSchedulePermission","UseOfForcePermission","PrisonerAlertsPermission","PrisonerVisitsAndVisitorsPermission","PrisonerBaseLocationPermission","CaseNotesPermission","CorePersonRecordPermission","readCheck","editCheck","sensitiveEditCheck","PersonProtectedCharacteristicsPermission","PersonHealthAndMedicationPermission","PersonalRelationshipsPermission","PathfinderPermission","SOCPermission","ProbationDocumentsPermission","PersonInterventionsPermission","PrisonerBasePermission","PersonCommunicationNeedsPermission","basePath"],"mappings":"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"}