[ofbiz-framework] branch trunk updated: Improved: All the service level error messages for missing required field for catalog component. (OFBIZ-7739) Thanks Ratnesh Upadhyay for reporting, reviewing the updated patch and Sega for initial patch.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[ofbiz-framework] branch trunk updated: Improved: All the service level error messages for missing required field for catalog component. (OFBIZ-7739) Thanks Ratnesh Upadhyay for reporting, reviewing the updated patch and Sega for initial patch.

surajk
This is an automated email from the ASF dual-hosted git repository.

surajk pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 757551a  Improved: All the service level error messages for missing required field for catalog component. (OFBIZ-7739) Thanks Ratnesh Upadhyay for reporting, reviewing the updated patch and Sega for initial patch.
     new 286303c  Merge branch 'trunk' of https://gitbox.apache.org/repos/asf/ofbiz-framework into trunk
757551a is described below

commit 757551a8fd4c8e3478f984465c18780c94d3ee29
Author: Suraj Khurana <[hidden email]>
AuthorDate: Sat Apr 25 17:52:53 2020 +0530

    Improved: All the service level error messages for missing required field for catalog component.
    (OFBIZ-7739)
    Thanks Ratnesh Upadhyay for reporting, reviewing the updated patch and Sega for initial patch.
---
 .../product/config/ProductErrorUiLabels.xml        | 105 ++++++++
 applications/product/servicedef/services_cost.xml  |  12 +-
 .../product/servicedef/services_feature.xml        |  24 +-
 applications/product/servicedef/services_maint.xml |  60 ++++-
 .../product/servicedef/services_shipment.xml       | 276 +++++++++++++++++----
 applications/product/servicedef/services_store.xml |  90 +++++--
 .../product/servicedef/services_subscription.xml   |  12 +-
 applications/product/servicedef/services_view.xml  |   6 +-
 8 files changed, 505 insertions(+), 80 deletions(-)

diff --git a/applications/product/config/ProductErrorUiLabels.xml b/applications/product/config/ProductErrorUiLabels.xml
index d13a145..b1e5ae7 100644
--- a/applications/product/config/ProductErrorUiLabels.xml
+++ b/applications/product/config/ProductErrorUiLabels.xml
@@ -1506,4 +1506,109 @@
         <value xml:lang="zh">缺少必须的变型产品标识, 请为新的变型产品输入一个标识。</value>
         <value xml:lang="zh-TW">缺少必須的變型產品識別, 請為新的變型產品輸入一個識別.</value>
     </property>
+    <property key="ProductRequiredFieldMissingAttrName">
+        <value xml:lang="en">Required Field Missing : Attr Name.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingAvailable">
+        <value xml:lang="en">Required Field Missing :Available.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingAvailableOrNotRequired">
+        <value xml:lang="en">Required Field Missing :Available Or Not Required.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingCanceledQuantity">
+        <value xml:lang="en">Required Field Missing :Canceled Quantity. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingCategoryId">
+        <value xml:lang="en">Required Field Missing : Category Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingFacilityId">
+        <value xml:lang="en">Required Field Missing :Facility Id.  </value>
+    </property>
+    <property key="ProductRequiredFieldMissingIdCode">
+        <value xml:lang="en">Required Field Missing : Id Code. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingImageUrl">
+        <value xml:lang="en">Required Field Missing : Image Url. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingInventoryItem">
+        <value xml:lang="en">Required Field Missing : Inventory Item. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingInventoryItemId">
+        <value xml:lang="en">Required Field Missing :Inventory Item Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingItemShipList">
+        <value xml:lang="en">Required Field Missing :Item Ship List. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingItemIssuanceId">
+        <value xml:lang="en">Required Field Missing :Item Issuance Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingNewItemQuantity">
+        <value xml:lang="en">Required Field Missing :New Item Quantity. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingOrderId">
+        <value xml:lang="en">Required Field Missing : Order Id.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingOrderItemSeqId">
+        <value xml:lang="en">Required Field Missing :Order Item Seq Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingProductCategoryId">
+        <value xml:lang="en">Required Field Missing : Product Category Id.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingProductCategoryIdTo">
+        <value xml:lang="en">Required Field Missing :Product Category Id To. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingProductCost">
+        <value xml:lang="en">Required Field Missing : Product Cost. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingProductFeatureApplTypeId">
+        <value xml:lang="en">Required Field Missing : Product Feature Appl TypeId. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingProductFeatureTypeId">
+        <value xml:lang="en">Required Field Missing : Product Feature TypeId. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingProductId">
+        <value xml:lang="en">Required Field Missing : Product Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingProductStoreId">
+        <value xml:lang="en">Required Field Missing : Product Store Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingPromisedDatetime">
+        <value xml:lang="en">Required Field Missing :Promised Date time. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingQuantity">
+        <value xml:lang="en">Required Field Missing : Quantity.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingQuantityAccepted">
+        <value xml:lang="en">Required Field Missing :Quantity Accepted. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingQuantityNotReserved">
+        <value xml:lang="en">Required Field Missing : Quantity Not Reserved.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingReceiptId">
+        <value xml:lang="en">Required Field Missing :Receipt Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingRequireInventory">
+        <value xml:lang="en">Required Field Missing :Require Inventory.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingShipGroupSeqId">
+        <value xml:lang="en">Required Field Missing :Ship Group Seq Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingShipmentId">
+        <value xml:lang="en">Required Field Missing :Shipment Id. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingShipmentItemSeqId">
+        <value xml:lang="en">Required Field Missing :Shipment Item SeqId. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingShipmentShipGroupFacilityList">
+        <value xml:lang="en">Required Field Missing : Shipment Ship Group Facility List.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingSubscriptionId">
+        <value xml:lang="en">Required Field Missing : Subscription Id.</value>
+    </property>
+    <property key="ProductRequiredFieldMissingTaskCost">
+        <value xml:lang="en">Required Field Missing : Task Cost. </value>
+    </property>
+    <property key="ProductRequiredFieldMissingTotalIssuedQty">
+        <value xml:lang="en">Required Field Missing :Total Issued Qty. </value>
+    </property>
 </resource>
