in ebaystore/src/main/java/org/apache/ofbiz/ebaystore/EbayStoreAutoPreferences.java [1175:1387]
public static Map<String, Object> autoBestOffer(DispatchContext dctx, Map<String, ? extends Object> context) {
Delegator delegator = dctx.getDelegator();
Locale locale = (Locale) context.get("locale");
try {
String productStoreId = (String) context.get("productStoreId");
GenericValue ebayProductStorePref = EntityQuery.use(delegator).from("EbayProductStorePref").where("productStoreId", productStoreId, "autoPrefEnumId", "EBAY_AUTO_BEST_OFFER").queryOne();
String parentPrefCondId = ebayProductStorePref.getString("parentPrefCondId");
List<GenericValue> ebayProductStorePrefCond = EntityQuery.use(delegator).from("EbayProductStorePrefCond").where("parentPrefCondId", parentPrefCondId).queryList();
//Parameters
String priceType = ebayProductStorePrefCond.get(0).getString("acceptanceCondition");
String acceptBestOfferValue = ebayProductStorePrefCond.get(1).getString("acceptanceCondition");
String rejectOffer = ebayProductStorePrefCond.get(2).getString("acceptanceCondition");
String ignoreOfferMessage = ebayProductStorePrefCond.get(3).getString("acceptanceCondition");
String rejectGreaterEnable = ebayProductStorePrefCond.get(4).getString("acceptanceCondition");
String greaterValue = ebayProductStorePrefCond.get(5).getString("acceptanceCondition");
String lessValue = ebayProductStorePrefCond.get(6).getString("acceptanceCondition");
String rejectGreaterMsg = ebayProductStorePrefCond.get(7).getString("acceptanceCondition");
String rejectLessEnable = ebayProductStorePrefCond.get(8).getString("acceptanceCondition");
String lessThanValue = ebayProductStorePrefCond.get(9).getString("acceptanceCondition");
String rejectLessMsg = ebayProductStorePrefCond.get(10).getString("acceptanceCondition");
//case parameter to double type
BigDecimal acceptPercentValue = new BigDecimal(acceptBestOfferValue);
BigDecimal greaterPercentValue = new BigDecimal(greaterValue);
BigDecimal lessThanPercentValue = new BigDecimal(lessValue);
BigDecimal rejectPercentValue = new BigDecimal(lessThanValue);
ApiContext apiContext = EbayStoreHelper.getApiContext(productStoreId, locale, delegator);
//GetMysbaySellingCall for get total page
GetMyeBaySellingCall getTotalPage = new GetMyeBaySellingCall(apiContext);
ItemListCustomizationType itemListType = new ItemListCustomizationType();
itemListType.setInclude(Boolean.TRUE);
itemListType.setSort(ItemSortTypeCodeType.ITEM_ID_DESCENDING);
itemListType.setListingType(ListingTypeCodeType.FIXED_PRICE_ITEM);
DetailLevelCodeType[] detailLevels = new DetailLevelCodeType[] {
DetailLevelCodeType.RETURN_ALL,
DetailLevelCodeType.ITEM_RETURN_ATTRIBUTES,
DetailLevelCodeType.ITEM_RETURN_DESCRIPTION
};
getTotalPage.setDetailLevel(detailLevels);
getTotalPage.setActiveList(itemListType);
getTotalPage.getMyeBaySelling();
int totalPage = getTotalPage.getReturnedActiveList().getPaginationResult().getTotalNumberOfPages();
for (int t = 1; t <= totalPage; t++) {
//GetMyebaySellingCall for get item that is sold on store
GetMyeBaySellingCall ebaySelling = new GetMyeBaySellingCall(apiContext);
//Set type of item
ItemListCustomizationType itemList = new ItemListCustomizationType();
itemList.setInclude(Boolean.TRUE);
itemListType.setSort(ItemSortTypeCodeType.ITEM_ID_DESCENDING);
itemListType.setListingType(ListingTypeCodeType.FIXED_PRICE_ITEM);
PaginationType page = new PaginationType();
page.setPageNumber(t);
itemList.setPagination(page);
itemList.setListingType(ListingTypeCodeType.FIXED_PRICE_ITEM);
DetailLevelCodeType[] detailLevel = new DetailLevelCodeType[] {
DetailLevelCodeType.RETURN_ALL,
DetailLevelCodeType.ITEM_RETURN_ATTRIBUTES,
DetailLevelCodeType.ITEM_RETURN_DESCRIPTION,
DetailLevelCodeType.RETURN_HEADERS,
DetailLevelCodeType.RETURN_MESSAGES
};
ebaySelling.setDetailLevel(detailLevel);
ebaySelling.setActiveList(itemList);
ebaySelling.getMyeBaySelling();
PaginatedItemArrayType itemListCustomizationType = ebaySelling.getReturnedActiveList();
ItemArrayType itemArrayType = itemListCustomizationType.getItemArray();
int itemArrayTypeSize = itemArrayType.getItemLength();
//Loop for get item
for (int itemCount = 0; itemCount < itemArrayTypeSize; itemCount++) {
ItemType item = itemArrayType.getItem(itemCount);
String itemID = item.getItemID();
Double buyItNowPrice = item.getBuyItNowPrice().getValue();
GetItemCall getItem = new GetItemCall(apiContext);
getItem.setDetailLevel(detailLevel);
getItem.getItem(itemID);
String SKUItem = getItem.getSKU();
ItemType itemBestOffer = getItem.getReturnedItem();
BestOfferDetailsType bestOfferDetailsType = itemBestOffer.getBestOfferDetails();
int inventoryQuantityItem = item.getQuantityAvailable(); //Quantity of the item
int bestOfferCount = itemBestOffer.getBestOfferDetails().getBestOfferCount();
Boolean bestOfferIsEnabled = itemBestOffer.getBestOfferDetails().isBestOfferEnabled();
//Check value of Best offer Detail not null
if ((bestOfferDetailsType != null) && (bestOfferCount > 0) && bestOfferIsEnabled.equals(true)) {
//Get base price from kindOfPrice parameter
Double doBasePrice = null;
if ("BUY_IT_NOW_PRICE".equals(priceType)) {
doBasePrice = buyItNowPrice;
} else if ("START_PRICE".equals(priceType)) {
doBasePrice = itemBestOffer.getStartPrice().getValue();
} else if ("RESERVE_PRICE".equals(priceType)) {
doBasePrice = itemBestOffer.getReservePrice().getValue();
} else if ("RETAIL_PRICE".equals(priceType)) {
//ignore
} else if ("SELLER_COST".equals(priceType)) {
List<GenericValue> supplierProduct = EntityQuery.use(delegator).from("SupplierProduct").where("productId", SKUItem).orderBy("availableFromDate DESC").queryList();
String lastPrice = supplierProduct.get(0).getString("lastPrice");
doBasePrice = Double.parseDouble(lastPrice);
} else if ("SECOND_CHANCE_PRICE".equals(priceType)) {
VerifyAddSecondChanceItemCall verifyAddSecondChanceItemCall = new VerifyAddSecondChanceItemCall(apiContext);
doBasePrice = verifyAddSecondChanceItemCall.getBuyItNowPrice().getValue();
} else if ("STORE_PRICE".equals(priceType)) {
//ignore
}
BigDecimal basePrice = new BigDecimal(doBasePrice);
BigDecimal percent = new BigDecimal(100);
//Calculate price with base price and percent from parameter
BigDecimal acceptPrice = (basePrice.multiply(acceptPercentValue)).divide(percent);
BigDecimal greaterPrice = (basePrice.multiply(greaterPercentValue)).divide(percent);
BigDecimal lessThanPrice = (basePrice.multiply(lessThanPercentValue)).divide(percent);
BigDecimal rejectPrice = (basePrice.multiply(rejectPercentValue)).divide(percent);
//GetBestOfferCall for get best offer detail
GetBestOffersCall getBestOfferCall = new GetBestOffersCall(apiContext);
getBestOfferCall.setItemID(itemID);
getBestOfferCall.setDetailLevel(detailLevel);
getBestOfferCall.setBestOfferStatus(BestOfferStatusCodeType.ALL);
getBestOfferCall.getBestOffers();
BestOfferType[] bestOffers = getBestOfferCall.getReturnedBestOffers();
List<String> acceptBestOfferIndexId = new LinkedList<>();
SortedMap<String, Object> acceptBestOfferIDs = new TreeMap<>();
//Loop for get data best offer from buyer
RespondToBestOfferCall respondToBestOfferCall = new RespondToBestOfferCall(apiContext);
respondToBestOfferCall.setItemID(itemID);
for (BestOfferType bestOfferType : bestOffers) {
BestOfferStatusCodeType bestOfferStatusCodeType = bestOfferType.getStatus();
//Check status of best offer
if (bestOfferStatusCodeType == BestOfferStatusCodeType.PENDING) {
String bestOfferID = bestOfferType.getBestOfferID();
UserType buyer = bestOfferType.getBuyer();
String buyerUserID = buyer.getUserID();
AmountType price = bestOfferType.getPrice();
String offerPrice = Double.toString(price.getValue());
Double doCerrentPrice = Double.parseDouble(offerPrice);
int offerQuantity = bestOfferType.getQuantity();
String[] bestOfferIDs = {bestOfferID};
respondToBestOfferCall.setBestOfferIDs(bestOfferIDs);
if ("Y".equals(rejectOffer)) {
if (offerQuantity > inventoryQuantityItem) {
respondToBestOfferCall.setSellerResponse("Your order is more than inventory item's Buy-It-Now price.");
respondToBestOfferCall.setBestOfferAction(BestOfferActionCodeType.DECLINE);
respondToBestOfferCall.respondToBestOffer();
continue;
}
}
String buyerMessage = bestOfferType.getBuyerMessage();
if ("Y".equals(ignoreOfferMessage) && UtilValidate.isNotEmpty(buyerMessage)) {
GenericValue userOfferCheck = EntityQuery.use(delegator).from("EbayUserBestOffer").where("itemId", itemID, "userId", buyerUserID).queryOne();
if (UtilValidate.isEmpty(userOfferCheck)) {
GenericValue ebayUserBestOffer = delegator.makeValue("EbayUserBestOffer");
ebayUserBestOffer.put("productStoreId", productStoreId);
ebayUserBestOffer.put("itemId", itemID);
ebayUserBestOffer.put("userId", buyerUserID);
ebayUserBestOffer.put("bestOfferId", bestOfferID);
ebayUserBestOffer.put("contactStatus", "NOT_CONTACT");
ebayUserBestOffer.create();
}
continue;
}
BigDecimal cerrentPrice = new BigDecimal(doCerrentPrice);
if (cerrentPrice.compareTo(acceptPrice) >= 0) {
acceptBestOfferIndexId.add(bestOfferID);
String Quantity = String.valueOf(offerQuantity);
acceptBestOfferIDs.put(bestOfferID, Quantity);
} else if ((cerrentPrice.compareTo(greaterPrice) >= 0) && (cerrentPrice.compareTo(lessThanPrice) <= 0) && "Y".equals(rejectGreaterEnable)) {
respondToBestOfferCall.setBestOfferAction(BestOfferActionCodeType.DECLINE);
respondToBestOfferCall.setSellerResponse(rejectGreaterMsg);
respondToBestOfferCall.respondToBestOffer();
} else if ((cerrentPrice.compareTo(rejectPrice) <= 0 && "Y".equals(rejectLessEnable))) {
respondToBestOfferCall.setBestOfferAction(BestOfferActionCodeType.DECLINE);
respondToBestOfferCall.setSellerResponse(rejectLessMsg);
respondToBestOfferCall.respondToBestOffer();
} else {
respondToBestOfferCall.setBestOfferAction(BestOfferActionCodeType.DECLINE);
respondToBestOfferCall.respondToBestOffer();
}
}
}
if (!acceptBestOfferIndexId.isEmpty()) {
int quantityAvailable = inventoryQuantityItem;
acceptBestOfferIndexId.sort(null);
RespondToBestOfferCall respondAcceptBestOfferCall = new RespondToBestOfferCall(apiContext);
respondAcceptBestOfferCall.setItemID(itemID);
for (String bestOfferIdIndex : acceptBestOfferIndexId) {
if (quantityAvailable <= 0) break;
Integer offerQuantity = Integer.parseInt(acceptBestOfferIDs.get(bestOfferIdIndex).toString());
String[] bestOfferID = { bestOfferIdIndex };
respondAcceptBestOfferCall.setBestOfferIDs(bestOfferID);
//respondAcceptBestOfferCall.setBestOfferIDs(bestOfferID);
if (offerQuantity <= quantityAvailable) {
respondAcceptBestOfferCall.setBestOfferAction(BestOfferActionCodeType.ACCEPT);
quantityAvailable = quantityAvailable - offerQuantity;
} else {
respondAcceptBestOfferCall.setBestOfferAction(BestOfferActionCodeType.DECLINE);
}
respondAcceptBestOfferCall.respondToBestOffer();
}
}
}
}
}
} catch (ApiException e) {
return ServiceUtil.returnError(e.getMessage());
} catch (Exception e) {
return ServiceUtil.returnError(e.getMessage());
}
return ServiceUtil.returnSuccess();
}