diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandForecastingConfiguration.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandForecastingConfiguration.java new file mode 100644 index 0000000..91de0c9 --- /dev/null +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandForecastingConfiguration.java @@ -0,0 +1,25 @@ +package pl.com.bottega.factory.demand.forecasting; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.transaction.Transactional; + +@Configuration +class DemandForecastingConfiguration { + + @Autowired + private ProductDemandRepository repository; + + @Bean + @Transactional + DemandService demandService() { + return new DemandService(repository); + } + + @Bean + ReviewPolicy reviewPolicy() { + return ReviewPolicy.BASIC; + } +} diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemandORMRepository.java similarity index 92% rename from demand-forecasting-adapters/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/ProductDemandORMRepository.java index f60b74d..2443bb8 100644 --- a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandORMRepository.java +++ b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemandORMRepository.java @@ -23,16 +23,24 @@ import static java.util.stream.Collectors.toMap; @Component @AllArgsConstructor -class DemandORMRepository { +class ProductDemandORMRepository implements ProductDemandRepository { private final Clock clock; private final DemandEvents events; - private final ReviewPolicy reviewPolicy = ReviewPolicy.BASIC; + private final ReviewPolicy reviewPolicy; private final EntityManager em; private final ProductDemandDao rootDao; private final DemandDao demandDao; - ProductDemand get(String refNo) { + @Override + public void initDemandsFor(String refNo) { + if (rootDao.findByRefNo(refNo) == null) { + rootDao.save(new ProductDemandEntity(refNo)); + } + } + + @Override + public ProductDemand get(String refNo) { ProductDemandEntity root = rootDao.findByRefNo(refNo); RefNoId id = root.createId(); @@ -48,23 +56,8 @@ class DemandORMRepository { return new ProductDemand(id, demands, clock, events); } - private DailyDemand map(String refNo, LocalDate date, - Map data) { - return ofNullable(data.get(date)) - .map(entity -> new DailyDemand( - entity.createId(), - reviewPolicy, - entity.getValue().getDocumented(), - entity.getValue().getAdjustment())) - .orElseGet(() -> new DailyDemand( - new DemandEntityId(refNo, date), - reviewPolicy, - null, - null - )); - } - - void save(ProductDemand model) { + @Override + public void save(ProductDemand model) { ProductDemandEntity root = rootDao.findOne(TechnicalId.get(model.id)); if (model.updates.size() > 0) { em.lock(root, LockModeType.OPTIMISTIC_FORCE_INCREMENT); @@ -87,9 +80,19 @@ class DemandORMRepository { } } - void initDemandsFor(String refNo) { - if (rootDao.findByRefNo(refNo) == null) { - rootDao.save(new ProductDemandEntity(refNo)); - } + private DailyDemand map(String refNo, LocalDate date, + Map data) { + return ofNullable(data.get(date)) + .map(entity -> new DailyDemand( + entity.createId(), + reviewPolicy, + entity.getValue().getDocumented(), + entity.getValue().getAdjustment())) + .orElseGet(() -> new DailyDemand( + new DemandEntityId(refNo, date), + reviewPolicy, + null, + null + )); } } diff --git a/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy b/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandORMRepositoryTest.groovy similarity index 90% rename from demand-forecasting-adapters/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/ProductDemandORMRepositoryTest.groovy index 13511cc..090cf26 100644 --- a/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/demand/forecasting/DemandORMRepositoryTest.groovy +++ b/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/demand/forecasting/ProductDemandORMRepositoryTest.groovy @@ -19,7 +19,7 @@ import java.time.ZoneId @SpringBootTest @Transactional @Commit -class DemandORMRepositoryTest extends Specification { +class ProductDemandORMRepositoryTest extends Specification { def clock = Clock.fixed(Instant.now(), ZoneId.systemDefault()) def events = Mock(DemandEvents) @@ -30,7 +30,7 @@ class DemandORMRepositoryTest extends Specification { @Autowired DemandDao demandDao - DemandORMRepository repository + ProductDemandORMRepository repository final def today = LocalDate.now(clock) final def refNo = "3009000" @@ -38,7 +38,14 @@ class DemandORMRepositoryTest extends Specification { def setup() { demandDao.deleteAllInBatch() rootDao.deleteAllInBatch() - repository = new DemandORMRepository(clock, events, em, rootDao, demandDao) + repository = new ProductDemandORMRepository( + clock, + events, + ReviewPolicy.BASIC, + em, + rootDao, + demandDao + ) } def "persists new demand"() { diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java similarity index 84% rename from demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java rename to demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java index 9865528..61308c5 100644 --- a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/DemandService.java @@ -1,17 +1,12 @@ package pl.com.bottega.factory.demand.forecasting; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; import pl.com.bottega.factory.demand.forecasting.ReviewRequired.ToReview; -import javax.transaction.Transactional; - -@Service -@Transactional @AllArgsConstructor public class DemandService { - private final DemandORMRepository repository; + private final ProductDemandRepository repository; public void init(String refNo) { repository.initDemandsFor(refNo); diff --git a/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemandRepository.java b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemandRepository.java new file mode 100644 index 0000000..34dbf97 --- /dev/null +++ b/demand-forecasting-model/src/main/java/pl/com/bottega/factory/demand/forecasting/ProductDemandRepository.java @@ -0,0 +1,9 @@ +package pl.com.bottega.factory.demand.forecasting; + +interface ProductDemandRepository { + ProductDemand get(String refNo); + + void save(ProductDemand model); + + void initDemandsFor(String refNo); +} diff --git a/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/MonitoringConfiguration.java b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/MonitoringConfiguration.java new file mode 100644 index 0000000..a07c7d4 --- /dev/null +++ b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/MonitoringConfiguration.java @@ -0,0 +1,32 @@ +package pl.com.bottega.factory.shortages.prediction.monitoring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import pl.com.bottega.factory.shortages.prediction.ConfigurationParams; + +import javax.transaction.Transactional; + +@Configuration +class MonitoringConfiguration { + + @Autowired + private ShortagePredictionProcessRepository repository; + + @Bean + @Transactional + ShortagePredictionService shortagePredictionService() { + return new ShortagePredictionService(repository); + } + + @Bean + ShortageDiffPolicy policy() { + return ShortageDiffPolicy.ValuesAreNotSame; + } + + @Bean + ConfigurationParams configuration() { + return () -> 14; + } + +} diff --git a/shortages-prediction-adapters/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 index ab6651a..47b7748 100644 --- a/shortages-prediction-adapters/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 @@ -3,7 +3,7 @@ package pl.com.bottega.factory.shortages.prediction.monitoring; import lombok.AllArgsConstructor; 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.ConfigurationParams; import pl.com.bottega.factory.shortages.prediction.calculation.ShortageForecasts; import pl.com.bottega.factory.shortages.prediction.monitoring.persistence.ShortagesDao; import pl.com.bottega.factory.shortages.prediction.monitoring.persistence.ShortagesEntity; @@ -13,15 +13,16 @@ import java.util.Optional; @Component @AllArgsConstructor -class ShortagePredictionProcessORMRepository { +class ShortagePredictionProcessORMRepository implements ShortagePredictionProcessRepository { private final ShortagesDao dao; private final ShortageDiffPolicy policy = ShortageDiffPolicy.ValuesAreNotSame; private final ShortageForecasts forecasts; - private final Configuration configuration = () -> 14; + private final ConfigurationParams configuration = () -> 14; private final ShortageEvents events; - ShortagePredictionProcess get(RefNoId refNo) { + @Override + public ShortagePredictionProcess get(RefNoId refNo) { Optional entity = dao.findByRefNo(refNo.getRefNo()); return new ShortagePredictionProcess( entity.map(ShortagesEntity::createId) @@ -31,7 +32,8 @@ class ShortagePredictionProcessORMRepository { ); } - void save(ShortagePredictionProcess model) { + @Override + public void save(ShortagePredictionProcess model) { // persisted after event } diff --git a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/Configuration.java b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/ConfigurationParams.java similarity index 78% rename from shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/Configuration.java rename to shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/ConfigurationParams.java index d23090e..ac65403 100644 --- a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/Configuration.java +++ b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/ConfigurationParams.java @@ -3,6 +3,6 @@ package pl.com.bottega.factory.shortages.prediction; /** * Created by michal on 02.02.2017. */ -public interface Configuration { +public interface ConfigurationParams { int shortagePredictionDaysAhead(); } 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 68d96f0..10582d0 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 @@ -2,7 +2,7 @@ package pl.com.bottega.factory.shortages.prediction.monitoring; import lombok.AllArgsConstructor; import pl.com.bottega.factory.product.management.RefNoId; -import pl.com.bottega.factory.shortages.prediction.Configuration; +import pl.com.bottega.factory.shortages.prediction.ConfigurationParams; import pl.com.bottega.factory.shortages.prediction.Shortage; import pl.com.bottega.factory.shortages.prediction.calculation.ShortageForecast; import pl.com.bottega.factory.shortages.prediction.calculation.ShortageForecasts; @@ -21,7 +21,7 @@ class ShortagePredictionProcess { private final ShortageDiffPolicy diffPolicy; private final ShortageForecasts forecasts; - private final Configuration configuration; + private final ConfigurationParams configuration; private final ShortageEvents events; void onDemandChanged() { 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 new file mode 100644 index 0000000..665223e --- /dev/null +++ b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessRepository.java @@ -0,0 +1,9 @@ +package pl.com.bottega.factory.shortages.prediction.monitoring; + +import pl.com.bottega.factory.product.management.RefNoId; + +interface ShortagePredictionProcessRepository { + ShortagePredictionProcess get(RefNoId refNo); + + void save(ShortagePredictionProcess model); +} diff --git a/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java similarity index 78% rename from shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java rename to shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java index ceb44e5..0d5826b 100644 --- a/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java +++ b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionService.java @@ -1,17 +1,12 @@ package pl.com.bottega.factory.shortages.prediction.monitoring; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; import pl.com.bottega.factory.demand.forecasting.DemandedLevelsChanged; -import javax.transaction.Transactional; - -@Service -@Transactional @AllArgsConstructor public class ShortagePredictionService { - private final ShortagePredictionProcessORMRepository repository; + private final ShortagePredictionProcessRepository repository; public void predictShortages(DemandedLevelsChanged event) { ShortagePredictionProcess model = repository.get(event.getRefNo()); diff --git a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/Notifications.java b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/Notifications.java index 7661ea3..d267a9c 100644 --- a/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/Notifications.java +++ b/shortages-prediction-model/src/main/java/pl/com/bottega/factory/shortages/prediction/notification/Notifications.java @@ -5,7 +5,7 @@ import pl.com.bottega.factory.shortages.prediction.Shortage; /** * Created by michal on 02.02.2017. */ -public interface Notifications { +interface Notifications { void alertPlanner(Shortage shortage); void softNotifyPlanner(Shortage shortage); diff --git a/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/InMemoryConfiguration.groovy b/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/InMemoryConfigurationParams.groovy similarity index 76% rename from shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/InMemoryConfiguration.groovy rename to shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/InMemoryConfigurationParams.groovy index e62f4c1..771929c 100644 --- a/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/InMemoryConfiguration.groovy +++ b/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/InMemoryConfigurationParams.groovy @@ -1,8 +1,8 @@ package pl.com.bottega.factory.shortages.prediction.monitoring -import pl.com.bottega.factory.shortages.prediction.Configuration +import pl.com.bottega.factory.shortages.prediction.ConfigurationParams -class InMemoryConfiguration implements Configuration { +class InMemoryConfigurationParams implements ConfigurationParams { int daysAhead; @Override diff --git a/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessSpec.groovy b/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessSpec.groovy index abb5275..c6e86f8 100644 --- a/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessSpec.groovy +++ b/shortages-prediction-model/src/test/groovy/pl/com/bottega/factory/shortages/prediction/monitoring/ShortagePredictionProcessSpec.groovy @@ -1,7 +1,7 @@ package pl.com.bottega.factory.shortages.prediction.monitoring import pl.com.bottega.factory.product.management.RefNoId -import pl.com.bottega.factory.shortages.prediction.Configuration +import pl.com.bottega.factory.shortages.prediction.ConfigurationParams import pl.com.bottega.factory.shortages.prediction.Shortage import pl.com.bottega.factory.shortages.prediction.calculation.ShortageForecasts import pl.com.bottega.factory.shortages.prediction.calculation.ShortagesCalculationAssembler @@ -166,8 +166,8 @@ class ShortagePredictionProcessSpec extends Specification { ) } - Configuration defaultConfig() { - new InMemoryConfiguration(daysAhead: 14) + ConfigurationParams defaultConfig() { + new InMemoryConfigurationParams(daysAhead: 14) } NewShortage newShortage(After after, Map missing) {