diff --git a/src/main/java/org/gridsuite/securityanalysis/server/SecurityAnalysisController.java b/src/main/java/org/gridsuite/securityanalysis/server/SecurityAnalysisController.java index 73edbb29..8b4c63e6 100644 --- a/src/main/java/org/gridsuite/securityanalysis/server/SecurityAnalysisController.java +++ b/src/main/java/org/gridsuite/securityanalysis/server/SecurityAnalysisController.java @@ -229,6 +229,47 @@ public ResponseEntity> getNmKConstraintsRes : ResponseEntity.notFound().build(); } + @GetMapping(value = "/results/{resultUuid}/nmk-cut-off-power-result/paged", produces = APPLICATION_JSON_VALUE) + @Operation(summary = "Get a paged security analysis result from the database - NMK contingencies cut off power result") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The security analysis result"), + @ApiResponse(responseCode = "404", description = "Security analysis result has not been found")}) + public ResponseEntity> getNmKCutOffPowerResult(@Parameter(description = "Result UUID") @PathVariable("resultUuid") UUID resultUuid, + @Parameter(description = "network Uuid") @RequestParam(name = "networkUuid", required = false) UUID networkUuid, + @Parameter(description = "variant Id") @RequestParam(name = "variantId", required = false) String variantId, + @Parameter(description = "Filters") @RequestParam(name = "filters", required = false) String filters, + @Parameter(description = "Global Filters") @RequestParam(name = "globalFilters", required = false) String globalFilters, + @Parameter(description = "Pagination parameters") Pageable pageable) { + Page result = securityAnalysisResultService.findNmKConnectivityResult(resultUuid, networkUuid, variantId, filters, globalFilters, pageable); + + return result != null + ? ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(result) + : ResponseEntity.notFound().build(); + } + + @PostMapping(value = "/results/{resultUuid}/nmk-cut-off-power-result/csv", produces = APPLICATION_OCTET_STREAM_VALUE, consumes = APPLICATION_JSON_VALUE) + @Operation(summary = "Get a security analysis result from the database - NMK contingencies result - CSV export") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The security analysis result csv export"), + @ApiResponse(responseCode = "404", description = "Security analysis result has not been found")}) + public ResponseEntity getNmKCutOffPowerResultZippedCsv(@Parameter(description = "Result UUID") @PathVariable("resultUuid") UUID resultUuid, + @Parameter(description = "network Uuid") @RequestParam(name = "networkUuid", required = false) UUID networkUuid, + @Parameter(description = "variant Id") @RequestParam(name = "variantId", required = false) String variantId, + @Parameter(description = "Filters") @RequestParam(name = "filters", required = false) String filters, + @Parameter(description = "Global Filters") @RequestParam(name = "globalFilters", required = false) String globalFilters, + @Parameter(description = "Translation properties") @RequestBody CsvTranslationDTO csvTranslations, + @Parameter(description = "Sort parameters") Sort sort) { + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(securityAnalysisResultService.findNmKConnectivityResultResultZippedCsv( + resultUuid, + networkUuid, + variantId, + filters, + globalFilters, + sort, + csvTranslations + )); + } + @PostMapping(value = "/results/{resultUuid}/nmk-constraints-result/csv", produces = APPLICATION_OCTET_STREAM_VALUE, consumes = APPLICATION_JSON_VALUE) @Operation(summary = "Get a security analysis result from the database - NMK constraints result - CSV export") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The security analysis result csv export"), diff --git a/src/main/java/org/gridsuite/securityanalysis/server/dto/ConnectivityResultDTO.java b/src/main/java/org/gridsuite/securityanalysis/server/dto/ConnectivityResultDTO.java new file mode 100644 index 00000000..bc6080a3 --- /dev/null +++ b/src/main/java/org/gridsuite/securityanalysis/server/dto/ConnectivityResultDTO.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2026, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.securityanalysis.server.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.gridsuite.securityanalysis.server.entities.ConnectivityResultEmbeddable; + +/** + * @author Ghazwa Rehili + */ + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ConnectivityResultDTO { + private Double disconnectedLoadActivePower; + private Double disconnectedGenerationActivePower; + + public static ConnectivityResultDTO toDto(ConnectivityResultEmbeddable connectivityResult) { + if (connectivityResult == null) { + return ConnectivityResultDTO.builder() + .disconnectedLoadActivePower(null) + .disconnectedGenerationActivePower(null) + .build(); + } + return ConnectivityResultDTO.builder() + .disconnectedLoadActivePower(connectivityResult.getDisconnectedLoadActivePower()) + .disconnectedGenerationActivePower(connectivityResult.getDisconnectedGenerationActivePower()) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/securityanalysis/server/dto/ContingencyCutOffPowerDTO.java b/src/main/java/org/gridsuite/securityanalysis/server/dto/ContingencyCutOffPowerDTO.java new file mode 100644 index 00000000..70899fbe --- /dev/null +++ b/src/main/java/org/gridsuite/securityanalysis/server/dto/ContingencyCutOffPowerDTO.java @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2026, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.securityanalysis.server.dto; + +import org.gridsuite.securityanalysis.server.entities.ContingencyEntity; +import org.gridsuite.securityanalysis.server.util.CsvExportUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author Ghazwa Rehili + */ +public record ContingencyCutOffPowerDTO( + String contingencyId, + String status, + ConnectivityResultDTO connectivityResult +) { + public static ContingencyCutOffPowerDTO toDto(ContingencyEntity entity) { + return new ContingencyCutOffPowerDTO( + entity.getContingencyId(), + entity.getStatus(), + ConnectivityResultDTO.toDto(entity.getConnectivityResult()) + ); + } + + public List> toCsvRows(Map translations, String language) { + List csvRow = new ArrayList<>(); + csvRow.add(contingencyId); + csvRow.add(CsvExportUtils.translate(status, translations)); + if (connectivityResult != null) { + csvRow.add(CsvExportUtils.convertDoubleToLocale(connectivityResult.getDisconnectedLoadActivePower(), language)); + csvRow.add(CsvExportUtils.convertDoubleToLocale(connectivityResult.getDisconnectedGenerationActivePower(), language)); + } + return List.of(csvRow); + } +} diff --git a/src/main/java/org/gridsuite/securityanalysis/server/entities/ConnectivityResultEmbeddable.java b/src/main/java/org/gridsuite/securityanalysis/server/entities/ConnectivityResultEmbeddable.java new file mode 100644 index 00000000..8ed4d998 --- /dev/null +++ b/src/main/java/org/gridsuite/securityanalysis/server/entities/ConnectivityResultEmbeddable.java @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2026, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.securityanalysis.server.entities; + +import com.powsybl.security.results.ConnectivityResult; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldNameConstants; + +/** + * @author Ghazwa Rehili + */ +@FieldNameConstants +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Embeddable +public class ConnectivityResultEmbeddable { + @Column + private Double disconnectedLoadActivePower; + + @Column + private Double disconnectedGenerationActivePower; + + public static ConnectivityResultEmbeddable toEntity(ConnectivityResult connectivityResult) { + if (connectivityResult.getDisconnectedLoadActivePower() == 0.0 && connectivityResult.getDisconnectedGenerationActivePower() == 0.0) { + return null; + } + return ConnectivityResultEmbeddable.builder() + .disconnectedGenerationActivePower(connectivityResult.getDisconnectedGenerationActivePower()) + .disconnectedLoadActivePower(connectivityResult.getDisconnectedLoadActivePower()) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/securityanalysis/server/entities/ContingencyEntity.java b/src/main/java/org/gridsuite/securityanalysis/server/entities/ContingencyEntity.java index d9bddad7..f5c7f767 100644 --- a/src/main/java/org/gridsuite/securityanalysis/server/entities/ContingencyEntity.java +++ b/src/main/java/org/gridsuite/securityanalysis/server/entities/ContingencyEntity.java @@ -31,10 +31,11 @@ @Table(name = "contingency") public class ContingencyEntity { - public ContingencyEntity(String contingencyId, String status, List contingencyElements, List contingencyLimitViolations) { + public ContingencyEntity(String contingencyId, String status, List contingencyElements, ConnectivityResultEmbeddable connectivityResult, List contingencyLimitViolations) { this.contingencyId = contingencyId; this.status = status; this.contingencyElements = contingencyElements; + this.connectivityResult = connectivityResult; setContingencyLimitViolations(contingencyLimitViolations); } @@ -54,6 +55,9 @@ public ContingencyEntity(String contingencyId, String status, List contingencyLimitViolations; + @Embedded + private ConnectivityResultEmbeddable connectivityResult; + /** * We keep a String as it could model LoadFlowResult.ComponentResult.Status or PostContingencyComputationStatus. */ @@ -72,6 +76,9 @@ public static ContingencyEntity toEntity(@Nullable Network network, PostContinge List contingencyLimitViolations = postContingencyResult.getLimitViolationsResult().getLimitViolations().stream() .map(limitViolation -> ContingencyLimitViolationEntity.toEntity(network, limitViolation, subjectLimitViolationsBySubjectId.get(limitViolation.getSubjectId()))) .collect(Collectors.toList()); - return new ContingencyEntity(postContingencyResult.getContingency().getId(), postContingencyResult.getStatus().name(), contingencyElements, contingencyLimitViolations); + + ConnectivityResultEmbeddable connectivityResult = ConnectivityResultEmbeddable.toEntity(postContingencyResult.getConnectivityResult()); + + return new ContingencyEntity(postContingencyResult.getContingency().getId(), postContingencyResult.getStatus().name(), contingencyElements, connectivityResult, contingencyLimitViolations); } } diff --git a/src/main/java/org/gridsuite/securityanalysis/server/service/SecurityAnalysisResultService.java b/src/main/java/org/gridsuite/securityanalysis/server/service/SecurityAnalysisResultService.java index 94a03cb6..624d1f00 100644 --- a/src/main/java/org/gridsuite/securityanalysis/server/service/SecurityAnalysisResultService.java +++ b/src/main/java/org/gridsuite/securityanalysis/server/service/SecurityAnalysisResultService.java @@ -12,9 +12,9 @@ import com.powsybl.iidm.network.ThreeSides; import com.powsybl.security.SecurityAnalysisResult; import lombok.Getter; -import org.gridsuite.computation.error.ComputationException; import org.gridsuite.computation.dto.GlobalFilter; import org.gridsuite.computation.dto.ResourceFilterDTO; +import org.gridsuite.computation.error.ComputationException; import org.gridsuite.computation.service.AbstractComputationResultService; import org.gridsuite.computation.utils.SpecificationUtils; import org.gridsuite.securityanalysis.server.dto.*; @@ -39,6 +39,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static org.gridsuite.computation.error.ComputationBusinessErrorCode.INVALID_SORT_FORMAT; import static org.gridsuite.computation.error.ComputationBusinessErrorCode.RESULT_NOT_FOUND; @@ -106,6 +108,13 @@ public class SecurityAnalysisResultService extends AbstractComputationResultServ AbstractLimitViolationEntity.Fields.locationId ); + private static final List ALLOWED_NMK_POWER_CUT_OFF_RESULT_SORT_PROPERTIES = List.of( + ContingencyEntity.Fields.contingencyId, + ContingencyEntity.Fields.status, + ContingencyEntity.Fields.connectivityResult + SpecificationUtils.FIELD_SEPARATOR + ConnectivityResultEmbeddable.Fields.disconnectedLoadActivePower, + ContingencyEntity.Fields.connectivityResult + SpecificationUtils.FIELD_SEPARATOR + ConnectivityResultEmbeddable.Fields.disconnectedGenerationActivePower + ); + public SecurityAnalysisResultService(SecurityAnalysisResultRepository securityAnalysisResultRepository, ContingencyRepository contingencyRepository, PreContingencyLimitViolationRepository preContingencyLimitViolationRepository, @@ -176,6 +185,27 @@ public List findNmKContingenciesResult(UUID resultUuid) { return contingencies.stream().map(ContingencyResultDTO::toDto).toList(); } + @Transactional(readOnly = true) + public Page findNmKConnectivityResult(UUID resultUuid, UUID networkUuid, String variantId, String stringFilters, String stringGlobalFilters, Pageable pageable) { + assertResultExists(resultUuid); + List allResourceFilters = getAllResourceFilters(stringFilters, stringGlobalFilters, globalFilter -> filterService.getResourceFilterContingencies(networkUuid, variantId, globalFilter)); + Specification hasConnectivityResult = (root, query, cb) -> { + var cr = root.get(ContingencyEntity.Fields.connectivityResult); + return cb.or( + cb.isNotNull(cr.get(ConnectivityResultEmbeddable.Fields.disconnectedLoadActivePower)), + cb.isNotNull(cr.get(ConnectivityResultEmbeddable.Fields.disconnectedGenerationActivePower)) + ); + }; + Page contingencyPage = self.findCutOffPowerContingenciesPage(resultUuid, allResourceFilters, hasConnectivityResult, pageable); + return contingencyPage.map(ContingencyCutOffPowerDTO::toDto); + } + + @Transactional(readOnly = true) + public byte[] findNmKConnectivityResultResultZippedCsv(UUID resultUuid, UUID networkUuid, String variantId, String stringFilters, String stringGlobalFilters, Sort sort, CsvTranslationDTO csvTranslations) { + List result = self.findNmKConnectivityResult(resultUuid, networkUuid, variantId, stringFilters, stringGlobalFilters, Pageable.unpaged(sort)).getContent(); + return CsvExportUtils.csvRowsToZippedCsv(csvTranslations.headers(), csvTranslations.language(), result.stream().map(r -> r.toCsvRows(csvTranslations.enumValueTranslations(), csvTranslations.language())).flatMap(List::stream).toList()); + } + @Transactional(readOnly = true) public byte[] findNmKContingenciesResultZippedCsv(UUID resultUuid, UUID networkUuid, String variantId, String stringFilters, String stringGlobalFilters, Sort sort, CsvTranslationDTO csvTranslations) { List result = self.findNmKContingenciesPaged(resultUuid, networkUuid, variantId, stringFilters, stringGlobalFilters, Pageable.unpaged(sort)).getContent(); @@ -231,6 +261,10 @@ private void assertSortAllowed(Sort sort, List allowedSortProperties) { } } + private void assertNmKCutOffPowerSortAllowed(Sort sort) { + assertSortAllowed(sort, ALLOWED_NMK_POWER_CUT_OFF_RESULT_SORT_PROPERTIES); + } + public void assertResultExists(UUID resultUuid) { if (securityAnalysisResultRepository.findById(resultUuid).isEmpty()) { throw new ComputationException(RESULT_NOT_FOUND, "Result not found"); @@ -406,6 +440,44 @@ private Page findSubjectLimitViolationsPage(UUID re } } + @Transactional(readOnly = true) + public Page findCutOffPowerContingenciesPage(UUID resultUuid, List resourceFilters, Specification extraSpecification, Pageable pageable) { + Objects.requireNonNull(resultUuid); + assertNmKCutOffPowerSortAllowed(pageable.getSort()); + Pageable modifiedPageable = withDefaultSort(pageable); + Specification specification = contingencySpecificationBuilder.buildSpecification(resultUuid, resourceFilters).and(extraSpecification); + + // Determine which properties to project based on sort fields + // When using DISTINCT, all ORDER BY columns must be in the SELECT list + Set projectionProperties = new LinkedHashSet<>(); + projectionProperties.add(ContingencyEntity.Fields.uuid); + modifiedPageable.getSort().forEach(order -> projectionProperties.add(order.getProperty())); + + Page uuidPage = contingencyRepository.findBy(specification, q -> + q.as(ContingencyRepository.EntityUuid.class) + .sortBy(modifiedPageable.getSort()) + .project(projectionProperties.toArray(String[]::new)) + .page(modifiedPageable) + ); + if (!uuidPage.hasContent()) { + return Page.empty(pageable); + } + + List orderedUuids = uuidPage.map(ContingencyRepository.EntityUuid::getUuid).toList(); + List contingencies = contingencyRepository.findAllByUuidIn(orderedUuids); + Map positionByUuid = IntStream.range(0, orderedUuids.size()).boxed().collect(Collectors.toMap(orderedUuids::get, Function.identity())); + contingencies.sort(Comparator.comparingInt(c -> positionByUuid.get(c.getUuid()))); + return new PageImpl<>(contingencies, pageable, uuidPage.getTotalElements()); + } + + private static Pageable withDefaultSort(Pageable pageable) { + if (pageable.isUnpaged() || pageable.getSort().getOrderFor(ContingencyEntity.Fields.uuid) != null) { + return pageable; + } + Sort stableSort = pageable.getSort().and(Sort.by(DEFAULT_SORT_DIRECTION, ContingencyEntity.Fields.uuid)); + return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), stableSort); + } + @Transactional(readOnly = true) public List findNResultLimitTypes(UUID resultUuid) { Objects.requireNonNull(resultUuid); diff --git a/src/main/java/org/gridsuite/securityanalysis/server/util/CsvExportUtils.java b/src/main/java/org/gridsuite/securityanalysis/server/util/CsvExportUtils.java index 5f38cd95..8ae01412 100644 --- a/src/main/java/org/gridsuite/securityanalysis/server/util/CsvExportUtils.java +++ b/src/main/java/org/gridsuite/securityanalysis/server/util/CsvExportUtils.java @@ -9,7 +9,9 @@ import java.io.OutputStream; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; +import java.text.NumberFormat; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -70,4 +72,10 @@ public static String translate(String valueToTranslate, Map tran // if translated value is null, we keep original value (untranslated value) return translations.getOrDefault(valueToTranslate, valueToTranslate); } + + public static String convertDoubleToLocale(Double value, String language) { + NumberFormat nf = NumberFormat.getInstance(language != null && language.equals("fr") ? Locale.FRENCH : Locale.US); + nf.setGroupingUsed(false); + return nf.format(value); + } } diff --git a/src/main/resources/db/changelog/changesets/changelog_20260521T124334Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260521T124334Z.xml new file mode 100644 index 00000000..7a4b11a3 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20260521T124334Z.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 0ea419f9..c23cd072 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -69,3 +69,6 @@ databaseChangeLog: - include: file: changesets/changelog_20260423T124334Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20260521T124334Z.xml + relativeToChangelogFile: true \ No newline at end of file diff --git a/src/test/resources/results/nmk-constraints-result-en.csv b/src/test/resources/results/nmk-constraints-result-en.csv index 83963347..f11631aa 100644 --- a/src/test/resources/results/nmk-constraints-result-en.csv +++ b/src/test/resources/results/nmk-constraints-result-en.csv @@ -1,4 +1,4 @@ -Equipment,Contingency,Status,Violation type,Bus,Limit name,Operational limits group id,Load (% limit),Load (% PATL),Actual overload,Upcoming overload,Next limit name,Limit (A or kV),PATL (A),Calculated value (A or kV),Side,Load cut off (MW),Power cut off (MW) +Equipment,Contingency,Status,Violation type,Bus,Limit name,Operational limits group id,Load (% limit),Load (% PATL),Actual overload,Upcoming overload,Next limit name,Limit (A or kV),PATL (A),Calculated value (A or kV),Side l3,l1,Converged,Current,,l3_name,,110,,,,,10,,11,Side 1 l3,l2,Converged,Current,,l3_name,,110,,,,,10,,11,Side 1 l3,l3,Converged,Current,,l3_name,,110,,,,,10,,11,Side 1 diff --git a/src/test/resources/results/nmk-constraints-result-fr.csv b/src/test/resources/results/nmk-constraints-result-fr.csv index 2919aecd..98cfd85f 100644 --- a/src/test/resources/results/nmk-constraints-result-fr.csv +++ b/src/test/resources/results/nmk-constraints-result-fr.csv @@ -1,4 +1,4 @@ -Ouvrage;Aléa;Statut;Type de contrainte;Noeud électrique;Nom de la limite;Id du jeu de limites;Charge (% limite);Charge (% IST);Tempo effective;Tempo imminente;Nom de la limite suivante;Limite (A ou kV);IST (A);Valeur calculée (A ou kV);Côté;Consommation coupée (MW);Puissance coupée (MW) +Ouvrage;Aléa;Statut;Type de contrainte;Noeud électrique;Nom de la limite;Id du jeu de limites;Charge (% limite);Charge (% IST);Tempo effective;Tempo imminente;Nom de la limite suivante;Limite (A ou kV);IST (A);Valeur calculée (A ou kV);Côté l3;l1;Convergence;Intensité;;l3_name;;110;;;;;10;;11;Côté 1 l3;l2;Convergence;Intensité;;l3_name;;110;;;;;10;;11;Côté 1 l3;l3;Convergence;Intensité;;l3_name;;110;;;;;10;;11;Côté 1 diff --git a/src/test/resources/results/nmk-constraints-result-with-filter-en.csv b/src/test/resources/results/nmk-constraints-result-with-filter-en.csv index 132b5fd0..4f3834d5 100644 --- a/src/test/resources/results/nmk-constraints-result-with-filter-en.csv +++ b/src/test/resources/results/nmk-constraints-result-with-filter-en.csv @@ -1,4 +1,4 @@ -Equipment,Contingency,Status,Violation type,Bus,Limit name,Operational limits group id,Load (% limit),Load (% PATL),Actual overload,Upcoming overload,Next limit name,Limit (A or kV),PATL (A),Calculated value (A or kV),Side,Load cut off (MW),Power cut off (MW) +Equipment,Contingency,Status,Violation type,Bus,Limit name,Operational limits group id,Load (% limit),Load (% PATL),Actual overload,Upcoming overload,Next limit name,Limit (A or kV),PATL (A),Calculated value (A or kV),Side l3,l1,Converged,Current,,l3_name,,110,,,,,10,,11,Side 1 l3,l2,Converged,Current,,l3_name,,110,,,,,10,,11,Side 1 l3,l3,Converged,Current,,l3_name,,110,,,,,10,,11,Side 1 diff --git a/src/test/resources/results/nmk-contingencies-result-en.csv b/src/test/resources/results/nmk-contingencies-result-en.csv index 715596a8..d1839b71 100644 --- a/src/test/resources/results/nmk-contingencies-result-en.csv +++ b/src/test/resources/results/nmk-contingencies-result-en.csv @@ -1,4 +1,4 @@ -Contingency,Status,Equipment,Violation type,Bus,Limit name,Operational limits group id,Load (% limit),Load (% PATL),Actual overload,Upcoming overload,Next limit name,Limit (A or kV),PATL (A),Calculated value (A or kV),Side,Load cut off (MW),Power cut off (MW) +Contingency,Status,Equipment,Violation type,Bus,Limit name,Operational limits group id,Load (% limit),Load (% PATL),Actual overload,Upcoming overload,Next limit name,Limit (A or kV),PATL (A),Calculated value (A or kV),Side f1,Failed,l6,Current,,l6_name,,110,,1200,,,10,,11,Side 1 f1,Failed,vl7,High voltage,vl7,vl7_name,,,,0,,,400,,410, f2,Failed,l6,Current,,l6_name,,110,,1200,,,10,,11,Side 1 diff --git a/src/test/resources/results/nmk-contingencies-result-fr.csv b/src/test/resources/results/nmk-contingencies-result-fr.csv index b286d6fb..2cc58820 100644 --- a/src/test/resources/results/nmk-contingencies-result-fr.csv +++ b/src/test/resources/results/nmk-contingencies-result-fr.csv @@ -1,4 +1,4 @@ -Aléa;Statut;Ouvrage;Type de contrainte;Noeud électrique;Nom de la limite;Id du jeu de limites;Charge (% limite);Charge (% IST);Tempo effective;Tempo imminente;Nom de la limite suivante;Limite (A ou kV);IST (A);Valeur calculée (A ou kV);Côté;Consommation coupée (MW);Puissance coupée (MW) +Aléa;Statut;Ouvrage;Type de contrainte;Noeud électrique;Nom de la limite;Id du jeu de limites;Charge (% limite);Charge (% IST);Tempo effective;Tempo imminente;Nom de la limite suivante;Limite (A ou kV);IST (A);Valeur calculée (A ou kV);Côté f1;Echec;l6;Intensité;;l6_name;;110;;1200;;;10;;11;Côté 1 f1;Echec;vl7;Tension haute;vl7;vl7_name;;;;0;;;400;;410; f2;Echec;l6;Intensité;;l6_name;;110;;1200;;;10;;11;Côté 1 diff --git a/src/test/resources/results/nmk-contingencies-result-with-filter-en.csv b/src/test/resources/results/nmk-contingencies-result-with-filter-en.csv index 19d34b56..bccea8a0 100644 --- a/src/test/resources/results/nmk-contingencies-result-with-filter-en.csv +++ b/src/test/resources/results/nmk-contingencies-result-with-filter-en.csv @@ -1,4 +1,4 @@ -Contingency,Status,Equipment,Violation type,Bus,Limit name,Operational limits group id,Load (% limit),Load (% PATL),Actual overload,Upcoming overload,Next limit name,Limit (A or kV),PATL (A),Calculated value (A or kV),Side;Load cut off (MW);Power cut off (MW) +Contingency,Status,Equipment,Violation type,Bus,Limit name,Operational limits group id,Load (% limit),Load (% PATL),Actual overload,Upcoming overload,Next limit name,Limit (A or kV),PATL (A),Calculated value (A or kV),Side f1,Failed,l6,Current,,l6_name,,110,,1200,,,10,,11,Side 1 f2,Failed,l6,Current,,l6_name,,110,,1200,,,10,,11,Side 1 f3,Failed,l6,Current,,l6_name,,110,,1200,,,10,,11,Side 1