diff --git a/applications/product/servicedef/services_cost.xml b/applications/product/servicedef/services_cost.xml
index b219ff6..4bfad3b 100644
--- a/applications/product/servicedef/services_cost.xml
+++ b/applications/product/servicedef/services_cost.xml
@@ -73,7 +73,11 @@ under the License.
         <attribute mode="IN" name="productId" optional="false" type="String"/>
         <attribute mode="IN" name="currencyUomId" optional="false" type="String"/>
         <attribute mode="IN" name="costComponentTypePrefix" optional="false" type="String"/>
-        <attribute mode="OUT" name="productCost" type="BigDecimal" optional="false"/>
+        <attribute mode="OUT" name="productCost" type="BigDecimal" optional="false">
+            <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductCost"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="getTaskCost" engine="simple" auth="true"
                 location="component://product/minilang/product/cost/CostServices.xml" invoke="getTaskCost">
@@ -82,7 +86,11 @@ under the License.
         <attribute mode="IN" name="currencyUomId" optional="false" type="String"/>
         <attribute mode="IN" name="productId" optional="true" type="String"/>
         <attribute mode="IN" name="routingId" optional="true" type="String"/>
-        <attribute mode="OUT" name="taskCost" type="BigDecimal" optional="false"/>
+        <attribute mode="OUT" name="taskCost" type="BigDecimal" optional="false">
+            <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingTaskCost"/>
+     </type-validate>
+        </attribute>
         <attribute mode="OUT" name="costsByType" type="Map" optional="true"/>
     </service>
     <service name="calculateProductCosts" engine="simple" auth="true"
diff --git a/applications/product/servicedef/services_feature.xml b/applications/product/servicedef/services_feature.xml
index 722729f..aa1bafd 100644
--- a/applications/product/servicedef/services_feature.xml
+++ b/applications/product/servicedef/services_feature.xml
@@ -81,10 +81,26 @@ under the License.
                 location="component://product/groovyScripts/product/feature/ProductFeatureServices.groovy" invoke="applyFeatureToProductFromTypeAndCode" auth="true">
         <description>Apply a ProductFeature to a Product</description>
         <permission-service service-name="checkProductRelatedPermission" main-action="CREATE"/>
-        <attribute name="productId" type="String" mode="IN" optional="false"/>
-        <attribute name="productFeatureTypeId" type="String" mode="IN" optional="false"/>
-        <attribute name="idCode" type="String" mode="IN" optional="false"/>
-        <attribute name="productFeatureApplTypeId" type="String" mode="IN" optional="false"/>
+        <attribute name="productId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="productFeatureTypeId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductFeatureTypeId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="idCode" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingIdCode"/>
+     </type-validate>
+        </attribute>
+        <attribute name="productFeatureApplTypeId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductFeatureApplTypeId"/>
+     </type-validate>
+        </attribute>
         <attribute name="fromDate" type="java.sql.Timestamp" mode="IN" optional="true"/>
         <attribute name="thruDate" type="java.sql.Timestamp" mode="IN" optional="true"/>
         <attribute name="sequenceNum" type="Long" mode="IN" optional="true"/>
diff --git a/applications/product/servicedef/services_maint.xml b/applications/product/servicedef/services_maint.xml
index 72198a6..bf8e44e 100644
--- a/applications/product/servicedef/services_maint.xml
+++ b/applications/product/servicedef/services_maint.xml
@@ -28,21 +28,37 @@ under the License.
     <service name="copyCategoryProductMembers" engine="groovy" transaction-timeout="600"
             location="component://product/groovyScripts/product/category/CategoryServices.groovy" invoke="copyCategoryProductMembers" auth="true">
         <description>Copy Product Members from one Category to Another, optionally filtering by the given valid date (otherwise no date filtering done), and optionally recursing (if recurse=Y) down the from category</description>
