import {projectAccess} from "../domain/access/access-projection"; import type {FolderMappingValues} from "../domain/value-objects/folder-mapping-values"; import {SharedFolderPath} from "../domain/value-objects/shared-folder-path"; import type {FolderContext} from "./folder-mapping.repository"; export function folderReferences(values:FolderMappingValues,context:FolderContext){ const profile=context.profiles.find(item=>item.id.equals(values.profileId)); const need=context.items.find(item=>item.id.equals(values.needId))?.values.data; if(!profile || need?.kind!=="need" || profile.values.personId.toPrimitive()!==need.personId){return undefined;} const resource=context.items.find(item=>item.id.toPrimitive()===need.resourceId)?.values.data; if(resource?.kind!=="resource"){return undefined;}return {profile,need,resource}; } function activeReference(context:FolderContext,id:string|null){return id===null || context.items.some(item=>{ const data=item.values.data;return item.id.toPrimitive()===id && "active" in data && data.active; });} export function folderAvailable(values:FolderMappingValues,context:FolderContext){ const references=folderReferences(values,context); if(!references){return false;} const {profile,need,resource}=references; const current=resource.reference===null ? undefined:SharedFolderPath.create(resource.reference); return profile.values.active && resource.active && need.startDate<=context.today && (need.endDate===null || context.todayitem.id.equals(profile.values.personId) && item.active) && context.assets.some(item=>item.id.equals(profile.values.assetId) && item.available) && current?.isSuccess===true && values.path.equals(current.data) && activeReference(context,resource.resourceTypeId) && activeReference(context,resource.systemId) && activeReference(context,resource.environmentId) && need.permissionIds.every(id=>activeReference(context,id)); } export function folderCoverage(context:FolderContext){ const current=context.items.filter(item=>{ const values=item.values.data;return !("startDate" in values) || values.startDate<=context.today; }); return new Map(projectAccess(current,context.people,context.today).coverage.map(item=>[item.needId,item.covered])); }