domain and design in readme
This commit is contained in:
@@ -2,7 +2,7 @@ package pl.com.bottega.factory.demand.forecasting;
|
||||
|
||||
import lombok.Value;
|
||||
import pl.com.bottega.factory.demand.forecasting.DemandedLevelsChanged.Change;
|
||||
import pl.com.bottega.factory.demand.forecasting.ReviewRequested.ReviewNeeded;
|
||||
import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
@@ -19,7 +19,7 @@ class DailyDemand {
|
||||
interface Events {
|
||||
void emit(LevelChanged event);
|
||||
|
||||
void emit(ReviewNeeded event);
|
||||
void emit(ToReview event);
|
||||
|
||||
void emit(DemandUpdated event);
|
||||
}
|
||||
@@ -49,7 +49,7 @@ class DailyDemand {
|
||||
void update(Demand documented) {
|
||||
State state = state();
|
||||
if (policy.reviewNeeded(this.documented, this.adjustment, documented)) {
|
||||
events.emit(new ReviewNeeded(id,
|
||||
events.emit(new ToReview(id,
|
||||
this.documented,
|
||||
this.adjustment.getDemand(),
|
||||
documented)
|
||||
|
||||
@@ -3,5 +3,5 @@ package pl.com.bottega.factory.demand.forecasting;
|
||||
public interface DemandEvents {
|
||||
void emit(DemandedLevelsChanged event);
|
||||
|
||||
void emit(ReviewRequested event);
|
||||
void emit(ReviewRequired event);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package pl.com.bottega.factory.demand.forecasting;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import pl.com.bottega.factory.demand.forecasting.ReviewRequested.ReviewNeeded;
|
||||
import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview;
|
||||
import pl.com.bottega.factory.product.management.RefNoId;
|
||||
|
||||
import java.time.Clock;
|
||||
@@ -40,11 +40,11 @@ class ProductDemand {
|
||||
events.emit(new DemandedLevelsChanged(id, unit.changes()));
|
||||
}
|
||||
if (unit.anyReviews()) {
|
||||
events.emit(new ReviewRequested(id, unit.reviews()));
|
||||
events.emit(new ReviewRequired(id, unit.reviews()));
|
||||
}
|
||||
}
|
||||
|
||||
void review(ReviewNeeded review, ReviewDecision decision) {
|
||||
void review(ToReview review, ReviewDecision decision) {
|
||||
if (decision.requireAdjustment()) {
|
||||
adjust(decision.toAdjustment(review));
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package pl.com.bottega.factory.demand.forecasting;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import pl.com.bottega.factory.demand.forecasting.ReviewRequested.ReviewNeeded;
|
||||
import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.function.Function;
|
||||
@@ -9,13 +9,13 @@ import java.util.function.Function;
|
||||
@AllArgsConstructor
|
||||
public enum ReviewDecision {
|
||||
IGNORE(r -> null),
|
||||
PICK_PREVIOUS(ReviewNeeded::getPreviousDocumented),
|
||||
MAKE_ADJUSTMENT_WEAK(ReviewNeeded::getAdjustment),
|
||||
PICK_NEW(ReviewNeeded::getNewDocumented);
|
||||
PICK_PREVIOUS(ToReview::getPreviousDocumented),
|
||||
MAKE_ADJUSTMENT_WEAK(ToReview::getAdjustment),
|
||||
PICK_NEW(ToReview::getNewDocumented);
|
||||
|
||||
private final Function<ReviewNeeded, Demand> pick;
|
||||
private final Function<ToReview, Demand> pick;
|
||||
|
||||
public AdjustDemand toAdjustment(ReviewNeeded review) {
|
||||
public AdjustDemand toAdjustment(ToReview review) {
|
||||
if (this == IGNORE) {
|
||||
throw new IllegalStateException("can't convert " + this + " to adjustment");
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package pl.com.bottega.factory.demand.forecasting;
|
||||
|
||||
import pl.com.bottega.factory.demand.forecasting.ReviewRequested.ReviewNeeded;
|
||||
import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -9,7 +9,7 @@ import static java.util.Collections.unmodifiableList;
|
||||
class UnitOfWork implements DailyDemand.Events {
|
||||
|
||||
Map<DailyId, DemandedLevelsChanged.Change> changes = new HashMap<>();
|
||||
List<ReviewNeeded> reviews = new LinkedList<>();
|
||||
List<ToReview> reviews = new LinkedList<>();
|
||||
List<DailyDemand.DemandUpdated> updates = new LinkedList<>();
|
||||
|
||||
boolean anyChanges() {
|
||||
@@ -24,7 +24,7 @@ class UnitOfWork implements DailyDemand.Events {
|
||||
return !reviews.isEmpty();
|
||||
}
|
||||
|
||||
List<ReviewNeeded> reviews() {
|
||||
List<ToReview> reviews() {
|
||||
return Collections.unmodifiableList(reviews);
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ class UnitOfWork implements DailyDemand.Events {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void emit(ReviewNeeded event) {
|
||||
public void emit(ToReview event) {
|
||||
reviews.add(event);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import java.time.LocalDate
|
||||
import java.time.ZoneId
|
||||
|
||||
import static DemandedLevelsChanged.Change
|
||||
import static ReviewRequested.ReviewNeeded
|
||||
import static pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview
|
||||
|
||||
class DailyDemandBuilder {
|
||||
|
||||
@@ -92,8 +92,8 @@ class DailyDemandBuilder {
|
||||
)
|
||||
}
|
||||
|
||||
ReviewNeeded reviewRequest(long previousDocumented, long adjustment, long newDocumented) {
|
||||
new ReviewNeeded(
|
||||
ToReview reviewRequest(long previousDocumented, long adjustment, long newDocumented) {
|
||||
new ToReview(
|
||||
new DailyId(refNo, date),
|
||||
Demand.of(previousDocumented),
|
||||
Demand.of(adjustment),
|
||||
|
||||
@@ -5,7 +5,7 @@ import pl.com.bottega.factory.product.management.RefNoId
|
||||
import java.time.*
|
||||
|
||||
import static DemandedLevelsChanged.Change
|
||||
import static ReviewRequested.ReviewNeeded
|
||||
import static pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview
|
||||
|
||||
class ProductDemandBuilder {
|
||||
|
||||
@@ -74,15 +74,15 @@ class ProductDemandBuilder {
|
||||
new DemandedLevelsChanged(new RefNoId(refNo), results)
|
||||
}
|
||||
|
||||
ReviewRequested reviewRequest(ReviewNeeded... reviews) {
|
||||
new ReviewRequested(new RefNoId(refNo), reviews as List)
|
||||
ReviewRequired reviewRequest(ToReview... reviews) {
|
||||
new ReviewRequired(new RefNoId(refNo), reviews as List)
|
||||
}
|
||||
|
||||
ReviewNeeded review(LocalDate date,
|
||||
long previousDocumented,
|
||||
long strongAdjustment,
|
||||
long newDocumented) {
|
||||
new ReviewNeeded(
|
||||
ToReview review(LocalDate date,
|
||||
long previousDocumented,
|
||||
long strongAdjustment,
|
||||
long newDocumented) {
|
||||
new ToReview(
|
||||
new DailyId(refNo, date),
|
||||
Demand.of(previousDocumented),
|
||||
Demand.of(strongAdjustment),
|
||||
|
||||
@@ -2,7 +2,7 @@ package pl.com.bottega.factory.demand.forecasting
|
||||
|
||||
import java.time.LocalDate
|
||||
|
||||
import static ReviewRequested.ReviewNeeded
|
||||
import static pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview
|
||||
|
||||
trait ProductDemandTrait {
|
||||
|
||||
@@ -32,11 +32,11 @@ trait ProductDemandTrait {
|
||||
[]
|
||||
}
|
||||
|
||||
ReviewRequested reviewRequest(ReviewNeeded... reviews) {
|
||||
ReviewRequired reviewRequest(ToReview... reviews) {
|
||||
builder.reviewRequest(reviews)
|
||||
}
|
||||
|
||||
ReviewNeeded review(
|
||||
ToReview review(
|
||||
LocalDate date,
|
||||
long previousDocumented,
|
||||
long strongAdjustment,
|
||||
|
||||
@@ -1,25 +1,29 @@
|
||||
Feature: manual adjustments of demand
|
||||
|
||||
sub domain: demand forecasting
|
||||
Sub Domain: demand forecasting
|
||||
keeps track of current and future customer needs for our products
|
||||
|
||||
Domain story:
|
||||
Adjust demand at day to amount, delivered.
|
||||
>> demand.adjust(productRefNo, atDay, amount)
|
||||
We can change only Demands for today and future.
|
||||
|
||||
New demand is stored for further reference
|
||||
Data from call-off document should be preserved (DON’T OVERRIDE THEM).
|
||||
Data from call-off document should be preserved.
|
||||
Adjust demand should be possible even
|
||||
if there was no call-off document for that product.
|
||||
In standard case future call-off documents should be stronger (overrides) adjustment,
|
||||
but if customer warn us about opposite case import of call-off document should not remove previous adjustments.
|
||||
if there was no document for that product.
|
||||
In standard case future call-off documents should override adjustment,
|
||||
but if customer warn us about opposite case
|
||||
import of document should not remove previous adjustments.
|
||||
Logistician note should be kept with adjustment.
|
||||
|
||||
emit domain event demand changed
|
||||
Domain event: demanded levels changed
|
||||
[context boundary]
|
||||
|
||||
Logistician note should be kept along with adjustment.
|
||||
Sub Domain: shortage prediction
|
||||
continuously monitors demands, production plan and stock levels
|
||||
predicts potential shortage based on forecasts
|
||||
notifies personal about potential shortages
|
||||
|
||||
outside of context boundary:
|
||||
If new demand is not fulfilled by
|
||||
current product stock and production forecast
|
||||
there is a shortage in particular days and we need to rise an alert.
|
||||
|
||||
Reference in New Issue
Block a user