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,