Add protection domain foundation
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
import { z } from "zod";
|
||||
import {
|
||||
breakerTripCharacteristics,
|
||||
fuseProtectionDeviceTypes,
|
||||
fuseUtilizationCategories,
|
||||
isAllowedRatedCurrentA,
|
||||
isAllowedRatedResidualCurrentMa,
|
||||
protectionDeviceTypes,
|
||||
rcdTypes,
|
||||
} from "../constants/protection-device.js";
|
||||
|
||||
function hasValue(value: unknown): boolean {
|
||||
return value !== undefined;
|
||||
}
|
||||
|
||||
export const protectionDeviceConfigurationSchema = z
|
||||
.object({
|
||||
type: z.enum(protectionDeviceTypes),
|
||||
ratedCurrentA: z.number().finite().positive(),
|
||||
fuseUtilizationCategory: z.enum(fuseUtilizationCategories).optional(),
|
||||
tripCharacteristic: z.enum(breakerTripCharacteristics).optional(),
|
||||
rcdType: z.enum(rcdTypes).optional(),
|
||||
ratedResidualCurrentMa: z
|
||||
.number()
|
||||
.int()
|
||||
.refine(isAllowedRatedResidualCurrentMa, {
|
||||
message: "Der Bemessungsdifferenzstrom ist nicht zulässig.",
|
||||
})
|
||||
.optional(),
|
||||
})
|
||||
.strict()
|
||||
.superRefine((value, context) => {
|
||||
if (!isAllowedRatedCurrentA(value.type, value.ratedCurrentA)) {
|
||||
context.addIssue({
|
||||
code: "custom",
|
||||
path: ["ratedCurrentA"],
|
||||
message: "Der Bemessungsstrom ist für diesen Schutzgerätetyp nicht zulässig.",
|
||||
});
|
||||
}
|
||||
|
||||
const isFuse = (fuseProtectionDeviceTypes as readonly string[]).includes(
|
||||
value.type
|
||||
);
|
||||
const hasBreakerFunction =
|
||||
value.type === "LS" || value.type === "FI_LS" || value.type === "AFDD";
|
||||
const hasResidualCurrentFunction =
|
||||
value.type === "FI" || value.type === "FI_LS";
|
||||
|
||||
if (isFuse !== hasValue(value.fuseUtilizationCategory)) {
|
||||
context.addIssue({
|
||||
code: "custom",
|
||||
path: ["fuseUtilizationCategory"],
|
||||
message: isFuse
|
||||
? "Für diesen Sicherungstyp ist eine Sicherungscharakteristik erforderlich."
|
||||
: "Dieser Schutzgerätetyp darf keine Sicherungscharakteristik enthalten.",
|
||||
});
|
||||
}
|
||||
|
||||
if (hasBreakerFunction !== hasValue(value.tripCharacteristic)) {
|
||||
context.addIssue({
|
||||
code: "custom",
|
||||
path: ["tripCharacteristic"],
|
||||
message: hasBreakerFunction
|
||||
? "Für diesen Schutzgerätetyp ist eine Auslösecharakteristik erforderlich."
|
||||
: "Dieser Schutzgerätetyp darf keine Auslösecharakteristik enthalten.",
|
||||
});
|
||||
}
|
||||
|
||||
if (hasResidualCurrentFunction !== hasValue(value.rcdType)) {
|
||||
context.addIssue({
|
||||
code: "custom",
|
||||
path: ["rcdType"],
|
||||
message: hasResidualCurrentFunction
|
||||
? "Für diesen Schutzgerätetyp ist ein FI-Typ erforderlich."
|
||||
: "Dieser Schutzgerätetyp darf keinen FI-Typ enthalten.",
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
hasResidualCurrentFunction !==
|
||||
hasValue(value.ratedResidualCurrentMa)
|
||||
) {
|
||||
context.addIssue({
|
||||
code: "custom",
|
||||
path: ["ratedResidualCurrentMa"],
|
||||
message: hasResidualCurrentFunction
|
||||
? "Für diesen Schutzgerätetyp ist ein Bemessungsdifferenzstrom erforderlich."
|
||||
: "Dieser Schutzgerätetyp darf keinen Bemessungsdifferenzstrom enthalten.",
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
export type ProtectionDeviceConfigurationInput = z.infer<
|
||||
typeof protectionDeviceConfigurationSchema
|
||||
>;
|
||||
Reference in New Issue
Block a user