diff --git a/app-monolith/src/test/resources/examples/delivery-definitions.json b/app-monolith/src/test/resources/examples/delivery-definitions.json index 20e33e2..2224a35 100644 --- a/app-monolith/src/test/resources/examples/delivery-definitions.json +++ b/app-monolith/src/test/resources/examples/delivery-definitions.json @@ -1,5 +1,5 @@ { - "refNo": "3009000", + "refNo": "3009001", "definition": { "definitions": { "AtDayStart": { diff --git a/app-monolith/src/test/resources/examples/demand-adjustments.json b/app-monolith/src/test/resources/examples/demand-adjustments.json index 77e2d2e..37fdb1f 100644 --- a/app-monolith/src/test/resources/examples/demand-adjustments.json +++ b/app-monolith/src/test/resources/examples/demand-adjustments.json @@ -1,27 +1,20 @@ { - "note": "Bo demo dla comarch-u", - "customerRepresentative": "Koledzy z logistyki", + "note": "Bo demo robie", + "customerRepresentative": "Kolega z logistyki", "adjustment": { - "refNo": "3009000", + "refNo": "3009001", "adjustments": { - "2017-12-17": { - "demand": { - "level": 2000, - "schema": "AtDayStart" - }, - "strong": true - }, - "2017-12-22": { + "2018-02-13": { "demand": { "level": 1000, "schema": "AtDayStart" }, - "strong": false + "strong": true }, - "2017-12-23": { + "2018-02-14": { "demand": { - "level": 300, - "schema": "AtDayStart" + "level": 1500, + "schema": "TillDayEnd" }, "strong": false } diff --git a/app-monolith/src/test/resources/examples/product-descriptions.json b/app-monolith/src/test/resources/examples/product-descriptions.json index 7cc9d80..acc6f82 100644 --- a/app-monolith/src/test/resources/examples/product-descriptions.json +++ b/app-monolith/src/test/resources/examples/product-descriptions.json @@ -1,9 +1,9 @@ { - "refNo": "3009000", + "refNo": "3009001", "description": { - "matNum": "461952398951", + "matNum": "461952398959", "names": [ - "PROWAD.POJ.NA JARZ.ESSENT" + "NOWA PROWAD.POJ.NA JARZ.ESSENT" ] } } diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java index d531ae5..f60b74d 100644 --- a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java @@ -43,25 +43,21 @@ class DemandORMRepository { Function.identity() )); - UnitOfWork unitOfWork = new UnitOfWork(); Demands demands = new Demands(); - demands.fetch = date -> map(refNo, date, data, unitOfWork); - return new ProductDemand(id, demands, unitOfWork, clock, events); + demands.fetch = date -> map(refNo, date, data); + return new ProductDemand(id, demands, clock, events); } private DailyDemand map(String refNo, LocalDate date, - Map data, - UnitOfWork unitOfWork) { + Map data) { return ofNullable(data.get(date)) .map(entity -> new DailyDemand( entity.createId(), - unitOfWork, reviewPolicy, entity.getValue().getDocumented(), entity.getValue().getAdjustment())) .orElseGet(() -> new DailyDemand( new DemandEntityId(refNo, date), - unitOfWork, reviewPolicy, null, null @@ -70,10 +66,10 @@ class DemandORMRepository { void save(ProductDemand model) { ProductDemandEntity root = rootDao.findOne(TechnicalId.get(model.id)); - if (model.unit.updates().size() > 0) { + if (model.updates.size() > 0) { em.lock(root, LockModeType.OPTIMISTIC_FORCE_INCREMENT); } - for (DemandUpdated updated : model.unit.updates()) { + for (DemandUpdated updated : model.updates) { DemandEntity entity; if (TechnicalId.isPersisted(updated.getId())) { entity = demandDao.getOne(TechnicalId.get(updated.getId())); diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/AdjustDemand.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/AdjustDemand.java index 353d706..cc73e66 100644 --- a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/AdjustDemand.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/AdjustDemand.java @@ -1,22 +1,26 @@ package pl.com.bottega.factory.demand.forecasting; import lombok.Value; +import pl.com.bottega.factory.demand.forecasting.DailyDemand.Result; import java.time.LocalDate; import java.util.Comparator; +import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.stream.Collectors; @Value public class AdjustDemand { String refNo; Map adjustments; - public void forEachStartingFrom(LocalDate date, BiConsumer f) { - adjustments.entrySet().stream() + public List forEachStartingFrom(LocalDate date, BiFunction f) { + return adjustments.entrySet().stream() .filter(e -> !e.getKey().isBefore(date)) - .forEach(e -> f.accept(e.getKey(), e.getValue())); + .map(e -> f.apply(e.getKey(), e.getValue())) + .collect(Collectors.toList()); } public Optional latestAdjustment() { diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Adjustment.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Adjustment.java index 82952ed..7d76eb1 100644 --- a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Adjustment.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Adjustment.java @@ -19,4 +19,8 @@ class Adjustment { static boolean isStrong(Adjustment adjustment) { return adjustment != null && adjustment.strong; } + + static boolean isNotStrong(Adjustment adjustment) { + return !isStrong(adjustment); + } } diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DailyDemand.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DailyDemand.java index ddaa52c..8f340dd 100644 --- a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DailyDemand.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DailyDemand.java @@ -1,11 +1,12 @@ package pl.com.bottega.factory.demand.forecasting; +import lombok.Builder; import lombok.Value; import pl.com.bottega.factory.demand.forecasting.DemandedLevelsChanged.Change; import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview; -import java.util.Objects; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; class DailyDemand { @@ -13,59 +14,53 @@ class DailyDemand { private Demand documented; private Adjustment adjustment; - private final Events events; private final ReviewPolicy policy; - interface Events { - void emit(LevelChanged event); - - void emit(ToReview event); - - void emit(DemandUpdated event); - } - - DailyDemand(DailyId id, Events events, ReviewPolicy policy, + DailyDemand(DailyId id, ReviewPolicy policy, Demand documented, Adjustment adjustment) { this.id = id; - this.events = events; this.policy = policy; this.documented = Optional.ofNullable(documented) .orElse(Demand.nothingDemanded()); this.adjustment = adjustment; } - void adjust(Adjustment adjustment) { + Result adjust(Adjustment adjustment) { + Result.ResultBuilder result = Result.builder(id); State state = state(); this.adjustment = adjustment; if (state.updated()) { - events.emit(new DemandUpdated(id, documented, adjustment)); + result.updated(new DemandUpdated(id, documented, adjustment)); } if (state.levelChanged()) { - events.emit(new LevelChanged(id, state.getLevelChange())); + result.levelChange(state.getLevelChange()); } + return result.build(); } - void update(Demand documented) { + Result update(Demand documented) { + Result.ResultBuilder result = Result.builder(id); State state = state(); if (policy.reviewNeeded(this.documented, this.adjustment, documented)) { - events.emit(new ToReview(id, + result.toReview(new ToReview(id, this.documented, this.adjustment.getDemand(), documented) ); } - if (!Adjustment.isStrong(this.adjustment)) { + if (Adjustment.isNotStrong(this.adjustment)) { this.adjustment = null; } this.documented = documented; if (state.updated()) { - events.emit(new DemandUpdated(id, documented, adjustment)); + result.updated(new DemandUpdated(id, documented, adjustment)); } if (state.levelChanged()) { - events.emit(new LevelChanged(id, state.getLevelChange())); + result.levelChange(state.getLevelChange()); } + return result.build(); } Demand getLevel() { @@ -74,12 +69,6 @@ class DailyDemand { .orElse(documented); } - @Value - static class LevelChanged { - DailyId id; - Change change; - } - @Value static class DemandUpdated { DailyId id; @@ -115,4 +104,40 @@ class DailyDemand { return !level.equals(getLevel()); } } + + @Builder + @Value + static class Result { + DailyId id; + DemandUpdated updated; + DemandedLevelsChanged.Change levelChange; + ReviewRequired.ToReview toReview; + + static ResultBuilder builder(DailyId id) { + return new ResultBuilder().id(id); + } + + static List reviews(List results) { + return Collections.unmodifiableList(results.stream() + .filter(result -> result.toReview != null) + .map(result -> result.toReview) + .collect(Collectors.toList())); + } + + static Map levelChanges(List results) { + return Collections.unmodifiableMap(results.stream() + .filter(result -> result.levelChange != null) + .collect(Collectors.toMap( + result -> result.id, + result -> result.levelChange + ))); + } + + static List updates(List results) { + return Collections.unmodifiableList(results.stream() + .filter(result -> result.updated != null) + .map(result -> result.updated) + .collect(Collectors.toList())); + } + } } diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Document.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Document.java index 80778d6..d7553c5 100644 --- a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Document.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Document.java @@ -5,8 +5,10 @@ import lombok.Value; import java.time.Instant; import java.time.LocalDate; import java.util.Collections; +import java.util.List; import java.util.SortedMap; -import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.stream.Collectors; @Value public class Document { @@ -21,10 +23,11 @@ public class Document { this.demands = Collections.unmodifiableSortedMap(demands); } - public void forEachStartingFrom(LocalDate date, BiConsumer f) { - demands.entrySet().stream() + public List forEachStartingFrom(LocalDate date, BiFunction f) { + return demands.entrySet().stream() .filter(e -> !e.getKey().isBefore(date)) - .forEach(e -> f.accept(e.getKey(), e.getValue())); + .map(e -> f.apply(e.getKey(), e.getValue())) + .collect(Collectors.toList()); } } diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemand.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemand.java index ebed56b..14498f1 100644 --- a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemand.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemand.java @@ -1,19 +1,24 @@ package pl.com.bottega.factory.demand.forecasting; import lombok.AllArgsConstructor; +import pl.com.bottega.factory.demand.forecasting.DailyDemand.Result; +import pl.com.bottega.factory.demand.forecasting.DemandedLevelsChanged.Change; import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview; import pl.com.bottega.factory.product.management.RefNoId; import java.time.Clock; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; @AllArgsConstructor class ProductDemand { final RefNoId id; final Demands demands; + final List updates = new ArrayList<>(); - final UnitOfWork unit; final Clock clock; final DemandEvents events; @@ -24,23 +29,34 @@ class ProductDemand { void adjust(AdjustDemand adjustDemand) { LocalDate today = LocalDate.now(clock); - adjustDemand.forEachStartingFrom(today, this::adjustDaily); + List results = adjustDemand + .forEachStartingFrom(today, this::adjustDaily); + updates.addAll(Result.updates(results)); - if (unit.anyChanges()) { - events.emit(new DemandedLevelsChanged(id, unit.changes())); + Map changes = Result.levelChanges(results); + + if (!changes.isEmpty()) { + events.emit(new DemandedLevelsChanged(id, changes)); } } void process(Document document) { LocalDate today = LocalDate.now(clock); - document.forEachStartingFrom(today, this::updateDaily); + List results = document + .forEachStartingFrom(today, this::updateDaily); + updates.addAll(Result.updates(results)); - if (unit.anyChanges()) { - events.emit(new DemandedLevelsChanged(id, unit.changes())); + Map changes = Result.levelChanges(results); + + if (!changes.isEmpty()) { + events.emit(new DemandedLevelsChanged(id, changes)); } - if (unit.anyReviews()) { - events.emit(new ReviewRequired(id, unit.reviews())); + + List reviews = Result.reviews(results); + + if (!reviews.isEmpty()) { + events.emit(new ReviewRequired(id, reviews)); } } @@ -50,13 +66,13 @@ class ProductDemand { } } - private void adjustDaily(LocalDate date, Adjustment adjustment) { + private Result adjustDaily(LocalDate date, Adjustment adjustment) { DailyDemand demand = demands.get(date); - demand.adjust(adjustment); + return demand.adjust(adjustment); } - private void updateDaily(LocalDate date, Demand demand) { + private Result updateDaily(LocalDate date, Demand demand) { DailyDemand daily = demands.get(date); - daily.update(demand); + return daily.update(demand); } } diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/UnitOfWork.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/UnitOfWork.java deleted file mode 100644 index 012e2ad..0000000 --- a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/UnitOfWork.java +++ /dev/null @@ -1,49 +0,0 @@ -package pl.com.bottega.factory.demand.forecasting; - -import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview; - -import java.util.*; - -import static java.util.Collections.unmodifiableList; - -class UnitOfWork implements DailyDemand.Events { - - Map changes = new HashMap<>(); - List reviews = new LinkedList<>(); - List updates = new LinkedList<>(); - - boolean anyChanges() { - return !changes.isEmpty(); - } - - Map changes() { - return Collections.unmodifiableMap(changes); - } - - boolean anyReviews() { - return !reviews.isEmpty(); - } - - List reviews() { - return Collections.unmodifiableList(reviews); - } - - List updates() { - return unmodifiableList(updates); - } - - @Override - public void emit(DailyDemand.LevelChanged event) { - changes.put(event.getId(), event.getChange()); - } - - @Override - public void emit(ToReview event) { - reviews.add(event); - } - - @Override - public void emit(DailyDemand.DemandUpdated event) { - updates.add(event); - } -} diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DailyDemandBuilder.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DailyDemandBuilder.groovy index 8fcb13f..3344a1b 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DailyDemandBuilder.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DailyDemandBuilder.groovy @@ -11,7 +11,6 @@ import static pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview class DailyDemandBuilder { Clock clock = Clock.fixed(Instant.now(), ZoneId.systemDefault()) - DailyDemand.Events events ReviewPolicy policy = ReviewPolicy.BASIC String refNo = "3009000" @@ -20,7 +19,7 @@ class DailyDemandBuilder { private Adjustment adjustment DailyDemand build() { - new DailyDemand(new DailyId(refNo, date), events, policy, base, adjustment) + new DailyDemand(new DailyId(refNo, date), policy, base, adjustment) } DailyDemandBuilder reset() { @@ -32,11 +31,6 @@ class DailyDemandBuilder { clazz == DailyDemand ? build() : super.asType(clazz) } - DailyDemandBuilder events(DailyDemand.Events events) { - this.events = events - this - } - DailyDemandBuilder nextDate() { date.plusDays(1) this @@ -85,11 +79,8 @@ class DailyDemandBuilder { new Adjustment(Demand.of(level), false) } - DailyDemand.LevelChanged levelChanged(long previous, long current) { - new DailyDemand.LevelChanged( - new DailyId(refNo, date), - new Change(Demand.of(previous), Demand.of(current)) - ) + Change levelChanged(long previous, long current) { + new Change(Demand.of(previous), Demand.of(current)) } ToReview reviewRequest(long previousDocumented, long adjustment, long newDocumented) { diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandAdjustmentSpec.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandAdjustmentSpec.groovy index 15ad3ad..835603a 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandAdjustmentSpec.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandAdjustmentSpec.groovy @@ -77,7 +77,6 @@ class DemandAdjustmentSpec extends Specification implements ProductDemandTrait { 1 * events.emit(levelChanged([2800, 2000], [0, 3500])) when: - builder.clearUnitOfWork() demand.adjust(adjustments) then: diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandsFake.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandsFake.groovy index 5647278..66245f5 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandsFake.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandsFake.groovy @@ -7,8 +7,8 @@ class DemandsFake extends Demands { DailyDemandBuilder builder - DemandsFake(String refNo, UnitOfWork unitOfWork, Clock clock) { - this.builder = new DailyDemandBuilder(refNo: refNo, events: unitOfWork, clock: clock) + DemandsFake(String refNo, Clock clock) { + this.builder = new DailyDemandBuilder(refNo: refNo, clock: clock) fetch = { date -> nothingDemanded(date) } } diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DocumentProcessingSpec.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DocumentProcessingSpec.groovy index 011c230..f736970 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DocumentProcessingSpec.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DocumentProcessingSpec.groovy @@ -77,7 +77,6 @@ class DocumentProcessingSpec extends Specification implements ProductDemandTrait 1 * events.emit(levelChanged([2800, 2000], [0, 3500])) when: - builder.clearUnitOfWork() demand.process(document) then: diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/KeepingDailyDemandsSpec.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/KeepingDailyDemandsSpec.groovy index 0dccb18..8691de7 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/KeepingDailyDemandsSpec.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/KeepingDailyDemandsSpec.groovy @@ -5,7 +5,6 @@ import spock.lang.Specification class KeepingDailyDemandsSpec extends Specification { def builder = new DailyDemandBuilder() - def events = Mock(DailyDemand.Events) def "Adjusted demands should be stored"() { given: @@ -14,11 +13,12 @@ class KeepingDailyDemandsSpec extends Specification { .noAdjustments().build() when: - demand.adjust(adjustDemandTo(3500)) + def res = demand.adjust(adjustDemandTo(3500)) then: demand.getLevel() == Demand.of(3500) - 1 * events.emit(levelChanged(2800, 3500)) + res.levelChange == levelChanged(2800, 3500) + res.updated != null } def "Adjusted demands should be stored when there is no demand for product"() { @@ -28,11 +28,12 @@ class KeepingDailyDemandsSpec extends Specification { .noAdjustments().build() when: - demand.adjust(adjustDemandTo(3500)) + def res = demand.adjust(adjustDemandTo(3500)) then: demand.getLevel() == Demand.of(3500) - 1 * events.emit(levelChanged(0, 3500)) + res.levelChange == levelChanged(0, 3500) + res.updated != null } def "In standard case documented demands overrides adjustments"() { @@ -42,11 +43,12 @@ class KeepingDailyDemandsSpec extends Specification { .adjustedTo(3500).build() when: - demand.update(newCallOffDemand(4000)) + def res = demand.update(newCallOffDemand(4000)) then: demand.getLevel() == Demand.of(4000) - 1 * events.emit(levelChanged(3500, 4000)) + res.levelChange == levelChanged(3500, 4000) + res.updated != null } def "Strong adjustment is kept even after processing of document"() { @@ -56,11 +58,12 @@ class KeepingDailyDemandsSpec extends Specification { .stronglyAdjustedTo(3500).build() when: - demand.update(newCallOffDemand(2800)) + def res = demand.update(newCallOffDemand(2800)) then: demand.getLevel() == Demand.of(3500) - 0 * events.emit(_ as DailyDemand.LevelChanged) + res.levelChange == null + res.updated == null } def "Document update ignored by strong adjustment should rise warning"() { @@ -70,15 +73,16 @@ class KeepingDailyDemandsSpec extends Specification { .stronglyAdjustedTo(3500).build() when: - demand.update(newCallOffDemand(5000)) + def res = demand.update(newCallOffDemand(5000)) then: demand.getLevel() == Demand.of(3500) - 1 * events.emit(reviewRequest(2800, 3500, 5000)) + res.toReview == reviewRequest(2800, 3500, 5000) + res.levelChange == null + res.updated != null } DailyDemandBuilder demand() { - builder.events = events builder } diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandBuilder.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandBuilder.groovy index 889c2b5..2b19c04 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandBuilder.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandBuilder.groovy @@ -10,8 +10,7 @@ import static pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview class ProductDemandBuilder { def refNo = "3009000" - def unitOfWork = new UnitOfWork() - def demands = new DemandsFake(refNo, unitOfWork, clock) + def demands = new DemandsFake(refNo, clock) def clock = Clock.fixed(Instant.now(), ZoneId.systemDefault()) DemandEvents events @@ -39,7 +38,7 @@ class ProductDemandBuilder { } def build() { - new ProductDemand(new RefNoId(refNo), demands, unitOfWork, clock, events) + new ProductDemand(new RefNoId(refNo), demands, clock, events) } def document(LocalDate date, long ... levels) { @@ -88,10 +87,4 @@ class ProductDemandBuilder { Demand.of(strongAdjustment), Demand.of(newDocumented)) } - - void clearUnitOfWork() { - unitOfWork.@changes.clear() - unitOfWork.@reviews.clear() - unitOfWork.@updates.clear() - } }