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

import java.util.*;
import java.sql.Timestamp;
import org.ofbiz.entity.*;
import org.ofbiz.base.util.*;
import org.ofbiz.entity.util.*;

module = "FindOrders.groovy";

// get the order types
orderTypes = from("OrderType").orderBy("description").queryList();
context.orderTypes = orderTypes;

// get the role types
roleTypes = from("RoleType").orderBy("description").queryList();
context.roleTypes = roleTypes;

// get the order statuses
orderStatuses = from("StatusItem").where("statusTypeId", "ORDER_STATUS").orderBy("sequenceId", "description").queryList();
context.orderStatuses = orderStatuses;

// get websites
websites = from("WebSite").orderBy("siteName").queryList();
context.webSites = websites;

// get the stores
stores = from("ProductStore").orderBy("storeName").queryList();
context.productStores = stores;

// get the channels
channels = from("Enumeration").where("enumTypeId", "ORDER_SALES_CHANNEL").orderBy("sequenceId").queryList();
context.salesChannels = channels;

// get the Shipping Methods
carrierShipmentMethods = from("CarrierShipmentMethod").queryList();
context.carrierShipmentMethods = carrierShipmentMethods;

// get the Payment Status
paymentStatusList = from("StatusItem").where("statusTypeId", "PAYMENT_PREF_STATUS").orderBy("description").queryList();
context.paymentStatusList = paymentStatusList;

// get the good identification types
goodIdentificationTypes = from("GoodIdentificationType").orderBy("goodIdentificationTypeId", "description").queryList();
context.goodIdentificationTypes = goodIdentificationTypes;

// current role type
currentRoleTypeId = request.getParameter("roleTypeId");
if (currentRoleTypeId) {
    currentRole = from("RoleType").where("roleTypeId", currentRoleTypeId).cache(true).queryOne();
    context.currentRole = currentRole;
}

// current selected type
currentTypeId = request.getParameter("orderTypeId");
if (currentTypeId) {
    currentType = from("OrderType").where("orderTypeId", currentTypeId).cache(true).queryOne();
    context.currentType = currentType;
}
// current selected status
currentStatusId = request.getParameter("orderStatusId");
if (currentStatusId) {
    currentStatus = from("StatusItem").where("statusId", currentStatusId).cache(true).queryOne();
    context.currentStatus = currentStatus;
}

// current website
currentWebSiteId = request.getParameter("orderWebSiteId");
if (currentWebSiteId) {
    currentWebSite = from("WebSite").where("webSiteId", currentWebSiteId).cache(true).queryOne();
    context.currentWebSite = currentWebSite;
}

// current store
currentProductStoreId = request.getParameter("productStoreId");
if (currentProductStoreId) {
    currentProductStore = from("ProductStore").where("productStoreId", currentProductStoreId).cache(true).queryOne();
    context.currentProductStore = currentProductStore;
}

// current Shipping Method
shipmentMethod = request.getParameter("shipmentMethod");
if (shipmentMethod) {
    carrierPartyId = shipmentMethod.substring(0, shipmentMethod.indexOf("@"));
    shipmentMethodTypeId = shipmentMethod.substring(shipmentMethod.indexOf("@")+1);
    if (carrierPartyId && shipmentMethodTypeId) {
        currentCarrierShipmentMethod = from("CarrierShipmentMethod").where("partyId", carrierPartyId, "shipmentMethodTypeId", shipmentMethodTypeId).queryFirst();
        context.currentCarrierShipmentMethod = currentCarrierShipmentMethod;
    }
}

// current channel
currentSalesChannelId = request.getParameter("salesChannelEnumId");
if (currentSalesChannelId) {
    currentSalesChannel = from("Enumeration").where("enumId", currentSalesChannelId).queryOne();
    context.currentSalesChannel = currentSalesChannel;
}

// current good identification type
currentGoodIdentificationTypeId = request.getParameter("goodIdentificationTypeId");
if (currentGoodIdentificationTypeId) {
    currentGoodIdentificationType = from("GoodIdentificationType").where("goodIdentificationTypeId", currentGoodIdentificationTypeId).queryOne();
    context.currentGoodIdentificationType = currentGoodIdentificationType;
}

// create the fromDate for calendar
fromCal = Calendar.getInstance();
fromCal.setTime(new java.util.Date());
fromCal.set(Calendar.DAY_OF_WEEK, fromCal.getActualMinimum(Calendar.DAY_OF_WEEK));
fromCal.set(Calendar.HOUR_OF_DAY, fromCal.getActualMinimum(Calendar.HOUR_OF_DAY));
fromCal.set(Calendar.MINUTE, fromCal.getActualMinimum(Calendar.MINUTE));
fromCal.set(Calendar.SECOND, fromCal.getActualMinimum(Calendar.SECOND));
fromCal.set(Calendar.MILLISECOND, fromCal.getActualMinimum(Calendar.MILLISECOND));
fromTs = new Timestamp(fromCal.getTimeInMillis());
fromStr = fromTs.toString();
fromStr = fromStr.substring(0, fromStr.indexOf('.'));
context.fromDateStr = fromStr;

// create the thruDate for calendar
toCal = Calendar.getInstance();
toCal.setTime(new java.util.Date());
toCal.set(Calendar.DAY_OF_WEEK, toCal.getActualMaximum(Calendar.DAY_OF_WEEK));
toCal.set(Calendar.HOUR_OF_DAY, toCal.getActualMaximum(Calendar.HOUR_OF_DAY));
toCal.set(Calendar.MINUTE, toCal.getActualMaximum(Calendar.MINUTE));
toCal.set(Calendar.SECOND, toCal.getActualMaximum(Calendar.SECOND));
toCal.set(Calendar.MILLISECOND, toCal.getActualMaximum(Calendar.MILLISECOND));
toTs = new Timestamp(toCal.getTimeInMillis());
toStr = toTs.toString();
context.thruDateStr = toStr;

// set the page parameters
viewIndex = request.getParameter("viewIndex") ? Integer.valueOf(request.getParameter("viewIndex")) : 1;
context.viewIndex = viewIndex;

viewSize = request.getParameter("viewSize") ? Integer.valueOf(request.getParameter("viewSize")) : 
                                                                EntityUtilProperties.getPropertyValue("widget", "widget.form.defaultViewSize", "20", delegator);
context.viewSize = viewSize;

// get the lookup flag
lookupFlag = request.getParameter("lookupFlag");

// fields from the service call
paramList = request.getAttribute("paramList") ?: "";
context.paramList = paramList;

if (paramList) {
    paramIds = paramList.split("&amp;");
    context.paramIdList = Arrays.asList(paramIds);
}

orderList = request.getAttribute("orderList");
context.orderList = orderList;

orderListSize = request.getAttribute("orderListSize");
context.orderListSize = orderListSize;

context.filterInventoryProblems = request.getAttribute("filterInventoryProblemsList");
context.filterPOsWithRejectedItems = request.getAttribute("filterPOsWithRejectedItemsList");
context.filterPOsOpenPastTheirETA = request.getAttribute("filterPOsOpenPastTheirETAList");
context.filterPartiallyReceivedPOs = request.getAttribute("filterPartiallyReceivedPOsList");

lowIndex = request.getAttribute("lowIndex");
context.lowIndex = lowIndex;

highIndex = request.getAttribute("highIndex");
context.highIndex = highIndex;
