domain and design in readme

This commit is contained in:
Michał Michaluk
2017-12-22 16:30:34 +01:00
parent 477149a716
commit 42689ab18d
40 changed files with 184 additions and 174 deletions

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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));
}

View File

@@ -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");
}

View File

@@ -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);
}

View File

@@ -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),

View File

@@ -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),

View File

@@ -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,

View File

@@ -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 (DONT 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.