86 lines
2.4 KiB
TypeScript
86 lines
2.4 KiB
TypeScript
import { Result } from "@repo/rdx-utils";
|
|
|
|
import { AssetCatalogError } from "../domain/asset-definition";
|
|
import { canAssignAsset } from "../domain/asset-state";
|
|
import { WorkstationValues } from "../domain/value-objects/workstation-values.vo";
|
|
import type { Workstation } from "../domain/workstation.aggregate";
|
|
import type { WorkstationInput } from "../domain/workstation-values";
|
|
|
|
import type { InventoryContext } from "./asset.repository";
|
|
|
|
export function mapWorkstationInput(
|
|
input: WorkstationInput,
|
|
context: InventoryContext,
|
|
previous?: Workstation
|
|
) {
|
|
const mapped = WorkstationValues.create(input);
|
|
|
|
if (!mapped.isSuccess) {
|
|
return mapped;
|
|
}
|
|
const values = mapped.data.toPrimitive();
|
|
|
|
if (
|
|
values.siteId &&
|
|
!context.sites.some(
|
|
(site) =>
|
|
site.id.toPrimitive() === values.siteId &&
|
|
(site.active || previous?.values.toPrimitive().siteId === values.siteId)
|
|
)
|
|
) {
|
|
return Result.fail(new AssetCatalogError("SITE_NOT_FOUND"));
|
|
}
|
|
const person = context.people.find((item) => item.id.toPrimitive() === values.personId);
|
|
|
|
if (
|
|
values.personId &&
|
|
(!person || (!person.active && previous?.values.toPrimitive().personId !== values.personId))
|
|
) {
|
|
return Result.fail(new AssetCatalogError("PERSON_UNAVAILABLE"));
|
|
}
|
|
for (const id of values.assetIds) {
|
|
const error = memberError(id, values, context, previous);
|
|
|
|
if (error) {
|
|
return Result.fail(new AssetCatalogError(error));
|
|
}
|
|
}
|
|
|
|
return mapped;
|
|
}
|
|
|
|
function memberError(
|
|
id: string,
|
|
values: WorkstationInput,
|
|
context: InventoryContext,
|
|
previous: Workstation | undefined
|
|
) {
|
|
const asset = context.assets.find((item) => item.id.toPrimitive() === id);
|
|
|
|
if (!asset) {
|
|
return "ASSET_NOT_FOUND";
|
|
}
|
|
if (!values.active) {
|
|
return undefined;
|
|
}
|
|
const previousMembers = previous?.values.assetIds;
|
|
const retained =
|
|
previous?.values.active && previousMembers?.some((item) => item.toPrimitive() === id);
|
|
|
|
if (!(retained || canAssignAsset(asset.values.technicalStatus, false))) {
|
|
return "ASSET_NOT_OPERATIONAL";
|
|
}
|
|
const others = context.workstations.filter(
|
|
(item) => item.values.active && item.id.toPrimitive() !== previous?.id.toPrimitive()
|
|
);
|
|
const exclusiveElsewhere = others.some((item) =>
|
|
item.values.assetIds.some((assetId) => assetId.toPrimitive() === id)
|
|
);
|
|
|
|
if (exclusiveElsewhere) {
|
|
return "ASSET_IN_WORKSTATION";
|
|
}
|
|
|
|
return undefined;
|
|
}
|