-        <attribute name="productCategoryId" type="String" mode="IN" optional="false"/>
-        <attribute name="productCategoryIdTo" type="String" mode="IN" optional="false"/>
+        <attribute name="productCategoryId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductCategoryId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="productCategoryIdTo" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductCategoryIdTo"/>
+     </type-validate>
+        </attribute>
         <attribute name="validDate" type="Timestamp" mode="IN" optional="true"/>
         <attribute name="recurse" type="String" mode="IN" optional="true"/>
     </service>
     <service name="expireAllCategoryProductMembers" engine="groovy"
             location="component://product/groovyScripts/product/category/CategoryServices.groovy" invoke="expireAllCategoryProductMembers" auth="true">
         <description>Expire All Product Members in a Category optionally using the thruDate specified as the expire date (now timestamp used by default)</description>
-        <attribute name="productCategoryId" type="String" mode="IN" optional="false"/>
+        <attribute name="productCategoryId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductCategoryId"/>
+     </type-validate>
+        </attribute>
         <attribute name="thruDate" type="Timestamp" mode="IN" optional="true"/>
     </service>
     <service name="removeExpiredCategoryProductMembers" engine="groovy"
             location="component://product/groovyScripts/product/category/CategoryServices.groovy" invoke="removeExpiredCategoryProductMembers" auth="true">
         <description>Remove All Expired Product Members in a Category, optionally uses the valid date instead of now to determine if the member has expired</description>
-        <attribute name="productCategoryId" type="String" mode="IN" optional="false"/>
+        <attribute name="productCategoryId" type="String" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductCategoryId"/>
+     </type-validate>
+        </attribute>
         <attribute name="validDate" type="Timestamp" mode="IN" optional="true"/>
     </service>
 
@@ -111,7 +127,11 @@ under the License.
     <service name="getRelatedCategories" engine="groovy"
       location="component://product/groovyScripts/product/catalog/CatalogServices.groovy" invoke="getRelatedCategories">
         <description>Get all related categories of a category </description>
-        <attribute name="parentProductCategoryId" type="String" mode="IN" optional="false"/>
+        <attribute name="parentProductCategoryId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingParentProductCategoryId"/>
+     </type-validate>
+        </attribute>
         <attribute name="categories" type="java.util.List" mode="INOUT" optional="true"/>
     </service>
 
@@ -132,27 +152,43 @@ under the License.
     <service name="checkImageUrlForCategoryAndProduct" engine="groovy"
       location="component://product/groovyScripts/product/catalog/CatalogServices.groovy" invoke="checkImageUrlForCategoryAndProduct">
         <description>check For Image Urls exists or not for category</description>
-        <attribute name="categoryId" type="String" mode="IN" optional="false"/>
+        <attribute name="categoryId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingCategoryId"/>
+     </type-validate>
+        </attribute>
         <attribute name="fileNotExists" type="java.util.List" mode="OUT" optional="true"/>
         <attribute name="fileExists" type="java.util.List" mode="OUT" optional="true"/>
     </service>
     <service name="checkImageUrlForCategory" engine="groovy"
       location="component://product/groovyScripts/product/catalog/CatalogServices.groovy" invoke="checkImageUrlForCategory">
         <description>check For Image Urls exists or not For Product</description>
-        <attribute name="categoryId" type="String" mode="IN" optional="false"/>
+        <attribute name="categoryId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingCategoryId"/>
+     </type-validate>
+        </attribute>
         <attribute name="filesImageMap" type="java.util.Map" mode="OUT" optional="true"/>
     </service>
     <service name="checkImageUrlForProduct" engine="groovy"
       location="component://product/groovyScripts/product/catalog/CatalogServices.groovy" invoke="checkImageUrlForProduct">
         <description>check For Image Urls exists or not For Product</description>
-        <attribute name="productId" type="String" mode="IN" optional="false"/>
+        <attribute name="productId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductId"/>
+     </type-validate>
+        </attribute>
         <attribute name="filesImageMap" type="java.util.Map" mode="OUT" optional="true"/>
     </service>
 
     <service name="checkImageUrl" engine="groovy"
       location="component://product/groovyScripts/product/catalog/CatalogServices.groovy" invoke="checkImageUrl">
         <description>check For Image Urls exists or not</description>
-        <attribute name="imageUrl" type="String" mode="IN" optional="false"/>
+        <attribute name="imageUrl" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingImageUrl"/>
+     </type-validate>
+        </attribute>
         <attribute name="isExists" type="String" mode="OUT" optional="true"/>
     </service>
 
@@ -175,6 +211,10 @@ under the License.
     <service name="updateOldInventoryToDetailSingle" engine="simple" require-new-transaction="true"
             location="component://product/minilang/product/inventory/InventoryServices.xml" invoke="updateOldInventoryToDetailSingle" auth="true">
         <description>Update Old Inventory To Detail</description>
-        <attribute name="inventoryItem" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="false"/>
+        <attribute name="inventoryItem" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingInventoryItem"/>
+     </type-validate>
+        </attribute>
     </service>
 </services>
