fix(record): reopen latest closed по max(validTo) + revert i18n

This commit is contained in:
Александр Зимин
2026-06-22 10:00:38 +00:00
parent b84ef94121
commit 3cc7410ab5
2 changed files with 10 additions and 9 deletions
@@ -441,17 +441,18 @@ public class DictionaryRecordService {
"business_key='" + businessKey + "' уже активен — re-open не нужен.");
}
// findByDictionaryIdAndBusinessKeyOrderByValidFromDesc возвращает версии
// отсортированными по validFrom desc. Самая недавно закрытая — это первый
// элемент, у которого validTo != FAR_FUTURE (closed) и validTo больше всех
// других closed. Так как версии bitemporal не пересекаются (exclusion
// constraint), а closed period — последний по validFrom, то это и есть
// первый matching элемент.
// Самая недавно закрытая версия = max(validTo) среди closed с НЕпустым
// периодом. Берём по validTo, а не по validFrom: при UPDATE/CLOSE в один
// момент возможны zero-length версии (validFrom == validTo) — артефакты,
// которые "никогда не были активны". Их фильтруем (isAfter validFrom),
// иначе re-open восстановил бы пустую версию вместо реально закрытой.
var prevData = repository
.findByDictionaryIdAndBusinessKeyOrderByValidFromDesc(d.getId(), businessKey)
.stream()
.filter(r -> r.getValidTo() != null && r.getValidTo().isBefore(FAR_FUTURE))
.findFirst()
.filter(r -> r.getValidTo() != null
&& r.getValidTo().isBefore(FAR_FUTURE)
&& r.getValidTo().isAfter(r.getValidFrom()))
.max(java.util.Comparator.comparing(DictionaryRecord::getValidTo))
.orElseThrow(() -> OrdinisException.notFound(
"record_not_closed",
"Нет закрытой версии business_key='" + businessKey + "' для re-open."));