You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2014/11/27 07:14:08 UTC

svn commit: r1642027 [2/2] - in /ofbiz/trunk: applications/accounting/ applications/accounting/entitydef/ applications/accounting/script/org/ofbiz/accounting/olap/ applications/accounting/servicedef/ applications/order/ applications/order/entitydef/ ap...

Added: ofbiz/trunk/specialpurpose/bi/script/org/ofbiz/bi/FactServices.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/bi/script/org/ofbiz/bi/FactServices.xml?rev=1642027&view=auto
==============================================================================
--- ofbiz/trunk/specialpurpose/bi/script/org/ofbiz/bi/FactServices.xml (added)
+++ ofbiz/trunk/specialpurpose/bi/script/org/ofbiz/bi/FactServices.xml Thu Nov 27 06:14:06 2014
@@ -0,0 +1,751 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods-v2.xsd">
+
+    <simple-method method-name="loadSalesInvoiceFact" short-description="">
+        <entity-one entity-name="Invoice" value-field="invoice"/>
+        <if-empty field="invoice">
+            <add-error>
+                <fail-property resource="AccountingUiLabels" property="AccountingInvoiceDoesNotExists"/>
+            </add-error>
+        </if-empty>
+        <check-errors/>
+        <if-compare field="invoice.invoiceTypeId" operator="equals" value="SALES_INVOICE">
+            <set field="andConditions.invoiceItemTypeId" value="INV_FPROD_ITEM"/>
+            <get-related relation-name="InvoiceItem" value-field="invoice" list="invoiceItems" map="andConditions"/>
+            <iterate list="invoiceItems" entry="invoiceItem">
+                <clear-field field="inMap"/>
+                <set field="inMap.invoice" from-field="invoice"/>
+                <set field="inMap.invoiceItem" from-field="invoiceItem"/>
+                <call-service service-name="loadSalesInvoiceItemFact" in-map-name="inMap"/>
+            </iterate>
+        </if-compare>
+    </simple-method>
+    <simple-method method-name="loadSalesInvoiceItemFact" short-description="">
+        <set field="invoice" from-field="parameters.invoice"/>
+        <set field="invoiceItem" from-field="parameters.invoiceItem"/>
+        <if-empty field="invoice">
+            <entity-one entity-name="Invoice" value-field="invoice"/>
+        </if-empty>
+        <if-empty field="invoiceItem">
+            <entity-one entity-name="InvoiceItem" value-field="invoiceItem"/>
+        </if-empty>
+        <if-empty field="invoice">
+            <add-error>
+                <fail-property resource="AccountingUiLabels" property="AccountingInvoiceDoesNotExists"/>
+            </add-error>
+        </if-empty>
+        <if-empty field="invoiceItem">
+            <add-error>
+                <fail-property resource="AccountingUiLabels" property="AccountingInvoiceItemDoesNotExists"/>
+            </add-error>
+        </if-empty>
+        <check-errors/>
+
+        <if-compare field="invoice.invoiceTypeId" operator="equals" value="SALES_INVOICE">
+            <entity-one entity-name="SalesInvoiceItemFact" value-field="fact" auto-field-map="false">
+                <field-map field-name="invoiceId" from-field="invoiceItem.invoiceId"/>
+                <field-map field-name="invoiceItemSeqId" from-field="invoiceItem.invoiceItemSeqId"/>
+            </entity-one>
+            <!-- key handling -->
+            <if-empty field="fact">
+                <make-value entity-name="SalesInvoiceItemFact" value-field="fact"/>
+                <set field="fact.invoiceId" from-field="invoice.invoiceId"/>
+                <set field="fact.invoiceItemSeqId" from-field="invoiceItem.invoiceItemSeqId"/>
+                <!-- conversion of the invoice date -->
+                <if-not-empty field="invoice.invoiceDate">
+                    <clear-field field="inMap"/>
+                    <set field="inMap.dimensionEntityName" value="DateDimension"/>
+                    <set field="inMap.naturalKeyFields.dateValue" from-field="invoice.invoiceDate" type="Date"/>
+                    <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                        <result-to-field result-name="dimensionId" field="fact.invoiceDateDimId"/>
+                    </call-service>
+                    <if-empty field="fact.invoiceDateDimId">
+                        <set field="fact.invoiceDateDimId" value="_NF_"/>
+                    </if-empty>
+                <else>
+                    <set field="fact.invoiceDateDimId" value="_NA_"/>
+                </else>
+                </if-not-empty>
+                <!-- conversion of the product id -->
+                <if-not-empty field="invoiceItem.productId">
+                    <clear-field field="inMap"/>
+                    <set field="inMap.dimensionEntityName" value="ProductDimension"/>
+                    <set field="inMap.naturalKeyFields.productId" from-field="invoiceItem.productId"/>
+                    <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                        <result-to-field result-name="dimensionId" field="fact.productDimId"/>
+                    </call-service>
+                    <if-empty field="fact.productDimId">
+                        <set field="fact.productDimId" value="_NF_"/>
+                    </if-empty>
+                <else>
+                    <set field="fact.productDimId" value="_NA_"/>
+                </else>
+                </if-not-empty>
+                <!-- conversion of the invoice currency -->
+                <if-not-empty field="invoice.currencyUomId">
+                    <clear-field field="inMap"/>
+                    <set field="inMap.dimensionEntityName" value="CurrencyDimension"/>
+                    <set field="inMap.naturalKeyFields.currencyId" from-field="invoice.currencyUomId"/>
+                    <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                        <result-to-field result-name="dimensionId" field="fact.origCurrencyDimId"/>
+                    </call-service>
+                    <if-empty field="fact.origCurrencyDimId">
+                        <set field="fact.origCurrencyDimId" value="_NF_"/>
+                    </if-empty>
+                <else>
+                    <set field="fact.origCurrencyDimId" value="_NA_"/>
+                </else>
+                </if-not-empty>
+                <!-- TODO -->
+                <set field="fact.orderId" value="_NA_"/>
+                <set field="fact.billToCustomerDimId" value="_NA_"/>
+                <create-value value-field="fact"/>
+            </if-empty>
+            <!-- =============== -->
+            <!-- facts handling  -->
+            <!-- =============== -->
+            <set field="fact.quantity" from-field="invoiceItem.quantity" type="BigDecimal"/>
+            <set field="fact.extGrossAmount" value="0.0" type="BigDecimal"/>
+            <set field="fact.extDiscountAmount" value="0.0" type="BigDecimal"/>
+            <set field="fact.extTaxAmount" value="0.0" type="BigDecimal"/>
+            <set field="fact.extNetAmount" value="0.0" type="BigDecimal"/>
+            <calculate field="fact.extGrossAmount">
+                <calcop field="invoiceItem.quantity" operator="multiply">
+                    <calcop field="invoiceItem.amount" operator="get"/>
+                </calcop>
+            </calculate>
+            <!-- taxes -->
+            <clear-field field="andConditions"/>
+            <set field="andConditions.invoiceItemTypeId" value="ITM_SALES_TAX"/>
+            <get-related relation-name="ChildrenInvoiceItem" value-field="invoiceItem" list="taxes" map="andConditions"/>
+            <iterate list="taxes" entry="tax">
+                <calculate field="fact.extTaxAmount">
+                    <calcop field="fact.extTaxAmount" operator="add">
+                        <calcop field="tax.amount" operator="get"/>
+                    </calcop>
+                </calculate>
+            </iterate>
+            <!-- discounts -->
+            <clear-field field="andConditions"/>
+            <set field="andConditions.invoiceItemTypeId" value="ITM_PROMOTION_ADJ"/>
+            <get-related relation-name="ChildrenInvoiceItem" value-field="invoiceItem" list="discounts" map="andConditions"/>
+            <iterate list="discounts" entry="discount">
+                <calculate field="fact.extDiscountAmount" type="BigDecimal">
+                    <calcop field="fact.extDiscountAmount" operator="add">
+                        <calcop field="discount.amount" operator="negative"/>
+                    </calcop>
+                </calculate>
+            </iterate>
+
+            <calculate field="fact.extNetAmount">
+                <calcop field="fact.extGrossAmount" operator="subtract">
+                    <calcop field="fact.extDiscountAmount" operator="get"/>
+                </calcop>
+            </calculate>
+            <!-- TODO: prorate invoice header discounts and shipping charges -->
+            <!-- TODO: costs -->
+            <set field="fact.extManFixedCost" value="0.0" type="BigDecimal"/>
+            <set field="fact.extManVarCost" value="0.0" type="BigDecimal"/>
+            <set field="fact.extStorageCost" value="0.0" type="BigDecimal"/>
+            <set field="fact.extDistributionCost" value="0.0" type="BigDecimal"/>
+
+            <calculate field="fact.contributionAmount">
+                <calcop field="fact.extNetAmount" operator="subtract">
+                    <calcop field="fact.extManFixedCost" operator="get"/>
+                    <calcop field="fact.extManVarCost" operator="get"/>
+                    <calcop field="fact.extStorageCost" operator="get"/>
+                    <calcop field="fact.extDistributionCost" operator="get"/>
+                </calcop>
+            </calculate>
+
+            <store-value value-field="fact"/>
+        </if-compare>
+    </simple-method>
+
+    <simple-method method-name="loadSalesOrderFact" short-description="">
+        <entity-one entity-name="OrderHeader" value-field="orderHeader"/>
+        <if-empty field="orderHeader">
+            <add-error>
+                <fail-property resource="OrderErrorUiLabels" property="OrderOrderIdDoesNotExists"/>
+            </add-error>
+        </if-empty>
+        <check-errors/>
+        <if-compare field="orderHeader.orderTypeId" operator="equals" value="SALES_ORDER">
+            <if-compare field="orderHeader.statusId" operator="equals" value="ORDER_APPROVED">
+                <entity-condition entity-name="OrderItem" list="orderItems">
+                    <condition-list combine="and">
+                        <condition-expr field-name="orderId" operator="equals" from-field="orderHeader.orderId"/>
+                        <!--<condition-expr field-name="productId" operator="not-like" value="M00%"/>-->
+                        <condition-expr field-name="orderItemTypeId" operator="equals" value="PRODUCT_ORDER_ITEM"/>
+                        <!--<condition-expr field-name="statusId" operator="equals" value="ITEM_APPROVED"/>-->
+                    </condition-list>
+                </entity-condition>
+
+                <!--<set field="andConditions.orderItemTypeId" value="PRODUCT_ORDER_ITEM"/>
+                <get-related relation-name="OrderItem" value-field="orderHeader" list="orderItems" map="andConditions"/>-->
+
+                <iterate list="orderItems" entry="orderItem">
+                    <clear-field field="inMap"/>
+                    <set field="inMap.orderHeader" from-field="orderHeader"/>
+                    <set field="inMap.orderItem" from-field="orderItem"/>
+                    <set field="inMap.orderAdjustment" from-field="orderAdjustment"/>
+                    <call-service service-name="loadSalesOrderItemFact" in-map-name="inMap"/>
+                </iterate>
+            </if-compare>
+        </if-compare>
+    </simple-method>
+
+    <simple-method method-name="loadSalesOrderItemFact" short-description="">
+        <set field="orderHeader" from-field="parameters.orderHeader"/>
+        <set field="orderItem" from-field="parameters.orderItem"/>
+        <set field="orderAdjustment" from-field="parameters.orderAdjustment"/>
+        <if-empty field="orderHeader">
+            <entity-one entity-name="OrderHeader" value-field="orderHeader"/>
+        </if-empty>
+        <if-empty field="orderItem">
+            <entity-one entity-name="OrderItem" value-field="orderItem"/>
+        </if-empty>
+        <if-empty field="orderAdjustment">
+            <entity-and entity-name="OrderAdjustment" list="orderAdjustments">
+                <field-map field-name="orderId" from-field="orderItem.orderId"/>
+            </entity-and>
+        </if-empty>
+        <if-empty field="orderHeader">
+            <add-error>
+                <fail-property resource="OrderErrorUiLabels" property="OrderOrderIdDoesNotExists"/>
+            </add-error>
+        </if-empty>
+        <if-empty field="orderItem">
+            <add-error>
+                <fail-property resource="OrderErrorUiLabels" property="OrderOrderItemIdDoesNotExists"/>
+            </add-error>
+        </if-empty>
+        <check-errors/>
+
+        <if-compare field="orderHeader.statusId" operator="equals" value="ORDER_APPROVED">
+            <entity-one entity-name="SalesOrderItemFact" value-field="fact" auto-field-map="false">
+                <field-map field-name="orderId" from-field="orderItem.orderId"/>
+                <field-map field-name="orderItemSeqId" from-field="orderItem.orderItemSeqId"/>
+            </entity-one>
+            <!-- key handling -->
+            <if-empty field="fact">
+                <make-value entity-name="SalesOrderItemFact" value-field="fact"/>
+                <set field="fact.orderId" from-field="orderHeader.orderId"/>
+                <set field="fact.orderItemSeqId" from-field="orderItem.orderItemSeqId"/>
+                <set field="fact.productStoreId" from-field="orderHeader.productStoreId"/>
+                <set field="fact.salesChannelEnumId" from-field="orderHeader.salesChannelEnumId"/>
+                <set field="fact.statusId" from-field="orderItem.statusId"/>
+
+                <!-- account -->
+                <if-not-empty field="orderHeader.productStoreId">
+                    <entity-one entity-name="ProductStore" value-field="account">
+                        <field-map field-name="productStoreId" from-field="orderHeader.productStoreId"/>
+                    </entity-one>
+                    <set field="fact.account" from-field="account.storeName"/>
+                </if-not-empty>
+
+                <!-- pod -->
+                <if-compare field="orderHeader.currencyUom" operator="equals" value="EUR">
+                    <set field="fact.pod" value="Latin"/>
+                <else>
+                    <set field="fact.pod" value="English"/>
+                </else>
+                </if-compare>
+
+                <!-- brand -->
+                <if-not-empty field="orderHeader.salesChannelEnumId">
+                    <entity-one entity-name="Enumeration" value-field="brand">
+                        <field-map field-name="enumId" from-field="orderHeader.salesChannelEnumId"/>
+                    </entity-one>
+                    <set field="fact.brand" from-field="brand.description"/>
+                </if-not-empty>
+
+                <!-- conversion of the order date -->
+                <entity-condition entity-name="OrderStatus" list="orderStatusList">
+                    <condition-list combine="and">
+                        <condition-expr field-name="orderId" from-field="orderHeader.orderId"/>
+                        <condition-expr field-name="statusId" value="ORDER_APPROVED"/>
+                    </condition-list>
+                    <order-by field-name="-statusDatetime"/>
+                </entity-condition>
+                <first-from-list entry="orderStatus" list="orderStatusList"/>
+                <if-not-empty field="orderStatus.statusDatetime">
+                    <clear-field field="inMap"/>
+                    <set field="inMap.dimensionEntityName" value="DateDimension"/>
+                    <set field="inMap.naturalKeyFields.dateValue" from-field="orderStatus.statusDatetime" type="Date"/>
+                    <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                        <result-to-field result-name="dimensionId" field="fact.orderDateDimId"/>
+                    </call-service>
+                    <if-empty field="fact.orderDateDimId">
+                        <set field="fact.orderDateDimId" value="_NF_"/>
+                    </if-empty>
+                <else>
+                    <set field="fact.orderDateDimId" value="_NA_"/>
+                </else>
+                </if-not-empty>
+
+                <!-- conversion of the product id -->
+                <if-not-empty field="orderItem.productId">
+                    <clear-field field="inMap"/>
+                    <set field="inMap.dimensionEntityName" value="ProductDimension"/>
+                    <set field="inMap.naturalKeyFields.productId" from-field="orderItem.productId"/>
+                    <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                        <result-to-field result-name="dimensionId" field="fact.productDimId"/>
+                    </call-service>
+                    <if-empty field="fact.productDimId">
+                        <set field="fact.productDimId" value="_NF_"/>
+                    </if-empty>
+                <else>
+                    <set field="fact.productDimId" value="_NA_"/>
+                </else>
+                </if-not-empty>
+
+                <!-- conversion of the order currency -->
+                <if-not-empty field="orderHeader.currencyUom">
+                    <clear-field field="inMap"/>
+                    <set field="inMap.dimensionEntityName" value="CurrencyDimension"/>
+                    <set field="inMap.naturalKeyFields.currencyId" from-field="orderHeader.currencyUom"/>
+                    <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                        <result-to-field result-name="dimensionId" field="fact.origCurrencyDimId"/>
+                    </call-service>
+                    <if-empty field="fact.origCurrencyDimId">
+                        <set field="fact.origCurrencyDimId" value="_NF_"/>
+                    </if-empty>
+                <else>
+                    <set field="fact.origCurrencyDimId" value="_NA_"/>
+                </else>
+                </if-not-empty>
+
+                <!-- productCategoryId -->
+                <entity-and entity-name="ProductCategoryMember" list="productCategoryMembers">
+                    <field-map field-name="productId" from-field="orderItem.productId"/>
+                    <field-map field-name="thruDate" from-field="nullField"/>
+                </entity-and>
+                <if-not-empty field="productCategoryMembers">
+                    <first-from-list list="productCategoryMembers" entry="productCategoryMember"/>
+                    <set field="fact.productCategoryId" from-field="productCategoryMember.productCategoryId"/>
+                </if-not-empty>
+
+                <!-- TODO -->
+                <set field="fact.billToCustomerDimId" value="_NA_"/>
+
+                <create-value value-field="fact"/>
+            </if-empty>
+            <!-- =============== -->
+            <!-- facts handling  -->
+            <!-- =============== -->
+            <set field="fact.quantity" from-field="orderItem.quantity" type="BigDecimal"/>
+            <set field="fact.extGrossAmount" value="0" type="BigDecimal"/>
+            <set field="fact.extGrossCost" value="0" type="BigDecimal"/>
+            <set field="fact.extDiscountAmount" value="0" type="BigDecimal"/>
+            <set field="fact.extNetAmount" value="0" type="BigDecimal"/>
+            <set field="fact.extShippingAmount" value="0" type="BigDecimal"/>
+            <set field="fact.extTaxAmount" value="0" type="BigDecimal"/>
+
+            <set field="fact.GS" value="0" type="BigDecimal"/>
+            <set field="fact.GMS" value="0" type="BigDecimal"/>
+            <set field="fact.GMP" value="0" type="BigDecimal"/>
+            <set field="fact.GSS" value="0" type="BigDecimal"/>
+            <set field="fact.GSC" value="0" type="BigDecimal"/>
+            <set field="fact.GSP" value="0" type="BigDecimal"/>
+            <set field="fact.GP" value="0" type="BigDecimal"/>
+
+            <set field="fact.countOrder" value="0" type="BigDecimal"/>
+
+            <!-- extGrossAmount -->
+            <set field="convertUomCurrencyMap.uomId" from-field="orderHeader.currencyUom"/>
+            <set field="convertUomCurrencyMap.uomIdTo" value="USD"/>
+            <set field="convertUomCurrencyMap.nowDate" from-field="orderStatus.statusDatetime"/>
+            <call-service service-name="convertUomCurrency" in-map-name="convertUomCurrencyMap">
+                <result-to-field result-name="conversionFactor" field="exchangeRate"/>
+            </call-service>
+
+            <if-not-empty field="exchangeRate">
+                <calculate field="unitPrice">
+                    <calcop field="orderItem.unitPrice" operator="multiply">
+                        <calcop field="exchangeRate" operator="get"/>
+                    </calcop>
+                </calculate>
+
+                <calculate field="fact.extGrossAmount">
+                    <calcop field="fact.quantity" operator="multiply">
+                        <calcop field="unitPrice" operator="get"/>
+                    </calcop>
+                </calculate>
+            </if-not-empty>
+
+            <!-- extGrossCost -->
+            <entity-condition entity-name="SupplierProduct" list="costs">
+                <condition-list combine="and">
+                    <condition-expr field-name="productId" operator="equals" from-field="orderItem.productId"/>
+                    <condition-expr field-name="availableThruDate" operator="equals" from-field="nullField"/>
+                    <condition-expr field-name="minimumOrderQuantity" operator="equals" value="0"/>
+                </condition-list>
+            </entity-condition>
+            <if-not-empty field="costs">
+                <first-from-list entry="cost" list="costs"/>
+
+                <set field="convertUomCurrencyMap.uomId" from-field="cost.currencyUomId"/>
+                <set field="convertUomCurrencyMap.uomIdTo" value="USD"/>
+                <set field="convertUomCurrencyMap.nowDate" from-field="orderStatus.statusDatetime"/>
+                <call-service service-name="convertUomCurrency" in-map-name="convertUomCurrencyMap">
+                    <result-to-field result-name="conversionFactor" field="exchangeRate"/>
+                </call-service>
+
+                <if-not-empty field="exchangeRate">
+                    <calculate field="costPrice">
+                        <calcop field="cost.lastPrice" operator="multiply">
+                            <calcop field="exchangeRate" operator="get"/>
+                        </calcop>
+                    </calculate>
+
+                    <calculate field="fact.extGrossCost">
+                        <calcop field="fact.quantity" operator="multiply">
+                            <calcop field="costPrice" operator="get"/>
+                        </calcop>
+                    </calculate>
+                </if-not-empty>
+            </if-not-empty>
+
+            <!-- extShippingAmount -->
+            <iterate list="orderAdjustments" entry="shipping">
+                <if-compare field="shipping.orderAdjustmentTypeId" operator="equals" value="SHIPPING_CHARGES">
+                    <calculate field="fact.extShippingAmount">
+                        <calcop field="fact.extShippingAmount" operator="add">
+                            <calcop field="shipping.amount" operator="get"/>
+                        </calcop>
+                    </calculate>
+                </if-compare>
+            </iterate>
+
+            <!-- extTaxAmount -->
+            <iterate list="orderAdjustments" entry="tax">
+                <if-compare field="tax.orderAdjustmentTypeId" operator="equals" value="SALES_TAX">
+                    <calculate field="fact.extTaxAmount">
+                        <calcop field="fact.extTaxAmount" operator="add">
+                            <calcop field="tax.amount" operator="get"/>
+                        </calcop>
+                    </calculate>
+                </if-compare>
+            </iterate>
+
+            <!-- extDiscountAmount -->
+            <iterate list="orderAdjustments" entry="discount">
+                <if-compare field="discount.orderAdjustmentTypeId" operator="equals" value="PROMOTION_ADJUSTMENT">
+                    <calculate field="fact.extDiscountAmount">
+                        <calcop field="fact.extDiscountAmount" operator="add">
+                            <calcop field="discount.amount" operator="get"/>
+                        </calcop>
+                    </calculate>
+                    <!-- product promo code -->
+                    <entity-and entity-name="ProductPromoCode" list="productPromo">
+                        <field-map field-name="productPromoId" from-field="discount.productPromoId"/>
+                    </entity-and>
+                    <first-from-list entry="productPromoCode" list="productPromo"/>
+                    <if-not-empty field="productPromoCode">
+                        <set field="fact.productPromoCode" from-field="productPromoCode.productPromoCodeId"/>
+                        <else>
+                            <set field="fact.productPromoCode" value="Not require code"/>
+                        </else>
+                    </if-not-empty>
+                </if-compare>
+            </iterate>
+
+            <!-- extNetAmount -->
+            <calculate field="fact.extNetAmount">
+                <calcop field="fact.extGrossAmount" operator="subtract">
+                    <calcop field="fact.extDiscountAmount" operator="get"/>
+                </calcop>
+            </calculate>
+
+            <!-- GS -->
+            <set field="countGS" value="0"/>
+            <entity-and entity-name="SalesOrderItemFact" list="checkGSList">
+                <field-map field-name="orderId" from-field="orderHeader.orderId"/>
+            </entity-and>
+            <iterate entry="checkGS" list="checkGSList">
+                <if-not-empty field="checkGS.GS">
+                    <if-compare field="checkGS.GS" operator="not-equals" value="0">
+                        <set field="countGS" value="1"/>
+                    </if-compare>
+                </if-not-empty>
+            </iterate>
+            <if-compare field="countGS" operator="equals" value="0">
+                <set field="convertUomCurrencyMap.uomId" from-field="orderHeader.currencyUom"/>
+                <set field="convertUomCurrencyMap.uomIdTo" value="USD"/>
+                <set field="convertUomCurrencyMap.nowDate" from-field="orderStatus.statusDatetime"/>
+                <call-service service-name="convertUomCurrency" in-map-name="convertUomCurrencyMap">
+                    <result-to-field result-name="conversionFactor" field="exchangeRate"/>
+                </call-service>
+
+                <if-not-empty field="exchangeRate">
+                    <calculate field="fact.GS">
+                        <calcop field="orderHeader.grandTotal" operator="multiply">
+                            <calcop field="exchangeRate" operator="get"/>
+                        </calcop>
+                    </calculate>
+                </if-not-empty>
+            </if-compare>
+
+            <!-- GMS -->
+            <calculate field="fact.GMS">
+                <calcop field="fact.GMS" operator="add">
+                    <calcop field="fact.extGrossAmount" operator="get"/>
+                </calcop>
+            </calculate>
+
+            <!-- GMP -->
+            <calculate field="fact.GMP">
+                <calcop field="fact.GMS" operator="subtract">
+                    <calcop field="fact.extGrossCost" operator="get"/>
+                </calcop>
+            </calculate>
+
+            <!-- GSP -->
+            <set field="countGSP" value="0"/>
+            <entity-and entity-name="SalesOrderItemFact" list="checkGSPList">
+                <field-map field-name="orderId" from-field="orderHeader.orderId"/>
+            </entity-and>
+            <iterate entry="checkGSP" list="checkGSPList">
+                <if-not-empty field="checkGSP.GSP">
+                    <if-compare field="checkGSP.GSP" operator="not-equals" value="0">
+                        <set field="countGSP" value="1"/>
+                    </if-compare>
+                </if-not-empty>
+            </iterate>
+            <if-compare field="countGSP" operator="equals" value="0">
+                <entity-and list="orderItemList" entity-name="OrderItem">
+                    <field-map field-name="orderId" from-field="orderHeader.orderId"/>
+                </entity-and>
+
+                <set field="warrantyPrice" value="0" type="BigDecimal"/>
+                <iterate list="orderAdjustments" entry="warranty">
+                    <if-compare field="warranty.orderAdjustmentTypeId" operator="equals" value="WARRANTY_ADJUSTMENT">
+                        <calculate field="warrantyPrice">
+                            <calcop field="warrantyPrice" operator="add">
+                                <calcop field="warranty.amount" operator="get"/>
+                            </calcop>
+                        </calculate>
+                    </if-compare>
+                </iterate>
+                <calculate field="GSS">
+                    <calcop field="fact.extShippingAmount" operator="add">
+                        <calcop field="warrantyPrice" operator="get"/>
+                    </calcop>
+                </calculate>
+
+                <set field="convertUomCurrencyMap.uomId" from-field="orderHeader.currencyUom"/>
+                <set field="convertUomCurrencyMap.uomIdTo" value="USD"/>
+                <set field="convertUomCurrencyMap.nowDate" from-field="orderStatus.statusDatetime"/>
+                <call-service service-name="convertUomCurrency" in-map-name="convertUomCurrencyMap">
+                    <result-to-field result-name="conversionFactor" field="exchangeRate"/>
+                </call-service>
+
+                <if-not-empty field="exchangeRate">
+                    <calculate field="GSS">
+                        <calcop field="GSS" operator="multiply">
+                            <calcop field="exchangeRate" operator="get"/>
+                        </calcop>
+                    </calculate>
+                </if-not-empty>
+                <set field="fact.GSS" from-field="GSS"/>
+
+                <set field="fact.GSP" from-field="GSS" type="BigDecimal"/>
+            </if-compare>
+
+            <!-- GP -->
+            <calculate field="fact.GP">
+                <calcop field="fact.GMP" operator="add">
+                    <calcop field="fact.GSP" operator="get"/>
+                </calcop>
+            </calculate>
+
+            <!-- countOrder -->
+            <set field="countOrder" value="0"/>
+            <entity-and entity-name="SalesOrderItemFact" list="checkCountOrderList">
+                <field-map field-name="orderId" from-field="orderHeader.orderId"/>
+            </entity-and>
+            <iterate entry="checkCountOrder" list="checkCountOrderList">
+                <if-not-empty field="checkCountOrder.countOrder">
+                    <if-compare field="checkCountOrder.countOrder" operator="not-equals" value="0">
+                        <set field="countOrder" value="1"/>
+                    </if-compare>
+                </if-not-empty>
+            </iterate>
+            <if-compare field="countOrder" operator="equals" value="0">
+                <set field="fact.countOrder" value="1" type="BigDecimal"/>
+            </if-compare>
+
+            <store-value value-field="fact"/>
+        </if-compare>
+    </simple-method>
+
+    <simple-method method-name="loadSalesOrderDataDaily" short-description="Load Sales Order Data Daily">
+        <now-date-to-env field="nowDate"/>
+        <set field="yesterday" value="${groovy:
+            import java.text.SimpleDateFormat;
+            def sdf = new SimpleDateFormat(&quot;yyyy-MM-dd 07:00:00.000&quot;);
+            def yesterday = sdf.format(nowDate-1);
+            return yesterday;
+        }" type="Timestamp"/>
+        <set field="today" value="${groovy:
+            import java.text.SimpleDateFormat;
+            def sdf = new SimpleDateFormat(&quot;yyyy-MM-dd 07:00:00.000&quot;);
+            def today = sdf.format(nowDate);
+            return today;
+        }" type="Timestamp"/>
+
+         <set field="inMap.fromDate" from-field="yesterday"/>
+         <set field="inMap.thruDate" from-field="today"/>
+         <call-service service-name="importSalesOrderData" in-map-name="inMap"></call-service>
+    </simple-method>
+
+    <simple-method method-name="importSalesOrderData" short-description="Import Sales Order Data">
+        <set-service-fields service-name="loadDateDimension" map="parameters" to-map="inMap"/>
+        <set field="inMap.fromDate" from-field="parameters.fromDate"/>
+        <set field="inMap.thruDate" from-field="parameters.thruDate"/>
+        <call-service service-name="loadDateDimension" in-map-name="inMap"/>
+        <check-errors/>
+
+        <entity-condition list="orderStatusList" entity-name="OrderStatus">
+            <condition-list combine="and">
+                <condition-expr field-name="statusId" value="ORDER_APPROVED"/>
+                <condition-expr field-name="statusDatetime" operator="greater-equals" from-field="parameters.fromDate"/>
+                <condition-expr field-name="statusDatetime" operator="less" from-field="parameters.thruDate"/>
+            </condition-list>
+        </entity-condition>
+        <iterate list="orderStatusList" entry="orderHeader">
+            <clear-field field="inMap"/>
+            <set field="inMap.orderId" from-field="orderHeader.orderId"/>
+            <call-service service-name="loadSalesOrderFact" in-map-name="inMap"></call-service>
+            <check-errors/>
+        </iterate>
+    </simple-method>
+
+    <simple-method method-name="convertUomCurrency" short-description="Convert Uom Currency from UomConversionDated entity">
+        <if-empty field="parameters.nowDate">
+            <now field="now"/>
+            <set field="parameters.nowDate" from-field="now"/>
+        </if-empty>
+        <entity-condition entity-name="UomConversionDated" list="UomConversionDatedList">
+            <condition-list combine="and">
+                <condition-expr field-name="uomId" operator="equals" from-field="parameters.uomId"/>
+                <condition-expr field-name="uomIdTo" operator="equals" from-field="parameters.uomIdTo"/>
+                <condition-expr field-name="fromDate" operator="less-equals" from-field="parameters.nowDate"/>
+                <condition-expr field-name="thruDate" operator="greater" from-field="parameters.nowDate"/>
+            </condition-list>
+            <order-by field-name="-fromDate"/>
+        </entity-condition>
+        <if-not-empty field="UomConversionDatedList">
+            <first-from-list entry="UomConversion" list="UomConversionDatedList"/>
+            <field-to-result field="UomConversion.conversionFactor" result-name="conversionFactor"/>
+        <else>
+            <entity-condition entity-name="UomConversionDated" list="UomConversionDatedLastestList">
+                <condition-list combine="and">
+                    <condition-expr field-name="uomId" operator="equals" from-field="parameters.uomId"/>
+                    <condition-expr field-name="uomIdTo" operator="equals" from-field="parameters.uomIdTo"/>
+                    <condition-expr field-name="thruDate" operator="equals" from-field="nullField"/>
+                </condition-list>
+            </entity-condition>
+            <if-not-empty field="UomConversionDatedLastestList">
+                <first-from-list entry="UomConversionLastest" list="UomConversionDatedLastestList"/>
+                <field-to-result field="UomConversionLastest.conversionFactor" result-name="conversionFactor"/>
+            </if-not-empty>
+        </else>
+        </if-not-empty>
+    </simple-method>
+
+    <simple-method method-name="loadInventoryFact" short-description="">
+        <entity-one entity-name="InventoryItem" value-field="inventory">
+            <field-map field-name="inventoryItemId" from-field="parameters.inventoryItemId"/>
+        </entity-one>
+        <entity-one entity-name="InventoryItemFact" value-field="fact">
+            <field-map field-name="inventoryItemId" from-field="parameters.inventoryItemId"/>
+        </entity-one>
+        <if-empty field="fact">
+            <make-value value-field="fact" entity-name="InventoryItemFact"/>
+            <set field="fact.inventoryItemId" from-field="inventory.inventoryItemId"/>
+            <!-- conversion of the inventory date -->
+            <if-not-empty field="inventory.createdStamp">
+                <clear-field field="inMap"/>
+                <set field="inMap.dimensionEntityName" value="DateDimension"/>
+                <set field="inMap.naturalKeyFields.dateValue" from-field="inventory.createdStamp" type="Date"/>
+                <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                    <result-to-field result-name="dimensionId" field="fact.inventoryDateDimId"/>
+                </call-service>
+                <if-empty field="fact.inventoryDateDimId">
+                    <set field="fact.inventoryDateDimId" value="_NF_"/>
+                </if-empty>
+                <else>
+                    <set field="fact.inventoryDateDimId" value="_NA_"/>
+                </else>
+            </if-not-empty>
+            <!-- conversion of the product id -->
+            <if-not-empty field="inventory.productId">
+                <clear-field field="inMap"/>
+                <set field="inMap.dimensionEntityName" value="ProductDimension"/>
+                <set field="inMap.naturalKeyFields.productId" from-field="inventory.productId"/>
+                <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                    <result-to-field result-name="dimensionId" field="fact.productDimId"/>
+                </call-service>
+                <if-empty field="fact.productDimId">
+                    <set field="fact.productDimId" value="_NF_"/>
+                </if-empty>
+                <else>
+                    <set field="fact.productDimId" value="_NA_"/>
+                </else>
+            </if-not-empty>
+            <!-- conversion of the order currency -->
+            <if-not-empty field="inventory.currencyUomId">
+                <clear-field field="inMap"/>
+                <set field="inMap.dimensionEntityName" value="CurrencyDimension"/>
+                <set field="inMap.naturalKeyFields.currencyId" from-field="inventory.currencyUomId"/>
+                <call-service service-name="getDimensionIdFromNaturalKey" in-map-name="inMap">
+                    <result-to-field result-name="dimensionId" field="fact.origCurrencyDimId"/>
+                </call-service>
+                <if-empty field="fact.origCurrencyDimId">
+                    <set field="fact.origCurrencyDimId" value="_NF_"/>
+                </if-empty>
+                <else>
+                    <set field="fact.origCurrencyDimId" value="_NA_"/>
+                </else>
+            </if-not-empty>
+            <create-value value-field="fact"/>
+        </if-empty>
+
+        <set field="fact.facilityId" from-field="inventory.facilityId"/>
+        <set field="fact.inventoryItemId" from-field="inventory.inventoryItemId"/>
+        <set field="fact.quantityOnHandTotal" from-field="inventory.quantityOnHandTotal"/>
+        <set field="fact.availableToPromiseTotal" from-field="inventory.availableToPromiseTotal"/>
+        <set field="fact.unitCost" from-field="inventory.unitCost"/>
+
+        <!-- calculate sold out amount -->
+        <calculate field="fact.soldoutAmount">
+            <calcop operator="get" field="inventory.quantityOnHandTotal">
+                <calcop operator="negative" field="inventory.availableToPromiseTotal"/>
+            </calcop>
+        </calculate>
+        <store-value value-field="fact"/>
+    </simple-method>
+
+</simple-methods>