diff --git a/applications/product/servicedef/services_shipment.xml b/applications/product/servicedef/services_shipment.xml
index 03a4b28..1b33dc6 100644
--- a/applications/product/servicedef/services_shipment.xml
+++ b/applications/product/servicedef/services_shipment.xml
@@ -57,7 +57,11 @@ under the License.
     <service name="createOrderShipmentPlan" engine="simple"
             location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="createOrderShipmentPlan" auth="true">
         <description>Create Shipment, ShipmentItems and OrderShipment</description>
-        <attribute name="orderId" type="String" mode="IN" optional="false"/>
+        <attribute name="orderId" type="String" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrderId"/>
+     </type-validate>
+        </attribute>
         <attribute name="shipmentId" type="String" mode="OUT" optional="true"/>
     </service>
 
@@ -67,23 +71,47 @@ under the License.
           automatically issued in full and put into one package.  The shipment is created in the INPUT status and then updated to
           PACKED and SHIPPED.
         </description>
-        <attribute name="orderId" type="String" mode="IN" optional="false"/>
+        <attribute name="orderId" type="String" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrderId"/>
+     </type-validate>
+        </attribute>
         <attribute name="originFacilityId" type="String" mode="IN" optional="true"/>
         <attribute name="setPackedOnly" type="String" mode="IN" optional="true"/>
         <attribute name="eventDate" type="Timestamp" mode="IN" optional="true"/>
         <!-- A List of Maps, each with a shipmentId,a facilityId, and a shipGroupSeqId for each shipment created -->
-        <attribute name="shipmentShipGroupFacilityList" type="List" mode="OUT" optional="false"/>
+        <attribute name="shipmentShipGroupFacilityList" type="List" mode="OUT" optional="false">
+     <type-validate>
+          <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentShipGroupFacilityList"/>
+     </type-validate>
+        </attribute>
         <attribute name="shipmentIds" type="List" mode="OUT" optional="true"/>
     </service>
     <service name="quickShipOrderByItem" engine="simple"
             location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="quickShipOrderByItem" auth="true">
         <description>Quick Ships An Order By Item</description>
-        <attribute name="orderId" type="String" mode="IN" optional="false"/>
-        <attribute name="shipGroupSeqId" type="String" mode="IN" optional="false"/>
-        <attribute name="itemShipList" type="List" mode="IN" optional="false"/>
+        <attribute name="orderId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrderId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="shipGroupSeqId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipGroupSeqId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="itemShipList" type="List" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingItemShipList"/>
+     </type-validate>
+        </attribute>
         <attribute name="originFacilityId" type="String" mode="IN" optional="true"/>
         <attribute name="setPackedOnly" type="String" mode="IN" optional="true"/>
-        <attribute name="shipmentId" type="String" mode="OUT" optional="false"/>
+        <attribute name="shipmentId" type="String" mode="OUT" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="quickReceivePurchaseOrder" engine="simple"
             location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="quickReceivePurchaseOrder" auth="true">
@@ -92,8 +120,16 @@ under the License.
           The shipment's status is first set to CREATED and then set as SHIPPED.  The facilityId is used to set the destinationFacilityId
           of the Shipment.
         </description>
-        <attribute name="orderId" type="String" mode="IN" optional="false"/>
-        <attribute name="facilityId" type="String" mode="IN" optional="false"/>
+        <attribute name="orderId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrderId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="facilityId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingFacilityId"/>
+     </type-validate>
+        </attribute>
         <attribute name="shipmentIds" type="List" mode="OUT" optional="true"/>
     </service>
     <service name="createShipmentForReturn" default-entity-name="ReturnHeader" engine="simple"
@@ -101,7 +137,11 @@ under the License.
         <description>Create a Return Shipment with information from ReturnHeader fields</description>
         <permission-service service-name="facilityGenericPermission" main-action="CREATE"/>
         <auto-attributes include="pk" mode="IN" optional="false"/>
-        <attribute name="shipmentId" type="String" mode="OUT" optional="false"/>
+        <attribute name="shipmentId" type="String" mode="OUT" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="createShipmentAndItemsForReturn" default-entity-name="ReturnHeader" engine="simple"
             location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="createShipmentAndItemsForReturn">
@@ -116,7 +156,11 @@ under the License.
         <description>Create a Return Shipment and ShipmentItems with primaryReturnId</description>
         <permission-service service-name="facilityGenericPermission" main-action="CREATE"/>
         <auto-attributes include="nonpk" mode="IN" optional="true"/>
-        <attribute name="shipmentId" type="String" mode="OUT" optional="false"/>
+        <attribute name="shipmentId" type="String" mode="OUT" optional="false">
+            <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+            </type-validate>
+        </attribute>
         <override name="primaryReturnId" optional="false"/>
     </service>
 
@@ -182,7 +226,11 @@ under the License.
             <permission-service service-name="facilityGenericPermission" main-action="CREATE"/>
             <permission-service service-name="facilityGenericPermission" main-action="UPDATE"/>
         </required-permissions>
-        <attribute name="shipmentId" type="String" mode="IN" optional="false"/>
+        <attribute name="shipmentId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="balanceItemIssuancesForShipment" engine="simple"
             location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="balanceItemIssuancesForShipment" auth="true">
