Hi all
I have been writing a bunch of REST services and found the same
problem.
I used a kind of brute force method below I check to see it the order
has any item in a bad state then i repair the order, you can just put
this in the refresh order pipeline.
cheers
Jon
public void updateOrder(Order pOrder) throws CommerceException {
OrderImpl theOrder = (OrderImpl) pOrder;
theOrder.updateVersion();
orderManager.updateOrder(theOrder);
}
public Order repairOrder(Order order) {
try {
if (order == null) {
return order;
}
// save order makes sure that the order getCommerceItemCount actual
works
order = saveOrder(order);
int orderItemCount = order.getCommerceItemCount();
List<CommerceItemBean> commerceItemBeans =
getAllGoodCommerceItems(order);
int goodItemCount = commerceItemBeans.size();
if (orderItemCount == goodItemCount) {
// its in a good state all items exist
return order;
}
Order newOrder = (OrderImpl)
orderManager.createOrder(order.getProfileId());
orderManager.addOrder(newOrder);
newOrder.setProfileId(order.getProfileId());
addAllCommerceItemBeans(newOrder, commerceItemBeans);
orderManager.removeOrder(order.getId());
order = saveOrder(newOrder);
} catch (CommerceException e) {
if (isLoggingError()) {
logError(e);
}
}
return order;
}
public Order saveOrder(Order order) {
try {
if (order == null) {
return order;
}
updateOrder(order);
order = (OrderImpl) orderManager.loadOrder(order.getId());
repriceOrderItems(order);
return order;
} catch (Exception e) {
if (isLoggingError()) {
logError(e);
}
}
return order;
}
public void repriceOrderItems(Order order) {
repriceOrder(order, PricingConstants.OP_REPRICE_ITEMS);
}
public void repriceOrder(Order order, String repriceMethod) {
DynamoHttpServletRequest request = ServletUtil.getCurrentRequest();
DynamoHttpServletResponse response =
ServletUtil.getCurrentResponse();
try {
PricingModelHolder pricingModelHolder = (PricingModelHolder)
request.resolveName(commerceProfileTools.getUserPricingModelsPath());
Locale locale = commerceProfileTools.getUserLocale(request,
response);
Profile profile = getProfile();
commerceProfileTools.repriceOrder(order, profile,
pricingModelHolder, locale, repriceMethod);
} catch (Exception e) {
if (isLoggingError()) {
logError(e);
}
}
}
private List<CommerceItemBean> getAllGoodCommerceItems(Order order) {
List<CommerceItemBean> result = new ArrayList<CommerceItemBean>();
try {
List<CommerceItem> commerceItems = order.getCommerceItems();
for (CommerceItem commerceItem : commerceItems) {
if (isItemInGoodState(commerceItem)) {
CommerceItemBean commerceItemBean =
createCommerceItemBean(commerceItem);
if (commerceItemBean != null) {
result.add(commerceItemBean);
}
}
}
} catch (Exception e) {
if (isLoggingError()) {
logError(e);
}
}
return result;
}
private CommerceItemBean createCommerceItemBean(CommerceItem
commerceItem) {
CommerceItemBean commerceItemBean = null;
try {
commerceItemBean = new CommerceItemBean();
commerceItemBean.setCatalogRefId(commerceItem.getCatalogRefId());
commerceItemBean.setProductId(commerceItem.getAuxiliaryData().getProductId());
commerceItemBean.setQuantity(commerceItem.getQuantity());
} catch (Exception e) {
if (isLoggingError()) {
logError(e);
}
}
return commerceItemBean;
}
private boolean isItemInGoodState(CommerceItem commerceItem) {
if (commerceItem == null){
return false;
}
if (commerceItem.getAuxiliaryData() == null){
return false;
}
if (commerceItem.getAuxiliaryData().getProductId() == null){
return false;
}
return true;