Propchange: ofbiz/trunk/specialpurpose/bi/script/org/ofbiz/bi/FactServices.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/specialpurpose/bi/script/org/ofbiz/bi/FactServices.xml
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/specialpurpose/bi/script/org/ofbiz/bi/FactServices.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: ofbiz/trunk/specialpurpose/bi/servicedef/secas.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/bi/servicedef/secas.xml?rev=1642027&view=auto
==============================================================================
--- ofbiz/trunk/specialpurpose/bi/servicedef/secas.xml (added)
+++ ofbiz/trunk/specialpurpose/bi/servicedef/secas.xml Thu Nov 27 06:14:06 2014
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<service-eca xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/service-eca.xsd">
+
+    <!-- dimension entities -->
+    <eca service="createProduct" event="global-commit-post-run">
+        <action service="loadType1ProductInProductDimension" mode="async"/>
+    </eca>
+    <eca service="updateProduct" event="global-commit-post-run">
+        <action service="loadType2ProductInProductDimension" mode="async"/>
+    </eca>
+
+    <!-- fact entities -->
+    <!-- Load data into the SalesInvoiceItemFact olap entity when a sales invoice is set to ready -->
+    <eca service="setInvoiceStatus" event="global-commit-post-run">
+        <condition field-name="statusId" operator="equals" value="INVOICE_READY"/>
+        <condition-field field-name="statusId" operator="not-equals" to-field-name="oldStatusId"/>
+        <action service="loadSalesInvoiceFact" mode="async" run-as-user="system"/>
+    </eca>
+    <!-- Load data into the SalesOrderItemFact olap entity when a sales order is set to ready -->
+    <!-- TODO: there are two eca for the same order status change: one of the two should be removed -->
+    <eca service="setOrderStatus" event="commit">
+        <condition field-name="statusId" operator="equals" value="ITEM_APPROVED"/>
+        <condition-field field-name="statusId" operator="not-equals" to-field-name="oldStatusId"/>
+        <action service="loadSalesOrderFact" mode="async" run-as-user="system"/>
+    </eca>
+    <eca service="changeOrderItemStatus" event="commit">
+        <condition field-name="statusId" operator="equals" value="ITEM_APPROVED"/>
+        <condition-field field-name="statusId" operator="not-equals" to-field-name="oldStatusId"/>
+        <action service="loadSalesOrderFact" mode="sync" run-as-user="system"/>
+    </eca>
+</service-eca>

