From 6110fcaeb39cdcc5998d5336ecf8343ef3550bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Michaluk?= Date: Sat, 10 Mar 2018 09:58:28 +0100 Subject: [PATCH] introducing command object for applying reviews --- .../forecasting/command/CommandsHandler.java | 2 +- .../command/RequiredReviewEntity.java | 5 ++++ .../forecasting/ApplyReviewDecision.java | 28 +++++++++++++++++++ .../demand/forecasting/DemandService.java | 7 ++--- .../demand/forecasting/ProductDemand.java | 6 ++-- .../demand/forecasting/ReviewDecision.java | 16 ++--------- .../forecasting/DemandServiceSpec.groovy | 6 ++-- .../forecasting/ProductDemandBuilder.groovy | 5 ++++ .../forecasting/ProductDemandTrait.groovy | 4 +++ .../forecasting/ReviewProcessingSpec.groovy | 20 ++++++++++--- 10 files changed, 71 insertions(+), 28 deletions(-) create mode 100644 demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ApplyReviewDecision.java diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/CommandsHandler.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/CommandsHandler.java index 43f4c00..2937b16 100644 --- a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/CommandsHandler.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/CommandsHandler.java @@ -39,7 +39,7 @@ public class CommandsHandler { public void review(RequiredReviewEntity review) { if (review.decisionTaken()) { review.setCleanAfter(LocalDate.now(clock).plusDays(7)); - service.review(review.getReview(), review.getDecision()); + service.review(review.getReviewDecision()); } } diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/RequiredReviewEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/RequiredReviewEntity.java index 50cf569..9ff9d85 100644 --- a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/RequiredReviewEntity.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/RequiredReviewEntity.java @@ -3,6 +3,7 @@ package pl.com.bottega.factory.demand.forecasting.command; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import pl.com.bottega.factory.demand.forecasting.ApplyReviewDecision; import pl.com.bottega.factory.demand.forecasting.ReviewDecision; import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview; import pl.com.bottega.tools.JsonConverter; @@ -43,6 +44,10 @@ public class RequiredReviewEntity implements Serializable { return decision != null; } + public ApplyReviewDecision getReviewDecision() { + return new ApplyReviewDecision(review, decision); + } + public static class ReviewAsJson extends JsonConverter { public ReviewAsJson() { super(ToReview.class); diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ApplyReviewDecision.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ApplyReviewDecision.java new file mode 100644 index 0000000..1137104 --- /dev/null +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ApplyReviewDecision.java @@ -0,0 +1,28 @@ +package pl.com.bottega.factory.demand.forecasting; + +import lombok.Value; + +import java.util.Collections; + +@Value +public class ApplyReviewDecision { + ReviewRequired.ToReview review; + ReviewDecision decision; + + boolean requireAdjustment() { + return decision != ReviewDecision.IGNORE; + } + + AdjustDemand toAdjustment() { + return new AdjustDemand(review.getRefNo(), + Collections.singletonMap( + review.getDate(), + Adjustment.weak(decision.toAdjustment(review)) + ) + ); + } + + public String getRefNo() { + return review.getRefNo(); + } +} diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java index cf50960..0a118f2 100644 --- a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java @@ -1,7 +1,6 @@ package pl.com.bottega.factory.demand.forecasting; import lombok.AllArgsConstructor; -import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview; @AllArgsConstructor public class DemandService { @@ -24,9 +23,9 @@ public class DemandService { repository.save(model); } - public void review(ToReview review, ReviewDecision decision) { - ProductDemand model = repository.get(review.getRefNo()); - model.review(review, decision); + public void review(ApplyReviewDecision reviewDecision) { + ProductDemand model = repository.get(reviewDecision.getRefNo()); + model.review(reviewDecision); repository.save(model); } } 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 9bb4627..4487946 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 @@ -59,9 +59,9 @@ class ProductDemand { } } - void review(ToReview review, ReviewDecision decision) { - if (decision.requireAdjustment()) { - adjust(decision.toAdjustment(review)); + void review(ApplyReviewDecision reviewDecision) { + if (reviewDecision.requireAdjustment()) { + adjust(reviewDecision.toAdjustment()); } } diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ReviewDecision.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ReviewDecision.java index 446236c..803a0a8 100644 --- a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ReviewDecision.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ReviewDecision.java @@ -3,7 +3,6 @@ package pl.com.bottega.factory.demand.forecasting; import lombok.AllArgsConstructor; import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview; -import java.util.Collections; import java.util.function.Function; @AllArgsConstructor @@ -15,19 +14,10 @@ public enum ReviewDecision { private final Function pick; - public AdjustDemand toAdjustment(ToReview review) { - if (this == IGNORE) { + public Demand toAdjustment(ToReview review) { + if (this == ReviewDecision.IGNORE) { throw new IllegalStateException("can't convert " + this + " to adjustment"); } - return new AdjustDemand(review.getRefNo(), - Collections.singletonMap( - review.getDate(), - Adjustment.weak(pick.apply(review)) - ) - ); - } - - public boolean requireAdjustment() { - return this != IGNORE; + return pick.apply(review); } } diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandServiceSpec.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandServiceSpec.groovy index 6fdb3ff..41a5396 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandServiceSpec.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandServiceSpec.groovy @@ -58,14 +58,14 @@ class DemandServiceSpec extends Specification implements ProductDemandTrait { def "Repository interactions while review processing"() { given: def today = LocalDate.now(builder.clock) - def demand = demand(0, 2800) + def demand = demand(2800) .stronglyAdjusted((today): 3500) .build() - def review = review(today, 0, 3500, 2800) + def review = reviewDecision(review(today, 0, 3500, 2800), PICK_NEW) repo.get(review.refNo) >> demand when: - service.review(review, PICK_NEW) + service.review(review) then: 1 * repo.save(demand) 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 b1fce54..3d23d2f 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 @@ -87,4 +87,9 @@ class ProductDemandBuilder { Demand.of(strongAdjustment), Demand.of(newDocumented)) } + + ApplyReviewDecision reviewDecision(ToReview review, + ReviewDecision decision) { + new ApplyReviewDecision(review, decision) + } } diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandTrait.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandTrait.groovy index 5401aeb..e502647 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandTrait.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandTrait.groovy @@ -43,4 +43,8 @@ trait ProductDemandTrait { long newDocumented) { return builder.review(date, previousDocumented, strongAdjustment, newDocumented) } + + ApplyReviewDecision reviewDecision(ToReview review, ReviewDecision decision) { + builder.reviewDecision(review, decision) + } } \ No newline at end of file diff --git a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ReviewProcessingSpec.groovy b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ReviewProcessingSpec.groovy index 6d8c26f..a98f096 100644 --- a/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ReviewProcessingSpec.groovy +++ b/demand-forecasting-model/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ReviewProcessingSpec.groovy @@ -38,7 +38,10 @@ class ReviewProcessingSpec extends Specification implements ProductDemandTrait { .build() when: - demand.review(review(tomorrow, 0, 3500, 2800), IGNORE) + demand.review(reviewDecision( + review(tomorrow, 0, 3500, 2800), + IGNORE + )) then: 0 * events.emit(_ as DemandedLevelsChanged) @@ -53,7 +56,10 @@ class ReviewProcessingSpec extends Specification implements ProductDemandTrait { .build() when: - demand.review(review(tomorrow, 0, 3500, 2800), PICK_NEW) + demand.review(reviewDecision( + review(tomorrow, 0, 3500, 2800), + PICK_NEW + )) then: 1 * events.emit(levelChanged([], [3500, 2800])) @@ -68,7 +74,10 @@ class ReviewProcessingSpec extends Specification implements ProductDemandTrait { .build() when: - demand.review(review(tomorrow, 0, 3500, 2800), PICK_PREVIOUS) + demand.review(reviewDecision( + review(tomorrow, 0, 3500, 2800), + PICK_PREVIOUS + )) then: 1 * events.emit(levelChanged([], [3500, 0])) @@ -83,7 +92,10 @@ class ReviewProcessingSpec extends Specification implements ProductDemandTrait { .build() when: - demand.review(review(tomorrow, 0, 3500, 2800), MAKE_ADJUSTMENT_WEAK) + demand.review(reviewDecision( + review(tomorrow, 0, 3500, 2800), + MAKE_ADJUSTMENT_WEAK + )) then: 0 * events.emit(_ as DemandedLevelsChanged)