Author: hansbak
Date: Thu Sep 8 07:07:07 2011
New Revision: 1166543
URL: http://svn.apache.org/viewvc?rev=1166543&view=rev
Log:
New product type SERVICE_PRODUCT which was discussed in the mailing list. blog
linked to the what is new file will be added later
Modified:
ofbiz/trunk/applications/order/data/OrderTypeData.xml
ofbiz/trunk/applications/order/script/org/ofbiz/order/test/ShoppingCartTests.xml
ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java
ofbiz/trunk/applications/order/testdef/ShoppingCartTests.xml
ofbiz/trunk/applications/product/data/ProductTypeData.xml
ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml
Modified: ofbiz/trunk/applications/order/data/OrderTypeData.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/data/OrderTypeData.xml?rev=1166543&r1=1166542&r2=1166543&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/data/OrderTypeData.xml (original)
+++ ofbiz/trunk/applications/order/data/OrderTypeData.xml Thu Sep 8 07:07:07
2011
@@ -322,6 +322,7 @@ under the License.
<ReturnItemTypeMap returnHeaderTypeId="CUSTOMER_RETURN"
returnItemMapKey="SURCHARGE_ADJUSTMENT" returnItemTypeId="RET_SURCHARGE_ADJ"/>
<ReturnItemTypeMap returnHeaderTypeId="CUSTOMER_RETURN"
returnItemMapKey="ADDITIONAL_FEATURE" returnItemTypeId="RET_ADD_FEATURE_ADJ"/>
<ReturnItemTypeMap returnHeaderTypeId="CUSTOMER_RETURN"
returnItemMapKey="WARRANTY_ADJUSTMENT" returnItemTypeId="RET_WARRANTY_ADJ"/>
+<ReturnItemTypeMap returnHeaderTypeId="CUSTOMER_RETURN" returnItemMapKey="SERVICE_PRODUCT"
returnItemTypeId="RET_SPROD_ITEM"/>
<ReturnItemTypeMap returnHeaderTypeId="VENDOR_RETURN" returnItemMapKey="FINISHED_GOOD"
returnItemTypeId="RET_FPROD_ITEM"/>
<ReturnItemTypeMap returnHeaderTypeId="VENDOR_RETURN"
returnItemMapKey="MARKETING_PKG_AUTO" returnItemTypeId="RET_FPROD_ITEM"/>
<ReturnItemTypeMap returnHeaderTypeId="VENDOR_RETURN"
returnItemMapKey="MARKETING_PKG_PICK" returnItemTypeId="RET_FPROD_ITEM"/>
Modified:
ofbiz/trunk/applications/order/script/org/ofbiz/order/test/ShoppingCartTests.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/script/org/ofbiz/order/test/ShoppingCartTests.xml?rev=1166543&r1=1166542&r2=1166543&view=diff
==============================================================================
---
ofbiz/trunk/applications/order/script/org/ofbiz/order/test/ShoppingCartTests.xml
(original)
+++
ofbiz/trunk/applications/order/script/org/ofbiz/order/test/ShoppingCartTests.xml
Thu Sep 8 07:07:07 2011
@@ -260,4 +260,119 @@ under the License.
<assert><not><if-empty field="orderMap.orderId"/></not></assert>
<check-errors/>
</simple-method>
+
+<simple-method method-name="testCreateOrderServiceProduct" short-description="Test create an
order using a service product" login-required="false">
+<entity-one entity-name="UserLogin" value-field="userLogin">
+<field-map field-name="userLoginId" value="DemoCustomer"/>
+</entity-one>
+
+<!-- Shopping Cart new Instance -->
+<set field="delegator" from-field="parameters.delegator" type="Object"/>
+<set field="dispatcher" from-field="parameters.dispatcher" type="Object"/>
+<set field="locale" from-field="parameters.locale" type="Object" />
+<set field="productStoreId" value="9000" type="String"/>
+<set field="currencyUom" value="USD" type="String"/>
+<set field="salesChannel" value="WEB_SALES_CHANNEL" type="String"/>
+
+<set field="partyId" value="DemoCustomer" type="String"/>
+
+<create-object class-name="org.ofbiz.order.shoppingcart.ShoppingCart"
field="shoppingCart">
+<field field="delegator" type="org.ofbiz.entity.Delegator"/>
+<field field="productStoreId" type="String"/>
+<field field="locale" type="java.util.Locale"/>
+<field field="currencyUom" type="String"/>
+</create-object>
+
+<set field="orderType" value="SALES_ORDER" type="String"/>
+<call-object-method method-name="setOrderType" obj-field="shoppingCart">
+<field field="orderType" type="String"/>
+</call-object-method>
+
+<call-object-method method-name="setChannelType" obj-field="shoppingCart">
+<field field="salesChannel" type="String"/>
+</call-object-method>
+
+<call-object-method method-name="setProductStoreId" obj-field="shoppingCart">
+<field field="productStoreId" type="String"/>
+</call-object-method>
+
+<call-object-method method-name="setBillToCustomerPartyId"
obj-field="shoppingCart">
+<field field="partyId" type="String"/>
+</call-object-method>
+
+<call-object-method method-name="setPlacingCustomerPartyId"
obj-field="shoppingCart">
+<field field="partyId" type="String"/>
+</call-object-method>
+
+<call-object-method method-name="setShipToCustomerPartyId"
obj-field="shoppingCart">
+<field field="partyId" type="String"/>
+</call-object-method>
+
+<call-object-method method-name="setEndUserCustomerPartyId"
obj-field="shoppingCart">
+<field field="partyId" type="String"/>
+</call-object-method>
+
+<call-object-method method-name="setUserLogin" obj-field="shoppingCart">
+<field field="userLogin" type="org.ofbiz.entity.GenericValue"/>
+<field field="dispatcher" type="org.ofbiz.service.LocalDispatcher"/>
+</call-object-method>
+
+<set field="productId" value="SV-1001" type="String"/>
+<set field="prodCatalogId" value="DemoCatalog" type="String"/>
+<set field="quantity" value="1" type="BigDecimal"/>
+
+<call-object-method method-name="addOrIncreaseItem" obj-field="shoppingCart">
+<field field="productId" type="String"/>
+<field field="selectedAmount" type="BigDecimal"/>
+<field field="quantity" type="BigDecimal"/>
+<field field="reservStart" type="Timestamp"/>
+<field field="reservLength" type="BigDecimal"/>
+<field field="reservPersons" type="BigDecimal"/>
+<field field="shipBeforeDate" type="Timestamp"/>
+<field field="shipAfterDate" type="Timestamp"/>
+<field field="features" type="Map"/>
+<field field="attributes" type="Map"/>
+<field field="prodCatalogId" type="String"/>
+<field field="configWrapper"
type="org.ofbiz.product.config.ProductConfigWrapper"/>
+<field field="itemType" type="String"/>
+<field field="itemGroupNumber" type="String"/>
+<field field="parentProductId" type="String"/>
+<field field="dispatcher" type="org.ofbiz.service.LocalDispatcher"/>
+</call-object-method>
+
+<call-object-method method-name="setDefaultCheckoutOptions"
obj-field="shoppingCart">
+<field field="dispatcher" type="org.ofbiz.service.LocalDispatcher"/>
+</call-object-method>
+
+<create-object class-name="org.ofbiz.order.shoppingcart.CheckOutHelper"
field="checkOutHelper">
+<field field="dispatcher" type="org.ofbiz.service.LocalDispatcher"/>
+<field field="delegator" type="org.ofbiz.entity.Delegator"/>
+<field field="shoppingCart" type="org.ofbiz.order.shoppingcart.ShoppingCart"/>
+</create-object>
+
+<call-object-method method-name="createOrder" obj-field="checkOutHelper"
ret-field="orderCreateResult">
+<field field="userLogin" type="org.ofbiz.entity.GenericValue"/>
+</call-object-method>
+<set field="orderId" from-field="orderCreateResult.orderId" type="String"/>
+<if-not-empty field="orderId">
+<call-class-method method-name="approveOrder"
class-name="org.ofbiz.order.order.OrderChangeHelper" ret-field="approved">
+<field field="dispatcher" type="org.ofbiz.service.LocalDispatcher"/>
+<field field="userLogin" type="org.ofbiz.entity.GenericValue"/>
+<field field="orderId" type="String"/>
+</call-class-method>
+<log level="info" message="======== Test order with id: [${orderId}] has been
approved: [${approved}]========"/>
+
+<entity-one entity-name="UserLogin" value-field="systemUserLogin">
+<field-map field-name="userLoginId" value="system"/>
+</entity-one>
+
+<set field="quickShipEntireOrderMap.orderId" from-field="orderId"/>
+<set field="quickShipEntireOrderMap.userLogin" from-field="systemUserLogin"/>
+<call-service service-name="quickShipEntireOrder"
in-map-name="quickShipEntireOrderMap"/>
+<log level="info" message="========Test order with id: [${orderId}] has been
shipped"/>
+</if-not-empty>
+
+<assert><not><if-empty field="orderId"/></not></assert>
+<check-errors/>
+</simple-method>
</simple-methods>
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=1166543&r1=1166542&r2=1166543&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
Thu Sep 8 07:07:07 2011
@@ -1130,8 +1130,63 @@ public class OrderServices {
// store line items, etc so that they will be there for the
foreign key checks
delegator.storeAll(toBeStored);
- // START inventory reservation
List<String> resErrorMessages = new LinkedList<String>();
+
+ // add a product service to inventory
+ if (UtilValidate.isNotEmpty(orderItems)) {
+ for (GenericValue orderItem: orderItems) {
+ String productId = (String) orderItem.get("productId");
+ GenericValue product = delegator.getRelatedOne("Product",
orderItem);
+
+ if("SERVICE_PRODUCT".equals(product.get("productTypeId"))){
+ String inventoryFacilityId = null;
+ if
("Y".equals(productStore.getString("oneInventoryFacility"))) {
+ inventoryFacilityId =
productStore.getString("inventoryFacilityId");
+
+ if (UtilValidate.isEmpty(inventoryFacilityId)) {
+ Debug.logWarning("ProductStore with id " +
productStoreId + " has Y for oneInventoryFacility but inventoryFacilityId is empty, returning
false for inventory check", module);
+ }
+ } else {
+ List<GenericValue> productFacilities = null;
+ GenericValue productFacility = null;
+
+ try {
+ productFacilities =
delegator.getRelatedCache("ProductFacility", product);
+ } catch (GenericEntityException e) {
+ Debug.logWarning(e, "Error invoking getRelatedCache
in isCatalogInventoryAvailable", module);
+ }
+
+ if (UtilValidate.isNotEmpty(productFacilities)) {
+ productFacility =
EntityUtil.getFirst(productFacilities);
+ inventoryFacilityId = (String)
productFacility.get("facilityId");
+ }
+ }
+
+ Map<String, Object> ripCtx = FastMap.newInstance();
+ if (UtilValidate.isNotEmpty(inventoryFacilityId)&&
UtilValidate.isNotEmpty(productId)&&
orderItem.getBigDecimal("quantity").compareTo(BigDecimal.ZERO)> 0) {
+ // do something tricky here: run as the "system"
user
+ GenericValue permUserLogin =
delegator.findByPrimaryKeyCache("UserLogin", UtilMisc.toMap("userLoginId",
"system"));
+ ripCtx.put("productId", productId);
+ ripCtx.put("facilityId", inventoryFacilityId);
+ ripCtx.put("inventoryItemTypeId",
"NON_SERIAL_INV_ITEM");
+ ripCtx.put("quantityAccepted",
orderItem.getBigDecimal("quantity"));
+ ripCtx.put("quantityRejected", 0.0);
+ ripCtx.put("userLogin", permUserLogin);
+ try {
+ Map<String, Object> ripResult =
dispatcher.runSync("receiveInventoryProduct", ripCtx);
+ if (ServiceUtil.isError(ripResult)) {
+ String errMsg =
ServiceUtil.getErrorMessage(ripResult);
+ resErrorMessages.addAll((Collection<? extends String>) UtilMisc.<String,
String>toMap("reasonCode", "ReceiveInventoryServiceError", "description", errMsg));
+ }
+ } catch (GenericServiceException e) {
+ Debug.logWarning(e, "Error invoking
receiveInventoryProduct service in createOrder", module);
+ }
+ }
+ }
+ }
+ }
+
+ // START inventory reservation
try {
reserveInventory(delegator, dispatcher, userLogin, locale,
orderItemShipGroupInfo, dropShipGroupIds, itemValuesBySeqId,
orderTypeId, productStoreId, resErrorMessages);
Modified: ofbiz/trunk/applications/order/testdef/ShoppingCartTests.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/testdef/ShoppingCartTests.xml?rev=1166543&r1=1166542&r2=1166543&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/testdef/ShoppingCartTests.xml (original)
+++ ofbiz/trunk/applications/order/testdef/ShoppingCartTests.xml Thu Sep 8
07:07:07 2011
@@ -25,4 +25,7 @@ under the License.
<test-case case-name="shoppingCart-test">
<simple-method-test
location="component://order/script/org/ofbiz/order/test/ShoppingCartTests.xml"
name="testCreateShoppingCart"/>
</test-case>
+<test-case case-name="productServiceOrder-test">
+<simple-method-test
location="component://order/script/org/ofbiz/order/test/ShoppingCartTests.xml"
name="testCreateOrderServiceProduct"/>
+</test-case>
</test-suite>
Modified: ofbiz/trunk/applications/product/data/ProductTypeData.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/data/ProductTypeData.xml?rev=1166543&r1=1166542&r2=1166543&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/data/ProductTypeData.xml (original)
+++ ofbiz/trunk/applications/product/data/ProductTypeData.xml Thu Sep 8
07:07:07 2011
@@ -498,6 +498,7 @@ under the License.
<ProductType description="Marketing Package: Pick Assembly" isPhysical="Y" isDigital="N"
hasTable="N" parentTypeId="MARKETING_PKG" productTypeId="MARKETING_PKG_PICK"/>
<ProductType description="Work In Process" isPhysical="Y" isDigital="N" hasTable="N"
parentTypeId="GOOD" productTypeId="WIP"/>
<ProductType description="Configurable Good Configuration" isPhysical="Y" isDigital="N"
hasTable="N" parentTypeId="AGGREGATED" productTypeId="AGGREGATED_CONF"/>
+<ProductType description="Service a product which is received to- and shipped from inventory" isPhysical="Y"
isDigital="N" hasTable="N" parentTypeId="" productTypeId="SERVICE_PRODUCT"/>
<EnumerationType description="Product Requirement Method" enumTypeId="PROD_REQ_METHOD"
hasTable="N" parentTypeId=""/>
<!-- NONE: no requirement is created (default) -->
Modified: ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml?rev=1166543&r1=1166542&r2=1166543&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml (original)
+++ ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml Thu Sep 8
07:07:07 2011
@@ -710,7 +710,7 @@ under the License.
<ElectronicText dataResourceId="SERV-001-ALT" textData="service-product"/>
<ElectronicText dataResourceId="DRSERV-001-ALTEN" textData="services"/>
<ElectronicText dataResourceId="DRSERV-001-ALTEN"
textData="service-product"/>
-
+
<Content contentId="SERV-001-ALT" contentTypeId="DOCUMENT"
dataResourceId="SERV-001-ALT" localeString="en"/>
<Content contentId="CSERV-001-ALTEN" contentTypeId="DOCUMENT"
dataResourceId="DRSERV-001-ALTEN" localeString="en_US"/>
<Content contentId="SV-1000-ALT" contentTypeId="DOCUMENT" dataResourceId="SV-1000-ALT"
localeString="en"/>
@@ -720,6 +720,22 @@ under the License.
<ProductCategoryContent productCategoryId="SERV-001" contentId="SERV-001-ALT"
prodCatContentTypeId="ALTERNATIVE_URL" fromDate="2001-05-13 12:00:00.0"/>
<ProductContent productId="SV-1000" contentId="SV-1000-ALT"
productContentTypeId="ALTERNATIVE_URL" fromDate="2001-05-13 12:00:00.0"/>
+<!-- test for service product type which is received to- and shipped from
inventory-->
+<Product productId="SV-1001" productTypeId="SERVICE_PRODUCT" primaryProductCategoryId="SERV-001" productName="Laundry service" internalName="Service type product which is received to-
and shipped from inventory" description="Service type product which is received to- and shipped from inventory 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-1001" productPricePurposeId="PURCHASE" productPriceTypeId="DEFAULT_PRICE" currencyUomId="USD"
productStoreGroupId="_NA_" fromDate="2011-08-02 12:00:00.0" price="10.99" createdDate="2011-08-02 12:00:00.0"
createdByUserLogin="admin"/>
+<ProductCategoryMember productCategoryId="SERV-001" productId="SV-1001"
fromDate="2011-08-02 12:00:00.0"/>
+<ProductCategoryMember productCategoryId="CATALOG1_SEARCH" productId="SV-1001"
fromDate="2011-08-02 12:00:00.0"/>
+<DataResource dataResourceId="SV-1001-ALT" dataResourceTypeId="LINK"
objectInfo="lanudry-service-SV-1001-p"/>
+<DataResource dataResourceTypeId="ELECTRONIC_TEXT" dataResourceId="SV-1001-ALT"
localeString="en"/>
+<DataResource dataResourceTypeId="ELECTRONIC_TEXT" dataResourceId="DRSV-1001-ALTEN"
localeString="en_US"/>
+<ElectronicText dataResourceId="SV-1001-ALT" textData="service-product"/>
+<ElectronicText dataResourceId="DRSV-1001-ALTEN" textData="service-product"/>
+
+<Content contentId="SV-1001-ALT" contentTypeId="DOCUMENT" dataResourceId="SV-1001-ALT"
localeString="en"/>
+<Content contentId="CSV-1001-ALTEN" contentTypeId="DOCUMENT"
dataResourceId="DRSV-1001-ALTEN" localeString="en_US"/>
+<ContentAssoc contentId="SV-1001-ALT" contentIdTo="CSV-1001-ALTEN"
contentAssocTypeId="ALTERNATE_LOCALE" fromDate="2011-08-02 12:00:00.0"/>
+<ProductContent productId="SV-1001" contentId="SV-1001-ALT"
productContentTypeId="ALTERNATIVE_URL" fromDate="2011-08-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"/>
@@ -975,6 +991,7 @@ under the License.
<ProductFacility productId="GZ-1000" facilityId="WebStoreWarehouse" minimumStock="2"
reorderQuantity="10" daysToShip="1"/>
<ProductFacility productId="GZ-1001" facilityId="WebStoreWarehouse" minimumStock="2"
reorderQuantity="10" daysToShip="1"/>
<ProductFacility productId="GZ-1004" facilityId="WebStoreWarehouse" minimumStock="2"
reorderQuantity="10" daysToShip="1"/>
+<ProductFacility productId="SV-1001" facilityId="WebStoreWarehouse" minimumStock="2"
reorderQuantity="10" daysToShip="1"/>
<ProductFacilityLocation productId="GZ-2644" facilityId="WebStoreWarehouse"
locationSeqId="TLTLTLUL01"/>
<ProductFacilityLocation productId="GZ-2644" facilityId="WebStoreWarehouse"
locationSeqId="TLTLTLLL01" minimumStock="2" moveQuantity="5"/>
@@ -987,6 +1004,7 @@ under the License.
<ProductFacilityLocation productId="GZ-1000" facilityId="WebStoreWarehouse"
locationSeqId="TLTLTLUL01" minimumStock="5" moveQuantity="20"/>
<ProductFacilityLocation productId="GZ-1001" facilityId="WebStoreWarehouse"
locationSeqId="TLTLTLLL02" minimumStock="5" moveQuantity="20"/>
<ProductFacilityLocation productId="GZ-1004" facilityId="WebStoreWarehouse"
locationSeqId="TLTLTLLL04" minimumStock="5" moveQuantity="20"/>
+<ProductFacilityLocation productId="SV-1001" facilityId="WebStoreWarehouse"
locationSeqId="TLTLTLLL04" minimumStock="5" moveQuantity="20"/>
<!-- some default inventory quantities, things are a bit underutilized
without these... -->
<InventoryItem facilityId="WebStoreWarehouse" locationSeqId="TLTLTLUL01"
datetimeReceived="2008-08-01 08:00:00.000"