Propchange: ofbiz/trunk/specialpurpose/bi/servicedef/secas.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/specialpurpose/bi/servicedef/secas.xml
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/specialpurpose/bi/servicedef/secas.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: ofbiz/trunk/specialpurpose/bi/servicedef/services.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/bi/servicedef/services.xml?rev=1642027&r1=1641394&r2=1642027&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/bi/servicedef/services.xml (original)
+++ ofbiz/trunk/specialpurpose/bi/servicedef/services.xml Thu Nov 27 06:14:06 2014
@@ -28,7 +28,6 @@ under the License.
         <attribute name="naturalKeyFields" type="List" mode="IN" optional="false"/> <!-- the names of the fields that compose the natural key of the dimension -->
         <attribute name="updateMode" type="String" mode="IN" optional="false"/> <!-- TYPE1, TYPE2, TYPE3 -->
     </service>
-
     <service name="getDimensionIdFromNaturalKey" engine="java"
         location="org.ofbiz.bi.util.DimensionServices" invoke="getDimensionIdFromNaturalKey" auth="true">
         <description>Generic service to get the dimensionId for a natural key.</description>
@@ -36,8 +35,6 @@ under the License.
         <attribute name="naturalKeyFields" type="Map" mode="IN" optional="false"/> <!-- the names/values pairs of the fields that compose the natural key of the dimension -->
         <attribute name="dimensionId" type="String" mode="OUT" optional="true"/>
     </service>
