diff --git a/adapter-commons/src/main/java/pl/com/bottega/tools/JsonConverter.java b/adapter-commons/src/main/java/pl/com/bottega/tools/JsonConverter.java index ca18262..cf5a718 100644 --- a/adapter-commons/src/main/java/pl/com/bottega/tools/JsonConverter.java +++ b/adapter-commons/src/main/java/pl/com/bottega/tools/JsonConverter.java @@ -19,6 +19,7 @@ public abstract class JsonConverter implements AttributeConverter .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.ANY) .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) .enable(SerializationFeature.WRITE_DATES_WITH_ZONE_ID) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) .registerModule(new JavaTimeModule()); private final Class type; diff --git a/adapter-commons/src/test/resources/application.properties b/adapter-commons/src/test/resources/application.properties index 0994d18..e2ed5d8 100644 --- a/adapter-commons/src/test/resources/application.properties +++ b/adapter-commons/src/test/resources/application.properties @@ -1,6 +1,6 @@ spring.main.banner-mode=off spring.jpa.database=default -spring.jpa.generate-ddl=true +spring.jpa.generate-ddl=false spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password= diff --git a/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/ressource/StockForecastDao.java b/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/ressource/StockForecastDao.java index 869bad8..77e4904 100644 --- a/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/ressource/StockForecastDao.java +++ b/app-monolith/src/main/java/pl/com/bottega/factory/stock/forecast/ressource/StockForecastDao.java @@ -1,19 +1,14 @@ package pl.com.bottega.factory.stock.forecast.ressource; import org.springframework.data.rest.core.annotation.RepositoryRestResource; -import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.stereotype.Repository; import pl.com.bottega.tools.ProjectionRepository; -import java.util.List; - @Repository @RepositoryRestResource(path = "stock-forecasts", collectionResourceRel = "stock-forecasts", itemResourceRel = "stock-forecast", excerptProjection = StockForecastEntity.CollectionItem.class) -public interface StockForecastDao extends ProjectionRepository { +public interface StockForecastDao extends ProjectionRepository { - @RestResource(path = "refNos", rel = "refNos") - List findByProductRefNo(String refNo); } 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 b87f5da..e1042b3 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,27 +1,22 @@ package pl.com.bottega.factory.stock.forecast.ressource; -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.stock.forecast.StockForecast; -import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; import java.io.Serializable; @Entity(name = "StockForecast") +@Table(schema = "shortages_prediction") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "id") -@ToString public class StockForecastEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @Column private String refNo; public StockForecastEntity(String refNo) { diff --git a/app-monolith/src/test/resources/curl.txt b/app-monolith/src/test/resources/curl.txt index badf109..f977fab 100644 --- a/app-monolith/src/test/resources/curl.txt +++ b/app-monolith/src/test/resources/curl.txt @@ -5,6 +5,8 @@ curl -X POST -H "Content-Type: application/json" \ -d @app-monolith/src/test/resources/examples/product-descriptions.json \ http://localhost:8080/product-descriptions +curl http://localhost:8080/stock-forecasts + curl -X POST -H "Content-Type: application/json" \ -d @app-monolith/src/test/resources/examples/delivery-definitions.json \ http://localhost:8080/delivery-definitions diff --git a/database/initdb.sql b/database/initdb.sql index e14b9f9..e2be0ec 100644 --- a/database/initdb.sql +++ b/database/initdb.sql @@ -1,4 +1,2 @@ ---create schema demands authorization postgres; ---create schema shortages authorization postgres; ---create schema products authorization postgres; +-- see schema directory diff --git a/database/schema/commons.sql b/database/schema/commons.sql new file mode 100644 index 0000000..495f961 --- /dev/null +++ b/database/schema/commons.sql @@ -0,0 +1,12 @@ +--liquibase formatted sql + +--changeset michaluk.michal:1.init + +CREATE SEQUENCE hibernate_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +CREATE CAST (character varying AS json) WITH INOUT AS ASSIGNMENT; diff --git a/database/schema/db.changelog.xml b/database/schema/db.changelog.xml index ccc937e..0e94a27 100644 --- a/database/schema/db.changelog.xml +++ b/database/schema/db.changelog.xml @@ -2,7 +2,10 @@ - - - + + + + + + diff --git a/database/schema/delivery-planning.sql b/database/schema/delivery-planning.sql new file mode 100644 index 0000000..0b3e86b --- /dev/null +++ b/database/schema/delivery-planning.sql @@ -0,0 +1,17 @@ +--liquibase formatted sql + +--changeset michaluk.michal:1.init +CREATE SCHEMA delivery_planning; + +CREATE TABLE delivery_planning.delivery_planner_definition ( + ref_no character varying(64) NOT NULL PRIMARY KEY, + definition json NOT NULL +); + +CREATE TABLE delivery_planning.delivery_forecast ( + id serial NOT NULL PRIMARY KEY, + ref_no character varying(64) NOT NULL, + "time" timestamp without time zone NOT NULL, + "date" timestamp without time zone NOT NULL, + level bigint NOT NULL +); diff --git a/database/schema/demand-forecasting.sql b/database/schema/demand-forecasting.sql new file mode 100644 index 0000000..d3b9dd2 --- /dev/null +++ b/database/schema/demand-forecasting.sql @@ -0,0 +1,46 @@ +--liquibase formatted sql + +--changeset michaluk.michal:1.init +CREATE SCHEMA demand_forecasting; + +CREATE TABLE demand_forecasting.product_demand ( + id serial NOT NULL PRIMARY KEY, + version bigint NOT NULL, + ref_no character varying(64) NOT NULL, + UNIQUE(ref_no) +); + +CREATE TABLE demand_forecasting."demand" ( + id serial NOT NULL PRIMARY KEY, + ref_no character varying(64) NOT NULL, + "date" timestamp without time zone NOT NULL, + value json NOT NULL, + UNIQUE(ref_no, "date") +); + +CREATE TABLE demand_forecasting.current_demand ( + id serial NOT NULL PRIMARY KEY, + ref_no character varying(64) NOT NULL, + "date" timestamp without time zone NOT NULL, + level bigint NOT NULL, + "schema" character varying(64) NOT NULL, + UNIQUE(ref_no, "date") +); + +CREATE TABLE demand_forecasting.demand_adjustment ( + id serial NOT NULL PRIMARY KEY, + customer_representative character varying(255) NOT NULL, + note character varying(255) NOT NULL, + adjustment json NOT NULL, + clean_after timestamp without time zone +); + +CREATE TABLE demand_forecasting.demand_review ( + id serial NOT NULL PRIMARY KEY, + ref_no character varying(64) NOT NULL, + "date" timestamp without time zone NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + review json NOT NULL, + decision character varying(64), + clean_after timestamp without time zone +); diff --git a/database/schema/product-management.sql b/database/schema/product-management.sql index ded654b..f7b66f5 100644 --- a/database/schema/product-management.sql +++ b/database/schema/product-management.sql @@ -1,3 +1,9 @@ --liquibase formatted sql --changeset michaluk.michal:1.init +CREATE SCHEMA product_management; + +CREATE TABLE product_management.product_description ( + ref_no character varying(64) NOT NULL PRIMARY KEY, + description json NOT NULL +); diff --git a/database/schema/production-planning.sql b/database/schema/production-planning.sql new file mode 100644 index 0000000..025cf40 --- /dev/null +++ b/database/schema/production-planning.sql @@ -0,0 +1,22 @@ +--liquibase formatted sql + +--changeset michaluk.michal:1.init +CREATE SCHEMA production_planning; + +CREATE TABLE production_planning.production_daily_output ( + id serial NOT NULL PRIMARY KEY, + ref_no character varying(64) NOT NULL, + "date" timestamp without time zone NOT NULL, + output bigint NOT NULL, + UNIQUE(ref_no, "date") +); + +CREATE TABLE production_planning.production_output ( + id serial NOT NULL PRIMARY KEY, + ref_no character varying(64) NOT NULL, + "start" timestamp without time zone NOT NULL, + "end" timestamp without time zone NOT NULL, + duration bigint NOT NULL, + parts_per_minute integer NOT NULL, + total bigint NOT NULL +); diff --git a/database/schema/shortages-prediction.sql b/database/schema/shortages-prediction.sql new file mode 100644 index 0000000..55d0a4a --- /dev/null +++ b/database/schema/shortages-prediction.sql @@ -0,0 +1,16 @@ +--liquibase formatted sql + +--changeset michaluk.michal:1.init +CREATE SCHEMA shortages_prediction; + +CREATE TABLE shortages_prediction.shortage ( + id serial NOT NULL PRIMARY KEY, + version bigint NOT NULL, + ref_no character varying(64) NOT NULL, + shortages json NOT NULL, + UNIQUE(ref_no) +); + +CREATE TABLE shortages_prediction.stock_forecast ( + ref_no character varying(64) NOT NULL PRIMARY KEY +); diff --git a/demand-forecasting-adapters/pom.xml b/demand-forecasting-adapters/pom.xml index f387cc7..0868984 100644 --- a/demand-forecasting-adapters/pom.xml +++ b/demand-forecasting-adapters/pom.xml @@ -25,6 +25,13 @@ adapter-commons 1.0-SNAPSHOT + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + test-jar + test + org.projectlombok diff --git a/demand-forecasting-adapters/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 index 351c999..c36f568 100644 --- a/demand-forecasting-adapters/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 @@ -17,7 +17,7 @@ public class DeliveryAutoPlannerORMRepository { public DeliveryAutoPlanner get(String refNo) { return new DeliveryAutoPlanner(refNo, - ofNullable(dao.findByRefNo(refNo)) + ofNullable(dao.findOne(refNo)) .map(DeliveryPlannerDefinitionEntity::getDefinition) .map(x -> x.map(DeliveriesSuggestion::timesAndFractions)) .orElse(Collections.emptyMap())); diff --git a/demand-forecasting-adapters/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 index ff76fa7..6689628 100644 --- a/demand-forecasting-adapters/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 @@ -2,8 +2,8 @@ package pl.com.bottega.factory.delivery.planning.definition; import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.EqualsAndHashCode; import lombok.Singular; +import lombok.Value; import pl.com.bottega.factory.demand.forecasting.Demand; import java.time.LocalTime; @@ -13,8 +13,8 @@ import java.util.function.Function; import java.util.stream.Collectors; @Builder +@Value @AllArgsConstructor -@EqualsAndHashCode public class DeliveryPlannerDefinition { @Singular private final Map> definitions; diff --git a/demand-forecasting-adapters/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 index 3daea9b..8a0ef79 100644 --- a/demand-forecasting-adapters/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 @@ -2,7 +2,6 @@ package pl.com.bottega.factory.delivery.planning.definition; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; -import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.stereotype.Repository; @Repository @@ -10,7 +9,6 @@ import org.springframework.stereotype.Repository; path = "delivery-definitions", collectionResourceRel = "delivery-definitions", itemResourceRel = "delivery-definition") -public interface DeliveryPlannerDefinitionDao extends JpaRepository { - @RestResource(path = "refNos", rel = "refNos") - DeliveryPlannerDefinitionEntity findByRefNo(String refNo); +public interface DeliveryPlannerDefinitionDao extends JpaRepository { + } diff --git a/demand-forecasting-adapters/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 index b23c237..5bd5f3c 100644 --- a/demand-forecasting-adapters/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,26 +1,24 @@ package pl.com.bottega.factory.delivery.planning.definition; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import pl.com.bottega.tools.JsonConverter; -import javax.persistence.*; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; import java.io.Serializable; @Entity(name = "DeliveryPlannerDefinition") +@Table(schema = "delivery_planning") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "refNo") public class DeliveryPlannerDefinitionEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - @Column private String refNo; - @Column - @Convert(converter = DescriptionAsJson.class) + @Convert(converter = DefinitionAsJson.class) private DeliveryPlannerDefinition definition; public DeliveryPlannerDefinitionEntity(String refNo, DeliveryPlannerDefinition definition) { @@ -28,8 +26,8 @@ public class DeliveryPlannerDefinitionEntity implements Serializable { this.definition = definition; } - public static class DescriptionAsJson extends JsonConverter { - public DescriptionAsJson() { + public static class DefinitionAsJson extends JsonConverter { + public DefinitionAsJson() { super(DeliveryPlannerDefinition.class); } } diff --git a/demand-forecasting-adapters/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 index c867b25..ca4b138 100644 --- a/demand-forecasting-adapters/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 @@ -1,30 +1,28 @@ package pl.com.bottega.factory.delivery.planning.projection; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; @Entity(name = "DeliveryForecast") +@Table(schema = "delivery_planning") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = {"refNo", "date"}) public class DeliveryForecastEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; - @Column private String refNo; - @Column private LocalDate date; - @Column private LocalDateTime time; - @Column private long level; DeliveryForecastEntity(String refNo, LocalDateTime time, long level) { 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/DemandORMRepository.java index 1b61f6c..d531ae5 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/DemandORMRepository.java @@ -37,7 +37,7 @@ class DemandORMRepository { RefNoId id = root.createId(); Map data = - demandDao.findByProductRefNoAndDateGreaterThanEqual(refNo, LocalDate.now(clock)).stream() + demandDao.findByRefNoAndDateGreaterThanEqual(refNo, LocalDate.now(clock)).stream() .collect(toMap( DemandEntity::getDate, Function.identity() diff --git a/demand-forecasting-adapters/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 index 7d4fed7..c74e679 100644 --- a/demand-forecasting-adapters/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 @@ -1,6 +1,5 @@ package pl.com.bottega.factory.demand.forecasting.command; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -12,27 +11,22 @@ import java.io.Serializable; import java.time.LocalDate; @Entity(name = "DemandAdjustment") +@Table(schema = "demand_forecasting") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "id") public class DemandAdjustmentEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; - - @Column private String note; - @Column private String customerRepresentative; - @Column - @Setter - private LocalDate cleanAfter; - - @Column(length = 4096) @Convert(converter = AdjustDemandAsJson.class) private AdjustDemand adjustment; + @Setter + private LocalDate cleanAfter; + public static class AdjustDemandAsJson extends JsonConverter { public AdjustDemandAsJson() { super(AdjustDemand.class); diff --git a/demand-forecasting-adapters/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 index 6b712b7..8a04684 100644 --- a/demand-forecasting-adapters/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 @@ -1,6 +1,5 @@ package pl.com.bottega.factory.demand.forecasting.command; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -14,29 +13,22 @@ import java.time.Instant; import java.time.LocalDate; @Entity(name = "DemandReview") +@Table(schema = "demand_forecasting") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "id") public class DemandReviewEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; - - @Column private String refNo; - @Column private LocalDate date; - @Column private Instant timestamp; - @Column @Convert(converter = ReviewAsJson.class) private ReviewNeeded review; - @Column @Enumerated(EnumType.STRING) private ReviewDecision decision; - @Column @Setter private LocalDate cleanAfter; diff --git a/demand-forecasting-adapters/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 index 5ff57fe..8e93cd8 100644 --- a/demand-forecasting-adapters/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 @@ -10,5 +10,5 @@ import java.util.List; @Repository @RestResource(exported = false) public interface DemandDao extends JpaRepository { - List findByProductRefNoAndDateGreaterThanEqual(String refNo, LocalDate now); + List findByRefNoAndDateGreaterThanEqual(String refNo, LocalDate now); } 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 index ab6042a..6cc6103 100644 --- 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 @@ -1,6 +1,8 @@ package pl.com.bottega.factory.demand.forecasting.persistence; -import lombok.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import pl.com.bottega.factory.demand.forecasting.DailyId; import pl.com.bottega.factory.demand.forecasting.DemandValue; import pl.com.bottega.tools.JsonConverter; @@ -11,22 +13,18 @@ import java.io.Serializable; import java.time.LocalDate; @Entity(name = "Demand") +@Table(schema = "demand_forecasting") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "id") -@ToString public class DemandEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; - @Column - String refNo; - @Column + private String refNo; private LocalDate date; - @Column - @Convert(converter = DemandAsJson.class) @Setter + @Convert(converter = DemandAsJson.class) private DemandValue value; public DemandEntity(String refNo, LocalDate date) { diff --git a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandEntity.java b/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/ProductDemandEntity.java index f365d7d..14fe0c0 100644 --- a/demand-forecasting-adapters/src/main/java/pl/com/bottega/factory/demand/forecasting/persistence/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.persistence; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import pl.com.bottega.factory.product.management.RefNoId; @@ -10,17 +9,16 @@ import javax.persistence.*; import java.io.Serializable; @Entity(name = "ProductDemand") +@Table(schema = "demand_forecasting") @NoArgsConstructor -@EqualsAndHashCode(of = "id") public class ProductDemandEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; @Version private Long version; - @Column - String refNo; + private String refNo; public ProductDemandEntity(String refNo) { this.refNo = refNo; @@ -33,11 +31,7 @@ public class ProductDemandEntity implements Serializable { @Getter static class ProductDemandEntityId extends RefNoId implements TechnicalId { - Long id; - - ProductDemandEntityId(String refNo) { - super(refNo); - } + private Long id; ProductDemandEntityId(String refNo, long id) { super(refNo); diff --git a/demand-forecasting-adapters/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 index 1551609..fc7d693 100644 --- a/demand-forecasting-adapters/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 @@ -1,6 +1,5 @@ package pl.com.bottega.factory.demand.forecasting.projection; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import pl.com.bottega.factory.demand.forecasting.Demand; @@ -10,21 +9,17 @@ import java.io.Serializable; import java.time.LocalDate; @Entity(name = "CurrentDemand") +@Table(schema = "demand_forecasting") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "id") public class CurrentDemandEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; - @Column private String refNo; - @Column private LocalDate date; - @Column private long level; - @Column @Enumerated(EnumType.STRING) private Demand.Schema schema; diff --git a/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java b/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java new file mode 100644 index 0000000..46e742b --- /dev/null +++ b/demand-forecasting-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java @@ -0,0 +1,41 @@ +package pl.com.bottega.factory; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Bean; +import org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters; +import org.springframework.scheduling.annotation.EnableScheduling; +import pl.com.bottega.factory.demand.forecasting.DemandEvents; +import pl.com.bottega.factory.demand.forecasting.DemandedLevelsChanged; +import pl.com.bottega.factory.demand.forecasting.ReviewRequested; + +import java.time.Clock; + +@SpringBootApplication +@EnableScheduling +@EntityScan( + basePackageClasses = {Configuration.class, Jsr310JpaConverters.class} +) +public class Configuration { + @Bean + public Clock clock() { + return Clock.systemDefaultZone(); + } + + @Bean + public DemandEventsFake DemandEvents() { + return new DemandEventsFake(); + } + + private class DemandEventsFake implements DemandEvents { + @Override + public void emit(DemandedLevelsChanged event) { + + } + + @Override + public void emit(ReviewRequested event) { + + } + } +} 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/DemandORMRepositoryTest.groovy index 9bae647..13511cc 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/DemandORMRepositoryTest.groovy @@ -76,7 +76,7 @@ class DemandORMRepositoryTest extends Specification { demandInDB((today.minusDays(1)): 10000, (today): 1000) when: - def demands = demandDao.findByProductRefNoAndDateGreaterThanEqual(refNo, today) + def demands = demandDao.findByRefNoAndDateGreaterThanEqual(refNo, today) then: demands.size() == 1 @@ -90,7 +90,7 @@ class DemandORMRepositoryTest extends Specification { private void demandInDB(Map demands) { def root = rootDao.save(new ProductDemandEntity(refNo)) demands.each { date, level -> - def demand = new DemandEntity(root, date) + def demand = new DemandEntity(refNo, date) demand.setValue(new DemandValue(Demand.of(level), null)) demandDao.save(demand) } @@ -107,6 +107,6 @@ class DemandORMRepositoryTest extends Specification { } private def hasAdjustment(long level) { - return { it.get().getAdjustment() == Adjustment.strong(Demand.of(level)) } + return { it.getValue().getAdjustment() == Adjustment.strong(Demand.of(level)) } } } diff --git a/product-management-adapters/pom.xml b/product-management-adapters/pom.xml index e18a1f8..b13d877 100644 --- a/product-management-adapters/pom.xml +++ b/product-management-adapters/pom.xml @@ -20,6 +20,13 @@ adapter-commons 1.0-SNAPSHOT + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + test-jar + test + org.projectlombok diff --git a/product-management-adapters/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 index 9e438f3..9b10a70 100644 --- a/product-management-adapters/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 @@ -2,7 +2,6 @@ package pl.com.bottega.factory.product.management; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; -import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.stereotype.Repository; @Repository @@ -10,7 +9,6 @@ import org.springframework.stereotype.Repository; path = "product-descriptions", collectionResourceRel = "product-descriptions", itemResourceRel = "product-description") -public interface ProductDescriptionDao extends JpaRepository { - @RestResource(path = "refNos", rel = "refNos") - ProductDescriptionEntity findByRefNo(String refNo); +public interface ProductDescriptionDao extends JpaRepository { + } diff --git a/product-management-adapters/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 index 6cb9ef7..704c162 100644 --- a/product-management-adapters/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,29 +1,27 @@ package pl.com.bottega.factory.product.management; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import pl.com.bottega.tools.JsonConverter; -import javax.persistence.*; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; import java.io.Serializable; @Entity(name = "ProductDescription") +@Table(schema = "product_management") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "refNo") public class ProductDescriptionEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - @Column private String refNo; - @Column @Convert(converter = DescriptionAsJson.class) - ProductDescription description; + private ProductDescription description; - public ProductDescriptionEntity(String refNo, ProductDescription description) { + ProductDescriptionEntity(String refNo, ProductDescription description) { this.refNo = refNo; this.description = description; } diff --git a/product-management-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java b/product-management-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java new file mode 100644 index 0000000..e449042 --- /dev/null +++ b/product-management-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java @@ -0,0 +1,21 @@ +package pl.com.bottega.factory; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Bean; +import org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters; +import org.springframework.scheduling.annotation.EnableScheduling; + +import java.time.Clock; + +@SpringBootApplication +@EnableScheduling +@EntityScan( + basePackageClasses = {Configuration.class, Jsr310JpaConverters.class} +) +public class Configuration { + @Bean + public Clock clock() { + return Clock.systemDefaultZone(); + } +} diff --git a/production-planning-adapters/pom.xml b/production-planning-adapters/pom.xml index a89b362..173b39c 100644 --- a/production-planning-adapters/pom.xml +++ b/production-planning-adapters/pom.xml @@ -20,6 +20,13 @@ adapter-commons 1.0-SNAPSHOT + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + test-jar + test + org.projectlombok diff --git a/production-planning-adapters/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 index 6c07912..6c4d912 100644 --- a/production-planning-adapters/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 @@ -1,30 +1,29 @@ package pl.com.bottega.factory.production.planning.projection; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; import java.io.Serializable; import java.time.LocalDate; @Entity(name = "ProductionDailyOutput") +@Table(schema = "production_planning") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "refNo") public class ProductionDailyOutputEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; - @Column private String refNo; - @Column private LocalDate date; - @Column private long output; - public ProductionDailyOutputEntity(String refNo, LocalDate date, long output) { + ProductionDailyOutputEntity(String refNo, LocalDate date, long output) { this.refNo = refNo; this.date = date; this.output = output; diff --git a/production-planning-adapters/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 index 1e57f66..f2da07d 100644 --- a/production-planning-adapters/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 @@ -1,45 +1,45 @@ package pl.com.bottega.factory.production.planning.projection; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; import java.io.Serializable; import java.time.Duration; import java.time.LocalDateTime; @Entity(name = "ProductionOutput") +@Table(schema = "production_planning") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "refNo") public class ProductionOutputEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; - @Column private String refNo; - @Column private LocalDateTime start; - @Column - private Duration duration; - @Column + private long duration; private LocalDateTime end; - @Column private int partsPerMinute; - @Column private long total; - public ProductionOutputEntity(String refNo, - LocalDateTime start, Duration duration, - int partsPerMinute, - long total) { + ProductionOutputEntity(String refNo, + LocalDateTime start, Duration duration, + int partsPerMinute, + long total) { this.refNo = refNo; this.start = start; - this.duration = duration; + this.duration = duration.getSeconds(); this.end = start.plus(duration); this.partsPerMinute = partsPerMinute; this.total = total; } + + public Duration getDuration() { + return Duration.ofSeconds(duration); + } } diff --git a/shortages-prediction-adapters/pom.xml b/shortages-prediction-adapters/pom.xml index 3eb1ead..f3183c6 100644 --- a/shortages-prediction-adapters/pom.xml +++ b/shortages-prediction-adapters/pom.xml @@ -25,6 +25,13 @@ adapter-commons 1.0-SNAPSHOT + + pl.com.bottega + adapter-commons + 1.0-SNAPSHOT + test-jar + test + org.projectlombok diff --git a/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesDao.java b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesDao.java index 62a9c29..c2dce1f 100644 --- a/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesDao.java +++ b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesDao.java @@ -14,4 +14,6 @@ import java.util.Optional; public interface ShortagesDao extends ProjectionRepository { @RestResource(path = "refNos", rel = "refNos") Optional findByRefNo(String refNo); + + void deleteAllInBatch(); } diff --git a/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesEntity.java b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesEntity.java index 790feea..275db73 100644 --- a/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesEntity.java +++ b/shortages-prediction-adapters/src/main/java/pl/com/bottega/factory/shortages/prediction/monitoring/persistence/ShortagesEntity.java @@ -1,6 +1,5 @@ package pl.com.bottega.factory.shortages.prediction.monitoring.persistence; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -13,21 +12,19 @@ import javax.persistence.*; import java.io.Serializable; @Entity(name = "Shortage") +@Table(schema = "shortages_prediction") @Getter @NoArgsConstructor -@EqualsAndHashCode(of = "refNo") public class ShortagesEntity implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue private Long id; @Version private Long version; - @Column private String refNo; - @Column(length = 1024) - @Convert(converter = ShortagesAsJson.class) @Setter + @Convert(converter = ShortagesAsJson.class) private Shortages shortages; public ShortagesEntity(String refNo) { @@ -51,7 +48,7 @@ public class ShortagesEntity implements Serializable { @Getter static class ShortagesEntityId extends RefNoId implements TechnicalId { - Long id; + private Long id; ShortagesEntityId(String refNo) { super(refNo); diff --git a/shortages-prediction-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java b/shortages-prediction-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java new file mode 100644 index 0000000..dbadbd8 --- /dev/null +++ b/shortages-prediction-adapters/src/test/groovy/pl/com/bottega/factory/Configuration.java @@ -0,0 +1,56 @@ +package pl.com.bottega.factory; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Bean; +import org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters; +import org.springframework.scheduling.annotation.EnableScheduling; +import pl.com.bottega.factory.product.management.RefNoId; +import pl.com.bottega.factory.shortages.prediction.calculation.Forecast; +import pl.com.bottega.factory.shortages.prediction.calculation.Forecasts; +import pl.com.bottega.factory.shortages.prediction.monitoring.NewShortage; +import pl.com.bottega.factory.shortages.prediction.monitoring.ShortageEvents; +import pl.com.bottega.factory.shortages.prediction.monitoring.ShortageSolved; + +import java.time.Clock; + +@SpringBootApplication +@EnableScheduling +@EntityScan( + basePackageClasses = {Configuration.class, Jsr310JpaConverters.class} +) +public class Configuration { + @Bean + public Clock clock() { + return Clock.systemDefaultZone(); + } + + @Bean + public Forecasts forecasts() { + return new ForecastsFake(); + } + + @Bean + public ShortageEventsFake shortageEvents() { + return new ShortageEventsFake(); + } + + private class ShortageEventsFake implements ShortageEvents { + @Override + public void emit(NewShortage event) { + + } + + @Override + public void emit(ShortageSolved event) { + + } + } + + private class ForecastsFake implements Forecasts { + @Override + public Forecast get(RefNoId refNo, int daysAhead) { + return null; + } + } +} diff --git a/shortages-prediction-adapters/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 index ac56368..91c8041 100644 --- a/shortages-prediction-adapters/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 @@ -8,7 +8,6 @@ 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 import javax.transaction.Transactional @@ -27,11 +26,11 @@ class ShortagePredictionProcessORMRepositoryTest extends Specification { @Autowired ShortagesDao dao def forecasts = Mock(Forecasts) - def notifications = Mock(NotificationOfShortage) + def notifications = Mock(ShortageEvents) ShortagePredictionProcessORMRepository repository def setup() { - dao.deleteAll() + dao.deleteAllInBatch() repository = new ShortagePredictionProcessORMRepository( dao, forecasts, notifications )