@@ -195,21 +243,41 @@ under the License.
             <permission-service service-name="facilityGenericPermission" main-action="CREATE"/>
             <permission-service service-name="facilityGenericPermission" main-action="UPDATE"/>
         </required-permissions>
-        <attribute name="shipmentId" type="String" mode="IN" optional="false"/>
+        <attribute name="shipmentId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="checkCancelItemIssuanceAndOrderShipmentFromShipment" engine="simple"
             location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="checkCancelItemIssuanceAndOrderShipmentFromShipment" auth="true">
         <description>Check Shipment Items and cancel Item Issuance and Order Shipment</description>
         <permission-service service-name="facilityGenericPermission" main-action="UPDATE"/>
-        <attribute name="shipmentId" type="String" mode="IN" optional="false"/>
+        <attribute name="shipmentId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="quickDropShipOrder" engine="simple"
             location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="quickDropShipOrder" auth="true">
         <description>Creates a drop shipment for a ship group and calls updateShipment twice in succession to set
             shipment status to PURCH_SHIP_SHIPPED and then to PURCH_SHIP_RECEIVED</description>
-        <attribute name="orderId" type="String" mode="IN" optional="false"/>
-        <attribute name="shipGroupSeqId" type="String" mode="IN" optional="false"/>
-        <attribute name="shipmentId" type="String" mode="OUT" optional="false"/>
+        <attribute name="orderId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrdertId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="shipGroupSeqId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipGroupSeqId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="shipmentId" type="String" mode="OUT" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
     </service>
 
     <!-- ShipmentItem Services -->
@@ -238,7 +306,11 @@ under the License.
             NOTE that this does manage OrderShipment records, but NOTHING else, so it is only to be used for Shipment
             Plan stuff BEFORE the items are issued, shipment packed, etc.</description>
         <auto-attributes entity-name="ShipmentItem" include="pk" mode="IN" optional="false"/>
-        <attribute name="newItemQuantity" type="BigDecimal" mode="IN" optional="false"/>
+        <attribute name="newItemQuantity" type="BigDecimal" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingNewItemQuantity"/>
+     </type-validate>
+        </attribute>
         <attribute name="newShipmentItemSeqId" type="String" mode="OUT" optional="true"/>
     </service>
 
@@ -423,8 +495,16 @@ under the License.
         </required-permissions>
         <auto-attributes entity-name="Shipment" include="pk" mode="IN" optional="false"/>
         <auto-attributes entity-name="OrderItemShipGroupAssoc" include="pk" mode="IN" optional="false"/>
-        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false"/>
-        <attribute name="shipmentItemSeqId" type="String" mode="OUT" optional="false"/>
+        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantity"/>
+     </type-validate>
+        </attribute>
+        <attribute name="shipmentItemSeqId" type="String" mode="OUT" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentItemSeqId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="issueOrderItemShipGrpInvResToShipment" engine="simple"
             location="component://product/minilang/shipment/issuance/IssuanceServices.xml" invoke="issueOrderItemShipGrpInvResToShipment" auth="true">
@@ -435,42 +515,98 @@ under the License.
         </required-permissions>
         <auto-attributes entity-name="Shipment" include="pk" mode="IN" optional="false"/>
         <auto-attributes entity-name="OrderItemShipGrpInvRes" include="pk" mode="IN" optional="false"/>
-        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false"/>
+        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantity"/>
+     </type-validate>
+        </attribute>
         <attribute name="eventDate" type="Timestamp" mode="IN" optional="true"/>
-        <attribute name="shipmentItemSeqId" type="String" mode="OUT" optional="false"/>
-        <attribute name="itemIssuanceId" type="String" mode="OUT" optional="false"/>
+        <attribute name="shipmentItemSeqId" type="String" mode="OUT" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentItemSeqId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="itemIssuanceId" type="String" mode="OUT" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingItemIssuanceId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="issueInventoryItemToFixedAssetMaint" engine="simple"
         location="component://product/minilang/shipment/issuance/IssuanceServices.xml" invoke="issueInventoryItemToFixedAssetMaint" auth="true">
         <description>Issue an InventoryItem to a FixedAssetMaint - for conversion to use as supples/parts</description>
         <auto-attributes entity-name="InventoryItem" include="pk" mode="IN" optional="false"/>
         <auto-attributes entity-name="FixedAssetMaint" include="pk" mode="IN" optional="false"/>
-        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false"/>
-        <attribute name="itemIssuanceId" type="String" mode="OUT" optional="false"/>
+        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantity"/>
+     </type-validate>
+        </attribute>
+        <attribute name="itemIssuanceId" type="String" mode="OUT" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingItemIssuanceId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="returnInventoryItemIssuedToFixedAssetMaint" engine="simple"
         location="component://product/minilang/shipment/issuance/IssuanceServices.xml" invoke="returnInventoryItemIssuedToFixedAssetMaint" auth="true">
         <description>Return InventoryItem Issued to a FixedAssetMaint - for conversion to use as supples/parts</description>