-
-    <!-- TODO: this should be moved outside of the bi component -->
     <service name="quickInitDataWarehouse" auth="true" engine="simple"
         location="component://bi/script/org/ofbiz/bi/DimensionServices.xml" invoke="quickInitDataWarehouse">
         <description>Quickly initialize the dimensions (Currency, Date, Product) and facts (SalesInvoiceItem): useful to quickly initialize the datawarehouse.</description>
@@ -45,4 +42,108 @@ under the License.
         <attribute name="thruDate" type="Timestamp" mode="IN" optional="false"/>
     </service>
 
+    <!-- Common Dimensions -->
+    <service name="loadDateDimension" engine="java" transaction-timeout="300"
+        location="org.ofbiz.bi.util.DimensionServices" invoke="loadDateDimension" auth="true">
+        <description>Loads data in the DateDimension entity (olap entity) using the update strategy of 'type 1': overwrite the values of the attributes</description>
+        <attribute name="fromDate" type="Timestamp" mode="IN" optional="false"/>
+        <attribute name="thruDate" type="Timestamp" mode="IN" optional="false"/>
+    </service>
+    <service name="loadCurrencyDimension" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/DimensionServices.xml" invoke="loadCurrencyDimension">
+        <description>Loads data in the CurrencyDimension entity (olap entity) using the update strategy of 'type 1': overwrite the values of the attributes</description>
+    </service>
+    <!-- Product Dimension -->
+    <service name="prepareProductDimensionData" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/DimensionServices.xml" invoke="prepareProductDimensionData">
+        <description>Pulls information from the Product* entities (oltp entities) and prepares data for the ProductDimension entity (olap entity)</description>
+        <attribute name="productId" type="String" mode="IN" optional="false"/>
+        <attribute name="productDimension" type="GenericEntity" mode="OUT" optional="false"/>
+    </service>
+    <service name="loadProductInProductDimension" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/DimensionServices.xml" invoke="loadProductInProductDimension">
+        <description>Pulls information from the Product* entities and stores them in the ProductDimension entity (olap entity)</description>
+        <attribute name="productId" type="String" mode="IN" optional="false"/>
+        <attribute name="updateMode" type="String" mode="IN" optional="false"/> <!-- TYPE1, TYPE2, TYPE3 -->
+    </service>
+    <service name="loadType1ProductInProductDimension" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/DimensionServices.xml" invoke="loadProductInProductDimension">
+        <description>Same as loadProductInProductDimension; the update strategy is 'type 1': overwrite the values of the attributes</description>
+        <attribute name="productId" type="String" mode="IN" optional="false"/>
+        <attribute name="updateMode" type="String" mode="IN" optional="true" default-value="TYPE1"/>
+    </service>
+    <service name="loadType2ProductInProductDimension" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/DimensionServices.xml" invoke="loadProductInProductDimension">
+        <description>Same as loadProductInProductDimension; the update strategy is 'type 2': add a dimension row</description>
+        <attribute name="productId" type="String" mode="IN" optional="false"/>
+        <attribute name="updateMode" type="String" mode="IN" optional="true" default-value="TYPE2"/>
+    </service>
+    <service name="loadAllProductsInProductDimension" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/DimensionServices.xml" invoke="loadAllProductsInProductDimension">
+        <description>Calls the loadProductInProductDimension service for all the products.</description>
+        <attribute name="updateMode" type="String" mode="IN" optional="true" default-value="TYPE1"/>
+    </service>
+
+    <!-- Accounting Facts -->
+    <service name="loadSalesInvoiceItemFact" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/FactServices.xml" invoke="loadSalesInvoiceItemFact">
+        <description>
+            Pulls information from the Invoice* entities and stores them in the SalesInvoiceItem entity (olap entity).
+            One of invoiceId/invoiceItemSeqId or invoice/invoiceItem must be passed or an error is returned.
+        </description>
+        <attribute name="invoiceId" type="String" mode="IN" optional="true"/>
+        <attribute name="invoiceItemSeqId" type="String" mode="IN" optional="true"/>
+        <attribute name="invoice" type="org.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
+        <attribute name="invoiceItem" type="org.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
+    </service>
+    <service name="loadSalesInvoiceFact" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/FactServices.xml" invoke="loadSalesInvoiceFact">
+        <description>Calls the loadSalesInvoiceItemFact service for all the invoice items.</description>
+        <attribute name="invoiceId" type="String" mode="IN" optional="false"/>
+    </service>
+
+    <!-- Order Facts -->
+    <service name="loadSalesOrderItemFact" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/FactServices.xml" invoke="loadSalesOrderItemFact">
+        <description>
+            Pulls information from the OrderItem* entities and stores them in the SalesOrderItem entity (olap entity).
+            One of orderId/orderItemSeqId or order/orderItem must be passed or an error is returned.
+        </description>
+        <attribute name="orderId" type="String" mode="IN" optional="true"/>
+        <attribute name="orderItemSeqId" type="String" mode="IN" optional="true"/>
+        <attribute name="orderHeader" type="org.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
+        <attribute name="orderItem" type="org.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
+        <attribute name="orderAdjustment " type="org.ofbiz.entity.GenericValue" mode="IN" optional="true"/>
+    </service>
+    <service name="loadSalesOrderFact" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/FactServices.xml" invoke="loadSalesOrderFact">
+        <description>Calls the loadSalesOrderItemFact service for all the order items.</description>
+        <attribute name="orderId" type="String" mode="IN" optional="false"/>
+    </service>
+    <service name="loadSalesOrderDataDaily" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/FactServices.xml" invoke="loadSalesOrderDataDaily" transaction-timeout="10000000">
+        <description>Load Sales Order Data Daily.</description>
+    </service>
+    <service name="importSalesOrderData" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/FactServices.xml" invoke="importSalesOrderData" transaction-timeout="10000000">
+        <description>Import Sales Order Data.</description>
+        <attribute name="fromDate" type="Timestamp" mode="IN" optional="false"/>
+        <attribute name="thruDate" type="Timestamp" mode="IN" optional="false"/>
+    </service>
+    <service name="convertUomCurrency" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/FactServices.xml" invoke="convertUomCurrency">
+        <description>Import Sales Order Data.</description>
+        <attribute name="uomId" type="String" mode="IN"/>
+        <attribute name="uomIdTo" type="String" mode="IN"/>
+        <attribute name="nowDate" type="Timestamp" mode="IN" optional="true"/>
+        <attribute name="conversionFactor" type="Double" mode="OUT" optional="true"/>
+    </service>
+
+    <!-- Inventory Facts -->
+    <service name="loadInventoryFact" auth="true" engine="simple"
+        location="component://bi/script/org/ofbiz/bi/FactServices.xml" invoke="loadInventoryFact">
+        <attribute name="inventoryItemId" type="String" mode="IN" optional="true"/>
+    </service>
+
+
 </services>

