This repository has been archived on 2020-08-02. You can view files and clone it, but cannot push or open issues or pull requests.
e-commerce/web_backend/src/main/java/org/hso/ecommerce/action/cronjob/ReorderAction.java

112 lines
4.1 KiB
Java

package org.hso.ecommerce.action.cronjob;
import org.hso.ecommerce.action.cronjob.ReadSupplierDataAction.ArticleIdentifier;
import org.hso.ecommerce.action.cronjob.ReadSupplierDataAction.Offer;
import org.hso.ecommerce.api.SupplierService;
import org.hso.ecommerce.api.data.Order;
import org.hso.ecommerce.api.data.OrderConfirmation;
import org.hso.ecommerce.entities.shop.Article;
import org.hso.ecommerce.entities.supplier.ArticleOffer;
import org.hso.ecommerce.entities.supplier.SupplierOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Timestamp;
import java.util.HashMap;
public class ReorderAction {
private static final Logger log = LoggerFactory.getLogger(ReorderAction.class);
private Article article;
private Integer[] orderedAmounts;
private Integer undeliveredReorders;
private int amountInStock;
private HashMap<ArticleIdentifier, Offer> cheapestOffer;
private HashMap<ArticleIdentifier, ArticleOffer> articleOffers;
public ReorderAction(
Article article, Integer[] orderedAmounts,
Integer undeliveredReorders,
int amountInStock,
HashMap<ArticleIdentifier, Offer> cheapestOffer,
HashMap<ArticleIdentifier, ArticleOffer> articleOffers
) {
this.article = article;
this.orderedAmounts = orderedAmounts;
this.undeliveredReorders = undeliveredReorders;
this.amountInStock = amountInStock;
this.cheapestOffer = cheapestOffer;
this.articleOffers = articleOffers;
}
private int null_to_zero(Integer input) {
return input == null ? 0 : input;
}
private int calculateAmountToReorder() {
// Algorithm as described in the documentation
int a = null_to_zero(orderedAmounts[0]);
int b = null_to_zero(orderedAmounts[1]);
int c = null_to_zero(orderedAmounts[2]);
int x = Math.max(Math.max(a, b), c);
int y = Math.min(Math.min(a, b), c);
int n = 6 * x - 2 * y;
if (n < 3) {
n = 3;
}
int i = null_to_zero(undeliveredReorders);
int l = amountInStock;
return n - i - l;
}
public SupplierOrder finish() {
if (!article.shouldReorder) {
return null;
}
int amount = calculateAmountToReorder();
if (amount <= 0) {
return null;
}
ArticleIdentifier identifier = new ArticleIdentifier(article.related.manufacturer, article.related.articleNumber);
Offer offer = cheapestOffer.get(identifier);
if (offer == null) {
log.info("Could not order \"" + article.title + "\" because there is no supplier delivering it.");
return null;
}
ArticleOffer articleOffer = articleOffers.get(identifier);
org.hso.ecommerce.api.data.Article apiArticle = offer.apiSupplier.findArticle(identifier.manufacturer,
identifier.articleNumber);
if (apiArticle.pricePerUnitNet > article.reorderMaxPrice) {
log.info("Could not order \"" + article.title + "\" because it is currently too expensive.");
return null;
}
Order order = new Order();
order.manufacturer = articleOffer.manufacturer;
order.articleNumber = articleOffer.articleNumber;
order.quantity = amount;
order.maxTotalPriceCentNet = apiArticle.pricePerUnitNet * amount;
OrderConfirmation confirm = new SupplierService(offer.dbSupplier.apiUrl).order(order);
SupplierOrder createdOrder = new SupplierOrder();
createdOrder.created = new Timestamp(System.currentTimeMillis());
createdOrder.supplier = offer.dbSupplier;
createdOrder.ordered = articleOffer;
createdOrder.numberOfUnits = confirm.quantity;
createdOrder.pricePerUnitNetCent = confirm.pricePerUnitNetCent;
createdOrder.totalPriceNet = confirm.totalPriceNetCharged;
createdOrder.carrier = confirm.carrier;
createdOrder.trackingId = confirm.trackingId;
createdOrder.estimatedArrival = Timestamp.valueOf(confirm.estimatedArrival);
return createdOrder;
}
}