-        <attribute name="itemIssuanceId" type="String" mode="IN" optional="false"/>
+        <attribute name="itemIssuanceId" type="String" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingItemIssuanceId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="cancelOrderItemIssuanceFromSalesShipment" engine="simple"
             location="component://product/minilang/shipment/issuance/IssuanceServices.xml" invoke="cancelOrderItemIssuanceFromSalesShipment" auth="true">
         <description>Cancel an ItemIssuance from Sales Shipment</description>
         <permission-service service-name="facilityGenericPermission" main-action="UPDATE"/>
-        <attribute name="itemIssuanceId" type="String" mode="IN" optional="false"/>
+        <attribute name="itemIssuanceId" type="String" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingItemIssuanceId"/>
+     </type-validate>
+        </attribute>
         <attribute name="cancelQuantity" type="BigDecimal" mode="IN" optional="true"/>
-        <attribute name="canceledQuantity" type="BigDecimal" mode="OUT" optional="false"/>
+        <attribute name="canceledQuantity" type="BigDecimal" mode="OUT" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingCanceledQuantity"/>
+     </type-validate>
+        </attribute>
     </service>
 
     <service name="issueInventoryItemToShipment" engine="simple"
             location="component://product/minilang/shipment/issuance/IssuanceServices.xml" invoke="issueInventoryItemToShipment" auth="true">
         <description>Issue an InventoryItem to a Shipment</description>
-        <attribute name="shipmentId" type="String" mode="IN" optional="false"/>
-        <attribute name="shipmentItemSeqId" type="String" mode="IN" optional="false"/>
-        <attribute name="inventoryItemId" type="String" mode="IN" optional="false"/>
-        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false"/>
-        <attribute name="totalIssuedQty" type="BigDecimal" mode="IN" optional="false"/>
-        <attribute name="itemIssuanceId" type="String" mode="OUT" optional="false"/>
+        <attribute name="shipmentId" type="String" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="shipmentItemSeqId" type="String" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentItemSeqId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="inventoryItemId" type="String" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingInventoryItemId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantity"/>
+     </type-validate>
+        </attribute>
+        <attribute name="totalIssuedQty" type="BigDecimal" mode="IN" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingTotalIssuedQty"/>
+     </type-validate>
+        </attribute>
+        <attribute name="itemIssuanceId" type="String" mode="OUT" optional="false">
+     <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingItemIssuanceId"/>
+     </type-validate>
+        </attribute>
     </service>
 
     <!-- Pick Verify Services -->
@@ -718,7 +854,11 @@ under the License.
         <description>Creates a ShipmentReceipt Record</description>
         <permission-service service-name="facilityGenericPermission" main-action="CREATE"/>
         <implements service="interfaceShipmentReceipt"/>
-        <attribute name="receiptId" type="String" mode="OUT" optional="false"/>
+        <attribute name="receiptId" type="String" mode="OUT" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingReceiptId"/>
+     </type-validate>
+        </attribute>
         <attribute name="affectAccounting" type="Boolean" mode="OUT" optional="true"/>
     </service>
     <service name="updatePurchaseShipmentFromReceipt" engine="java"
@@ -868,7 +1008,11 @@ under the License.
     <service name="cancelReceivedItems" engine="simple"
             location="component://product/minilang/shipment/receipt/ShipmentReceiptServices.xml" invoke="cancelReceivedItems" auth="true">
         <description>Cancel Received Items against a purchase order if received something incorrectly</description>
-        <attribute name="receiptId" type="String" mode="IN" optional="false"/>
+        <attribute name="receiptId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingReceiptId"/>
+     </type-validate>
+        </attribute>
         <attribute name="facilityId" type="String" mode="IN" optional="true"/>
     </service>
 
@@ -905,12 +1049,32 @@ under the License.
     <service name="issueSerializedInvToShipmentPackageAndSetTracking" engine="simple"
             location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="issueSerializedInvToShipmentPackageAndSetTracking" auth="true">
         <description></description>
-        <attribute name="inventoryItemId" type="String" mode="IN" optional="false"/>
-        <attribute name="shipmentId" type="String" mode="IN" optional="false"/>
+        <attribute name="inventoryItemId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingInventoryItemId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="shipmentId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
         <attribute name="productId" type="String" mode="IN" optional="true"/>
-        <attribute name="orderId" type="String" mode="IN" optional="false"/>
-        <attribute name="orderItemSeqId" type="String" mode="IN" optional="false"/>
-        <attribute name="shipGroupSeqId" type="String" mode="IN" optional="false"/>
+        <attribute name="orderId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrderId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="orderItemSeqId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrderItemSeqId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="shipGroupSeqId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipGroupSeqId"/>
+     </type-validate>
+        </attribute>
         <attribute name="quantity" type="BigDecimal" mode="IN" optional="true"/>
         <attribute name="reservedDatetime" type="Timestamp" mode="IN" optional="true"/>
         <attribute name="requireInventory" type="String" mode="IN" optional="true"/>
@@ -920,13 +1084,21 @@ under the License.
         <attribute name="trackingNum" type="String" mode="IN" optional="true"/>
         <attribute name="originFacilityId" type="String" mode="IN" optional="true"/>
         <attribute name="quantityNotReserved" type="BigDecimal" mode="IN" optional="true"/>
