You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jl...@apache.org on 2008/12/02 20:33:26 UTC
svn commit: r722588 - in /ofbiz/trunk/applications:
ecommerce/data/DemoProduct.xml order/servicedef/secas.xml
order/servicedef/services.xml
order/src/org/ofbiz/order/order/OrderServices.java
Author: jleroux
Date: Tue Dec 2 11:33:25 2008
New Revision: 722588
URL: http://svn.apache.org/viewvc?rev=722588&view=rev
Log:
A patch from Krzysztof Podejma "Cannot complete order that contains products of type "SERVICE"" (https://issues.apache.org/jira/browse/OFBIZ-943) - OFBIZ-943
+ some demo data
Modified:
ofbiz/trunk/applications/ecommerce/data/DemoProduct.xml
ofbiz/trunk/applications/order/servicedef/secas.xml
ofbiz/trunk/applications/order/servicedef/services.xml
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java
Modified: ofbiz/trunk/applications/ecommerce/data/DemoProduct.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/ecommerce/data/DemoProduct.xml?rev=722588&r1=722587&r2=722588&view=diff
==============================================================================
--- ofbiz/trunk/applications/ecommerce/data/DemoProduct.xml (original)
+++ ofbiz/trunk/applications/ecommerce/data/DemoProduct.xml Tue Dec 2 11:33:25 2008
@@ -279,6 +279,14 @@
<ProductAssoc productId="GZ-BASKET-PICK" productIdTo="GZ-1000" productAssocTypeId="PRODUCT_COMPONENT" quantity="1" fromDate="2007-01-01 12:00:00.0"/>
<ProductAssoc productId="GZ-BASKET-PICK" productIdTo="GZ-1001" productAssocTypeId="PRODUCT_COMPONENT" quantity="2" fromDate="2007-01-01 12:00:00.0"/>
<ProductAssoc productId="GZ-BASKET-PICK" productIdTo="GZ-1004" productAssocTypeId="PRODUCT_COMPONENT" quantity="3" fromDate="2007-01-01 12:00:00.0"/>
+
+ <!-- test for service product type-->
+ <ProductCategory productCategoryId="SERV-001" productCategoryTypeId="CATALOG_CATEGORY"/>
+ <ProductCategoryRollup fromDate="2008-12-02 12:00:00.0" parentProductCategoryId="CATALOG1" productCategoryId="SERV-001"/>
+ <Product productId="SV-1000" productTypeId="SERVICE" primaryProductCategoryId="SERV-001" productName="Service product" internalName="Service type product" description="Service type product for demonstration use" taxable="Y" chargeShipping="N" autoCreateKeywords="Y" isVirtual="N" isVariant="N" createdDate="2008-12-02 12:00:00.0" createdByUserLogin="admin" lastModifiedDate="2008-12-02 12:00:00.0" lastModifiedByUserLogin="admin"/>
+ <ProductPrice productId="SV-1000" productPricePurposeId="PURCHASE" productPriceTypeId="DEFAULT_PRICE" currencyUomId="USD" productStoreGroupId="_NA_" fromDate="2008-12-02 12:00:00.0" price="1000" createdDate="2008-12-02 12:00:00.0" createdByUserLogin="admin"/>
+ <ProductCategoryMember productCategoryId="SERV-001" productId="SV-1000" fromDate="2008-12-02 12:00:00.0"/>
+ <ProductCategoryMember productCategoryId="CATALOG1_SEARCH" productId="SV-1000" fromDate="2008-12-02 12:00:00.0"/>
<ProductFeatureCategory productFeatureCategoryId="8000" description="License Features"/>
<ProductFeatureCategoryAppl productFeatureCategoryId="8000" productCategoryId="CATALOG1_SEARCH" fromDate="2001-05-13 12:00:00.0"/>
Modified: ofbiz/trunk/applications/order/servicedef/secas.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/servicedef/secas.xml?rev=722588&r1=722587&r2=722588&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/servicedef/secas.xml (original)
+++ ofbiz/trunk/applications/order/servicedef/secas.xml Tue Dec 2 11:33:25 2008
@@ -52,7 +52,10 @@
<condition field-name="statusId" operator="equals" value="ITEM_APPROVED"/>
<action service="checkDigitalItemFulfillment" mode="sync"/>
</eca>
-
+ <eca service="changeOrderItemStatus" event="commit">
+ <condition field-name="statusId" operator="equals" value="ITEM_APPROVED"/>
+ <action service="invoiceServiceItems" mode="sync"/>
+ </eca>
<!-- order status changes -->
<eca service="changeOrderStatus" event="commit" run-on-error="false">
<condition field-name="statusId" operator="equals" value="ORDER_CANCELLED"/>
@@ -297,4 +300,4 @@
<condition field-name="workEffortId" operator="is-empty" />
<action service="createWorkEffort" mode="sync"/>
</eca>
-</service-eca>
\ No newline at end of file
+</service-eca>
Modified: ofbiz/trunk/applications/order/servicedef/services.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/servicedef/services.xml?rev=722588&r1=722587&r2=722588&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/servicedef/services.xml (original)
+++ ofbiz/trunk/applications/order/servicedef/services.xml Tue Dec 2 11:33:25 2008
@@ -440,7 +440,11 @@
<auto-attributes entity-name="ProductContent" include="pk" mode="IN" optional="false"/>
<attribute name="orderItem" type="GenericValue" mode="IN" optional="false"/>
</service>
-
+ <service name="invoiceServiceItems" engine="java"
+ location="org.ofbiz.order.order.OrderServices" invoke="invoiceServiceItems" auth="true">
+ <description>Check an order for service items and invoice the items</description>
+ <attribute name="orderId" type="String" mode="IN"/>
+ </service>
<!-- Order View Services -->
<service name="getOrderedSummaryInformation" engine="simple"
location="org/ofbiz/order/order/OrderServices.xml" invoke="getOrderedSummaryInformation">
Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java?rev=722588&r1=722587&r2=722588&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java (original)
+++ ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java Tue Dec 2 11:33:25 2008
@@ -3125,6 +3125,134 @@
}
return ServiceUtil.returnSuccess();
}
+ /** Service to invoice service items from order*/
+ public static Map invoiceServiceItems(DispatchContext dctx, Map context){
+ GenericDelegator delegator = dctx.getDelegator();
+ LocalDispatcher dispatcher = dctx.getDispatcher();
+ GenericValue userLogin = (GenericValue) context.get("userLogin");
+ String orderId = (String) context.get("orderId");
+ Locale locale = (Locale) context.get("locale");
+
+ // need the order header
+ GenericValue orderHeader = null;
+ try {
+ orderHeader = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", orderId));
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "ERROR: Unable to get OrderHeader for orderId : " + orderId, module);
+ return ServiceUtil.returnError(UtilProperties.getMessage(resource_error,"OrderErrorUnableToGetOrderHeaderForOrderId", UtilMisc.toMap("orderId",orderId), locale));
+ }
+
+ // get all the items for the order
+ List orderItems = null;
+ if (orderHeader != null) {
+ try {
+ orderItems = orderHeader.getRelated("OrderItem");
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "ERROR: Unable to get OrderItem list for orderId : " + orderId, module);
+ return ServiceUtil.returnError(UtilProperties.getMessage(resource_error,"OrderErrorUnableToGetOrderItemListForOrderId", UtilMisc.toMap("orderId",orderId), locale));
+ }
+ }
+
+ // find any service items
+ List serviceItems = new ArrayList();
+ Map serviceProducts = new HashMap();
+ if (orderItems != null && orderItems.size() > 0) {
+ Iterator i = orderItems.iterator();
+ while (i.hasNext()) {
+ GenericValue item = (GenericValue) i.next();
+ GenericValue product = null;
+ try {
+ product = item.getRelatedOne("Product");
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "ERROR: Unable to get Product from OrderItem", module);
+ }
+ if (product != null) {
+ GenericValue productType = null;
+ try {
+ productType = product.getRelatedOne("ProductType");
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "ERROR: Unable to get ProductType from Product", module);
+ }
+
+ if (productType != null) {
+ String productTypeId = productType.getString("productTypeId");
+
+ // check for service goods
+ if (productTypeId != null && "SERVICE".equalsIgnoreCase(productTypeId)) {
+ // we only invoice APPROVED items
+ if ("ITEM_APPROVED".equals(item.getString("statusId"))) {
+ serviceItems.add(item);
+ serviceProducts.put(item,product);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // now process the service items
+ if (serviceItems.size() > 0) {
+
+
+ // single list with all invoice items
+ List itemsToInvoice = FastList.newInstance();
+ itemsToInvoice.addAll(serviceItems);
+
+ // do something tricky here: run as a different user that can actually create an invoice, post transaction, etc
+ Map invoiceResult = null;
+ try {
+ GenericValue permUserLogin = delegator.findByPrimaryKey("UserLogin", UtilMisc.toMap("userLoginId", "system"));
+ Map invoiceContext = UtilMisc.toMap("orderId", orderId, "billItems", itemsToInvoice, "userLogin", permUserLogin);
+ invoiceResult = dispatcher.runSync("createInvoiceForOrder", invoiceContext);
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "ERROR: Unable to invoice service items", module);
+ return ServiceUtil.returnError(UtilProperties.getMessage(resource_error,"OrderProblemWithInvoiceCreationServiceItems", locale));
+ } catch (GenericServiceException e) {
+ Debug.logError(e, "ERROR: Unable to invoice service items", module);
+ return ServiceUtil.returnError(UtilProperties.getMessage(resource_error,"OrderProblemWithInvoiceCreationServiceItems", locale));
+ }
+ if (ModelService.RESPOND_ERROR.equals(invoiceResult.get(ModelService.RESPONSE_MESSAGE))) {
+ return ServiceUtil.returnError((String) invoiceResult.get(ModelService.ERROR_MESSAGE));
+ }
+
+ // update the status of service goods to COMPLETED;
+ Iterator dii = itemsToInvoice.iterator();
+ while (dii.hasNext()) {
+ GenericValue productType = null;
+ GenericValue item = (GenericValue) dii.next();
+ GenericValue product = (GenericValue) serviceProducts.get(item);
+ boolean markComplete = false;
+ if(product != null){
+ try {
+ productType = product.getRelatedOne("ProductType");
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "ERROR: Unable to get ProductType from Product", module);
+ }
+ if (item != null && productType != null) {
+ String productTypeId = productType.getString("productTypeId");
+ if (productTypeId != null && "SERVICE".equalsIgnoreCase(productTypeId)) {
+ markComplete = true;
+ }
+ }
+ }
+
+ if (markComplete) {
+ Map statusCtx = new HashMap();
+ statusCtx.put("orderId", item.getString("orderId"));
+ statusCtx.put("orderItemSeqId", item.getString("orderItemSeqId"));
+ statusCtx.put("statusId", "ITEM_COMPLETED");
+ statusCtx.put("userLogin", userLogin);
+ try {
+ dispatcher.runSyncIgnore("changeOrderItemStatus", statusCtx);
+ } catch (GenericServiceException e) {
+ Debug.logError(e, "ERROR: Problem setting the status to COMPLETED : " + item, module);
+ }
+ }
+ }
+ }
+
+ return ServiceUtil.returnSuccess();
+ }
public static Map addItemToApprovedOrder(DispatchContext dctx, Map context) {
LocalDispatcher dispatcher = dctx.getDispatcher();