From a3682be9b8306ffbd20aa09a6f9fc02753190ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Michaluk?= Date: Sat, 16 Dec 2017 19:49:41 +0100 Subject: [PATCH] modular monolith, context maps left in app-monolith --- adapter-commons/pom.xml | 54 ++++++++++++ .../com/bottega/tools/CommandRepository.java | 2 - .../pl/com/bottega/tools/JsonConverter.java | 0 .../bottega/tools/ProjectionRepository.java | 2 - .../pl/com/bottega/tools/TechnicalId.java | 0 .../src/test/resources/application.properties | 0 app-monolith/pom.xml | 29 +++++-- ...eliveryPlannerDefinitionEventsMapping.java | 4 +- .../demand/forecasting/DemandEntity.java | 76 ----------------- .../forecasting/DemandEventsMapping.java | 21 ++--- .../ProductDescriptionEventsMapping.java | 10 ++- ...ovider.java => ForecastORMRepository.java} | 14 ++-- .../monitoring/ShortageEventsMapping.java | 24 ++++++ .../factory/stock/forecast/StockForecast.java | 1 - .../stock/forecast/StockForecastQuery.java | 3 +- .../ressource/StockForecastEntity.java | 19 +++-- app-monolith/src/test/resources/curl.txt | 6 +- .../delivery-definitions.json | 0 .../delivery-forecasts.json | 0 .../demand-adjustments.json | 13 ++- .../demand-forecasts.json | 0 .../product-descriptions.json | 0 .../production-outputs-daily.json | 0 .../production-outputs.json | 0 .../shortages.json | 0 .../stock-forecasts.json | 0 demand-forecasting-adapters/pom.xml | 84 +++++++++++++++++++ .../DeliveryAutoPlannerORMRepository.java | 0 .../definition/DeliveryPlannerDefinition.java | 0 .../DeliveryPlannerDefinitionDao.java | 0 .../DeliveryPlannerDefinitionEntity.java | 4 +- .../projection/DeliveryForecastDao.java | 2 +- .../projection/DeliveryForecastEntity.java | 0 .../DeliveryForecastProjection.java | 0 .../forecasting/DemandORMRepository.java | 25 ++++-- .../demand/forecasting/DemandService.java | 4 + .../demand/forecasting/DemandValue.java | 9 ++ .../command/DemandAdjustmentDao.java | 0 .../command/DemandAdjustmentEntity.java | 0 .../forecasting/command/DemandReviewDao.java | 0 .../command/DemandReviewEntity.java | 2 +- .../demand/forecasting/command/Handler.java | 0 .../forecasting/persistence/DemandDao.java | 1 - .../forecasting/persistence/DemandEntity.java | 62 ++++++++++++++ .../persistence/ProductDemandDao.java | 1 - .../persistence}/ProductDemandEntity.java | 8 +- .../projection/CurrentDemandDao.java | 0 .../projection/CurrentDemandEntity.java | 1 + .../projection/CurrentDemandProjection.java | 0 .../DeliveryPlannerDefinitionTest.groovy | 0 .../DemandORMRepositoryTest.groovy | 6 +- demand-forecasting-model/pom.xml | 64 +++++--------- .../demand/forecasting/DailyDemand.java | 1 + .../demand/forecasting/DemandEvents.java | 1 - pom.xml | 6 +- product-management-adapters/pom.xml | 78 +++++++++++++++++ .../management/ProductDescription.java | 0 .../management/ProductDescriptionDao.java | 0 .../management/ProductDescriptionEntity.java | 4 +- .../ProductDescriptionPersistenceTest.groovy | 0 production-planning-adapters/pom.xml | 78 +++++++++++++++++ .../projection/ProductionDailyOutputDao.java | 0 .../ProductionDailyOutputEntity.java | 0 .../projection/ProductionOutputDao.java | 2 +- .../projection/ProductionOutputEntity.java | 3 + shared-kernel-model/pom.xml | 47 ++++------- .../factory/demand/forecasting/Demand.java | 2 +- shortages-prediction-adapters/pom.xml | 84 +++++++++++++++++++ ...hortagePredictionProcessORMRepository.java | 17 ++-- .../monitoring/ShortagePredictionService.java | 17 ++-- .../monitoring/persistence}/ShortagesDao.java | 2 +- .../persistence}/ShortagesEntity.java | 13 +-- .../NotificationConfiguration.java | 0 ...ePredictionProcessORMRepositoryTest.groovy | 2 + shortages-prediction-model/pom.xml | 57 +++++-------- ...eliveries.java => DeliveriesForecast.java} | 2 +- .../prediction/calculation/Forecast.java | 2 +- .../monitoring/ShortagePredictionProcess.java | 10 +-- .../ShortagePredictionProcessRepository.java | 12 --- .../notification/NotificationOfShortage.java | 12 +-- .../ShortagesCalculationAssemblerTrait.groovy | 12 +-- .../NotificationOfShortageSpec.groovy | 27 ++---- 82 files changed, 698 insertions(+), 344 deletions(-) create mode 100644 adapter-commons/pom.xml rename {app-monolith => adapter-commons}/src/main/java/pl/com/bottega/tools/CommandRepository.java (90%) rename {app-monolith => adapter-commons}/src/main/java/pl/com/bottega/tools/JsonConverter.java (100%) rename {app-monolith => adapter-commons}/src/main/java/pl/com/bottega/tools/ProjectionRepository.java (92%) rename {app-monolith => adapter-commons}/src/main/java/pl/com/bottega/tools/TechnicalId.java (100%) rename {app-monolith => adapter-commons}/src/test/resources/application.properties (100%) delete mode 100644 app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEntity.java rename app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/{ForecastORMProvider.java => ForecastORMRepository.java} (79%) create mode 100644 app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortageEventsMapping.java rename app-monolith/src/test/resources/{pl.com.bottega.factory.delivery.planning => examples}/delivery-definitions.json (100%) rename app-monolith/src/test/resources/{pl.com.bottega.factory.delivery.planning => examples}/delivery-forecasts.json (100%) rename app-monolith/src/test/resources/{pl.com.bottega.factory.demand.forecasting.command => examples}/demand-adjustments.json (64%) rename app-monolith/src/test/resources/{pl.com.bottega.factory.demand.forecasting.command => examples}/demand-forecasts.json (100%) rename app-monolith/src/test/resources/{pl.com.bottega.factory.product.management => examples}/product-descriptions.json (100%) rename app-monolith/src/test/resources/{pl.com.bottega.factory.production.planning => examples}/production-outputs-daily.json (100%) rename app-monolith/src/test/resources/{pl.com.bottega.factory.production.planning => examples}/production-outputs.json (100%) rename app-monolith/src/test/resources/{pl.com.bottega.factory.shortages.prediction.monitoring => examples}/shortages.json (100%) rename app-monolith/src/test/resources/{pl.com.bottega.factory.stock.forecast => examples}/stock-forecasts.json (100%) create mode 100644 demand-forecasting-adapters/pom.xml rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/delivery/planning/DeliveryAutoPlannerORMRepository.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinition.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionDao.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEntity.java (97%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastDao.java (88%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastEntity.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastProjection.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java (79%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java (91%) create mode 100644 demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandValue.java rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentDao.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentEntity.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewDao.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewEntity.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/command/Handler.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandDao.java (88%) create mode 100644 demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandEntity.java rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandDao.java (85%) rename {app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting => demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence}/ProductDemandEntity.java (87%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandDao.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandEntity.java (96%) rename {app-monolith => demand-forecasting-adapters}/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandProjection.java (100%) rename {app-monolith => demand-forecasting-adapters}/src/test/groovy/pl/com/bottega/factory/delivery/planning/DeliveryPlannerDefinitionTest.groovy (100%) rename {app-monolith => demand-forecasting-adapters}/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy (92%) rename {shared-kernel-model => demand-forecasting-model}/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEvents.java (99%) create mode 100644 product-management-adapters/pom.xml rename {app-monolith => product-management-adapters}/src/main/java/pl/com/bottega/factory/product/management/ProductDescription.java (100%) rename {app-monolith => product-management-adapters}/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionDao.java (100%) rename {app-monolith => product-management-adapters}/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEntity.java (96%) rename {app-monolith => product-management-adapters}/src/test/groovy/pl/com/bottega/factory/product/management/ProductDescriptionPersistenceTest.groovy (100%) create mode 100644 production-planning-adapters/pom.xml rename {app-monolith => production-planning-adapters}/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputDao.java (100%) rename {app-monolith => production-planning-adapters}/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputEntity.java (100%) rename {app-monolith => production-planning-adapters}/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputDao.java (83%) rename {app-monolith => production-planning-adapters}/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputEntity.java (92%) create mode 100644 shortages-prediction-adapters/pom.xml rename {app-monolith => shortages-prediction-adapters}/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepository.java (80%) rename app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/ShortagePredictionEventsMapping.java => shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java (54%) rename {app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring => shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence}/ShortagesDao.java (88%) rename {app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring => shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence}/ShortagesEntity.java (85%) rename {app-monolith => shortages-prediction-adapters}/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationConfiguration.java (100%) rename {app-monolith => shortages-prediction-adapters}/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepositoryTest.groovy (95%) rename shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/{Deliveries.java => DeliveriesForecast.java} (92%) delete mode 100644 shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessRepository.java diff --git a/adapter-commons/pom.xml b/adapter-commons/pom.xml new file mode 100644 index 0000000..3128142 --- /dev/null +++ b/adapter-commons/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-data-rest + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.8.5 + + + + + 1.8 + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + test-jar + + + + + + + + diff --git a/app-monolith/src/main/java/pl/com/bottega/tools/CommandRepository.java b/adapter-commons/src/main/java/pl/com/bottega/tools/CommandRepository.java similarity index 90% rename from app-monolith/src/main/java/pl/com/bottega/tools/CommandRepository.java rename to adapter-commons/src/main/java/pl/com/bottega/tools/CommandRepository.java index a854d50..507455b 100644 --- a/app-monolith/src/main/java/pl/com/bottega/tools/CommandRepository.java +++ b/adapter-commons/src/main/java/pl/com/bottega/tools/CommandRepository.java @@ -2,11 +2,9 @@ package pl.com.bottega.tools; import org.springframework.data.repository.CrudRepository; import org.springframework.data.rest.core.annotation.RestResource; -import org.springframework.stereotype.Repository; import java.io.Serializable; -@Repository public interface CommandRepository extends CrudRepository { @Override diff --git a/app-monolith/src/main/java/pl/com/bottega/tools/JsonConverter.java b/adapter-commons/src/main/java/pl/com/bottega/tools/JsonConverter.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/tools/JsonConverter.java rename to adapter-commons/src/main/java/pl/com/bottega/tools/JsonConverter.java diff --git a/app-monolith/src/main/java/pl/com/bottega/tools/ProjectionRepository.java b/adapter-commons/src/main/java/pl/com/bottega/tools/ProjectionRepository.java similarity index 92% rename from app-monolith/src/main/java/pl/com/bottega/tools/ProjectionRepository.java rename to adapter-commons/src/main/java/pl/com/bottega/tools/ProjectionRepository.java index ec41615..58528c4 100644 --- a/app-monolith/src/main/java/pl/com/bottega/tools/ProjectionRepository.java +++ b/adapter-commons/src/main/java/pl/com/bottega/tools/ProjectionRepository.java @@ -2,11 +2,9 @@ package pl.com.bottega.tools; import org.springframework.data.repository.CrudRepository; import org.springframework.data.rest.core.annotation.RestResource; -import org.springframework.stereotype.Repository; import java.io.Serializable; -@Repository public interface ProjectionRepository extends CrudRepository { @Override diff --git a/app-monolith/src/main/java/pl/com/bottega/tools/TechnicalId.java b/adapter-commons/src/main/java/pl/com/bottega/tools/TechnicalId.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/tools/TechnicalId.java rename to adapter-commons/src/main/java/pl/com/bottega/tools/TechnicalId.java diff --git a/app-monolith/src/test/resources/application.properties b/adapter-commons/src/test/resources/application.properties similarity index 100% rename from app-monolith/src/test/resources/application.properties rename to adapter-commons/src/test/resources/application.properties diff --git a/app-monolith/pom.xml b/app-monolith/pom.xml index b40dac2..fb85b0f 100644 --- a/app-monolith/pom.xml +++ b/app-monolith/pom.xml @@ -17,19 +17,37 @@ pl.com.bottega - shared-kernel-model + demand-forecasting-adapters 1.0-SNAPSHOT pl.com.bottega - demand-forecasting-model + shortages-prediction-adapters 1.0-SNAPSHOT pl.com.bottega - shortages-prediction-model + product-management-adapters 1.0-SNAPSHOT + + pl.com.bottega + production-planning-adapters + 1.0-SNAPSHOT + + + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + test-jar + test + org.projectlombok @@ -53,11 +71,6 @@ org.springframework.data spring-data-rest-hal-browser - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - 2.8.5 - org.springframework.boot spring-boot-starter-test diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEventsMapping.java b/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEventsMapping.java index 95366ed..2167f36 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEventsMapping.java +++ b/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEventsMapping.java @@ -1,7 +1,9 @@ package pl.com.bottega.factory.delivery.planning.definition; import lombok.AllArgsConstructor; -import org.springframework.data.rest.core.annotation.*; +import org.springframework.data.rest.core.annotation.HandleAfterCreate; +import org.springframework.data.rest.core.annotation.HandleAfterSave; +import org.springframework.data.rest.core.annotation.RepositoryEventHandler; import org.springframework.stereotype.Component; import pl.com.bottega.factory.delivery.planning.projection.DeliveryForecastProjection; diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEntity.java b/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEntity.java deleted file mode 100644 index c54adbf..0000000 --- a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEntity.java +++ /dev/null @@ -1,76 +0,0 @@ -package pl.com.bottega.factory.demand.forecasting; - -import lombok.*; -import pl.com.bottega.tools.JsonConverter; -import pl.com.bottega.tools.TechnicalId; - -import javax.persistence.*; -import java.io.Serializable; -import java.time.LocalDate; -import java.util.Optional; - -@Entity(name = "Demand") -@Data -@NoArgsConstructor -@EqualsAndHashCode(of = "id") -@ToString(exclude = "product") -public class DemandEntity implements Serializable { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - @ManyToOne - private ProductDemandEntity product; - @Column - private LocalDate date; - @Column - @Convert(converter = DemandAsJson.class) - private DemandValue value; - - DemandEntity(ProductDemandEntity product, LocalDate date) { - this.product = product; - this.date = date; - } - - DemandEntityId createId() { - return new DemandEntityId(product.getRefNo(), date, id); - } - - void set(Demand demand, Adjustment adjustment) { - value = new DemandValue(demand, adjustment); - } - - DemandValue get() { - return Optional.ofNullable(value) - .orElse(DemandValue.NO_VAL); - } - - @Value - static class DemandValue { - public static final DemandValue NO_VAL = new DemandValue(null, null); - - Demand documented; - Adjustment adjustment; - } - - public static class DemandAsJson extends JsonConverter { - public DemandAsJson() { - super(DemandValue.class); - } - } - - @Getter - static class DemandEntityId extends DailyId implements TechnicalId { - - Long id; - - DemandEntityId(String refNo, LocalDate date) { - super(refNo, date); - } - - DemandEntityId(String refNo, LocalDate date, Long id) { - super(refNo, date); - this.id = id; - } - } -} diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEventsMapping.java b/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEventsMapping.java index 09ce956..b66dc27 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEventsMapping.java +++ b/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEventsMapping.java @@ -7,7 +7,7 @@ import pl.com.bottega.factory.delivery.planning.projection.DeliveryForecastProje import pl.com.bottega.factory.demand.forecasting.command.DemandReviewDao; import pl.com.bottega.factory.demand.forecasting.command.DemandReviewEntity; import pl.com.bottega.factory.demand.forecasting.projection.CurrentDemandProjection; -import pl.com.bottega.factory.shortages.prediction.ShortagePredictionEventsMapping; +import pl.com.bottega.factory.shortages.prediction.monitoring.ShortagePredictionService; import java.time.Clock; import java.time.Instant; @@ -18,23 +18,24 @@ import java.util.stream.Collectors; @AllArgsConstructor class DemandEventsMapping implements DemandEvents { - private final CurrentDemandProjection demands; - private final DeliveryForecastProjection deliveries; - private final ShortagePredictionEventsMapping predictions; - private final DemandReviewDao reviews; + private final CurrentDemandProjection demandProjection; + private final DeliveryForecastProjection deliveryProjection; + private final ShortagePredictionService shortagePrediction; + private final DemandReviewDao demandReviews; private final Clock clock; @Override public void emit(DemandedLevelsChanged event) { - demands.persistCurrentDemands(event); - deliveries.persistDeliveryForecasts(event); - predictions.predictShortages(event); + demandProjection.persistCurrentDemands(event); + deliveryProjection.persistDeliveryForecasts(event); + shortagePrediction.predictShortages(event); } @Override public void emit(ReviewRequested event) { - reviews.save(event.getReviews().stream() - .map(review -> new DemandReviewEntity(Instant.now(clock), review)) + Instant timestamp = Instant.now(clock); + demandReviews.save(event.getReviews().stream() + .map(r -> new DemandReviewEntity(timestamp, r)) .collect(Collectors.toList()) ); } diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEventsMapping.java b/app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEventsMapping.java index 06607bc..5e0af21 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEventsMapping.java +++ b/app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEventsMapping.java @@ -2,17 +2,23 @@ package pl.com.bottega.factory.product.management; import lombok.AllArgsConstructor; import org.springframework.data.rest.core.annotation.HandleAfterCreate; -import org.springframework.data.rest.core.annotation.HandleAfterSave; import org.springframework.data.rest.core.annotation.RepositoryEventHandler; import org.springframework.stereotype.Component; +import pl.com.bottega.factory.demand.forecasting.DemandService; +import pl.com.bottega.factory.stock.forecast.ressource.StockForecastDao; +import pl.com.bottega.factory.stock.forecast.ressource.StockForecastEntity; @Component @AllArgsConstructor @RepositoryEventHandler public class ProductDescriptionEventsMapping { - @HandleAfterSave + private final DemandService demandService; + private final StockForecastDao stockForecasts; + @HandleAfterCreate public void handle(ProductDescriptionEntity entity) { + demandService.init(entity.getRefNo()); + stockForecasts.save(new StockForecastEntity(entity.getRefNo())); } } diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/ForecastORMProvider.java b/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/ForecastORMRepository.java similarity index 79% rename from app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/ForecastORMProvider.java rename to app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/ForecastORMRepository.java index 7070c23..6b86448 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/ForecastORMProvider.java +++ b/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/ForecastORMRepository.java @@ -10,8 +10,8 @@ import pl.com.bottega.factory.shortages.prediction.calculation.ProductionForecas import pl.com.bottega.factory.warehouse.WarehouseService; import java.time.Clock; -import java.time.Instant; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; @@ -21,7 +21,7 @@ import static java.util.stream.Collectors.toMap; @Component @AllArgsConstructor -class ForecastORMProvider implements Forecasts { +class ForecastORMRepository implements Forecasts { private final WarehouseService stocks; private final DeliveryForecastDao deliveries; @@ -31,21 +31,21 @@ class ForecastORMProvider implements Forecasts { @Override public Forecast get(RefNoId refNo, int daysAhead) { Stock stock = stocks.forRefNo(refNo); - Instant now = Instant.now(clock); - LocalDateTime time = now.atZone(clock.getZone()).toLocalDateTime(); + LocalDateTime time = LocalDateTime.now(clock); + LocalDateTime max = time.plusDays(daysAhead).truncatedTo(ChronoUnit.DAYS); Map deliveries = this.deliveries - .findByRefNoAndTimeGreaterThanEqual(refNo.getRefNo(), time).stream() + .findByRefNoAndTimeBetween(refNo.getRefNo(), time, max).stream() .collect(toMap( DeliveryForecastEntity::getTime, DeliveryForecastEntity::getLevel )); SortedSet deliveryTimes = new TreeSet<>(deliveries.keySet()); - Deliveries demand = new Deliveries(deliveries); + DeliveriesForecast demand = new DeliveriesForecast(deliveries); ProductionOutputs outputs = new ProductionForecast( - this.outputs.findByRefNoAndStartGreaterThanEqual(refNo.getRefNo(), time).stream() + this.outputs.findByRefNoAndEndGreaterThanAndStartLessThan(refNo.getRefNo(), time, max).stream() .map(e -> new Item( e.getStart(), e.getDuration(), diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortageEventsMapping.java b/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortageEventsMapping.java new file mode 100644 index 0000000..f9fb3f4 --- /dev/null +++ b/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortageEventsMapping.java @@ -0,0 +1,24 @@ +package pl.com.bottega.factory.shortages.prediction.monitoring; + +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import pl.com.bottega.factory.shortages.prediction.notification.NotificationOfShortage; + +@Lazy +@Component +@AllArgsConstructor +class ShortageEventsMapping implements ShortageEvents { + + private final NotificationOfShortage notification; + + @Override + public void emit(NewShortage event) { + notification.notifyAbout(event); + } + + @Override + public void emit(ShortageSolved event) { + + } +} diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/StockForecast.java b/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/StockForecast.java index 09996e4..3cf7ee2 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/StockForecast.java +++ b/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/StockForecast.java @@ -11,7 +11,6 @@ import java.util.List; @Builder public class StockForecast { - String refNo; @Singular List forecasts; diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/StockForecastQuery.java b/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/StockForecastQuery.java index 4615911..a66faa4 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/StockForecastQuery.java +++ b/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/StockForecastQuery.java @@ -53,8 +53,7 @@ public class StockForecastQuery { Map outputs) { LocalDate stopAtDay = today.plusDays(15); long level = stock.getLevel(); - StockForecastBuilder builder = StockForecast.builder() - .refNo(refNo.getRefNo()); + StockForecastBuilder builder = StockForecast.builder(); for (LocalDate date = today; date.isBefore(stopAtDay); date = date.plusDays(1)) { long withLocked = level + stock.getLocked(); long demand = demands.getOrDefault(date, 0L); diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/ressource/StockForecastEntity.java b/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/ressource/StockForecastEntity.java index a9d9877..b87f5da 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/ressource/StockForecastEntity.java +++ b/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/ressource/StockForecastEntity.java @@ -1,36 +1,39 @@ package pl.com.bottega.factory.stock.forecast.ressource; -import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; import org.springframework.data.rest.core.config.Projection; -import pl.com.bottega.factory.product.management.ProductDescriptionEntity; import pl.com.bottega.factory.stock.forecast.StockForecast; import javax.persistence.*; import java.io.Serializable; @Entity(name = "StockForecast") -@Data +@Getter @NoArgsConstructor @EqualsAndHashCode(of = "id") -@ToString(exclude = "product") +@ToString public class StockForecastEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; - @ManyToOne - private ProductDescriptionEntity product; + @Column + private String refNo; + + public StockForecastEntity(String refNo) { + this.refNo = refNo; + } public StockForecast getStockForecast() { - return StaticAccess.calculateQuery(product.getRefNo()); + return StaticAccess.calculateQuery(refNo); } @Projection(types = {StockForecastEntity.class}) interface CollectionItem { - ProductDescriptionEntity getProduct(); + String getRefNo(); } } diff --git a/app-monolith/src/test/resources/curl.txt b/app-monolith/src/test/resources/curl.txt index dde2edb..badf109 100644 --- a/app-monolith/src/test/resources/curl.txt +++ b/app-monolith/src/test/resources/curl.txt @@ -2,15 +2,15 @@ curl http://localhost:8080 curl -X POST -H "Content-Type: application/json" \ - -d @app-monolith/src/test/resources/pl.com.bottega.factory.product.management/product-descriptions.json \ + -d @app-monolith/src/test/resources/examples/product-descriptions.json \ http://localhost:8080/product-descriptions curl -X POST -H "Content-Type: application/json" \ - -d @app-monolith/src/test/resources/pl.com.bottega.factory.delivery.planning/delivery-definitions.json \ + -d @app-monolith/src/test/resources/examples/delivery-definitions.json \ http://localhost:8080/delivery-definitions curl -X POST -H "Content-Type: application/json" \ - -d @app-monolith/src/test/resources/pl.com.bottega.factory.demand.forecasting.command/demand-adjustments.json \ + -d @app-monolith/src/test/resources/examples/demand-adjustments.json \ http://localhost:8080/demand-adjustments curl http://localhost:8080/demand-forecasts diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.delivery.planning/delivery-definitions.json b/app-monolith/src/test/resources/examples/delivery-definitions.json similarity index 100% rename from app-monolith/src/test/resources/pl.com.bottega.factory.delivery.planning/delivery-definitions.json rename to app-monolith/src/test/resources/examples/delivery-definitions.json diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.delivery.planning/delivery-forecasts.json b/app-monolith/src/test/resources/examples/delivery-forecasts.json similarity index 100% rename from app-monolith/src/test/resources/pl.com.bottega.factory.delivery.planning/delivery-forecasts.json rename to app-monolith/src/test/resources/examples/delivery-forecasts.json diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.demand.forecasting.command/demand-adjustments.json b/app-monolith/src/test/resources/examples/demand-adjustments.json similarity index 64% rename from app-monolith/src/test/resources/pl.com.bottega.factory.demand.forecasting.command/demand-adjustments.json rename to app-monolith/src/test/resources/examples/demand-adjustments.json index 49d4f60..77e2d2e 100644 --- a/app-monolith/src/test/resources/pl.com.bottega.factory.demand.forecasting.command/demand-adjustments.json +++ b/app-monolith/src/test/resources/examples/demand-adjustments.json @@ -4,19 +4,26 @@ "adjustment": { "refNo": "3009000", "adjustments": { - "2017-12-15": { + "2017-12-17": { "demand": { - "level": 1000, + "level": 2000, "schema": "AtDayStart" }, "strong": true }, - "2017-12-16": { + "2017-12-22": { "demand": { "level": 1000, "schema": "AtDayStart" }, "strong": false + }, + "2017-12-23": { + "demand": { + "level": 300, + "schema": "AtDayStart" + }, + "strong": false } } } diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.demand.forecasting.command/demand-forecasts.json b/app-monolith/src/test/resources/examples/demand-forecasts.json similarity index 100% rename from app-monolith/src/test/resources/pl.com.bottega.factory.demand.forecasting.command/demand-forecasts.json rename to app-monolith/src/test/resources/examples/demand-forecasts.json diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.product.management/product-descriptions.json b/app-monolith/src/test/resources/examples/product-descriptions.json similarity index 100% rename from app-monolith/src/test/resources/pl.com.bottega.factory.product.management/product-descriptions.json rename to app-monolith/src/test/resources/examples/product-descriptions.json diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.production.planning/production-outputs-daily.json b/app-monolith/src/test/resources/examples/production-outputs-daily.json similarity index 100% rename from app-monolith/src/test/resources/pl.com.bottega.factory.production.planning/production-outputs-daily.json rename to app-monolith/src/test/resources/examples/production-outputs-daily.json diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.production.planning/production-outputs.json b/app-monolith/src/test/resources/examples/production-outputs.json similarity index 100% rename from app-monolith/src/test/resources/pl.com.bottega.factory.production.planning/production-outputs.json rename to app-monolith/src/test/resources/examples/production-outputs.json diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.shortages.prediction.monitoring/shortages.json b/app-monolith/src/test/resources/examples/shortages.json similarity index 100% rename from app-monolith/src/test/resources/pl.com.bottega.factory.shortages.prediction.monitoring/shortages.json rename to app-monolith/src/test/resources/examples/shortages.json diff --git a/app-monolith/src/test/resources/pl.com.bottega.factory.stock.forecast/stock-forecasts.json b/app-monolith/src/test/resources/examples/stock-forecasts.json similarity index 100% rename from app-monolith/src/test/resources/pl.com.bottega.factory.stock.forecast/stock-forecasts.json rename to app-monolith/src/test/resources/examples/stock-forecasts.json diff --git a/demand-forecasting-adapters/pom.xml b/demand-forecasting-adapters/pom.xml new file mode 100644 index 0000000..f387cc7 --- /dev/null +++ b/demand-forecasting-adapters/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + pl.com.bottega + demand-forecasting-adapters + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + pl.com.bottega + demand-forecasting-model + 1.0-SNAPSHOT + + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + + + + org.projectlombok + lombok + 1.16.18 + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + org.postgresql + postgresql + 42.1.4 + runtime + + + org.spockframework + spock-core + 1.1-groovy-2.4 + test + + + org.spockframework + spock-spring + 1.1-groovy-2.4 + test + + + net.bytebuddy + byte-buddy + 1.7.9 + test + + + + + 1.8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -parameters + + + + + + + diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/DeliveryAutoPlannerORMRepository.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/DeliveryAutoPlannerORMRepository.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/DeliveryAutoPlannerORMRepository.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/DeliveryAutoPlannerORMRepository.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinition.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinition.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinition.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinition.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionDao.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionDao.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionDao.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionDao.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEntity.java similarity index 97% rename from app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEntity.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEntity.java index 8c934ce..b23c237 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEntity.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/definition/DeliveryPlannerDefinitionEntity.java @@ -1,7 +1,7 @@ package pl.com.bottega.factory.delivery.planning.definition; -import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; import pl.com.bottega.tools.JsonConverter; @@ -9,7 +9,7 @@ import javax.persistence.*; import java.io.Serializable; @Entity(name = "DeliveryPlannerDefinition") -@Data +@Getter @NoArgsConstructor @EqualsAndHashCode(of = "refNo") public class DeliveryPlannerDefinitionEntity implements Serializable { diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastDao.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastDao.java similarity index 88% rename from app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastDao.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastDao.java index f810fdb..8066f4f 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastDao.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastDao.java @@ -16,7 +16,7 @@ import java.util.List; public interface DeliveryForecastDao extends ProjectionRepository { @RestResource(path = "refNos", rel = "refNos") - List findByRefNoAndTimeGreaterThanEqual(String refNo, LocalDateTime from); + List findByRefNoAndTimeBetween(String refNo, LocalDateTime from, LocalDateTime to); @RestResource(exported = false) void deleteByRefNoAndDate(String refNo, LocalDate date); diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastEntity.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastEntity.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastEntity.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastProjection.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastProjection.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastProjection.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/delivery/planning/projection/DeliveryForecastProjection.java diff --git a/app-monolith/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 similarity index 79% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java index 756971d..1b61f6c 100644 --- a/app-monolith/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 @@ -3,9 +3,11 @@ package pl.com.bottega.factory.demand.forecasting; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import pl.com.bottega.factory.demand.forecasting.DailyDemand.DemandUpdated; -import pl.com.bottega.factory.demand.forecasting.DemandEntity.DemandEntityId; import pl.com.bottega.factory.demand.forecasting.persistence.DemandDao; +import pl.com.bottega.factory.demand.forecasting.persistence.DemandEntity; +import pl.com.bottega.factory.demand.forecasting.persistence.DemandEntity.DemandEntityId; import pl.com.bottega.factory.demand.forecasting.persistence.ProductDemandDao; +import pl.com.bottega.factory.demand.forecasting.persistence.ProductDemandEntity; import pl.com.bottega.factory.product.management.RefNoId; import pl.com.bottega.tools.TechnicalId; @@ -24,7 +26,7 @@ import static java.util.stream.Collectors.toMap; class DemandORMRepository { private final Clock clock; - private final DemandEventsMapping events; + private final DemandEvents events; private final ReviewPolicy reviewPolicy = ReviewPolicy.BASIC; private final EntityManager em; private final ProductDemandDao rootDao; @@ -55,8 +57,8 @@ class DemandORMRepository { entity.createId(), unitOfWork, reviewPolicy, - entity.get().getDocumented(), - entity.get().getAdjustment())) + entity.getValue().getDocumented(), + entity.getValue().getAdjustment())) .orElseGet(() -> new DailyDemand( new DemandEntityId(refNo, date), unitOfWork, @@ -76,13 +78,22 @@ class DemandORMRepository { if (TechnicalId.isPersisted(updated.getId())) { entity = demandDao.getOne(TechnicalId.get(updated.getId())); } else { - entity = new DemandEntity(root, updated.getId().getDate()); + entity = new DemandEntity( + updated.getId().getRefNo(), + updated.getId().getDate() + ); demandDao.save(entity); } - entity.set( + entity.setValue(new DemandValue( updated.getDocumented().nullIfNone(), updated.getAdjustment() - ); + )); + } + } + + void initDemandsFor(String refNo) { + if (rootDao.findByRefNo(refNo) == null) { + rootDao.save(new ProductDemandEntity(refNo)); } } } diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java similarity index 91% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java index a37060c..d0446fd 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java @@ -13,6 +13,10 @@ public class DemandService { private final DemandORMRepository repository; + public void init(String refNo) { + repository.initDemandsFor(refNo); + } + public void process(Document document) { ProductDemand model = repository.get(document.getRefNo()); model.process(document); diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandValue.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandValue.java new file mode 100644 index 0000000..2e4522e --- /dev/null +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandValue.java @@ -0,0 +1,9 @@ +package pl.com.bottega.factory.demand.forecasting; + +import lombok.Value; + +@Value +public class DemandValue { + Demand documented; + Adjustment adjustment; +} diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentDao.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentDao.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentDao.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentDao.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentEntity.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentEntity.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandAdjustmentEntity.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewDao.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewDao.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewDao.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewDao.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewEntity.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewEntity.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewEntity.java index de6216e..6b712b7 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewEntity.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/DemandReviewEntity.java @@ -4,8 +4,8 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import pl.com.bottega.factory.demand.forecasting.ReviewRequested.ReviewNeeded; import pl.com.bottega.factory.demand.forecasting.ReviewDecision; +import pl.com.bottega.factory.demand.forecasting.ReviewRequested.ReviewNeeded; import pl.com.bottega.tools.JsonConverter; import javax.persistence.*; diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/Handler.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/Handler.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/command/Handler.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/command/Handler.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandDao.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandDao.java similarity index 88% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandDao.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandDao.java index 0fd3e41..5ff57fe 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandDao.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandDao.java @@ -3,7 +3,6 @@ package pl.com.bottega.factory.demand.forecasting.persistence; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.stereotype.Repository; -import pl.com.bottega.factory.demand.forecasting.DemandEntity; import java.time.LocalDate; import java.util.List; diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandEntity.java new file mode 100644 index 0000000..ab6042a --- /dev/null +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/DemandEntity.java @@ -0,0 +1,62 @@ +package pl.com.bottega.factory.demand.forecasting.persistence; + +import lombok.*; +import pl.com.bottega.factory.demand.forecasting.DailyId; +import pl.com.bottega.factory.demand.forecasting.DemandValue; +import pl.com.bottega.tools.JsonConverter; +import pl.com.bottega.tools.TechnicalId; + +import javax.persistence.*; +import java.io.Serializable; +import java.time.LocalDate; + +@Entity(name = "Demand") +@Getter +@NoArgsConstructor +@EqualsAndHashCode(of = "id") +@ToString +public class DemandEntity implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + @Column + String refNo; + @Column + private LocalDate date; + @Column + @Convert(converter = DemandAsJson.class) + @Setter + private DemandValue value; + + public DemandEntity(String refNo, LocalDate date) { + this.refNo = refNo; + this.date = date; + this.value = new DemandValue(null, null); + } + + public DemandEntityId createId() { + return new DemandEntityId(refNo, date, id); + } + + public static class DemandAsJson extends JsonConverter { + public DemandAsJson() { + super(DemandValue.class); + } + } + + @Getter + public static class DemandEntityId extends DailyId implements TechnicalId { + + private Long id; + + public DemandEntityId(String refNo, LocalDate date) { + super(refNo, date); + } + + DemandEntityId(String refNo, LocalDate date, Long id) { + super(refNo, date); + this.id = id; + } + } +} diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandDao.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandDao.java similarity index 85% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandDao.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandDao.java index dc874e6..4a13ec2 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandDao.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandDao.java @@ -3,7 +3,6 @@ package pl.com.bottega.factory.demand.forecasting.persistence; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.stereotype.Repository; -import pl.com.bottega.factory.demand.forecasting.ProductDemandEntity; @Repository @RestResource(exported = false) diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemandEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandEntity.java similarity index 87% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemandEntity.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandEntity.java index b42aeb7..f365d7d 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemandEntity.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandEntity.java @@ -1,6 +1,5 @@ -package pl.com.bottega.factory.demand.forecasting; +package pl.com.bottega.factory.demand.forecasting.persistence; -import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -11,7 +10,6 @@ import javax.persistence.*; import java.io.Serializable; @Entity(name = "ProductDemand") -@Data @NoArgsConstructor @EqualsAndHashCode(of = "id") public class ProductDemandEntity implements Serializable { @@ -22,13 +20,13 @@ public class ProductDemandEntity implements Serializable { @Version private Long version; @Column - private String refNo; + String refNo; public ProductDemandEntity(String refNo) { this.refNo = refNo; } - ProductDemandEntityId createId() { + public ProductDemandEntityId createId() { return new ProductDemandEntityId(refNo, id); } diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandDao.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandDao.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandDao.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandDao.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandEntity.java similarity index 96% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandEntity.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandEntity.java index 159384a..1551609 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandEntity.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandEntity.java @@ -25,6 +25,7 @@ public class CurrentDemandEntity implements Serializable { @Column private long level; @Column + @Enumerated(EnumType.STRING) private Demand.Schema schema; CurrentDemandEntity(String refNo, LocalDate date, long level, Demand.Schema schema) { diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandProjection.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandProjection.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandProjection.java rename to demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/projection/CurrentDemandProjection.java diff --git a/app-monolith/src/test/groovy/pl/com/bottega/factory/delivery/planning/DeliveryPlannerDefinitionTest.groovy b/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/delivery/planning/DeliveryPlannerDefinitionTest.groovy similarity index 100% rename from app-monolith/src/test/groovy/pl/com/bottega/factory/delivery/planning/DeliveryPlannerDefinitionTest.groovy rename to demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/delivery/planning/DeliveryPlannerDefinitionTest.groovy diff --git a/app-monolith/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy b/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy similarity index 92% rename from app-monolith/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy rename to demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy index 65c405a..9bae647 100644 --- a/app-monolith/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy +++ b/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy @@ -4,7 +4,9 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.annotation.Commit import pl.com.bottega.factory.demand.forecasting.persistence.DemandDao +import pl.com.bottega.factory.demand.forecasting.persistence.DemandEntity import pl.com.bottega.factory.demand.forecasting.persistence.ProductDemandDao +import pl.com.bottega.factory.demand.forecasting.persistence.ProductDemandEntity import spock.lang.Specification import javax.persistence.EntityManager @@ -20,7 +22,7 @@ import java.time.ZoneId class DemandORMRepositoryTest extends Specification { def clock = Clock.fixed(Instant.now(), ZoneId.systemDefault()) - def events = Mock(DemandEventsMapping) + def events = Mock(DemandEvents) @Autowired EntityManager em @Autowired @@ -89,7 +91,7 @@ class DemandORMRepositoryTest extends Specification { def root = rootDao.save(new ProductDemandEntity(refNo)) demands.each { date, level -> def demand = new DemandEntity(root, date) - demand.set(Demand.of(level), null) + demand.setValue(new DemandValue(Demand.of(level), null)) demandDao.save(demand) } } diff --git a/demand-forecasting-model/pom.xml b/demand-forecasting-model/pom.xml index e064ea9..004ada5 100644 --- a/demand-forecasting-model/pom.xml +++ b/demand-forecasting-model/pom.xml @@ -9,6 +9,26 @@ jar 1.0-SNAPSHOT + + + pl.com.bottega + shared-kernel-model + 1.0-SNAPSHOT + + + org.projectlombok + lombok + 1.16.18 + provided + + + org.spockframework + spock-core + 1.1-groovy-2.4 + test + + + @@ -46,48 +66,4 @@ - - - - pl.com.bottega - shared-kernel-model - 1.0-SNAPSHOT - - - org.projectlombok - lombok - 1.16.18 - provided - - - junit - junit - 4.12 - test - - - org.assertj - assertj-core - 3.8.0 - test - - - info.cukes - cucumber-java - 1.2.5 - test - - - info.cukes - cucumber-core - 1.2.5 - test - - - org.spockframework - spock-core - 1.1-groovy-2.4 - test - - \ No newline at end of file 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 1654900..87f4020 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 @@ -15,6 +15,7 @@ class DailyDemand { private final Events events; private final ReviewPolicy policy; + interface Events { void emit(LevelChanged event); diff --git a/shared-kernel-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEvents.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEvents.java similarity index 99% rename from shared-kernel-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEvents.java rename to demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEvents.java index fa47c87..ab9040b 100644 --- a/shared-kernel-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEvents.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandEvents.java @@ -4,5 +4,4 @@ public interface DemandEvents { void emit(DemandedLevelsChanged event); void emit(ReviewRequested event); - } diff --git a/pom.xml b/pom.xml index 9a9d68f..0598d12 100644 --- a/pom.xml +++ b/pom.xml @@ -11,10 +11,14 @@ app-monolith + adapter-commons shared-kernel-model demand-forecasting-model + demand-forecasting-adapters shortages-prediction-model - + shortages-prediction-adapters + product-management-adapters + production-planning-adapters diff --git a/product-management-adapters/pom.xml b/product-management-adapters/pom.xml new file mode 100644 index 0000000..e18a1f8 --- /dev/null +++ b/product-management-adapters/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + pl.com.bottega + product-management-adapters + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + + + + org.projectlombok + lombok + 1.16.18 + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + org.postgresql + postgresql + 42.1.4 + runtime + + + org.spockframework + spock-core + 1.1-groovy-2.4 + test + + + org.spockframework + spock-spring + 1.1-groovy-2.4 + test + + + net.bytebuddy + byte-buddy + 1.7.9 + + + + + 1.8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -parameters + + + + + + + diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescription.java b/product-management-adapters/src/main/java/pl/com/bottega/factory/product/management/ProductDescription.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescription.java rename to product-management-adapters/src/main/java/pl/com/bottega/factory/product/management/ProductDescription.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionDao.java b/product-management-adapters/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionDao.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionDao.java rename to product-management-adapters/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionDao.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEntity.java b/product-management-adapters/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEntity.java similarity index 96% rename from app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEntity.java rename to product-management-adapters/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEntity.java index b6201b1..6cb9ef7 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEntity.java +++ b/product-management-adapters/src/main/java/pl/com/bottega/factory/product/management/ProductDescriptionEntity.java @@ -1,7 +1,7 @@ package pl.com.bottega.factory.product.management; -import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; import pl.com.bottega.tools.JsonConverter; @@ -9,7 +9,7 @@ import javax.persistence.*; import java.io.Serializable; @Entity(name = "ProductDescription") -@Data +@Getter @NoArgsConstructor @EqualsAndHashCode(of = "refNo") public class ProductDescriptionEntity implements Serializable { diff --git a/app-monolith/src/test/groovy/pl/com/bottega/factory/product/management/ProductDescriptionPersistenceTest.groovy b/product-management-adapters/src/test/groovy/pl/com/bottega/factory/product/management/ProductDescriptionPersistenceTest.groovy similarity index 100% rename from app-monolith/src/test/groovy/pl/com/bottega/factory/product/management/ProductDescriptionPersistenceTest.groovy rename to product-management-adapters/src/test/groovy/pl/com/bottega/factory/product/management/ProductDescriptionPersistenceTest.groovy diff --git a/production-planning-adapters/pom.xml b/production-planning-adapters/pom.xml new file mode 100644 index 0000000..a89b362 --- /dev/null +++ b/production-planning-adapters/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + pl.com.bottega + production-planning-adapters + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + + + + org.projectlombok + lombok + 1.16.18 + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + org.postgresql + postgresql + 42.1.4 + runtime + + + org.spockframework + spock-core + 1.1-groovy-2.4 + test + + + org.spockframework + spock-spring + 1.1-groovy-2.4 + test + + + net.bytebuddy + byte-buddy + 1.7.9 + + + + + 1.8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -parameters + + + + + + + diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputDao.java b/production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputDao.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputDao.java rename to production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputDao.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputEntity.java b/production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputEntity.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputEntity.java rename to production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionDailyOutputEntity.java diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputDao.java b/production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputDao.java similarity index 83% rename from app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputDao.java rename to production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputDao.java index 68b9983..d54dedd 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputDao.java +++ b/production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputDao.java @@ -14,5 +14,5 @@ import java.util.List; itemResourceRel = "production-output") public interface ProductionOutputDao extends ProjectionRepository { @RestResource(path = "refNos", rel = "refNos") - List findByRefNoAndStartGreaterThanEqual(String refNo, LocalDateTime from); + List findByRefNoAndEndGreaterThanAndStartLessThan(String refNo, LocalDateTime from, LocalDateTime to); } diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputEntity.java b/production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputEntity.java similarity index 92% rename from app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputEntity.java rename to production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputEntity.java index 5c41d2d..1e57f66 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputEntity.java +++ b/production-planning-adapters/src/main/java/pl/com/bottega/factory/production/planning/projection/ProductionOutputEntity.java @@ -25,6 +25,8 @@ public class ProductionOutputEntity implements Serializable { @Column private Duration duration; @Column + private LocalDateTime end; + @Column private int partsPerMinute; @Column private long total; @@ -36,6 +38,7 @@ public class ProductionOutputEntity implements Serializable { this.refNo = refNo; this.start = start; this.duration = duration; + this.end = start.plus(duration); this.partsPerMinute = partsPerMinute; this.total = total; } diff --git a/shared-kernel-model/pom.xml b/shared-kernel-model/pom.xml index 6587632..171358c 100644 --- a/shared-kernel-model/pom.xml +++ b/shared-kernel-model/pom.xml @@ -9,6 +9,21 @@ jar 1.0-SNAPSHOT + + + org.projectlombok + lombok + 1.16.18 + compile + + + org.spockframework + spock-core + 1.1-groovy-2.4 + test + + + @@ -47,36 +62,4 @@ - - - org.projectlombok - lombok - 1.16.18 - compile - - - org.assertj - assertj-core - 3.8.0 - test - - - info.cukes - cucumber-java - 1.2.5 - test - - - info.cukes - cucumber-core - 1.2.5 - test - - - org.spockframework - spock-core - 1.1-groovy-2.4 - test - - \ No newline at end of file diff --git a/shared-kernel-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Demand.java b/shared-kernel-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Demand.java index 0165deb..039516b 100644 --- a/shared-kernel-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Demand.java +++ b/shared-kernel-model/src/main/java/pl/com/bottega/factory/demand/forecasting/Demand.java @@ -21,7 +21,7 @@ public class Demand { return new Demand(level, schema); } - public static Demand nothingDemanded() { + static Demand nothingDemanded() { return NONE; } diff --git a/shortages-prediction-adapters/pom.xml b/shortages-prediction-adapters/pom.xml new file mode 100644 index 0000000..3eb1ead --- /dev/null +++ b/shortages-prediction-adapters/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + pl.com.bottega + shortages-prediction-adapters + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + pl.com.bottega + shortages-prediction-model + 1.0-SNAPSHOT + + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + + + + org.projectlombok + lombok + 1.16.18 + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + org.postgresql + postgresql + 42.1.4 + runtime + + + org.spockframework + spock-core + 1.1-groovy-2.4 + test + + + org.spockframework + spock-spring + 1.1-groovy-2.4 + test + + + net.bytebuddy + byte-buddy + 1.7.9 + test + + + + + 1.8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -parameters + + + + + + + diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepository.java b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepository.java similarity index 80% rename from app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepository.java rename to shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepository.java index 1bdc8fd..d79398b 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepository.java +++ b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepository.java @@ -5,23 +5,23 @@ import org.springframework.stereotype.Component; import pl.com.bottega.factory.product.management.RefNoId; import pl.com.bottega.factory.shortages.prediction.Configuration; import pl.com.bottega.factory.shortages.prediction.calculation.Forecasts; -import pl.com.bottega.factory.shortages.prediction.notification.NotificationOfShortage; +import pl.com.bottega.factory.shortages.prediction.monitoring.persistence.ShortagesDao; +import pl.com.bottega.factory.shortages.prediction.monitoring.persistence.ShortagesEntity; import pl.com.bottega.tools.TechnicalId; import java.util.Optional; @Component @AllArgsConstructor -class ShortagePredictionProcessORMRepository implements ShortagePredictionProcessRepository { +class ShortagePredictionProcessORMRepository { private final ShortagesDao dao; private final ShortageDiffPolicy policy = ShortageDiffPolicy.ValuesAreNotSame; private final Forecasts forecasts; private final Configuration configuration = () -> 14; - private final NotificationOfShortage notifications; + private final ShortageEvents events; - @Override - public ShortagePredictionProcess get(RefNoId refNo) { + ShortagePredictionProcess get(RefNoId refNo) { Optional entity = dao.findByRefNo(refNo.getRefNo()); return new ShortagePredictionProcess( entity.map(ShortagesEntity::createId) @@ -31,8 +31,7 @@ class ShortagePredictionProcessORMRepository implements ShortagePredictionProces ); } - @Override - public void save(ShortagePredictionProcess model) { + void save(ShortagePredictionProcess model) { // persisted after event } @@ -42,12 +41,12 @@ class ShortagePredictionProcessORMRepository implements ShortagePredictionProces refNo, dao::findOne, () -> dao.save(new ShortagesEntity(refNo.getRefNo()))); entity.setShortages(event.getShortages()); - notifications.emit(event); + events.emit(event); } private void delete(ShortageSolved event) { dao.delete(TechnicalId.get(event.getRefNo())); - notifications.emit(event); + events.emit(event); } private class EventsHandler implements ShortageEvents { diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/ShortagePredictionEventsMapping.java b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java similarity index 54% rename from app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/ShortagePredictionEventsMapping.java rename to shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java index 8a84a4d..ceb44e5 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/ShortagePredictionEventsMapping.java +++ b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java @@ -1,18 +1,17 @@ -package pl.com.bottega.factory.shortages.prediction; +package pl.com.bottega.factory.shortages.prediction.monitoring; import lombok.AllArgsConstructor; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import pl.com.bottega.factory.demand.forecasting.DemandedLevelsChanged; -import pl.com.bottega.factory.shortages.prediction.monitoring.ShortagePredictionProcess; -import pl.com.bottega.factory.shortages.prediction.monitoring.ShortagePredictionProcessRepository; -@Lazy -@Component +import javax.transaction.Transactional; + +@Service +@Transactional @AllArgsConstructor -public class ShortagePredictionEventsMapping { +public class ShortagePredictionService { - private final ShortagePredictionProcessRepository repository; + private final ShortagePredictionProcessORMRepository repository; public void predictShortages(DemandedLevelsChanged event) { ShortagePredictionProcess model = repository.get(event.getRefNo()); diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagesDao.java b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesDao.java similarity index 88% rename from app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagesDao.java rename to shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesDao.java index 2156e09..62a9c29 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagesDao.java +++ b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesDao.java @@ -1,4 +1,4 @@ -package pl.com.bottega.factory.shortages.prediction.monitoring; +package pl.com.bottega.factory.shortages.prediction.monitoring.persistence; import org.springframework.data.rest.core.annotation.RepositoryRestResource; import org.springframework.data.rest.core.annotation.RestResource; diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagesEntity.java b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesEntity.java similarity index 85% rename from app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagesEntity.java rename to shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesEntity.java index 60592eb..790feea 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagesEntity.java +++ b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesEntity.java @@ -1,9 +1,9 @@ -package pl.com.bottega.factory.shortages.prediction.monitoring; +package pl.com.bottega.factory.shortages.prediction.monitoring.persistence; -import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import pl.com.bottega.factory.product.management.RefNoId; import pl.com.bottega.factory.shortages.prediction.Shortages; import pl.com.bottega.tools.JsonConverter; @@ -13,7 +13,7 @@ import javax.persistence.*; import java.io.Serializable; @Entity(name = "Shortage") -@Data +@Getter @NoArgsConstructor @EqualsAndHashCode(of = "refNo") public class ShortagesEntity implements Serializable { @@ -27,17 +27,18 @@ public class ShortagesEntity implements Serializable { private String refNo; @Column(length = 1024) @Convert(converter = ShortagesAsJson.class) + @Setter private Shortages shortages; - ShortagesEntity(String refNo) { + public ShortagesEntity(String refNo) { this.refNo = refNo; } - RefNoId createId() { + public RefNoId createId() { return new ShortagesEntityId(refNo, id); } - static RefNoId createId(RefNoId id) { + public static RefNoId createId(RefNoId id) { return id instanceof ShortagesEntityId ? id : new ShortagesEntityId(id.getRefNo()); } diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationConfiguration.java b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationConfiguration.java similarity index 100% rename from app-monolith/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationConfiguration.java rename to shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationConfiguration.java diff --git a/app-monolith/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepositoryTest.groovy b/shortages-prediction-adapters/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepositoryTest.groovy similarity index 95% rename from app-monolith/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepositoryTest.groovy rename to shortages-prediction-adapters/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepositoryTest.groovy index a18a1b2..ac56368 100644 --- a/app-monolith/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepositoryTest.groovy +++ b/shortages-prediction-adapters/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessORMRepositoryTest.groovy @@ -6,6 +6,8 @@ import org.springframework.test.annotation.Commit import pl.com.bottega.factory.product.management.RefNoId import pl.com.bottega.factory.shortages.prediction.Shortages import pl.com.bottega.factory.shortages.prediction.calculation.Forecasts +import pl.com.bottega.factory.shortages.prediction.monitoring.persistence.ShortagesDao +import pl.com.bottega.factory.shortages.prediction.monitoring.persistence.ShortagesEntity import pl.com.bottega.factory.shortages.prediction.notification.NotificationOfShortage import spock.lang.Specification diff --git a/shortages-prediction-model/pom.xml b/shortages-prediction-model/pom.xml index baf813e..ec62b7f 100644 --- a/shortages-prediction-model/pom.xml +++ b/shortages-prediction-model/pom.xml @@ -9,6 +9,26 @@ jar 1.0-SNAPSHOT + + + pl.com.bottega + shared-kernel-model + 1.0-SNAPSHOT + + + org.projectlombok + lombok + 1.16.18 + compile + + + org.spockframework + spock-core + 1.1-groovy-2.4 + test + + + @@ -47,41 +67,4 @@ - - - pl.com.bottega - shared-kernel-model - 1.0-SNAPSHOT - - - org.projectlombok - lombok - 1.16.18 - compile - - - org.assertj - assertj-core - 3.8.0 - test - - - info.cukes - cucumber-java - 1.2.5 - test - - - info.cukes - cucumber-core - 1.2.5 - test - - - org.spockframework - spock-core - 1.1-groovy-2.4 - test - - \ No newline at end of file diff --git a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/Deliveries.java b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/DeliveriesForecast.java similarity index 92% rename from shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/Deliveries.java rename to shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/DeliveriesForecast.java index 6fc1a6e..6533630 100644 --- a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/Deliveries.java +++ b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/DeliveriesForecast.java @@ -6,7 +6,7 @@ import java.time.LocalDateTime; import java.util.Map; @AllArgsConstructor -class Deliveries { +class DeliveriesForecast { private final Map forecast; diff --git a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/Forecast.java b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/Forecast.java index 2703a4d..ad9dcdc 100644 --- a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/Forecast.java +++ b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/calculation/Forecast.java @@ -15,7 +15,7 @@ public class Forecast { private final SortedSet deliveryTimes; private final Stock stock; private final ProductionOutputs outputs; - private final Deliveries deliveries; + private final DeliveriesForecast deliveries; public Optional findShortages() { long level = stock.getLevel(); diff --git a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcess.java b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcess.java index 3a65af4..da18650 100644 --- a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcess.java +++ b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcess.java @@ -14,7 +14,7 @@ import java.util.Optional; * Created by michal on 02.02.2017. */ @AllArgsConstructor -public class ShortagePredictionProcess { +class ShortagePredictionProcess { private final RefNoId refNo; private Shortages known; @@ -24,19 +24,19 @@ public class ShortagePredictionProcess { private final Configuration configuration; private final ShortageEvents events; - public void onDemandChanged() { + void onDemandChanged() { predict(After.DemandChanged); } - public void onPlanChanged() { + void onPlanChanged() { predict(After.PlanChanged); } - public void onStockChanged() { + void onStockChanged() { predict(After.StockChanged); } - public void onLockedParts() { + void onLockedParts() { predict(After.LockedParts); } diff --git a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessRepository.java b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessRepository.java deleted file mode 100644 index 3036065..0000000 --- a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package pl.com.bottega.factory.shortages.prediction.monitoring; - -import pl.com.bottega.factory.product.management.RefNoId; - -/** - * Created by michal on 03.02.2017. - */ -public interface ShortagePredictionProcessRepository { - ShortagePredictionProcess get(RefNoId refNo); - - void save(ShortagePredictionProcess model); -} diff --git a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationOfShortage.java b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationOfShortage.java index 6e74741..ef90267 100644 --- a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationOfShortage.java +++ b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/NotificationOfShortage.java @@ -7,15 +7,13 @@ import lombok.Value; import pl.com.bottega.factory.shortages.prediction.Shortages; import pl.com.bottega.factory.shortages.prediction.monitoring.NewShortage; import pl.com.bottega.factory.shortages.prediction.monitoring.NewShortage.After; -import pl.com.bottega.factory.shortages.prediction.monitoring.ShortageEvents; -import pl.com.bottega.factory.shortages.prediction.monitoring.ShortageSolved; import java.time.Clock; import java.time.LocalDateTime; import java.util.Map; @AllArgsConstructor -public class NotificationOfShortage implements ShortageEvents { +public class NotificationOfShortage { private final QualityTasks qualityTasks; private final Clock clock; @@ -33,8 +31,7 @@ public class NotificationOfShortage implements ShortageEvents { .build(); } - @Override - public void emit(NewShortage event) { + public void notifyAbout(NewShortage event) { Shortages shortage = event.getShortages(); rules.wayOfNotificationAfter(event.getTrigger()) .notifyAbout(event.getShortages()); @@ -44,11 +41,6 @@ public class NotificationOfShortage implements ShortageEvents { } } - @Override - public void emit(ShortageSolved event) { - - } - @Value @Builder static class NotificationRules { diff --git a/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/calculation/ShortagesCalculationAssemblerTrait.groovy b/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/calculation/ShortagesCalculationAssemblerTrait.groovy index f516dac..2e6a4c4 100644 --- a/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/calculation/ShortagesCalculationAssemblerTrait.groovy +++ b/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/calculation/ShortagesCalculationAssemblerTrait.groovy @@ -12,12 +12,12 @@ trait ShortagesCalculationAssemblerTrait { String refNo = "3009000" SortedSet times - Forecasts forecastProvider(Stock stock, Deliveries demands, ProductionOutputs outputs) { + Forecasts forecastProvider(Stock stock, DeliveriesForecast demands, ProductionOutputs outputs) { def forecast = forecast(stock, demands, outputs) return { RefNoId refNo, int daysAhead -> forecast } as Forecasts } - Forecast forecast(Stock stock, Deliveries demands, ProductionOutputs outputs) { + Forecast forecast(Stock stock, DeliveriesForecast demands, ProductionOutputs outputs) { new Forecast(refNo, now, times, stock, outputs, demands) } @@ -35,14 +35,14 @@ trait ShortagesCalculationAssemblerTrait { new ProductionForecast.Item(start, duration, partsPerMinute) } - Deliveries noDeliveries() { + DeliveriesForecast noDeliveries() { times = Collections.emptySortedSet() - new Deliveries([:]) + new DeliveriesForecast([:]) } - Deliveries deliveries(Map demands) { + DeliveriesForecast deliveries(Map demands) { times = new TreeSet<>(demands.keySet()) - new Deliveries(demands) + new DeliveriesForecast(demands) } Stock stock(long levels) { diff --git a/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/notification/NotificationOfShortageSpec.groovy b/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/notification/NotificationOfShortageSpec.groovy index 99bbec2..53f32c5 100644 --- a/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/notification/NotificationOfShortageSpec.groovy +++ b/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/notification/NotificationOfShortageSpec.groovy @@ -3,7 +3,6 @@ package pl.com.bottega.factory.shortages.prediction.notification import pl.com.bottega.factory.product.management.RefNoId import pl.com.bottega.factory.shortages.prediction.Shortages import pl.com.bottega.factory.shortages.prediction.monitoring.NewShortage -import pl.com.bottega.factory.shortages.prediction.monitoring.ShortageSolved import spock.lang.Specification import java.time.* @@ -25,7 +24,7 @@ class NotificationOfShortageSpec extends Specification { def notificator = notificator() when: - notificator.emit(newShortage(After.DemandChanged, withShortage())) + notificator.notifyAbout(newShortage(After.DemandChanged, withShortage())) then: 1 * notifications.alertPlanner(withShortage()) @@ -36,7 +35,7 @@ class NotificationOfShortageSpec extends Specification { def notificator = notificator() when: - notificator.emit(newShortage(After.LockedParts, withShortage())) + notificator.notifyAbout(newShortage(After.LockedParts, withShortage())) then: 1 * notifications.softNotifyPlanner(withShortage()) @@ -47,7 +46,7 @@ class NotificationOfShortageSpec extends Specification { def notificator = notificator() when: - notificator.emit(newShortage(After.PlanChanged, withShortage())) + notificator.notifyAbout(newShortage(After.PlanChanged, withShortage())) then: 1 * notifications.markOnPlan(withShortage()) @@ -58,7 +57,7 @@ class NotificationOfShortageSpec extends Specification { def notificator = notificator() when: - notificator.emit(newShortage(After.StockChanged, withShortage())) + notificator.notifyAbout(newShortage(After.StockChanged, withShortage())) then: 1 * notifications.alertPlanner(withShortage()) @@ -69,7 +68,7 @@ class NotificationOfShortageSpec extends Specification { def notificator = notificator() when: - notificator.emit(newShortage(After.StockChanged, + notificator.notifyAbout(newShortage(After.StockChanged, withShortage(Duration.ofDays(1), 500)) ) @@ -82,7 +81,7 @@ class NotificationOfShortageSpec extends Specification { def notificator = notificator() when: - notificator.emit(newShortage(After.StockChanged, + notificator.notifyAbout(newShortage(After.StockChanged, withShortage(Duration.ofDays(1), 0)) ) @@ -95,7 +94,7 @@ class NotificationOfShortageSpec extends Specification { def notificator = notificator() when: - notificator.emit(newShortage(After.StockChanged, + notificator.notifyAbout(newShortage(After.StockChanged, withShortage(Duration.ofDays(10), 500)) ) @@ -103,18 +102,6 @@ class NotificationOfShortageSpec extends Specification { 0 * tasks.increasePriorityFor(_) } - def "No notification after shortage solved specified for now"() { - given: - def notificator = notificator() - - when: - notificator.emit(new ShortageSolved(new RefNoId(refNo))) - - then: - 0 * tasks.increasePriorityFor(_) - 0 * notifications._(_) - } - def notificator() { new NotificationOfShortage( tasks, clock, policy,