Modified: ofbiz/trunk/specialpurpose/bi/src/org/ofbiz/bi/util/DimensionServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/bi/src/org/ofbiz/bi/util/DimensionServices.java?rev=1642027&r1=1641394&r2=1642027&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/bi/src/org/ofbiz/bi/util/DimensionServices.java (original)
+++ ofbiz/trunk/specialpurpose/bi/src/org/ofbiz/bi/util/DimensionServices.java Thu Nov 27 06:14:06 2014
@@ -18,12 +18,16 @@ under the License.
 */
 package org.ofbiz.bi.util;
 
+import java.lang.Object;
+import java.lang.String;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
-import javolution.util.FastMap;
-
 import org.ofbiz.base.util.UtilGenerics;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.util.UtilProperties;
@@ -66,7 +70,7 @@ public class DimensionServices {
         Locale locale = (Locale) context.get("locale");
 
         try {
-            Map<String, Object> andCondition = FastMap.newInstance();
+            Map<String, Object> andCondition = new HashMap<String, Object>();
             for (String naturalKeyField: naturalKeyFields) {
                 andCondition.put(naturalKeyField, dimensionValue.get(naturalKeyField));
             }
@@ -104,4 +108,72 @@ public class DimensionServices {
         return ServiceUtil.returnSuccess();
     }
 
+    /*
+     * OLAP Dimension
+     * Service used to initialize the Date dimension (DateDimension).
+     * The DateDimension entity is a nearly constant dimension ("Slowly Changing Dimension" or SCD):
+     * the default strategy to handle data change is "Type 1" (i.e. overwrite the values).
+     */
+    public static Map<String, Object> loadDateDimension(DispatchContext ctx, Map<String, ? extends Object> context) {
+        Delegator delegator = ctx.getDelegator();
+
+        Date fromDate = (Date) context.get("fromDate");
+        Date thruDate = (Date) context.get("thruDate");
+
+        SimpleDateFormat monthNameFormat = new SimpleDateFormat("MMMM");
+        SimpleDateFormat dayNameFormat = new SimpleDateFormat("EEEE");
+        SimpleDateFormat dayDescriptionFormat = new SimpleDateFormat("MMMM d, yyyy");
+        SimpleDateFormat yearMonthDayFormat = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat yearMonthFormat = new SimpleDateFormat("yyyy-MM");
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(fromDate);
+        calendar.set(Calendar.HOUR, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        java.sql.Date currentDate = new java.sql.Date(calendar.getTimeInMillis());
+        while (currentDate.compareTo(thruDate) <= 0) {
+            GenericValue dateValue = null;
+            try {
+                dateValue = EntityUtil.getFirst(delegator.findByAnd("DateDimension", UtilMisc.toMap("dateValue", currentDate), null, false));
+            } catch (GenericEntityException gee) {
+                return ServiceUtil.returnError(gee.getMessage());
+            }
+            boolean newValue = (dateValue == null);
+            if (newValue) {
+                dateValue = delegator.makeValue("DateDimension");
+                dateValue.set("dimensionId", delegator.getNextSeqId("DateDimension"));
+                dateValue.set("dateValue", new java.sql.Date(currentDate.getTime()));
+            }
+            dateValue.set("description", dayDescriptionFormat.format(currentDate));
+            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+            dateValue.set("dayName", dayNameFormat.format(currentDate));
+            dateValue.set("dayOfMonth", new Long(calendar.get(Calendar.DAY_OF_MONTH)));
+            dateValue.set("dayOfYear", new Long(calendar.get(Calendar.DAY_OF_YEAR)));
+            dateValue.set("monthName", monthNameFormat.format(currentDate));
+
+            dateValue.set("monthOfYear", new Long(calendar.get(Calendar.MONTH) + 1));
+            dateValue.set("yearName", new Long(calendar.get(Calendar.YEAR)));
+            dateValue.set("weekOfMonth", new Long(calendar.get(Calendar.WEEK_OF_MONTH)));
+            dateValue.set("weekOfYear", new Long(calendar.get(Calendar.WEEK_OF_YEAR)));
+            dateValue.set("weekdayType", (dayOfWeek == 1 || dayOfWeek == 7? "Weekend": "Weekday"));
+            dateValue.set("yearMonthDay", yearMonthDayFormat.format(currentDate));
+            dateValue.set("yearAndMonth", yearMonthFormat.format(currentDate));
+
+            try {
+                if (newValue) {
+                    dateValue.create();
+                } else {
+                    dateValue.store();
+                }
+            } catch (GenericEntityException gee) {
+                return ServiceUtil.returnError(gee.getMessage());
+            }
+            calendar.add(Calendar.DATE, 1);
+            currentDate = new java.sql.Date(calendar.getTimeInMillis());
+        }
+        return ServiceUtil.returnSuccess();
+    }
+
 }

Modified: ofbiz/trunk/specialpurpose/build.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/build.xml?rev=1642027&r1=1642026&r2=1642027&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/build.xml (original)
+++ ofbiz/trunk/specialpurpose/build.xml Thu Nov 27 06:14:06 2014
@@ -38,6 +38,7 @@
         pos/build.xml,
         projectmgr/build.xml,
         scrum/build.xml,
+        bi/build.xml,
         webpos/build.xml
     "/>
 </project>

Modified: ofbiz/trunk/specialpurpose/component-load.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/component-load.xml?rev=1642027&r1=1642026&r2=1642027&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/component-load.xml (original)
+++ ofbiz/trunk/specialpurpose/component-load.xml Thu Nov 27 06:14:06 2014
@@ -38,6 +38,7 @@ under the License.
     <load-component component-location="ldap"/>
     <load-component component-location="webpos"/>
     <load-component component-location="birt"/>
+    <load-component component-location="bi"/>
     <load-component component-location="example"/>
     <load-component component-location="exampleext"/>
     <!-- <load-component component-location="jetty"/> -->