import type { SoftwareInstallation } from "../domain/software-installation.aggregate"; import type { SoftwareInstallationValues } from "../domain/value-objects/software-installation-values.vo"; import type { SoftwareContext } from "./software-installation.repository"; export function softwareReferences(values: SoftwareInstallationValues, context: SoftwareContext) { const licenseId = values.licenseResourceId.getOrUndefined(); return ( context.assets.some((item) => item.id.equals(values.assetId)) && context.resources.some( (item) => item.id.equals(values.resourceId) && (item.usage === "application" || item.usage === "os") ) && (!licenseId || context.resources.some((item) => item.id.equals(licenseId) && item.usage === "license")) ); } export function softwareLicenseAvailable( values: SoftwareInstallationValues, context: SoftwareContext ) { const licenseId = values.licenseResourceId.getOrUndefined(); const today = new Date().toISOString().slice(0, 10); return ( !licenseId || context.resources.some( (item) => item.id.equals(licenseId) && item.usage === "license" && item.active && (!item.expiresOn || item.expiresOn >= today) ) ); } export function softwareAvailable(values: SoftwareInstallationValues, context: SoftwareContext) { return ( context.assets.some((item) => item.id.equals(values.assetId) && item.notRetired) && context.resources.some( (item) => item.id.equals(values.resourceId) && item.active && (item.usage === "application" || item.usage === "os") ) && softwareLicenseAvailable(values, context) ); } /** Notas y retirada no crean una nueva dependencia de disponibilidad del producto. */ export function requiresAvailableSoftware( values: SoftwareInstallationValues, previous?: SoftwareInstallation ) { return ( !previous || (["pending", "configured"].includes(values.state) && (previous.values.state !== values.state || previous.values.version.getOrUndefined() !== values.version.getOrUndefined())) ); }