/*
 * 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.
 */

/*
 * Script to build the open order item report using
 * the OrderItemQuantityReportGroupByItem view.
 */


import org.apache.ofbiz.base.util.UtilMisc
import org.apache.ofbiz.entity.condition.*
import org.apache.ofbiz.entity.util.*
import org.apache.ofbiz.entity.*
import org.apache.ofbiz.base.util.*

productStoreId = ObjectType.simpleTypeConvert(parameters.productStoreId, "List", null, null)
orderTypeId = ObjectType.simpleTypeConvert(parameters.orderTypeId, "List", null, null)
orderStatusId = ObjectType.simpleTypeConvert(parameters.orderStatusId, "List", null, null)


// search by orderTypeId is mandatory
conditions = [EntityCondition.makeCondition("orderTypeId", EntityOperator.IN, orderTypeId)]

if (fromOrderDate) {
    conditions.add(EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, fromOrderDate))
}
if (thruOrderDate) {
    conditions.add(EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, thruOrderDate))
}

if (productStoreId) {
    conditions.add(EntityCondition.makeCondition("productStoreId", EntityOperator.IN, productStoreId))
    // for generating a title (given product store)
    context.productStore = from("ProductStore").where("productStoreId", productStoreId).cache(true).queryOne()
} else {
    // for generating a title (all stores)  TODO: use UtilProperties to internationalize
    context.productStore = [storeName : "All Stores"]
}
if (orderStatusId) {
    conditions.add(EntityCondition.makeCondition("orderStatusId", EntityOperator.IN, orderStatusId))
} else {
    // search all orders that are not completed, cancelled or rejected
    conditions.add(
            EntityCondition.makeCondition([
                    EntityCondition.makeCondition("orderStatusId", EntityOperator.NOT_EQUAL, "ORDER_COMPLETED"),
                    EntityCondition.makeCondition("orderStatusId", EntityOperator.NOT_EQUAL, "ORDER_CANCELLED"),
                    EntityCondition.makeCondition("orderStatusId", EntityOperator.NOT_EQUAL, "ORDER_REJECTED")
                    ], EntityOperator.AND)
            )
}

// item conditions
conditions.add(EntityCondition.makeCondition("orderItemStatusId", EntityOperator.NOT_EQUAL, "ITEM_COMPLETED"))
conditions.add(EntityCondition.makeCondition("orderItemStatusId", EntityOperator.NOT_EQUAL, "ITEM_CANCELLED"))
conditions.add(EntityCondition.makeCondition("orderItemStatusId", EntityOperator.NOT_EQUAL, "ITEM_REJECTED"))

// get the results as an entity list iterator
listIt = select("orderId", "orderDate", "productId", "quantityOrdered", "quantityIssued", "quantityOpen", "shipBeforeDate", "shipAfterDate", "itemDescription")
            .from("OrderItemQuantityReportGroupByItem")
            .where(conditions)
            .orderBy("orderDate DESC")
            .cursorScrollInsensitive()
            .distinct()
            .queryIterator()
orderItemList = []
totalCostPrice = 0.0
totalListPrice = 0.0
totalMarkup = 0.0
totalDiscount = 0.0
totalRetailPrice = 0.0
totalquantityOrdered = 0.0
totalquantityOpen = 0.0

listIt.each { listValue ->
    orderId = listValue.orderId
    productId = listValue.productId
    orderDate = listValue.orderDate
    quantityOrdered = listValue.quantityOrdered
    quantityOpen = listValue.quantityOpen
    quantityIssued = listValue.quantityIssued
    itemDescription = listValue.itemDescription
    shipAfterDate = listValue.shipAfterDate
    shipBeforeDate = listValue.shipBeforeDate
    productIdCondExpr =  [EntityCondition.makeCondition("productId", EntityOperator.EQUALS, productId)]
    productPrices = select("price","productPriceTypeId").from("ProductPrice").where(productIdCondExpr).queryList()
    costPrice = 0.0
    retailPrice = 0.0
    listPrice = 0.0

    productPrices.each { productPriceMap ->
        if (productPriceMap.productPriceTypeId.equals("AVERAGE_COST")) {
            costPrice = productPriceMap.price
        } else if (productPriceMap.productPriceTypeId.equals("DEFAULT_PRICE")) {
            retailPrice = productPriceMap.price
        } else if (productPriceMap.productPriceTypeId.equals("LIST_PRICE")) {
            listPrice = productPriceMap.price
        }
    }

    totalListPrice += listPrice
    totalRetailPrice += retailPrice
    totalCostPrice += costPrice
    totalquantityOrdered += quantityOrdered
    totalquantityOpen += quantityOpen
    costPriceDividendValue = costPrice
    if (costPriceDividendValue) {
        percentMarkup = ((retailPrice - costPrice)/costPrice)*100
    } else{
        percentMarkup = ""
    }
    orderItemMap = [orderDate : orderDate,
                    orderId : orderId,
                    productId : productId,
                    itemDescription : itemDescription,
                    quantityOrdered : quantityOrdered,
                    quantityIssued : quantityIssued,
                    quantityOpen : quantityOpen,
                    shipAfterDate : shipAfterDate,
                    shipBeforeDate : shipBeforeDate,
                    costPrice : costPrice,
                    retailPrice : retailPrice,
                    listPrice : listPrice,
                    discount : listPrice - retailPrice,
                    calculatedMarkup : retailPrice - costPrice,
                    percentMarkup : percentMarkup]
    orderItemList.add(orderItemMap)
}

listIt.close()
totalAmountList = []
if (orderItemList) {
    totalCostPriceDividendValue = totalCostPrice
    if (totalCostPriceDividendValue) {
        totalPercentMarkup = ((totalRetailPrice - totalCostPrice)/totalCostPrice)*100 
    } else{
        totalPercentMarkup = ""
    }
    totalAmountMap = [totalCostPrice : totalCostPrice,
                      totalListPrice : totalListPrice,
                      totalRetailPrice : totalRetailPrice,
                      totalquantityOrdered : totalquantityOrdered,
                      quantityOrdered : quantityOrdered,
                      totalquantityOpen : totalquantityOpen,
                      totalDiscount : totalListPrice - totalRetailPrice,
                      totalMarkup : totalRetailPrice - totalCostPrice,
                      totalPercentMarkup : totalPercentMarkup]
    totalAmountList.add(totalAmountMap)
}
context.orderItemList = orderItemList
context.totalAmountList = totalAmountList