-        <attribute name="promisedDatetime" type="Timestamp" mode="IN" optional="false"/>
+        <attribute name="promisedDatetime" type="Timestamp" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingPromisedDatetime"/>
+     </type-validate>
+        </attribute>
         <attribute name="shipmentPackageSeqId" type="String" mode="IN" optional="true"/>
     </service>
     <service name="setShipmentStatusPackedAndShipped" engine="simple"
         location="component://product/minilang/shipment/shipment/ShipmentServices.xml" invoke="setShipmentStatusPackedAndShipped" auth="true">
         <description>Move a shipment into Packed status and then to Shipped status</description>
-        <attribute name="shipmentId" type="String" mode="IN" optional="false"/>
+        <attribute name="shipmentId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingShipmentId"/>
+     </type-validate>
+        </attribute>
     </service>
     <service name="sendShipmentCompleteNotification" engine="java" require-new-transaction="true" max-retry="3"
         location="org.apache.ofbiz.shipment.shipment.ShipmentServices" invoke="sendShipmentCompleteNotification" auth="true">
@@ -944,9 +1116,21 @@ under the License.
     <service name="updateIssuanceShipmentAndPoOnReceiveInventory" engine="simple"
             location="component://product/minilang/shipment/receipt/ShipmentReceiptServices.xml" invoke="updateIssuanceShipmentAndPoOnReceiveInventory">
         <description>Update issuance, shipment and order items if quantity received is higher than quantity on purchase order</description>
-        <attribute name="orderId" type="String" mode="IN" optional="false"/>
-        <attribute name="orderItemSeqId" type="String" mode="IN" optional="false"/>
-        <attribute name="quantityAccepted"  type="BigDecimal" mode="IN" optional="false"/>
+        <attribute name="orderId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrderId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="orderItemSeqId" type="String" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingOrderItemSeqId"/>
+     </type-validate>
+        </attribute>
+        <attribute name="quantityAccepted"  type="BigDecimal" mode="IN" optional="false">
+     <type-validate>
+         <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantityAccepted"/>
+     </type-validate>
+        </attribute>
         <attribute name="shipmentId" type="String" mode="IN" optional="true"/>
         <attribute name="shipmentItemSeqId" type="String" mode="IN" optional="true"/>
         <attribute name="unitCost" type="String" mode="IN" optional="true"/>
diff --git a/applications/product/servicedef/services_store.xml b/applications/product/servicedef/services_store.xml
index 6cad645..fd06ffb 100644
--- a/applications/product/servicedef/services_store.xml
+++ b/applications/product/servicedef/services_store.xml
@@ -46,44 +46,104 @@ under the License.
     <service name="reserveStoreInventory" engine="simple"
             location="component://product/minilang/product/store/ProductStoreServices.xml" invoke="reserveStoreInventory">
         <description>Reserve Inventory in a Product Store</description>
-        <attribute name="productStoreId" type="String" mode="IN" optional="false"></attribute>
-        <attribute name="productId" type="String" mode="IN" optional="false"></attribute>
+        <attribute name="productStoreId" type="String" mode="IN" optional="false">
+            <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductStoreId"/>
+            </type-validate>
+        </attribute>
+        <attribute name="productId" type="String" mode="IN" optional="false">
+            <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductId"/>
+            </type-validate>
+        </attribute>
         <attribute name="facilityId" type="String" mode="IN" optional="true"></attribute>
-        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false"></attribute>
+        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false">
+            <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantity"/>
+            </type-validate>
+        </attribute>
         <attribute name="orderId" type="String" mode="IN" optional="true"></attribute>
         <attribute name="orderItemSeqId" type="String" mode="IN" optional="true"></attribute>
         <attribute name="shipGroupSeqId" type="String" mode="IN" optional="true"></attribute>
-        <attribute name="quantityNotReserved" type="BigDecimal" mode="OUT" optional="false"></attribute>
+        <attribute name="quantityNotReserved" type="BigDecimal" mode="OUT" optional="false">
+            <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantityNotReserved"/>
+            </type-validate>
+        </attribute>
     </service>
 
     <service name="isStoreInventoryRequired" engine="simple"
             location="component://product/minilang/product/store/ProductStoreServices.xml" invoke="isStoreInventoryRequired" auth="false">
         <description>Checks if Store Inventory is Required</description>
-        <attribute name="productStoreId" type="String" mode="IN" optional="false"></attribute>
+        <attribute name="productStoreId" type="String" mode="IN" optional="false">
+            <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductStoreId"/>
+            </type-validate>
+        </attribute>
         <attribute name="productStore" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"></attribute>
-        <attribute name="productId" type="String" mode="IN" optional="false"></attribute>
+        <attribute name="productId" type="String" mode="IN" optional="false">
+            <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductId"/>
+            </type-validate>
+        </attribute>
         <attribute name="product" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"></attribute>
