{"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/types/public/permissions/prisoner/PrisonerPermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsPermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyPermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/useOfForce/UseOfForcePermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/useOfForce/UseOfForcePermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerAlerts/PrisonerAlertsPermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerAlerts/PrisonerAlertsPermissionPaths.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksPermissions.ts","../src/types/public/permissions/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksPermissionPaths.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/PrisonerVisitsAndVisitorsPermissions.ts","../src/types/public/permissions/domains/runningAPrison/prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsPermissionPaths.ts","../src/types/public/permissions/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationPermissions.ts","../src/types/public/permissions/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationPermissionPaths.ts","../src/types/public/permissions/domains/runningAPrison/prisonerMoves/PrisonerMovesPermissions.ts","../src/types/public/permissions/domains/runningAPrison/prisonerMoves/PrisonerMovesPermissionPaths.ts","../src/types/public/permissions/domains/runningAPrison/RunningAPrisonDomainPermissionPaths.ts","../src/types/public/permissions/domains/person/caseNotes/CaseNotesPermissions.ts","../src/types/public/permissions/domains/person/caseNotes/CaseNotesPermissionPaths.ts","../src/types/public/permissions/domains/person/corePersonRecord/CorePersonRecordPermissions.ts","../src/types/public/permissions/domains/person/corePersonRecord/CorePersonRecordPermissionPaths.ts","../src/types/public/permissions/domains/person/personProtectedCharacteristics/PersonProtectedCharacteristicsPermissions.ts","../src/types/public/permissions/domains/person/personProtectedCharacteristics/PersonProtectedCharacteristicsPermissionPaths.ts","../src/types/public/permissions/domains/person/personHealthAndMedication/PersonHealthAndMedicationPermissions.ts","../src/types/public/permissions/domains/person/personHealthAndMedication/PersonHealthAndMedicationPermissionPaths.ts","../src/types/public/permissions/domains/person/personalRelationships/PersonalRelationshipsPermissions.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/PathfinderPermissions.ts","../src/types/public/permissions/domains/security/pathfinder/PathfinderPermissionPaths.ts","../src/types/public/permissions/domains/security/soc/SOCPermissions.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/ProbationDocumentsPermissions.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/PersonInterventionsPermissions.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/PersonCommunicationNeedsPermissions.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/services/permissions/utils/PermissionUtils.ts","../src/services/permissions/PrisonerPermissionConditions.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/PrisonNotInCaseloadStatus.ts","../src/services/permissions/checks/baseCheck/status/BaseCheckStatus.ts","../src/services/permissions/utils/PermissionCheckUtils.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/sharedChecks/inUsersCaseLoad/InUsersCaseLoad.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerMoney/prisonerMoneyRead/PrisonerMoneyReadCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerAdjudications/prisonerAdjudicationsRead/PrisonerAdjudicationsReadCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/incentiveLevelHistoryRead/IncentiveLevelHistoryReadCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesCheck.ts","../src/services/permissions/checks/sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom.ts","../src/services/permissions/checks/domains/prisonerSpecific/personPrisonCategory/personPrisonCategoryEdit/PersonPrisonCategoryEditCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryCheck.ts","../src/services/permissions/checks/sharedChecks/inActiveCaseLoadAndUserHasSomeRolesFrom/InActiveCaseLoadAndUserHasSomeRolesFrom.ts","../src/services/permissions/checks/sharedChecks/inActiveCaseLoad/InActiveCaseLoad.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/services/permissions/checks/domains/prisonerSpecific/useOfForce/useOfForceEdit/UseOfForceEditCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/useOfForce/UseOfForceCheck.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/prisonerSpecificRisks/csraRead/CsraAssessmentHistoryReadCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksCheck.ts","../src/services/permissions/checks/domains/prisonerSpecific/PrisonerSpecificCheck.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/moveCell/MoveCellCheck.ts","../src/services/permissions/checks/domains/runningAPrison/prisonerBaseLocation/locationDetailsAndHistoryRead/LocationDetailsAndHistoryReadCheck.ts","../src/services/permissions/checks/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationCheck.ts","../src/services/permissions/checks/domains/runningAPrison/prisonerMoves/PrisonerMovesCheck.ts","../src/services/permissions/checks/domains/runningAPrison/RunningAPrisonCheck.ts","../src/services/permissions/utils/DateUtils.ts","../src/services/permissions/checks/domains/person/caseNotes/CaseNotesReadAndEditCheck.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/CaseNotesCheck.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/services/permissions/checks/domains/person/personProtectedCharacteristics/PersonProtectedCharacteristicsCheck.ts","../src/services/permissions/checks/domains/person/personHealthAndMedication/dietRead/DietReadCheck.ts","../src/services/permissions/checks/domains/person/personHealthAndMedication/dietEdit/DietEditCheck.ts","../src/services/permissions/checks/domains/person/personHealthAndMedication/PersonHealthAndMedicationCheck.ts","../src/services/permissions/checks/sharedChecks/inUsersCaseLoadAndUserHasSomeRolesFrom/InUsersCaseLoadAndUserHasSomeRolesFrom.ts","../src/services/permissions/checks/sharedChecks/inUsersCaseLoadAndUserHasRole/InUsersCaseLoadAndUserHasRole.ts","../src/services/permissions/checks/sharedChecks/contactsReadCheck/contactsReadCheck.ts","../src/services/permissions/checks/domains/person/personalRelationships/PersonalRelationshipsCheck.ts","../src/services/permissions/checks/domains/person/PersonCheck.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/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/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/services/permissions/checks/domains/interventions/personInterventions/PersonInterventionsCheck.ts","../src/services/permissions/checks/domains/interventions/InterventionsCheck.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/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  EXCEEDS_TIME_RESTRICTION = 'EXCEEDS_TIME_RESTRICTION',\n  ROLE_NOT_PRESENT = 'ROLE_NOT_PRESENT',\n  NOT_PRISON_USER = 'NOT_PRISON_USER',\n  READ_ONLY = 'READ_ONLY',\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  logPermissionGrantedByDuplicate(\n    user: HmppsUser,\n    prisoner: Prisoner,\n    duplicateRecords: Prisoner[],\n    permission: PrisonerPermission,\n  ) {\n    if (this.telemetryClient) {\n      this.telemetryClient.trackEvent({\n        name: 'prisoner-permission-requirement-upgraded-by-duplicate',\n        properties: {\n          username: user.username,\n          prisonerNumber: prisoner.prisonerNumber,\n          duplicatePrisonerNumbers: duplicateRecords.map(record => record.prisonerNumber).join(','),\n          activeCaseLoad: user.authSource === 'nomis' && user.activeCaseLoadId,\n          permissionChecked: permission,\n        },\n      })\n    } else {\n      this.logger.info(`Required prisoner permission upgraded by duplicate: ${permission} 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  ExternalMovementsTemporaryAbsenceManagement = 'ROLE_EXTERNAL_MOVEMENTS_TAP_RW',\n  ExternalMovementsTemporaryAbsenceViewOnly = 'ROLE_EXTERNAL_MOVEMENTS_TAP_RO',\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 {\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 PrisonerAdjudicationsPermission {\n  read = 'prisoner:prisoner-adjudications:read',\n}\n\nexport type PrisonerAdjudicationsPermissions = Record<PrisonerAdjudicationsPermission, boolean>\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","export enum PrisonerMoneyPermission {\n  read = 'prisoner:prisoner-money:read',\n}\n\nexport type PrisonerMoneyPermissions = Record<PrisonerMoneyPermission, boolean>\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","export enum PrisonerIncentivesPermission {\n  read_incentive_level = 'prisoner:incentives:incentive-level:read',\n  read_incentive_level_history = 'prisoner:incentives:incentive-level-history:read',\n}\n\nexport type PrisonerIncentivesPermissions = Record<PrisonerIncentivesPermission, boolean>\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_incentive_level]: `domainGroups.prisonerSpecific.prisonerIncentives.${PrisonerIncentivesPermission.read_incentive_level}`,\n  [PrisonerIncentivesPermission.read_incentive_level_history]: `domainGroups.prisonerSpecific.prisonerIncentives.${PrisonerIncentivesPermission.read_incentive_level_history}`,\n}\n","export enum PersonPrisonCategoryPermission {\n  read = 'prisoner:person-prison-category:read',\n  edit = 'prisoner:person-prison-category:edit',\n}\n\nexport type PersonPrisonCategoryPermissions = Record<PersonPrisonCategoryPermission, boolean>\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.read]: `domainGroups.prisonerSpecific.personPrisonCategory.${PersonPrisonCategoryPermission.read}`,\n  [PersonPrisonCategoryPermission.edit]: `domainGroups.prisonerSpecific.personPrisonCategory.${PersonPrisonCategoryPermission.edit}`,\n}\n","export enum PrisonerSchedulePermission {\n  read_schedule = 'prisoner:schedule:read',\n  edit_appointment = 'prisoner:appointment:edit',\n  edit_activity = 'prisoner:activity:edit',\n}\n\nexport type PrisonerSchedulePermissions = Record<PrisonerSchedulePermission, boolean>\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.read_schedule]: `domainGroups.prisonerSpecific.prisonerSchedule.${PrisonerSchedulePermission.read_schedule}`,\n  [PrisonerSchedulePermission.edit_appointment]: `domainGroups.prisonerSpecific.prisonerSchedule.${PrisonerSchedulePermission.edit_appointment}`,\n  [PrisonerSchedulePermission.edit_activity]: `domainGroups.prisonerSpecific.prisonerSchedule.${PrisonerSchedulePermission.edit_activity}`,\n}\n","export enum UseOfForcePermission {\n  edit = 'prisoner:use-of-force:edit',\n}\n\nexport type UseOfForcePermissions = Record<UseOfForcePermission, boolean>\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","export enum PrisonerAlertsPermission {\n  edit = 'prisoner:prisoner-alerts:edit',\n}\n\nexport type PrisonerAlertsPermissions = Record<PrisonerAlertsPermission, boolean>\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","export enum PrisonerSpecificRisksPermission {\n  read_csra_rating = 'prisoner:csra-rating:read',\n  read_csra_assessment_history = 'prisoner:csra-assessment-history:read',\n}\n\nexport type PrisonerSpecificRisksPermissions = Record<PrisonerSpecificRisksPermission, boolean>\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { PrisonerSpecificRisksPermission } from './PrisonerSpecificRisksPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerSpecificRisksPermissionPaths: Record<\n  PrisonerSpecificRisksPermission,\n  Path<PrisonerPermissions>\n> = {\n  [PrisonerSpecificRisksPermission.read_csra_rating]: `domainGroups.prisonerSpecific.prisonerSpecificRisks.${PrisonerSpecificRisksPermission.read_csra_rating}`,\n  [PrisonerSpecificRisksPermission.read_csra_assessment_history]: `domainGroups.prisonerSpecific.prisonerSpecificRisks.${PrisonerSpecificRisksPermission.read_csra_assessment_history}`,\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'\nimport { prisonerSpecificRisksPermissionPaths } from './prisonerSpecificRisks/PrisonerSpecificRisksPermissionPaths'\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  ...prisonerSpecificRisksPermissionPaths,\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","export enum PrisonerVisitsAndVisitorsPermission {\n  read = 'prisoner:prisoner-visits-and-visitors:read',\n}\n\nexport type PrisonerVisitsAndVisitorsPermissions = Record<PrisonerVisitsAndVisitorsPermission, boolean>\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","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 { 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","export enum PrisonerMovesPermission {\n  read_temporary_absence = 'prisoner:temporary-absence:read',\n  edit_temporary_absence = 'prisoner:temporary-absence:edit',\n}\n\nexport type PrisonerMovesPermissions = Record<PrisonerMovesPermission, boolean>\n","import { PrisonerPermissions } from '../../../prisoner/PrisonerPermissions'\nimport { Path } from '../../../../../internal/utils/Path'\nimport { PrisonerMovesPermission } from './PrisonerMovesPermissions'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prisonerMovesPermissionPaths: Record<PrisonerMovesPermission, Path<PrisonerPermissions>> = {\n  [PrisonerMovesPermission.read_temporary_absence]: `domainGroups.runningAPrison.prisonerMoves.${PrisonerMovesPermission.read_temporary_absence}`,\n  [PrisonerMovesPermission.edit_temporary_absence]: `domainGroups.runningAPrison.prisonerMoves.${PrisonerMovesPermission.edit_temporary_absence}`,\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'\nimport { prisonerMovesPermissionPaths } from './prisonerMoves/PrisonerMovesPermissionPaths'\n\n// eslint-disable-next-line import/prefer-default-export\nexport const runningAPrisonDomainPermissionPaths: Record<RunningAPrisonDomainPermission, Path<PrisonerPermissions>> = {\n  ...prisonerVisitsAndVisitorsPermissionPaths,\n  ...prisonerBaseLocationPermissionPaths,\n  ...prisonerMovesPermissionPaths,\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 { 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","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 { 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","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 { 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","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 { 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","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 { 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","export enum PathfinderPermission {\n  read = 'prisoner:pathfinder:read',\n  edit = 'prisoner:pathfinder:edit',\n}\n\nexport type PathfinderPermissions = Record<PathfinderPermission, boolean>\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","export enum SOCPermission {\n  read = 'prisoner:soc:read',\n  edit = 'prisoner:soc:edit',\n}\n\nexport type SOCPermissions = Record<SOCPermission, boolean>\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","export enum ProbationDocumentsPermission {\n  read = 'prisoner:probation-documents:read',\n}\n\nexport type ProbationDocumentsPermissions = Record<ProbationDocumentsPermission, boolean>\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","export enum PersonInterventionsPermission {\n  read_csip = 'prisoner:csip:read',\n  edit_csip = 'prisoner:csip:edit',\n}\n\nexport type PersonInterventionsPermissions = Record<PersonInterventionsPermission, boolean>\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  [PersonInterventionsPermission.edit_csip]: `domainGroups.interventions.personInterventions.${PersonInterventionsPermission.edit_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","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 { 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 { HmppsUser } from '../../../types/internal/user/HmppsUser'\nimport { PrisonerPermission, PrisonerPermissions } from '../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport { Role } from '../../../types/internal/user/Role'\nimport { PermissionCheckStatus } from '../../../types/internal/permissions/PermissionCheckStatus'\nimport PrisonerPermissionsContext from '../../../types/internal/permissions/PrisonerPermissionsContext'\nimport Prisoner from '../../../data/hmppsPrisonerSearch/interfaces/Prisoner'\nimport { prisonerPermissionPaths } from '../../../types/public/permissions/prisoner/PrisonerPermissionPaths'\nimport { isGranted } from '../../../types/public/permissions/prisoner/PrisonerPermissionsUtils'\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  context: PrisonerPermissionsContext,\n  status: PermissionCheckStatus,\n) {\n  const { user, prisoner, baseCheckStatus, requestDependentOn, permissionsLogger } = context\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 const isReleased = (prisoner: Prisoner): boolean => {\n  return !!prisoner?.prisonId && ['OUT'].includes(prisoner.prisonId)\n}\n\nexport const isTransferring = (prisoner: Prisoner): boolean => {\n  return !!prisoner?.prisonId && ['TRN'].includes(prisoner.prisonId)\n}\n\nexport function isReleasedOrTransferring(prisoner: Prisoner): boolean {\n  return isReleased(prisoner) || isTransferring(prisoner)\n}\n\nexport const wasReleasedWithinThreeYears = (prisoner: Prisoner): boolean => {\n  return (\n    isReleased(prisoner) &&\n    !!prisoner.releaseDate &&\n    Date.parse(prisoner.releaseDate) > Date.now() - 3 * 365 * 24 * 60 * 60 * 1000\n  )\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\nexport function setPrisonerPermission(\n  permission: PrisonerPermission,\n  permitted: boolean,\n  permissions: PrisonerPermissions,\n): PrisonerPermissions {\n  const result = structuredClone(permissions)\n  const keys = prisonerPermissionPaths[permission].split('.')\n  const lastKey = keys.pop() as string\n  // @ts-expect-error TS cannot determine object type\n  // eslint-disable-next-line no-return-assign,no-param-reassign\n  const lastObj = keys.reduce((obj: object, key: string) => (obj[key] = obj[key] || {}), result)\n\n  // @ts-expect-error TS cannot determine object type\n  lastObj[lastKey] = permitted\n  return result\n}\n\nexport function upgradePermissions(\n  basePermissions: PrisonerPermissions,\n  additionalPermissions: PrisonerPermissions,\n): PrisonerPermissions {\n  return Object.keys(prisonerPermissionPaths).reduce((updatedPermissions, key) => {\n    const permission = key as PrisonerPermission\n    if (!isGranted(permission, basePermissions)) {\n      const additionalPermissionGranted = isGranted(permission, additionalPermissions)\n      return setPrisonerPermission(permission, additionalPermissionGranted, updatedPermissions)\n    }\n    return updatedPermissions\n  }, structuredClone(basePermissions))\n}\n","import { Role } from '../../types/internal/user/Role'\nimport { PermissionCheckStatus } from '../../types/internal/permissions/PermissionCheckStatus'\nimport { HmppsUser } from '../../types/internal/user/HmppsUser'\nimport Prisoner from '../../data/hmppsPrisonerSearch/interfaces/Prisoner'\nimport {\n  isInUsersCaseLoad,\n  isReleased,\n  isTransferring,\n  userHasAllRoles,\n  userHasSomeRolesFrom,\n} from './utils/PermissionUtils'\n\nexport type PrisonerPermissionStatusFunction = (user: HmppsUser, prisoner: Prisoner) => PermissionCheckStatus\n\nexport interface PrisonerPermissionConditions {\n  allRolesRequired?: Role[]\n  atLeastOneRoleRequiredFrom?: Role[]\n  overridingCondition?: PrisonerPermissionStatusFunction\n  ifRestrictedPatient: PrisonerPermissionStatusFunction\n  ifReleasedPrisoner: PrisonerPermissionStatusFunction\n  ifTransferringPrisoner: PrisonerPermissionStatusFunction\n  ifPrisonNotInCaseload: PrisonerPermissionStatusFunction\n  ifPrisonInCaseload: PrisonerPermissionStatusFunction\n}\n\nexport function getPermissionStatus(\n  user: HmppsUser,\n  prisoner: Prisoner,\n  conditions: PrisonerPermissionConditions,\n): PermissionCheckStatus {\n  // Currently we always require that the user is a Prison User:\n  if (user.authSource !== 'nomis') return PermissionCheckStatus.NOT_PRISON_USER\n\n  // Check if any blanket user roles are required:\n  if (!userHasAdditionalRequiredRoles(user, conditions)) return PermissionCheckStatus.ROLE_NOT_PRESENT\n\n  // Check if there's an overriding condition that takes precedence:\n  if (conditions.overridingCondition) return conditions.overridingCondition(user, prisoner)\n\n  // Restricted patients:\n  if (prisoner.restrictedPatient) return conditions.ifRestrictedPatient(user, prisoner)\n\n  // Released prisoners:\n  if (isReleased(prisoner)) return conditions.ifReleasedPrisoner(user, prisoner)\n\n  // Transferring prisoners:\n  if (isTransferring(prisoner)) return conditions.ifTransferringPrisoner(user, prisoner)\n\n  // When prisoner is outside user's caseload:\n  if (!isInUsersCaseLoad(prisoner.prisonId, user)) return conditions.ifPrisonNotInCaseload(user, prisoner)\n\n  // When prisoner IS inside user's caseload:\n  return conditions.ifPrisonInCaseload(user, prisoner)\n}\n\nfunction userHasAdditionalRequiredRoles(user: HmppsUser, conditions: PrisonerPermissionConditions): boolean {\n  if (conditions.allRolesRequired && !userHasAllRoles(conditions.allRolesRequired, user)) {\n    return false\n  }\n\n  if (conditions.atLeastOneRoleRequiredFrom && !userHasSomeRolesFrom(conditions.atLeastOneRoleRequiredFrom, user)) {\n    return false\n  }\n\n  return true\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 userHasSupportingPrisonInTheirCaseLoad = isInUsersCaseLoad(prisoner.supportingPrisonId, user)\n  const userIsPomUserWithSupportingPrisonInTheirCaseLoad = pomUser && userHasSupportingPrisonInTheirCaseLoad\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","import { userHasSomeRolesFrom } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport { HmppsUser } from '../../../../../types/internal/user/HmppsUser'\nimport { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\n\n/*\n * Prisoners in prisons outside the user's caseload can be accessed in the following circumstances:\n * - The user has the \"Global search\" role\n */\nexport default function prisonNotInCaseLoadStatus(user: HmppsUser): PermissionCheckStatus {\n  const globalSearchUser = userHasSomeRolesFrom([Role.GlobalSearch], user)\n\n  if (globalSearchUser) return PermissionCheckStatus.OK\n\n  return PermissionCheckStatus.NOT_IN_CASELOAD\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 { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport restrictedPatientStatus from './RestrictedPatientStatus'\nimport releasedPrisonerStatus from './ReleasedPrisonerStatus'\nimport transferringPrisonerStatus from './TransferringPrisonerStatus'\nimport {\n  getPermissionStatus,\n  PrisonerPermissionConditions,\n  PrisonerPermissionStatusFunction,\n} from '../../../PrisonerPermissionConditions'\nimport prisonNotInCaseloadStatus from './PrisonNotInCaseloadStatus'\n\nexport const baseCheckConditions: PrisonerPermissionConditions = {\n  ifRestrictedPatient: restrictedPatientStatus,\n  ifReleasedPrisoner: releasedPrisonerStatus,\n  ifTransferringPrisoner: transferringPrisonerStatus,\n  ifPrisonNotInCaseload: prisonNotInCaseloadStatus,\n  ifPrisonInCaseload: () => PermissionCheckStatus.OK,\n}\n\nexport const baseCheckStatus: PrisonerPermissionStatusFunction = (user, prisoner) =>\n  getPermissionStatus(user, prisoner, baseCheckConditions)\n","import PrisonerPermissionsContext from '../../../types/internal/permissions/PrisonerPermissionsContext'\nimport { PrisonerPermission } from '../../../types/public/permissions/prisoner/PrisonerPermissions'\nimport { getPermissionStatus, PrisonerPermissionConditions } from '../PrisonerPermissionConditions'\nimport { PermissionCheckStatus } from '../../../types/internal/permissions/PermissionCheckStatus'\nimport { baseCheckConditions } from '../checks/baseCheck/status/BaseCheckStatus'\nimport { logDeniedPermissionCheck } from './PermissionUtils'\n\nexport const matchBaseCheckAnd =\n  (additionalConditions: Partial<PrisonerPermissionConditions>) =>\n  (permission: PrisonerPermission, context: PrisonerPermissionsContext) => {\n    const { user, prisoner, baseCheckStatus, readOnly } = context\n\n    const baseCheckPassed = baseCheckStatus === PermissionCheckStatus.OK\n    const readOnlyCheckPassed = readOnly ? permission.endsWith(':read') : true\n\n    const permissionStatus = readOnlyCheckPassed\n      ? getPermissionStatus(user, prisoner, {\n          ...baseCheckConditions,\n          ...additionalConditions,\n        })\n      : PermissionCheckStatus.READ_ONLY\n\n    const permissionCheckPassed = baseCheckPassed && permissionStatus === PermissionCheckStatus.OK\n\n    if (!permissionCheckPassed) logDeniedPermissionCheck(permission, context, permissionStatus)\n\n    return permissionCheckPassed\n  }\n\nexport const checkWith =\n  (context: PrisonerPermissionsContext) =>\n  <P extends keyof T, T>(\n    permission: P,\n    check: (permission: PrisonerPermission, context: PrisonerPermissionsContext) => boolean,\n  ): Pick<T, P> => {\n    return { [permission]: check(permission as PrisonerPermission, context) } as Pick<T, P>\n  }\n","import { Role } from '../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../utils/PermissionCheckUtils'\n\nconst baseCheckAndUserHasAllRoles = (roles: Role[]) => matchBaseCheckAnd({ allRolesRequired: roles })\n\nexport default baseCheckAndUserHasAllRoles\n","import { Role } from '../../../../../types/internal/user/Role'\nimport baseCheckAndUserHasAllRoles from '../baseCheckAndUserHasAllRoles/BaseCheckAndUserHasAllRoles'\n\nconst baseCheckAndUserHasRole = (role: Role) => baseCheckAndUserHasAllRoles([role])\n\nexport default baseCheckAndUserHasRole\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport baseCheckAndUserHasRole from '../../../../sharedChecks/baseCheckAndUserHasRole/BaseCheckAndUserHasRole'\n\nconst sentenceCalculationReadCheck = baseCheckAndUserHasRole(Role.ReleaseDatesCalculator)\n\nexport default sentenceCalculationReadCheck\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport baseCheckAndUserHasRole from '../../../../sharedChecks/baseCheckAndUserHasRole/BaseCheckAndUserHasRole'\n\nconst sentenceCalculationEditAdjustmentCheck = baseCheckAndUserHasRole(Role.AdjustmentsMaintainer)\n\nexport default sentenceCalculationEditAdjustmentCheck\n","import {\n  PersonSentenceCalculationPermission,\n  PersonSentenceCalculationPermissions,\n} from '../../../../../../types/public/permissions/domains/sentenceAndOffence/personSentenceCalculation/PersonSentenceCalculationPermissions'\nimport sentenceCalculationReadCheck from './sentenceCalculationRead/SentenceCalculationReadCheck'\nimport PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport sentenceCalculationEditAdjustmentCheck from './sentenceCalculationAdjustmentEdit/SentenceCalculationEditAdjustmentCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function personSentenceCalculationCheck(\n  context: PrisonerPermissionsContext,\n): PersonSentenceCalculationPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PersonSentenceCalculationPermission.read, sentenceCalculationReadCheck),\n    ...check(PersonSentenceCalculationPermission.edit_adjustments, sentenceCalculationEditAdjustmentCheck),\n  }\n}\n","import { SentenceAndOffenceDomainPermissions } from '../../../../../types/public/permissions/domains/sentenceAndOffence/SentenceAndOffenceDomainPermissions'\nimport PrisonerPermissionsContext from '../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport personSentenceCalculationCheck from './personSentenceCalculation/PersonSentenceCalculationCheck'\n\nexport default function sentenceAndOffenceCheck(\n  context: PrisonerPermissionsContext,\n): SentenceAndOffenceDomainPermissions {\n  return {\n    personSentenceCalculation: personSentenceCalculationCheck(context),\n  }\n}\n","import { matchBaseCheckAnd } from '../../utils/PermissionCheckUtils'\n\nconst baseCheck = matchBaseCheckAnd({})\n\nexport default baseCheck\n","import { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { matchBaseCheckAnd } from '../../../utils/PermissionCheckUtils'\nimport { isInUsersCaseLoad } from '../../../utils/PermissionUtils'\n\nconst inUsersCaseLoad = matchBaseCheckAnd({\n  overridingCondition: (user, prisoner) =>\n    isInUsersCaseLoad(prisoner.prisonId, user) ? PermissionCheckStatus.OK : PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default inUsersCaseLoad\n","import inUsersCaseLoad from '../../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\n\nconst prisonerMoneyReadCheck = inUsersCaseLoad\n\nexport default prisonerMoneyReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport {\n  PrisonerMoneyPermission,\n  PrisonerMoneyPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerMoney/PrisonerMoneyPermissions'\nimport prisonerMoneyReadCheck from './prisonerMoneyRead/PrisonerMoneyReadCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function prisonerMoneyCheck(context: PrisonerPermissionsContext): PrisonerMoneyPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PrisonerMoneyPermission.read, prisonerMoneyReadCheck),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, userHasSomeRolesFrom } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst prisonerAdjudicationsReadCheck = matchBaseCheckAnd({\n  overridingCondition: (user, prisoner) =>\n    isInUsersCaseLoad(prisoner.prisonId, user) || userHasSomeRolesFrom([Role.PomUser, Role.ReceptionUser], user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default prisonerAdjudicationsReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport prisonerAdjudicationsReadCheck from './prisonerAdjudicationsRead/PrisonerAdjudicationsReadCheck'\nimport {\n  PrisonerAdjudicationsPermission,\n  PrisonerAdjudicationsPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerAdjudications/PrisonerAdjudicationsPermissions'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function prisonerAdjudicationsCheck(\n  context: PrisonerPermissionsContext,\n): PrisonerAdjudicationsPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PrisonerAdjudicationsPermission.read, prisonerAdjudicationsReadCheck),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { userHasSomeRolesFrom } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst incentiveLevelHistoryReadCheck = matchBaseCheckAnd({\n  // Transferring prisoner incentive history can only be accessed by users with the Global Search role:\n  ifTransferringPrisoner: user =>\n    userHasSomeRolesFrom([Role.GlobalSearch], user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.PRISONER_IS_TRANSFERRING,\n\n  // Global search is not sufficient for incentive level history access:\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default incentiveLevelHistoryReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport {\n  PrisonerIncentivesPermission,\n  PrisonerIncentivesPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissions'\nimport baseCheck from '../../../baseCheck/BaseCheck'\nimport incentiveLevelHistoryReadCheck from './incentiveLevelHistoryRead/IncentiveLevelHistoryReadCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function prisonerIncentivesCheck(context: PrisonerPermissionsContext): PrisonerIncentivesPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PrisonerIncentivesPermission.read_incentive_level, baseCheck),\n    ...check(PrisonerIncentivesPermission.read_incentive_level_history, incentiveLevelHistoryReadCheck),\n  }\n}\n","import { Role } from '../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../utils/PermissionCheckUtils'\n\nconst baseCheckAndUserHasSomeRolesFrom = (roles: Role[]) => matchBaseCheckAnd({ atLeastOneRoleRequiredFrom: roles })\n\nexport default baseCheckAndUserHasSomeRolesFrom\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\n\nconst personPrisonCategoryEditCheck = baseCheckAndUserHasSomeRolesFrom([\n  Role.CreateCategorisation,\n  Role.CreateRecategorisation,\n  Role.ApproveCategorisation,\n  Role.CategorisationSecurity,\n])\n\nexport default personPrisonCategoryEditCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport personPrisonCategoryEditCheck from './personPrisonCategoryEdit/PersonPrisonCategoryEditCheck'\nimport {\n  PersonPrisonCategoryPermission,\n  PersonPrisonCategoryPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissions'\nimport baseCheck from '../../../baseCheck/BaseCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function personPrisonCategoryCheck(\n  context: PrisonerPermissionsContext,\n): PersonPrisonCategoryPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PersonPrisonCategoryPermission.read, baseCheck),\n    ...check(PersonPrisonCategoryPermission.edit, personPrisonCategoryEditCheck),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isActiveCaseLoad, userHasSomeRolesFrom } from '../../../utils/PermissionUtils'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../utils/PermissionCheckUtils'\n\nconst inActiveCaseLoadAndUserHasSomeRolesFrom = (roles: Role[]) =>\n  matchBaseCheckAnd({\n    overridingCondition: (user, prisoner) => {\n      if (!userHasSomeRolesFrom(roles, user)) return PermissionCheckStatus.ROLE_NOT_PRESENT\n\n      return isActiveCaseLoad(prisoner.prisonId, user)\n        ? PermissionCheckStatus.OK\n        : PermissionCheckStatus.NOT_ACTIVE_CASELOAD\n    },\n  })\n\nexport default inActiveCaseLoadAndUserHasSomeRolesFrom\n","import inActiveCaseLoadAndUserHasSomeRolesFrom from '../inActiveCaseLoadAndUserHasSomeRolesFrom/InActiveCaseLoadAndUserHasSomeRolesFrom'\n\nconst inActiveCaseLoad = inActiveCaseLoadAndUserHasSomeRolesFrom([])\n\nexport default inActiveCaseLoad\n","import inActiveCaseLoad from '../../../../sharedChecks/inActiveCaseLoad/InActiveCaseLoad'\n\nconst prisonerAppointmentEditCheck = inActiveCaseLoad\n\nexport default prisonerAppointmentEditCheck\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isActiveCaseLoad, userHasRole } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst prisonerActivityEditCheck = matchBaseCheckAnd({\n  overridingCondition: (user, prisoner) => {\n    if (!userHasRole(Role.ActivityHub, user)) return PermissionCheckStatus.ROLE_NOT_PRESENT\n    if (!isActiveCaseLoad(prisoner.prisonId, user)) return PermissionCheckStatus.NOT_ACTIVE_CASELOAD\n    return PermissionCheckStatus.OK\n  },\n})\n\nexport default prisonerActivityEditCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport prisonerAppointmentEditCheck from './prisonerAppointmentEdit/PrisonerAppointmentEditCheck'\nimport {\n  PrisonerSchedulePermission,\n  PrisonerSchedulePermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerSchedule/PrisonerSchedulePermissions'\nimport prisonerActivityEditCheck from './prisonerActivityEdit/PrisonerActivityEditCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\nimport inUsersCaseLoad from '../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\n\nexport default function prisonerScheduleCheck(context: PrisonerPermissionsContext): PrisonerSchedulePermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PrisonerSchedulePermission.read_schedule, inUsersCaseLoad),\n    ...check(PrisonerSchedulePermission.edit_appointment, prisonerAppointmentEditCheck),\n    ...check(PrisonerSchedulePermission.edit_activity, prisonerActivityEditCheck),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { userHasRole } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\nimport { HmppsUser } from '../../../../../../../types/internal/user/HmppsUser'\n\nconst requiresInactiveBookingRole = (user: HmppsUser) =>\n  userHasRole(Role.InactiveBookings, user) ? PermissionCheckStatus.OK : PermissionCheckStatus.NOT_IN_CASELOAD\n\nconst useOfForceEditCheck = matchBaseCheckAnd({\n  ifRestrictedPatient: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n  ifReleasedPrisoner: requiresInactiveBookingRole,\n  ifTransferringPrisoner: requiresInactiveBookingRole,\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n  ifPrisonInCaseload: () => PermissionCheckStatus.OK,\n})\n\nexport default useOfForceEditCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport useOfForceEditCheck from './useOfForceEdit/UseOfForceEditCheck'\nimport {\n  UseOfForcePermission,\n  UseOfForcePermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/useOfForce/UseOfForcePermissions'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function useOfForceCheck(context: PrisonerPermissionsContext): UseOfForcePermissions {\n  const check = checkWith(context)\n  return {\n    ...check(UseOfForcePermission.edit, useOfForceEditCheck),\n  }\n}\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport { userHasRole } from '../../../../../utils/PermissionUtils'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst prisonerAlertsEditCheck = matchBaseCheckAnd({\n  atLeastOneRoleRequiredFrom: [Role.UpdateAlert],\n\n  // For transferring prisoners, only the Inactive Bookings role is acceptable,\n  // Global Search role is not sufficient:\n  ifTransferringPrisoner: user =>\n    userHasRole(Role.InactiveBookings, user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.PRISONER_IS_TRANSFERRING,\n\n  // Global search does NOT allow edit access to alerts for prisoners outside of user's caseload:\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default prisonerAlertsEditCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport prisonerAlertsEditCheck from './prisonerAlertsEdit/PrisonerAlertsEditCheck'\nimport {\n  PrisonerAlertsPermission,\n  PrisonerAlertsPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerAlerts/PrisonerAlertsPermissions'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function prisonerAlertsCheck(context: PrisonerPermissionsContext): PrisonerAlertsPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PrisonerAlertsPermission.edit, prisonerAlertsEditCheck),\n  }\n}\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport { userHasRole } from '../../../../../utils/PermissionUtils'\nimport { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst csraAssessmentHistoryReadCheck = matchBaseCheckAnd({\n  ifRestrictedPatient: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n  ifReleasedPrisoner: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n\n  // The Inactive Bookings role is NOT sufficient to access CSRA history for transferring prisoners:\n  ifTransferringPrisoner: user =>\n    userHasRole(Role.GlobalSearch, user) ? PermissionCheckStatus.OK : PermissionCheckStatus.PRISONER_IS_TRANSFERRING,\n\n  ifPrisonInCaseload: () => PermissionCheckStatus.OK,\n})\n\nexport default csraAssessmentHistoryReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport {\n  PrisonerSpecificRisksPermission,\n  PrisonerSpecificRisksPermissions,\n} from '../../../../../../types/public/permissions/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksPermissions'\nimport csraAssessmentHistoryReadCheck from './csraRead/CsraAssessmentHistoryReadCheck'\nimport baseCheck from '../../../baseCheck/BaseCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function prisonerSpecificRisksCheck(\n  context: PrisonerPermissionsContext,\n): PrisonerSpecificRisksPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PrisonerSpecificRisksPermission.read_csra_rating, baseCheck),\n    ...check(PrisonerSpecificRisksPermission.read_csra_assessment_history, csraAssessmentHistoryReadCheck),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../types/internal/permissions/PrisonerPermissionsContext'\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'\nimport prisonerSpecificRisksCheck from './prisonerSpecificRisks/PrisonerSpecificRisksCheck'\n\nexport default function prisonerSpecificCheck(context: PrisonerPermissionsContext): PrisonerSpecificDomainPermissions {\n  return {\n    prisonerMoney: prisonerMoneyCheck(context),\n    prisonerAdjudications: prisonerAdjudicationsCheck(context),\n    prisonerIncentives: prisonerIncentivesCheck(context),\n    personPrisonCategory: personPrisonCategoryCheck(context),\n    prisonerSchedule: prisonerScheduleCheck(context),\n    useOfForce: useOfForceCheck(context),\n    prisonerAlerts: prisonerAlertsCheck(context),\n    prisonerSpecificRisks: prisonerSpecificRisksCheck(context),\n  }\n}\n","import inUsersCaseLoad from '../../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\n\nconst prisonerVisitsAndVisitorsReadCheck = inUsersCaseLoad\n\nexport default prisonerVisitsAndVisitorsReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport {\n  PrisonerVisitsAndVisitorsPermission,\n  PrisonerVisitsAndVisitorsPermissions,\n} from '../../../../../../types/public/permissions/domains/runningAPrison/prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsPermissions'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\nimport prisonerVisitsAndVisitorsReadCheck from './prisonerVisitsAndVisitorsRead/PrisonerVisitsAndVisitorsReadCheck'\n\nexport default function prisonerVisitsAndVisitorsCheck(\n  context: PrisonerPermissionsContext,\n): PrisonerVisitsAndVisitorsPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PrisonerVisitsAndVisitorsPermission.read, prisonerVisitsAndVisitorsReadCheck),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst moveCellCheck = matchBaseCheckAnd({\n  atLeastOneRoleRequiredFrom: [Role.CellMove],\n\n  // Global search access is not allowed:\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default moveCellCheck\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst locationDetailsAndHistoryReadCheck = matchBaseCheckAnd({\n  // Global search access is not allowed:\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default locationDetailsAndHistoryReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport moveCellCheck from './moveCell/MoveCellCheck'\nimport {\n  PrisonerBaseLocationPermission,\n  PrisonerBaseLocationPermissions,\n} from '../../../../../../types/public/permissions/domains/runningAPrison/prisonerBaseLocation/PrisonerBaseLocationPermissions'\nimport locationDetailsAndHistoryReadCheck from './locationDetailsAndHistoryRead/LocationDetailsAndHistoryReadCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function prisonerBaseLocationCheck(\n  context: PrisonerPermissionsContext,\n): PrisonerBaseLocationPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PrisonerBaseLocationPermission.read_location_details, locationDetailsAndHistoryReadCheck),\n    ...check(PrisonerBaseLocationPermission.read_location_history, locationDetailsAndHistoryReadCheck),\n    ...check(PrisonerBaseLocationPermission.move_cell, moveCellCheck),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\nimport {\n  PrisonerMovesPermission,\n  PrisonerMovesPermissions,\n} from '../../../../../../types/public/permissions/domains/runningAPrison/prisonerMoves/PrisonerMovesPermissions'\nimport baseCheckAndUserHasRole from '../../../sharedChecks/baseCheckAndUserHasRole/BaseCheckAndUserHasRole'\nimport { Role } from '../../../../../../types/internal/user/Role'\nimport baseCheckAndUserHasSomeRolesFrom from '../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\n\nexport default function prisonerMovesCheck(context: PrisonerPermissionsContext): PrisonerMovesPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(\n      PrisonerMovesPermission.read_temporary_absence,\n      baseCheckAndUserHasSomeRolesFrom([\n        Role.ExternalMovementsTemporaryAbsenceViewOnly,\n        Role.ExternalMovementsTemporaryAbsenceManagement,\n      ]),\n    ),\n    ...check(\n      PrisonerMovesPermission.edit_temporary_absence,\n      baseCheckAndUserHasRole(Role.ExternalMovementsTemporaryAbsenceManagement),\n    ),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport { RunningAPrisonDomainPermissions } from '../../../../../types/public/permissions/domains/runningAPrison/RunningAPrisonDomainPermissions'\nimport prisonerVisitsAndVisitorsCheck from './prisonerVisitsAndVisitors/PrisonerVisitsAndVisitorsCheck'\nimport prisonerBaseLocationCheck from './prisonerBaseLocation/PrisonerBaseLocationCheck'\nimport prisonerMovesCheck from './prisonerMoves/PrisonerMovesCheck'\n\nexport default function runningAPrisonCheck(context: PrisonerPermissionsContext): RunningAPrisonDomainPermissions {\n  return {\n    prisonerVisitsAndVisitors: prisonerVisitsAndVisitorsCheck(context),\n    prisonerBaseLocation: prisonerBaseLocationCheck(context),\n    prisonerMoves: prisonerMovesCheck(context),\n  }\n}\n","export function getCurrentDateMinusDaysAsString(currentDateInMs: number, daysToSubtract: number): string {\n  return new Date(currentDateInMs - daysToMilliseconds(daysToSubtract)).toISOString().split('T')[0]\n}\n\nexport function daysToMilliseconds(days: number): number {\n  return days * 24 * 60 * 60 * 1000\n}\n\nexport function isDateWithinBounds(\n  dateToCheckInMs: number,\n  upperDateBoundInMs: number,\n  lowerDateBoundInMs: number,\n): boolean {\n  return dateToCheckInMs <= upperDateBoundInMs && lowerDateBoundInMs <= dateToCheckInMs\n}\n","import { PermissionCheckStatus } from '../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { isInUsersCaseLoad, userHasAllRoles, userHasRole } from '../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../types/internal/user/Role'\nimport { HmppsUser } from '../../../../../../types/internal/user/HmppsUser'\nimport Prisoner from '../../../../../../data/hmppsPrisonerSearch/interfaces/Prisoner'\nimport { daysToMilliseconds, isDateWithinBounds } from '../../../../utils/DateUtils'\nimport { matchBaseCheckAnd } from '../../../../utils/PermissionCheckUtils'\nimport { PrisonerPermissionConditions } from '../../../../PrisonerPermissionConditions'\n\nconst caseNotesAccessPeriodPostTransferInMs = daysToMilliseconds(90)\n\nexport const caseNotesReadAndEditConditions: Partial<PrisonerPermissionConditions> = {\n  ifTransferringPrisoner: user => {\n    return userHasRole(Role.InactiveBookings, user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.PRISONER_IS_TRANSFERRING\n  },\n\n  ifPrisonNotInCaseload: (user, prisoner) => {\n    if (!userHasAllRoles([Role.GlobalSearch, Role.PomUser], user)) return PermissionCheckStatus.ROLE_NOT_PRESENT\n\n    // Case notes for prisoners outside the user's caseload are only accessible with both Global Search and POM roles\n    // if the prisoner was previously in one of the users caseloads in the 30 days:\n    return checkTimeBasedAccessToCaseNotesPostTransfer(user, prisoner, caseNotesAccessPeriodPostTransferInMs)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.NOT_PERMITTED\n  },\n}\n\nconst caseNotesReadAndEditCheck = matchBaseCheckAnd(caseNotesReadAndEditConditions)\n\nexport default caseNotesReadAndEditCheck\n\nfunction checkTimeBasedAccessToCaseNotesPostTransfer(\n  user: HmppsUser,\n  prisoner: Prisoner,\n  timePeriodForAccessPostTransferInMilliseconds: number,\n): boolean {\n  if (!isInUsersCaseLoad(prisoner.previousPrisonId, user) || !prisoner.previousPrisonLeavingDate) return false\n\n  const previousPrisonLeavingDate = Date.parse(prisoner.previousPrisonLeavingDate)\n  const today = Date.now()\n\n  return isDateWithinBounds(previousPrisonLeavingDate, today, today - timePeriodForAccessPostTransferInMilliseconds)\n}\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\nimport { caseNotesReadAndEditConditions } from '../CaseNotesReadAndEditCheck'\n\nconst sensitiveCaseNotesReadCheck = matchBaseCheckAnd({\n  ...caseNotesReadAndEditConditions,\n  atLeastOneRoleRequiredFrom: [Role.PomUser, Role.ViewSensitiveCaseNotes, Role.AddSensitiveCaseNotes],\n})\n\nexport default sensitiveCaseNotesReadCheck\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\nimport { caseNotesReadAndEditConditions } from '../CaseNotesReadAndEditCheck'\n\nconst sensitiveCaseNotesDeleteCheck = matchBaseCheckAnd({\n  ...caseNotesReadAndEditConditions,\n  atLeastOneRoleRequiredFrom: [Role.DeleteSensitiveCaseNotes],\n})\n\nexport default sensitiveCaseNotesDeleteCheck\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\nimport { caseNotesReadAndEditConditions } from '../CaseNotesReadAndEditCheck'\n\nconst sensitiveCaseNotesEditCheck = matchBaseCheckAnd({\n  ...caseNotesReadAndEditConditions,\n  atLeastOneRoleRequiredFrom: [Role.PomUser, Role.AddSensitiveCaseNotes],\n})\n\nexport default sensitiveCaseNotesEditCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\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 { checkWith } from '../../../../utils/PermissionCheckUtils'\nimport caseNotesReadAndEditCheck from './CaseNotesReadAndEditCheck'\n\nexport default function caseNotesCheck(context: PrisonerPermissionsContext): CaseNotesPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(CaseNotesPermission.read, caseNotesReadAndEditCheck),\n    ...check(CaseNotesPermission.edit, caseNotesReadAndEditCheck),\n    ...check(CaseNotesPermission.read_sensitive, sensitiveCaseNotesReadCheck),\n    ...check(CaseNotesPermission.delete_sensitive, sensitiveCaseNotesDeleteCheck),\n    ...check(CaseNotesPermission.edit_sensitive, sensitiveCaseNotesEditCheck),\n  }\n}\n","import inActiveCaseLoad from '../inActiveCaseLoad/InActiveCaseLoad'\n\nconst prisonerProfileEditCheck = inActiveCaseLoad\n\nexport default prisonerProfileEditCheck\n","import { Role } from '../../../../../types/internal/user/Role'\nimport inActiveCaseLoadAndUserHasSomeRolesFrom from '../inActiveCaseLoadAndUserHasSomeRolesFrom/InActiveCaseLoadAndUserHasSomeRolesFrom'\n\nconst inActiveCaseLoadAndUserHasRole = (role: Role) => inActiveCaseLoadAndUserHasSomeRolesFrom([role])\n\nexport default inActiveCaseLoadAndUserHasRole\n","import { Role } from '../../../../../types/internal/user/Role'\nimport inActiveCaseLoadAndUserHasRole from '../inActiveCaseLoadAndUserHasRole/InActiveCaseLoadAndUserHasRole'\n\nconst prisonerProfileSensitiveEditCheck = inActiveCaseLoadAndUserHasRole(Role.PrisonerProfileSensitiveEdit)\n\nexport default prisonerProfileSensitiveEditCheck\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { userHasRole } from '../../../../../utils/PermissionUtils'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst photoReadCheck = matchBaseCheckAnd({\n  // Photos are only accessible for transferring prisoners if the user has the Inactive Bookings role\n  // (Global Search is NOT sufficient):\n  ifTransferringPrisoner: user =>\n    userHasRole(Role.InactiveBookings, user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.PRISONER_IS_TRANSFERRING,\n\n  // Global search does NOT permit access to photo:\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default photoReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\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'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\nimport inUsersCaseLoad from '../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\n\nexport default function corePersonRecordCheck(context: PrisonerPermissionsContext): CorePersonRecordPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(CorePersonRecordPermission.read_photo, photoReadCheck),\n    ...check(\n      CorePersonRecordPermission.edit_photo,\n      inActiveCaseLoadAndUserHasSomeRolesFrom([Role.PrisonerProfileSensitiveEdit, Role.PrisonerProfilePhotoUpload]),\n    ),\n\n    ...check(CorePersonRecordPermission.read_physical_characteristics, baseCheck),\n    ...check(CorePersonRecordPermission.edit_physical_characteristics, prisonerProfileEditCheck),\n\n    ...check(CorePersonRecordPermission.read_place_of_birth, inUsersCaseLoad),\n    ...check(CorePersonRecordPermission.edit_place_of_birth, prisonerProfileSensitiveEditCheck),\n\n    ...check(CorePersonRecordPermission.read_military_history, baseCheck),\n    ...check(CorePersonRecordPermission.edit_military_history, prisonerProfileEditCheck),\n\n    ...check(CorePersonRecordPermission.read_name_and_aliases, baseCheck),\n    ...check(CorePersonRecordPermission.edit_name_and_aliases, prisonerProfileSensitiveEditCheck),\n\n    ...check(CorePersonRecordPermission.read_date_of_birth, baseCheck),\n    ...check(CorePersonRecordPermission.edit_date_of_birth, prisonerProfileSensitiveEditCheck),\n\n    ...check(CorePersonRecordPermission.read_address, baseCheck),\n    ...check(CorePersonRecordPermission.edit_address, prisonerProfileSensitiveEditCheck),\n\n    ...check(CorePersonRecordPermission.read_nationality, inUsersCaseLoad),\n    ...check(CorePersonRecordPermission.edit_nationality, prisonerProfileSensitiveEditCheck),\n\n    ...check(CorePersonRecordPermission.read_identifiers, baseCheck),\n    ...check(CorePersonRecordPermission.edit_identifiers, prisonerProfileSensitiveEditCheck),\n\n    ...check(CorePersonRecordPermission.read_phone_numbers, baseCheck),\n    ...check(CorePersonRecordPermission.edit_phone_numbers, prisonerProfileSensitiveEditCheck),\n\n    ...check(CorePersonRecordPermission.read_email_addresses, baseCheck),\n    ...check(CorePersonRecordPermission.edit_email_addresses, prisonerProfileSensitiveEditCheck),\n\n    ...check(CorePersonRecordPermission.read_distinguishing_marks, baseCheck),\n    ...check(CorePersonRecordPermission.edit_distinguishing_marks, prisonerProfileSensitiveEditCheck),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\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'\nimport inUsersCaseLoad from '../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function personProtectedCharacteristicsCheck(\n  context: PrisonerPermissionsContext,\n): PersonProtectedCharacteristicsPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PersonProtectedCharacteristicsPermission.read_sexual_orientation, inUsersCaseLoad),\n    ...check(PersonProtectedCharacteristicsPermission.edit_sexual_orientation, prisonerProfileSensitiveEditCheck),\n\n    ...check(PersonProtectedCharacteristicsPermission.read_religion_and_belief, inUsersCaseLoad),\n    ...check(PersonProtectedCharacteristicsPermission.edit_religion_and_belief, prisonerProfileEditCheck),\n\n    ...check(PersonProtectedCharacteristicsPermission.read_ethnicity, baseCheck),\n    ...check(PersonProtectedCharacteristicsPermission.edit_ethnicity, prisonerProfileSensitiveEditCheck),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\nimport { isInUsersCaseLoad } from '../../../../../utils/PermissionUtils'\n\nconst dietReadCheck = matchBaseCheckAnd({\n  ifRestrictedPatient: (user, prisoner) =>\n    isInUsersCaseLoad(prisoner.supportingPrisonId, user)\n      ? PermissionCheckStatus.OK\n      : PermissionCheckStatus.RESTRICTED_PATIENT,\n  ifReleasedPrisoner: () => PermissionCheckStatus.PRISONER_IS_RELEASED,\n  ifTransferringPrisoner: () => PermissionCheckStatus.PRISONER_IS_TRANSFERRING,\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default dietReadCheck\n","import { Role } from '../../../../../../../types/internal/user/Role'\nimport inActiveCaseLoadAndUserHasRole from '../../../../sharedChecks/inActiveCaseLoadAndUserHasRole/InActiveCaseLoadAndUserHasRole'\n\nconst dietEditCheck = inActiveCaseLoadAndUserHasRole(Role.DietAndAllergiesEdit)\n\nexport default dietEditCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\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 dietReadCheck from './dietRead/DietReadCheck'\nimport dietEditCheck from './dietEdit/DietEditCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\nimport inUsersCaseLoad from '../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\n\nexport default function personHealthAndMedicationCheck(\n  context: PrisonerPermissionsContext,\n): PersonHealthAndMedicationPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PersonHealthAndMedicationPermission.read_pregnancy, baseCheck),\n    ...check(PersonHealthAndMedicationPermission.edit_pregnancy, prisonerProfileEditCheck),\n\n    ...check(PersonHealthAndMedicationPermission.read_smoker, inUsersCaseLoad),\n    ...check(PersonHealthAndMedicationPermission.edit_smoker, prisonerProfileEditCheck),\n\n    ...check(PersonHealthAndMedicationPermission.read_diet, dietReadCheck),\n    ...check(PersonHealthAndMedicationPermission.edit_diet, dietEditCheck),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../utils/PermissionCheckUtils'\nimport { isInUsersCaseLoad, userHasSomeRolesFrom } from '../../../utils/PermissionUtils'\n\nconst inUsersCaseLoadAndUserHasSomeRolesFrom = (roles: Role[]) =>\n  matchBaseCheckAnd({\n    overridingCondition: (user, prisoner) => {\n      if (!isInUsersCaseLoad(prisoner.prisonId, user)) return PermissionCheckStatus.NOT_IN_CASELOAD\n      if (!userHasSomeRolesFrom(roles, user)) return PermissionCheckStatus.ROLE_NOT_PRESENT\n      return PermissionCheckStatus.OK\n    },\n  })\n\nexport default inUsersCaseLoadAndUserHasSomeRolesFrom\n","import { Role } from '../../../../../types/internal/user/Role'\nimport inUsersCaseLoadAndUserHasSomeRolesFrom from '../inUsersCaseLoadAndUserHasSomeRolesFrom/InUsersCaseLoadAndUserHasSomeRolesFrom'\n\nconst inUsersCaseLoadAndUserHasRole = (role: Role) => inUsersCaseLoadAndUserHasSomeRolesFrom([role])\n\nexport default inUsersCaseLoadAndUserHasRole\n","import { PermissionCheckStatus } from '../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { Role } from '../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../utils/PermissionCheckUtils'\nimport {\n  isInUsersCaseLoad,\n  isReleased,\n  userHasSomeRolesFrom,\n  wasReleasedWithinThreeYears,\n} from '../../../utils/PermissionUtils'\n\nconst contactsReadCheck = matchBaseCheckAnd({\n  overridingCondition: (user, prisoner) => {\n    if (isReleased(prisoner)) {\n      if (!userHasSomeRolesFrom([Role.ContactsAdministrator, Role.ContactsAuthoriser], user))\n        return PermissionCheckStatus.ROLE_NOT_PRESENT\n      if (!wasReleasedWithinThreeYears(prisoner)) return PermissionCheckStatus.EXCEEDS_TIME_RESTRICTION\n      if (!isInUsersCaseLoad(prisoner.lastPrisonId, user)) return PermissionCheckStatus.NOT_IN_CASELOAD\n      return PermissionCheckStatus.OK\n    }\n\n    return isInUsersCaseLoad(prisoner.prisonId, user) ? PermissionCheckStatus.OK : PermissionCheckStatus.NOT_IN_CASELOAD\n  },\n})\n\nexport default contactsReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\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 inUsersCaseLoadAndUserHasSomeRolesFrom from '../../../sharedChecks/inUsersCaseLoadAndUserHasSomeRolesFrom/InUsersCaseLoadAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../types/internal/user/Role'\nimport prisonerProfileSensitiveEditCheck from '../../../sharedChecks/prisonerProfileSensitiveEditCheck/PrisonerProfileSensitiveEditCheck'\nimport inUsersCaseLoadAndUserHasRole from '../../../sharedChecks/inUsersCaseLoadAndUserHasRole/InUsersCaseLoadAndUserHasRole'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\nimport contactsReadCheck from '../../../sharedChecks/contactsReadCheck/contactsReadCheck'\nimport inUsersCaseLoad from '../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\n\nexport default function personalRelationshipsCheck(\n  context: PrisonerPermissionsContext,\n): PersonalRelationshipsPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PersonalRelationshipsPermission.read_number_of_children, inUsersCaseLoad),\n    ...check(PersonalRelationshipsPermission.edit_number_of_children, prisonerProfileEditCheck),\n\n    ...check(PersonalRelationshipsPermission.read_domestic_status, inUsersCaseLoad),\n    ...check(PersonalRelationshipsPermission.edit_domestic_status, prisonerProfileEditCheck),\n\n    ...check(PersonalRelationshipsPermission.read_emergency_contacts, baseCheck),\n    ...check(PersonalRelationshipsPermission.edit_emergency_contacts, prisonerProfileSensitiveEditCheck),\n\n    ...check(PersonalRelationshipsPermission.read_contacts, contactsReadCheck),\n    ...check(\n      PersonalRelationshipsPermission.edit_contacts,\n      inUsersCaseLoadAndUserHasSomeRolesFrom([\n        Role.ContactsAdministrator,\n        Role.ContactsAuthoriser,\n        Role.PrisonerProfileSensitiveEdit,\n      ]),\n    ),\n\n    ...check(\n      PersonalRelationshipsPermission.edit_contact_restrictions,\n      inUsersCaseLoadAndUserHasRole(Role.ContactsAuthoriser),\n    ),\n\n    ...check(\n      PersonalRelationshipsPermission.edit_contact_visit_approval,\n      inUsersCaseLoadAndUserHasRole(Role.ContactsAuthoriser),\n    ),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../types/internal/permissions/PrisonerPermissionsContext'\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(context: PrisonerPermissionsContext): PersonDomainPermissions {\n  return {\n    caseNotes: caseNotesCheck(context),\n    corePersonRecord: corePersonRecordCheck(context),\n    personProtectedCharacteristics: personProtectedCharacteristicsCheck(context),\n    personHealthAndMedication: personHealthAndMedicationCheck(context),\n    personalRelationships: personalRelationshipsCheck(context),\n  }\n}\n","import baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\n\nconst pathfinderReadCheck = baseCheckAndUserHasSomeRolesFrom([\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\nexport default pathfinderReadCheck\n","import baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\n\nconst pathfinderEditCheck = baseCheckAndUserHasSomeRolesFrom([\n  Role.PathfinderApproval,\n  Role.PathfinderStdPrison,\n  Role.PathfinderStdProbation,\n  Role.PathfinderHQ,\n  Role.PathfinderUser,\n])\n\nexport default pathfinderEditCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport pathfinderReadCheck from './pathfinderRead/PathfinderReadCheck'\nimport {\n  PathfinderPermission,\n  PathfinderPermissions,\n} from '../../../../../../types/public/permissions/domains/security/pathfinder/PathfinderPermissions'\nimport pathfinderEditCheck from './pathfinderEdit/PathfinderEditCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function pathfinderCheck(context: PrisonerPermissionsContext): PathfinderPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PathfinderPermission.read, pathfinderReadCheck),\n    ...check(PathfinderPermission.edit, pathfinderEditCheck),\n  }\n}\n","import baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\n\nconst socReadCheck = baseCheckAndUserHasSomeRolesFrom([Role.SocCommunity, Role.SocCustody])\n\nexport default socReadCheck\n","import baseCheckAndUserHasSomeRolesFrom from '../../../../sharedChecks/baseCheckAndUserHasSomeRolesFrom/BaseCheckAndUserHasSomeRolesFrom'\nimport { Role } from '../../../../../../../types/internal/user/Role'\n\nconst socEditCheck = baseCheckAndUserHasSomeRolesFrom([\n  Role.SocCustody,\n  Role.SocCommunity,\n  Role.SocDataAnalyst,\n  Role.SocDataManager,\n])\n\nexport default socEditCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport socReadCheck from './socRead/SOCReadCheck'\nimport {\n  SOCPermission,\n  SOCPermissions,\n} from '../../../../../../types/public/permissions/domains/security/soc/SOCPermissions'\nimport socEditCheck from './socEdit/SOCEditCheck'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function socCheck(context: PrisonerPermissionsContext): SOCPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(SOCPermission.read, socReadCheck),\n    ...check(SOCPermission.edit, socEditCheck),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport { SecurityDomainPermissions } from '../../../../../types/public/permissions/domains/security/SecurityDomainPermissions'\nimport pathfinderCheck from './pathfinder/PathfinderCheck'\nimport socCheck from './soc/SOCCheck'\n\nexport default function securityCheck(context: PrisonerPermissionsContext): SecurityDomainPermissions {\n  return {\n    pathfinder: pathfinderCheck(context),\n    soc: socCheck(context),\n  }\n}\n","import { PermissionCheckStatus } from '../../../../../../../types/internal/permissions/PermissionCheckStatus'\nimport { Role } from '../../../../../../../types/internal/user/Role'\nimport { matchBaseCheckAnd } from '../../../../../utils/PermissionCheckUtils'\n\nconst probationDocumentsReadCheck = matchBaseCheckAnd({\n  atLeastOneRoleRequiredFrom: [Role.PomUser, Role.ViewProbationDocuments],\n\n  // Global search access is not allowed:\n  ifPrisonNotInCaseload: () => PermissionCheckStatus.NOT_IN_CASELOAD,\n})\n\nexport default probationDocumentsReadCheck\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport probationDocumentsReadCheck from './probationDocumentsRead/ProbationDocumentsReadCheck'\nimport {\n  ProbationDocumentsPermission,\n  ProbationDocumentsPermissions,\n} from '../../../../../../types/public/permissions/domains/probation/probationDocuments/ProbationDocumentsPermissions'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function probationDocumentsCheck(context: PrisonerPermissionsContext): ProbationDocumentsPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(ProbationDocumentsPermission.read, probationDocumentsReadCheck),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport { ProbationDomainPermissions } from '../../../../../types/public/permissions/domains/probation/ProbationDomainPermissions'\nimport probationDocumentsCheck from './probationDocuments/ProbationDocumentsCheck'\n\nexport default function probationCheck(context: PrisonerPermissionsContext): ProbationDomainPermissions {\n  return {\n    probationDocuments: probationDocumentsCheck(context),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport {\n  PersonInterventionsPermission,\n  PersonInterventionsPermissions,\n} from '../../../../../../types/public/permissions/domains/interventions/personInterventions/PersonInterventionsPermissions'\nimport inUsersCaseLoad from '../../../sharedChecks/inUsersCaseLoad/InUsersCaseLoad'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function personInterventionsCheck(context: PrisonerPermissionsContext): PersonInterventionsPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PersonInterventionsPermission.read_csip, inUsersCaseLoad),\n    ...check(PersonInterventionsPermission.edit_csip, inUsersCaseLoad),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport { InterventionsDomainPermissions } from '../../../../../types/public/permissions/domains/interventions/InterventionsDomainPermissions'\nimport personInterventionsCheck from './personInterventions/PersonInterventionsCheck'\n\nexport default function interventionsCheck(context: PrisonerPermissionsContext): InterventionsDomainPermissions {\n  return {\n    personInterventions: personInterventionsCheck(context),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../../types/internal/permissions/PrisonerPermissionsContext'\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'\nimport { checkWith } from '../../../../utils/PermissionCheckUtils'\n\nexport default function personCommunicationNeedsCheck(\n  context: PrisonerPermissionsContext,\n): PersonCommunicationNeedsPermissions {\n  const check = checkWith(context)\n  return {\n    ...check(PersonCommunicationNeedsPermission.read_language, baseCheck),\n    ...check(PersonCommunicationNeedsPermission.edit_language, prisonerProfileEditCheck),\n  }\n}\n","import PrisonerPermissionsContext from '../../../../../types/internal/permissions/PrisonerPermissionsContext'\nimport personCommunicationNeedsCheck from './personCommunicationNeeds/PersonCommunicationNeedsCheck'\nimport { PersonPlanAndNeedsDomainPermissions } from '../../../../../types/public/permissions/domains/personPlanAndNeeds/PersonPlanAndNeedsDomainPermissions'\n\nexport default function personPlanAndNeedsCheck(\n  context: PrisonerPermissionsContext,\n): PersonPlanAndNeedsDomainPermissions {\n  return {\n    personCommunicationNeeds: personCommunicationNeedsCheck(context),\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 PrisonerPermissionsContext from '../../types/internal/permissions/PrisonerPermissionsContext'\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'\nimport { baseCheckStatus } from './checks/baseCheck/status/BaseCheckStatus'\nimport { upgradePermissions } from './utils/PermissionUtils'\nimport { Role } from '../../types/internal/user/Role'\nimport { isGranted } from '../../types/public/permissions/prisoner/PrisonerPermissionsUtils'\n\nexport default class PermissionsService {\n  private readonly prisonerSearchClient: PrisonerSearchClient\n\n  readonly permissionsLogger: PermissionsLogger\n\n  private readonly readOnly: boolean\n\n  static create({\n    prisonerSearchConfig,\n    authenticationClient,\n    logger = console,\n    telemetryClient,\n    readOnly = false,\n  }: {\n    prisonerSearchConfig: ApiConfig\n    authenticationClient: AuthenticationClient\n    logger?: bunyan | typeof console\n    telemetryClient?: TelemetryClient\n    readOnly?: boolean\n  }): PermissionsService {\n    return new PermissionsService(\n      new PrisonerSearchClient(logger, prisonerSearchConfig, authenticationClient),\n      new PermissionsLogger(logger, telemetryClient),\n      readOnly,\n    )\n  }\n\n  private constructor(\n    prisonerSearchClient: PrisonerSearchClient,\n    permissionsLogger: PermissionsLogger,\n    readOnly: boolean,\n  ) {\n    this.prisonerSearchClient = prisonerSearchClient\n    this.permissionsLogger = permissionsLogger\n    this.readOnly = readOnly\n  }\n\n  public getPrisonerPermissions({\n    user,\n    prisoner,\n    requestDependentOn,\n    duplicateRecords = [],\n  }: {\n    user: HmppsUser\n    prisoner: Prisoner\n    requestDependentOn: PrisonerPermission[]\n    duplicateRecords?: Prisoner[]\n  }): PrisonerPermissions {\n    const prisonerPermissions = this.calculatePrisonerPermissions({\n      user,\n      prisoner,\n      requestDependentOn,\n    })\n\n    return this.upgradePermissionsFromDuplicateRecords(\n      prisoner,\n      prisonerPermissions,\n      duplicateRecords,\n      user,\n      requestDependentOn,\n    )\n  }\n\n  private calculatePrisonerPermissions({\n    user,\n    prisoner,\n    requestDependentOn,\n    readOnly = false,\n  }: {\n    user: HmppsUser\n    prisoner: Prisoner\n    requestDependentOn: PrisonerPermission[]\n    readOnly?: boolean\n  }): PrisonerPermissions {\n    const context: PrisonerPermissionsContext = {\n      user,\n      prisoner,\n      baseCheckStatus: baseCheckStatus(user, prisoner),\n      requestDependentOn,\n      permissionsLogger: this.permissionsLogger,\n      readOnly: readOnly || this.readOnly,\n    }\n\n    return {\n      [PrisonerBasePermission.read]: baseCheck(PrisonerBasePermission.read, context),\n\n      domainGroups: {\n        interventions: interventionsCheck(context),\n        person: personCheck(context),\n        personPlanAndNeeds: personPlanAndNeedsCheck(context),\n        prisonerSpecific: prisonerSpecificCheck(context),\n        probation: probationCheck(context),\n        runningAPrison: runningAPrisonCheck(context),\n        security: securityCheck(context),\n        sentenceAndOffence: sentenceAndOffenceCheck(context),\n      },\n    }\n  }\n\n  /*\n   * Policy dictates that users should be permitted the highest level of READ access they have across\n   * duplicate records so that they can assess whether any data from the duplicate record is relevant to their work.\n   */\n  private upgradePermissionsFromDuplicateRecords(\n    prisoner: Prisoner,\n    basePermissions: PrisonerPermissions,\n    duplicateRecords: Prisoner[],\n    user: HmppsUser,\n    requestDependentOn: PrisonerPermission[],\n  ): PrisonerPermissions {\n    /*\n     * To prevent users with the INACTIVE_BOOKINGS (Released Prisoner Viewing) role being able to gain read access\n     * to active prisoner records outside their caseload, by virtue of having access to their inactive duplicate\n     * record, we will discount this role when calculating permissions for duplicate records.\n     */\n    const rolesToDiscountForDuplicateRecords = [Role.InactiveBookings]\n    const userWithoutDiscountedRoles = {\n      ...user,\n      userRoles: user.userRoles.filter(role => !rolesToDiscountForDuplicateRecords.includes(role)),\n    }\n\n    const upgradedPermissions = duplicateRecords.reduce((acc, duplicatePrisoner) => {\n      const duplicatePrisonerPermissions = this.calculatePrisonerPermissions({\n        user: userWithoutDiscountedRoles,\n        prisoner: duplicatePrisoner,\n        requestDependentOn: [], // Don't log when checking permissions for duplicate records\n        readOnly: true, // Only provide additional read-only permission from the duplicate record\n      })\n\n      return upgradePermissions(acc, duplicatePrisonerPermissions)\n    }, basePermissions)\n\n    requestDependentOn.forEach(requiredPermission => {\n      if (!isGranted(requiredPermission, basePermissions) && isGranted(requiredPermission, upgradedPermissions)) {\n        this.permissionsLogger.logPermissionGrantedByDuplicate(user, prisoner, duplicateRecords, requiredPermission)\n      }\n    })\n\n    return upgradedPermissions\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 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    /*\n     * Currently avoiding adding a dependency on the hmpps-person-record API and will just check to\n     * see if any duplicate prisoner records are present in the request middleware, which is up to the implementing\n     * service to provide if they wish to support permission upgrades based on duplicate records.\n     */\n    const duplicateRecords = req.middleware?.duplicatePrisonerData || []\n\n    const prisonerPermissions = permissionsService.getPrisonerPermissions({\n      user: res.locals.user,\n      prisoner: prisonerData,\n      requestDependentOn,\n      duplicateRecords,\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'\nimport { PrisonerSpecificRisksPermission } from '../types/public/permissions/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksPermissions'\nimport { PrisonerMovesPermission } from '../types/public/permissions/domains/runningAPrison/prisonerMoves/PrisonerMovesPermissions'\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({ PrisonerMovesPermission }),\n  ...nunjucksEnum({ PrisonerSchedulePermission }),\n  ...nunjucksEnum({ PrisonerSpecificRisksPermission }),\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","PrisonerBasePermission","PrisonerAdjudicationsPermission","PrisonerMoneyPermission","PrisonerIncentivesPermission","PersonPrisonCategoryPermission","PrisonerSchedulePermission","UseOfForcePermission","PrisonerAlertsPermission","PrisonerSpecificRisksPermission","PrisonerVisitsAndVisitorsPermission","PrisonerBaseLocationPermission","PrisonerMovesPermission","CaseNotesPermission","CorePersonRecordPermission","basePath","PersonProtectedCharacteristicsPermission","PersonHealthAndMedicationPermission","PersonalRelationshipsPermission","PathfinderPermission","SOCPermission","ProbationDocumentsPermission","PersonInterventionsPermission","PersonCommunicationNeedsPermission","prisonNotInCaseloadStatus"],"mappings":"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"}