Standardize phase type labels

This commit is contained in:
2026-07-29 10:46:00 +02:00
parent 084103bf54
commit 096ba8aa1c
23 changed files with 6117 additions and 52 deletions
@@ -6,6 +6,7 @@ import {
import {
resolveCircuitPhaseType,
resolveProjectVoltage,
normalizeKnownElectricalPhaseType,
} from "../services/project-voltage.service.js";
export const legacyProjectStateSnapshotSchemaVersion = 1 as const;
@@ -225,7 +226,7 @@ export function parseProjectStateSnapshot(
value: unknown
): ProjectStateSnapshot {
const version = isPlainObject(value) ? value.schemaVersion : undefined;
const snapshot =
const parsedSnapshot =
version === legacyProjectStateSnapshotSchemaVersion
? upgradeSupplyTypesProjectStateSnapshot(
upgradeDistributionBoardProjectStateSnapshot(
@@ -255,10 +256,57 @@ export function parseProjectStateSnapshot(
supplyTypesProjectStateSnapshotSchema.parse(value)
)
: projectStateSnapshotSchema.parse(value);
const snapshot = normalizeSnapshotPhaseTypes(parsedSnapshot);
assertProjectStateSnapshotRelations(snapshot);
return snapshot;
}
function normalizeSnapshotPhaseTypes(
snapshot: ProjectStateSnapshot
): ProjectStateSnapshot {
const sectionById = new Map(
snapshot.circuitSections.map((section) => [section.id, section])
);
const projectDeviceById = new Map(
snapshot.projectDevices.map((device) => [device.id, device])
);
return {
...snapshot,
circuits: snapshot.circuits.map((circuit) => {
const section = sectionById.get(circuit.sectionId);
const deviceRows = circuit.deviceRows.map((row) => {
const normalizedPhaseType =
normalizeKnownElectricalPhaseType(row.phaseType);
const linkedPhaseType = row.linkedProjectDeviceId
? projectDeviceById.get(row.linkedProjectDeviceId)?.phaseType
: undefined;
return {
...row,
phaseType:
normalizedPhaseType ??
linkedPhaseType ??
(section?.key === "three_phase"
? "three_phase"
: "single_phase"),
};
});
return {
...circuit,
voltage: section
? resolveProjectVoltage(
resolveCircuitPhaseType(
section.key,
deviceRows.map((row) => row.phaseType)
),
snapshot.project
)
: circuit.voltage,
deviceRows,
};
}),
};
}
function upgradeLegacyProjectStateSnapshot(
snapshot: z.infer<typeof legacyProjectStateSnapshotSchema>
): z.infer<typeof previousProjectStateSnapshotSchema> {