-        <attribute name="requireInventory" type="String" mode="OUT" optional="false"><!-- Y/N --></attribute>
+        <attribute name="requireInventory" type="String" mode="OUT" optional="false"><!-- Y/N -->
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingRequireInventory"/>
+         </type-validate>
+        </attribute>
     </service>
     <service name="isStoreInventoryAvailable" engine="simple"
             location="component://product/minilang/product/store/ProductStoreServices.xml" invoke="isStoreInventoryAvailable" auth="false">
         <description>Checks if Store Inventory is Required</description>
-        <attribute name="productStoreId" type="String" mode="IN" optional="false"></attribute>
+        <attribute name="productStoreId" type="String" mode="IN" optional="false">
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductStoreId"/>
+         </type-validate>
+        </attribute>
         <attribute name="productStore" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"></attribute>
-        <attribute name="productId" type="String" mode="IN" optional="false"></attribute>
+        <attribute name="productId" type="String" mode="IN" optional="false">
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductId"/>
+         </type-validate>
+        </attribute>
         <attribute name="product" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"></attribute>
-        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false"></attribute>
-        <attribute name="available" type="String" mode="OUT" optional="false"><!-- Y/N --></attribute>
+        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false">
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantity"/>
+         </type-validate>
+        </attribute>
+        <attribute name="available" type="String" mode="OUT" optional="false"><!-- Y/N -->
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingAvailable"/>
+         </type-validate>
+        </attribute>
     </service>
     <service name="isStoreInventoryAvailableOrNotRequired" engine="simple"
             location="component://product/minilang/product/store/ProductStoreServices.xml" invoke="isStoreInventoryAvailableOrNotRequired" auth="false">
         <description>Checks if Store Inventory is Required</description>
-        <attribute name="productStoreId" type="String" mode="IN" optional="false"></attribute>
+        <attribute name="productStoreId" type="String" mode="IN" optional="false">
+         <type-validate>
+             <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductStoreId"/>
+         </type-validate>
+        </attribute>
         <attribute name="productStore" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"></attribute>
-        <attribute name="productId" type="String" mode="IN" optional="false"></attribute>
+        <attribute name="productId" type="String" mode="IN" optional="false">
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductId"/>
+         </type-validate>
+        </attribute>
         <attribute name="product" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"></attribute>
-        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false"></attribute>
-        <attribute name="availableOrNotRequired" type="String" mode="OUT" optional="false"><!-- Y/N --></attribute>
+        <attribute name="quantity" type="BigDecimal" mode="IN" optional="false">
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingQuantity"/>
+         </type-validate>
+        </attribute>
+        <attribute name="availableOrNotRequired" type="String" mode="OUT" optional="false"><!-- Y/N -->
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingAvailableOrNotRequired"/>
+         </type-validate>
+        </attribute>
     </service>
 
     <!-- Product Store Role Services -->
diff --git a/applications/product/servicedef/services_subscription.xml b/applications/product/servicedef/services_subscription.xml
index 9d5437f..521fdee 100644
--- a/applications/product/servicedef/services_subscription.xml
+++ b/applications/product/servicedef/services_subscription.xml
@@ -134,8 +134,16 @@ under the License.
              location="component://product/minilang/product/subscription/SubscriptionServices.xml" invoke="updateSubscriptionAttribute">
         <description>Create (when not exist) or update (when exist) a Subscription attribute</description>
         <permission-service service-name="subscriptionPermissionCheck" main-action="UPDATE"/>
-        <attribute name="subscriptionId" type="String" mode="INOUT" optional="false"/>
-        <attribute name="attrName" type="String" mode="IN" optional="false"/>
+        <attribute name="subscriptionId" type="String" mode="INOUT" optional="false">
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingSubscriptionId"/>
+         </type-validate>
+        </attribute>
+        <attribute name="attrName" type="String" mode="IN" optional="false">
+         <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingAttrName"/>
+         </type-validate>    
+        </attribute>
         <attribute name="attrValue" type="String" mode="IN" optional="true"/>
     </service>
     <service name="deleteSubscriptionAttribute" default-entity-name="SubscriptionAttribute" engine="entity-auto" invoke="delete" auth="true">
diff --git a/applications/product/servicedef/services_view.xml b/applications/product/servicedef/services_view.xml
index 6495ee1..0d31554 100644
--- a/applications/product/servicedef/services_view.xml
+++ b/applications/product/servicedef/services_view.xml
@@ -121,7 +121,11 @@ under the License.
     <service name="getAssociatedProductsList" engine="groovy" auth="false"
         location="component://product/groovyScripts/product/category/CategoryServices.groovy" invoke="getAssociatedProductsList">
         <description>Set the product options for selected product category, mostly used by getDependentDropdownValues</description>
-        <attribute name="productCategoryId" mode="IN" type="String" optional="false"/>
+        <attribute name="productCategoryId" mode="IN" type="String" optional="false">
+            <type-validate>
+                <fail-property resource="ProductErrorUiLabels" property="ProductRequiredFieldMissingProductCategoryId"/>
+            </type-validate>
+        </attribute>
         <attribute name="products" mode="OUT" type="java.util.List"/>
     </service>