Updating tracking data when orders are shipped as a batch

For general questions and discussions specific to the AbleCommerce GOLD ASP.Net shopping cart software.
Post Reply
Brewhaus
Vice Admiral (VADM)
Vice Admiral (VADM)
Posts: 878
Joined: Sat Jan 19, 2008 4:30 pm

Updating tracking data when orders are shipped as a batch

Post by Brewhaus » Mon Jul 22, 2013 1:21 pm

In 7.0.7 we have our Orders/Default.aspx.cs file updated so that when orders are marked shipped the tracking numbers will be moved from a 'temporary' table in our DB to the TrackingNumbers table. This is because UPS Worldship truncates the OrderShipmentID going into the TrackingNumbers table because it does not handle the field length correctly. Worldship takes the INT limitation of 4 to mean 4 characters, and truncates the information that it sends, so we had to set up a TrackingNumbersTest table with BIGINT for the OrderShipmentID and then have a routing run when we mark orders shipped that will move the tracking number, OrderShipmentID, and ShipGatewayID to the TrackingNumbers table. Unfortunately, the same customizations that we made to the Orders/Default.aspx.cs file in 7.0.7 do not work in Gold (compilation error).

The Default.aspx.cs file from 7.0.7 is below. Can someone help with how to update the code, or even confirm that it is alright to change the field type from INT to BIGINT in the TrackingNumbers table (or if it is even possible)?

Code: Select all

using System;
using System.Data;
using System.Configuration;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CommerceBuilder.Common;
using CommerceBuilder.Orders;
using CommerceBuilder.Payments;
using CommerceBuilder.Reporting;
using CommerceBuilder.Search;
using CommerceBuilder.Utility;
using System.Text;
// BEGIN MOD:  AbleMods.com
// 11/16/2011
using CommerceBuilder.Shipping;
// END MOD: AbleMods.com

public partial class Admin_Orders_Default : CommerceBuilder.Web.UI.AbleCommerceAdminPage
{
    protected void Page_Init(object sender, EventArgs e)
    {
        //GET ORDER STATUSES FOR STORE
        OrderStatusCollection statuses = OrderStatusDataSource.LoadForStore();
        OrderStatusCollection validStatuses = new OrderStatusCollection();
        OrderStatusCollection invalidStatuses = new OrderStatusCollection();
        //BUILD STATUS FILTER
        String statusNamePrefix = "- ";
        foreach (OrderStatus status in statuses)
        {
            if (status.IsValid)
            {
                validStatuses.Add(status);
            }
            else
            {
                invalidStatuses.Add(status);
            }            
        }
        // ADD VALID STATUSES
        StatusFilter.Items.Add(new ListItem("All Valid", "-2"));
        foreach (OrderStatus status in validStatuses)
        {
            StatusFilter.Items.Add(new ListItem(statusNamePrefix + status.Name, status.OrderStatusId.ToString()));
        }
        // ADD INVALID STATUSES
        StatusFilter.Items.Add(new ListItem("All Invalid", "-3"));
        foreach (OrderStatus status in invalidStatuses)
        {
            StatusFilter.Items.Add(new ListItem(statusNamePrefix + status.Name, status.OrderStatusId.ToString()));
        }
        // SET THE DEFAULT AS ALL-VALID
        StatusFilter.SelectedIndex = 1;

        //APPEND ORDER STATUS ACTIONS TO BATCH LIST
        string updateText = "Update status to {0}";
        foreach (OrderStatus status in statuses)
        {
            
            BatchAction.Items.Add(new ListItem(string.Format(updateText, status.Name), "OS_" + status.OrderStatusId));
        }

        InitDateQuickPick();
    }

    private void InitDateQuickPick()
    {
        StringBuilder js = new StringBuilder();
        js.AppendLine("function dateQP(selectDom) {");
        js.AppendLine("var startPicker = " + OrderStartDate.GetPickerClientId());
        js.AppendLine("var endPicker = " + OrderEndDate.GetPickerClientId());
        js.AppendLine("switch(selectDom.selectedIndex){");
        string setStart= "startPicker.setSelectedDate(new Date('{0}'));";
        string setEnd= "endPicker.setSelectedDate(new Date('{0}'));";
        string clearStart= "startPicker.clearSelectedDate();";
        string clearEnd= "endPicker.clearSelectedDate();";
        int startIndex = 1;

        DateQuickPick.Items.Add(new ListItem("Today"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 7 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-7).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 14 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-14).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 30 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-30).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 60 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-60).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 90 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-90).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 120 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-120).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("This Week"));
        DateTime startDate = LocaleHelper.LocalNow.AddDays(-1 * (int)LocaleHelper.LocalNow.DayOfWeek);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last Week"));
        startDate = LocaleHelper.LocalNow.AddDays((-1 * (int)LocaleHelper.LocalNow.DayOfWeek) - 7);
        DateTime endDate = startDate.AddDays(6);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(string.Format(setEnd, endDate.ToString("d")));
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("This Month"));
        startDate = new DateTime(LocaleHelper.LocalNow.Year, LocaleHelper.LocalNow.Month, 1);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last Month"));
        DateTime lastMonth = LocaleHelper.LocalNow.AddMonths(-1);
        startDate = new DateTime(lastMonth.Year, lastMonth.Month, 1);
        endDate = new DateTime(startDate.Year, startDate.Month, DateTime.DaysInMonth(lastMonth.Year,lastMonth.Month));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(string.Format(setEnd, endDate.ToString("d")));
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("This Year"));
        startDate = new DateTime(LocaleHelper.LocalNow.Year, 1, 1);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("All Dates"));
        startDate = new DateTime(LocaleHelper.LocalNow.Year, 1, 1);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(clearStart);
        js.Append(clearEnd);
        js.AppendLine("break;");

        // close switch
        js.Append("}");

        // reset quick picker
        js.AppendLine("selectDom.selectedIndex = 0;");
        js.Append("}");
        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "dateQP", js.ToString(), true);
        DateQuickPick.Attributes.Add("onChange", "dateQP(this)");
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            // GET DATE FROM QUERYSTRING
            int dateFilter = AlwaysConvert.ToInt(Request.QueryString["DateFilter"]);
            if (dateFilter == 1) OrderStartDate.SelectedDate = LocaleHelper.LocalNow;
            else if (dateFilter == 5) OrderStartDate.SelectedDate = LocaleHelper.LocalNow.AddDays(-30);
            else if (dateFilter == 7) OrderStartDate.SelectedDate = LocaleHelper.LocalNow.AddDays(-90);
            else dateFilter = 0;

            // GET ORDER STATUS FROM QUERY STRING
            int orderStatusId = AlwaysConvert.ToInt(Request.QueryString["OrderStatusId"]);
            if (orderStatusId > 0)
            {
                ListItem item = StatusFilter.Items.FindByValue(orderStatusId.ToString());
                if (item != null)
                {
                    StatusFilter.SelectedIndex = StatusFilter.Items.IndexOf(item);
                }
                else orderStatusId = 0;
            }

            //DO NOT LOAD LAST SEARCH IF QUERY STRING PARAMETERS WERE NOT SET
            if (dateFilter == 0 && orderStatusId == 0) LoadLastSearch();
        }
    }

    private void LoadLastSearch()
    {
        // LOAD CRITERIA FROM SESSION?
        OrderFilter criteria = Session["OrderFilter"] as OrderFilter;
        int selectStatusId = AlwaysConvert.ToInt(Session["OrderFilterSelectedStatus"]);
        if (criteria != null)
        {
            // SET THE ORDER STATUS FILTER            
            if (selectStatusId == 0) selectStatusId = -2;
            ListItem statusItem = StatusFilter.Items.FindByValue(selectStatusId.ToString());
            if (statusItem != null) StatusFilter.SelectedIndex = StatusFilter.Items.IndexOf(statusItem);
            //SET THE PAYMENT STATUS FILTER
            statusItem = PaymentStatusFilter.Items.FindByValue(((int)criteria.PaymentStatus).ToString());
            if (statusItem != null) statusItem.Selected = true;
            //SET THE SHIPMENT STATUS FILTER
            statusItem = ShipmentStatusFilter.Items.FindByValue(((int)criteria.ShipmentStatus).ToString());
            if (statusItem != null) statusItem.Selected = true;
            // SET THE ORDERNUMBER
            OrderNumberFilter.Text = criteria.OrderNumberRange;
            // SET THE KEYWORD FILTER
            KeywordSearchText.Text = criteria.Keyword;
            ListItem searchFieldItem = KeywordSearchField.Items.FindByValue(criteria.KeywordField.ToString());
            if (searchFieldItem != null) KeywordSearchField.SelectedIndex = KeywordSearchField.Items.IndexOf(searchFieldItem);
            //IF ORDER START DATE IS SPECIFIED, DETERMINE DEFAULT FOR DATE RANGE
            if (criteria.OrderDateStart > DateTime.MinValue && criteria.OrderDateStart < DateTime.MaxValue)
                OrderStartDate.SelectedDate = criteria.OrderDateStart;
            if (criteria.OrderDateEnd > DateTime.MinValue && criteria.OrderDateEnd < DateTime.MaxValue)
                OrderEndDate.SelectedDate = criteria.OrderDateEnd;
            // DISPLAY A RESET BUTTON
            ResetSearchButton.Visible = true;
        }
    }

    protected void SearchButton_Click(object sender, EventArgs e)
    {
        OrderGrid.PageIndex = 0;
        int pageSize = AlwaysConvert.ToInt(PageSize.SelectedValue);
        if (pageSize == 0) OrderGrid.AllowPaging = false;
        else
        {
            OrderGrid.AllowPaging = true;
            OrderGrid.PageSize = pageSize;
        }

        OrderGrid.DataBind();
        SearchResultAjax.Update();

        // DISPLAY THE RESET BUTTON
        ResetSearchButton.Visible = true;
    }

    protected void ResetButton_Click(object sender, EventArgs e)
    {
        // RESET THE SESSION
        Session.Remove("OrderFilter");
        Session.Remove("OrderFilterSelectedStatus");

        // RESET THE FORM
        // SET THE ORDER STATUS FILTER            
        ListItem statusItem = StatusFilter.Items.FindByValue("-2");
        if (statusItem != null) StatusFilter.SelectedIndex = StatusFilter.Items.IndexOf(statusItem);

        //SET THE PAYMENT STATUS FILTER
        statusItem = PaymentStatusFilter.Items.FindByValue("0");
        if (statusItem != null) PaymentStatusFilter.SelectedIndex = PaymentStatusFilter.Items.IndexOf(statusItem);

        //SET THE SHIPMENT STATUS FILTER
        statusItem = ShipmentStatusFilter.Items.FindByValue("0");
        if (statusItem != null) ShipmentStatusFilter.SelectedIndex = ShipmentStatusFilter.Items.IndexOf(statusItem);

        // SET THE ORDERNUMBER
        OrderNumberFilter.Text = string.Empty;

        // SET THE KEYWORD FILTER
        statusItem = KeywordSearchField.Items.FindByValue("OrderNotes");
        KeywordSearchField.SelectedIndex = KeywordSearchField.Items.IndexOf(statusItem);
        KeywordSearchText.Text = String.Empty;

        //RESET DATES
        OrderStartDate.SelectedDate = DateTime.MinValue;
        OrderEndDate.SelectedDate = DateTime.MinValue;

        // EXECUTE THE SEARCH AND HIDE THE RESET BUTTON
        SearchButton_Click(sender, e);
        ResetSearchButton.Visible = false;
    }

    protected void CreateOrderButton_Click(object sender, EventArgs e)
    {
        Response.Redirect("Create/CreateOrder1.aspx");
    }

    protected string GetOrderStatus(Object orderStatusId)
    {
        OrderStatus status = OrderStatusDataSource.Load((int)orderStatusId);
        if (status != null) return status.Name;
        return string.Empty;
    }

    protected string GetPaymentStatus(object dataItem)
    {
        Order order = (Order)dataItem;
        if (order.PaymentStatus == OrderPaymentStatus.Paid) return "Paid";
        if (order.Payments.Count > 0)
        {
            order.Payments.Sort("PaymentDate");
            Payment lastPayment = order.Payments[order.Payments.Count - 1];
            return StringHelper.SpaceName(lastPayment.PaymentStatus.ToString());
        }
        return order.PaymentStatus.ToString();
    }

    protected void OrderGrid_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName.Equals("Capture") || e.CommandName.Equals("Ship"))
        {
            int orderId = (int)OrderGrid.DataKeys[AlwaysConvert.ToInt(e.CommandArgument)].Value;
            Order order = OrderDataSource.Load(orderId);
            if (order != null)
            {
                if (e.CommandName.Equals("Capture"))
                {
                    if ((order.Payments.Count == 1) && (order.Payments[0].PaymentStatus == PaymentStatus.Authorized))
                    {
                        Response.Redirect("Payments/CapturePayment.aspx?PaymentId=" + order.Payments[0].PaymentId.ToString());
                    }
                }
                else
                {
                    foreach (OrderShipment shipment in order.Shipments)
                    {
                        if (shipment.ShipDate == System.DateTime.MinValue)
                        {
                            Response.Redirect("Shipments/ShipOrder.aspx?OrderShipmentId=" + shipment.OrderShipmentId.ToString());
                        }
                    }
                }
            }
            OrderGrid.DataBind();
        }
    }

    private List<int> GetSelectedOrderIds()
    {
        int indexPeg = OrderGrid.PageSize * OrderGrid.PageIndex;

        List<int> selectedOrders = new List<int>();
        foreach (GridViewRow row in OrderGrid.Rows)
        {
            CheckBox selected = (CheckBox)PageHelper.RecursiveFindControl(row, "Selected");
            if ((selected != null) && selected.Checked)
            {
                selectedOrders.Add((int)OrderGrid.DataKeys[row.DataItemIndex - indexPeg].Values[0]);
            }
        }
        return selectedOrders;
    }


    protected void OrderGrid_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if ((e.Row != null) && (e.Row.RowType == DataControlRowType.DataRow) && (e.Row.DataItem != null))
        {
            //FORCE RELOAD OF DATA ITEM - NEED MORE EFFICIENT SOLUTION TO REFRESH GRID FROM BATCH UPDATES
            //THIS PREVENTS DATA FROM DATABASE AND GRID BECOMING UNSYNCRHONIZED
            Order order = OrderDataSource.Load(((Order)e.Row.DataItem).OrderId, false);
            e.Row.DataItem = order;
        }
    }

    protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if ((e.Row != null) && (e.Row.RowType == DataControlRowType.DataRow) && (e.Row.DataItem != null))
        {
            Order order = (Order)e.Row.DataItem;
            PlaceHolder phPaymentStatus = PageHelper.RecursiveFindControl(e.Row, "phPaymentStatus") as PlaceHolder;
            if (phPaymentStatus != null)
            {
                Image paymentStatus = new Image();
                paymentStatus.SkinID = GetPaymentStatusSkinID(order);
                phPaymentStatus.Controls.Add(paymentStatus);
            }
            PlaceHolder phShipmentStatus = PageHelper.RecursiveFindControl(e.Row, "phShipmentStatus") as PlaceHolder;
            if (phShipmentStatus != null)
            {
                Image shipmentStatus = new Image();
                shipmentStatus.SkinID = GetShipmentStatusSkinID(order);
                phShipmentStatus.Controls.Add(shipmentStatus);
            }
        }
    }

    protected string GetPaymentStatusSkinID(Order order)
    {
        //if (order.OrderStatus.Name.Equals("Cancelled", StringComparison.InvariantCultureIgnoreCase)) return "CodeGreen";
		if (!order.OrderStatus.IsValid) return "CodeRed";
        
        switch (order.PaymentStatus)
        {
            case OrderPaymentStatus.Unspecified:
            case OrderPaymentStatus.Unpaid:
                return "CodeYellow";
            case OrderPaymentStatus.Problem:
                return "CodeRed";
            default:
                return "CodeGreen";
        }
    }

    protected string GetShipmentStatusSkinID(Order order)
    {
        //if (order.OrderStatus.Name.Equals("Cancelled", StringComparison.InvariantCultureIgnoreCase)) return "CodeGreen";
        if (!order.OrderStatus.IsValid) return "CodeRed";
        
        switch (order.ShipmentStatus)
        {
            case OrderShipmentStatus.Unspecified:
            case OrderShipmentStatus.Unshipped:
                return "CodeYellow";
            default:
                return "CodeGreen";
        }
    }

    protected void OrderGrid_DataBound(object sender, EventArgs e)
    {
        foreach (GridViewRow gvr in OrderGrid.Rows)
        {
            CheckBox cb = (CheckBox)gvr.FindControl("Selected");
            ScriptManager.RegisterArrayDeclaration(OrderGrid, "CheckBoxIDs", String.Concat("'", cb.ClientID, "'"));
        }
        selectedOrdersPanel.Visible = (OrderGrid.Rows.Count > 0);
    }

    protected void BatchButton_Click(object sender, EventArgs e)
    {
        List<string> messages = new List<string>();
        List<int> orderIds = GetSelectedOrderIds();
        if (orderIds.Count > 0)
        {
            if (BatchAction.SelectedValue.StartsWith("OS_"))
            {
                //UPDATE ORDER STATUS REQUESTED
                int orderStatusId = AlwaysConvert.ToInt(BatchAction.SelectedValue.Substring(3));
                //VALIDATE STATUS
                OrderStatus status = OrderStatusDataSource.Load(orderStatusId);
                if (status != null)
                {
                    foreach (int orderId in orderIds)
                    {
                        Order order = OrderDataSource.Load(orderId);
                        if (order != null)
                        {
                            order.UpdateOrderStatus(status);
                        }
                    }
                }
            }
            else
            {
                switch (BatchAction.SelectedValue)
                {
                    case "PULLSHEET":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/PullSheet.aspx");
                        break;
                    case "BHINVOICE":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/BHInvoice.aspx");
                        break;
                    case "HSDINVOICE":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/HSDInvoice.aspx");
                        break;
                    case "BHPACKSLIP":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/BHPackSlip.aspx");
                        break;
                    case "HSDPACKSLIP":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/HSDPackSlip.aspx");
                        break;
                    case "CANCEL":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Batch/Cancel.aspx");
                        break;
                    case "SHIPOPT":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Batch/Ship.aspx");
                        break;
                    case "SHIP":
                        int shipCount = 0;
                        foreach (int orderId in orderIds)
                        {
                            Order order = OrderDataSource.Load(orderId);
                            if (order != null && order.Shipments != null)
                            {
                                bool shipped = false;
                                int shipmentCount = order.Shipments.Count;
                                for (int i = 0; i < shipmentCount; i++)
                                {
                                    OrderShipment shipment = order.Shipments[i];
                                    if (shipment != null && !shipment.IsShipped)
                                    {
                                        shipment.Ship();
                                        shipped = true;
                                    }
                                }
                                if (shipped)
                                {
                                    messages.Add("Order #" + order.OrderNumber + " shipped.");
                                    shipCount++;
                                }
                                else messages.Add("Order #" + order.OrderNumber + " did not have any unshipped items.");
                            }
                        }
                        messages.Add(shipCount + " orders shipped.");
                        //update trackingnumbers
                        int resultCount = 0;
                        resultCount = UpdateTrackingNumbers();
                        messages.Add(String.Format("<br/>Updated tracking status for {0} shipments.", resultCount.ToString()));
                        break;
                    case "PAY":
                        int payCount = 0;
                        foreach (int orderId in orderIds)
                        {
                            Order order = OrderDataSource.Load(orderId);
                            if (order != null)
                            {
                                bool paid = false;
                                int paymentCount = order.Payments.Count;
                                for (int i = 0; i < paymentCount; i++)
                                {
                                    Payment payment = order.Payments[i];
                                    if (payment.PaymentStatus == PaymentStatus.Authorized)
                                    {
                                        payment.Capture(payment.Amount, true);
                                        paid = true;
                                    }
                                    else if (payment.PaymentStatus == PaymentStatus.Unprocessed)
                                    {
                                        payment.Authorize();
                                        paid = true;
                                    }
                                }
                                if (paid)
                                {
                                    payCount++;
                                    messages.Add("Order " + order.OrderNumber.ToString() + " processed.");
                                }
                                else messages.Add("Order " + order.OrderNumber.ToString() + " does not have any payments to be processed.");
                            }
                        }
                        messages.Add(payCount + " orders processed.");
                        break;
                }
            }
        }
        if (messages.Count > 0)
        {
            trBatchMessage.Visible = true;
            BatchMessage.Text = string.Join("<br />", messages.ToArray());
        }
        BatchAction.SelectedIndex = -1;
        OrderGrid.DataBind();
    }

    protected OrderFilter GetOrderFilter()
    {
        // CREATE CRITERIA INSTANCE
        OrderFilter criteria = new OrderFilter();
        if (OrderStartDate.SelectedStartDate > DateTime.MinValue)
            criteria.OrderDateStart = OrderStartDate.SelectedStartDate;
        if (OrderEndDate.SelectedEndDate > DateTime.MinValue && OrderEndDate.SelectedEndDate < DateTime.MaxValue)
            criteria.OrderDateEnd = OrderEndDate.SelectedEndDate;
        criteria.OrderNumberRange = OrderNumberFilter.Text;
        criteria.PaymentStatus = (OrderPaymentStatus)AlwaysConvert.ToByte(PaymentStatusFilter.SelectedValue);
        criteria.ShipmentStatus = (OrderShipmentStatus)AlwaysConvert.ToByte(ShipmentStatusFilter.SelectedValue);
        // ADD IN ORDER STATUS FILTER
        int statusId = 0;
        if (StatusFilter.SelectedValue == "-2")
        {
            OrderStatusCollection statuses = OrderStatusDataSource.LoadForStore();            
            foreach (OrderStatus status in statuses)
            {
                if (status.IsValid)
                {
                    criteria.OrderStatus.Add(status.OrderStatusId);
                }
            }
        }
        else if (StatusFilter.SelectedValue == "-3")
        {
            OrderStatusCollection statuses = OrderStatusDataSource.LoadForStore();
            foreach (OrderStatus status in statuses)
            {
                if (!status.IsValid)
                {
                    criteria.OrderStatus.Add(status.OrderStatusId);
                }
            }
        }
        else
        {
            statusId =  AlwaysConvert.ToInt(StatusFilter.SelectedValue);
            if (statusId > 0) criteria.OrderStatus.Add(statusId);
        }
       
        // ADD IN KEYWORD FILTER
        criteria.Keyword = KeywordSearchText.Text;
        criteria.KeywordField = (OrderFilter.KeywordFieldType)Enum.Parse(typeof(OrderFilter.KeywordFieldType), KeywordSearchField.Text, true);

        // RETURN THE CRITERIA OBJECT
        Session["OrderFilter"] = criteria;
        Session["OrderFilterSelectedStatus"] = StatusFilter.SelectedValue;
        return criteria;
    }

    protected void OrderDs_Selecting(object sender, System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs e)
    {
        // ADD IN THE SEARCH CRITERIA
        e.InputParameters["filter"] = GetOrderFilter();
    }

    protected void JumpToOrderButton_Click(Object sender, EventArgs e)
    {
        int tempOrderNumber = AlwaysConvert.ToInt(JumpToOrderNumber.Text);
        Order order = OrderDataSource.Load(OrderDataSource.LookupOrderId(tempOrderNumber));
        if (order != null)
        {
            Response.Redirect("~/Admin/Orders/ViewOrder.aspx?OrderNumber=" + order.OrderNumber.ToString() + "&OrderId=" + order.OrderId.ToString());
        }
        else
        {
            CustomValidator invalidOrderId = new CustomValidator();
            invalidOrderId.ControlToValidate = "JumpToOrderNumber";
            invalidOrderId.Text = "not found, try search!";
            invalidOrderId.IsValid = false;
            invalidOrderId.ValidationGroup = "JumpToOrder";
            phJumpToOrder.Controls.Add(invalidOrderId);
        }
    }

    // BEGIN MOD:  AbleMods.com
    // 11/16/2011
    // NOTE:  You MUST add the reference to CommerceBuilder.Shipping to the top
    // of this page.  Otherwise this code will not work as written
    protected int UpdateTrackingNumbers()
    {
        //Microsoft.Practices.EnterpriseLibrary.Data.Database database = Token.Instance.Database;
        //comment out line above and use the following after an upgrade to 7.0.3 +
        CommerceBuilder.Data.Database database = Token.Instance.Database;
        string sql = ("SELECT * FROM ac_TrackingNumbersTest");
        int resultCount = 0;
        string deleteSql = ("DELETE from ac_TrackingNumbersTest");
        int deletedCount = 0;
        using (System.Data.Common.DbCommand selectCommand = database.GetSqlStringCommand(sql))
        {
            IDataReader dr = database.ExecuteReader(selectCommand);
            while (dr.Read())
            {
                TrackingNumber trackingNumber = new TrackingNumber();
                int orderShipmentId = AlwaysConvert.ToInt(dr["OrderShipmentId"]);
                int shipGatewayId = AlwaysConvert.ToInt(dr["ShipGatewayId"]);
                OrderShipment shipment = new OrderShipment();
                shipment = OrderShipmentDataSource.Load(AlwaysConvert.ToInt(dr["OrderShipmentId"]));
                ShipGateway shipGateway = new ShipGateway();
                shipGateway = ShipGatewayDataSource.Load(shipGatewayId);
                trackingNumber.TrackingNumberData = AlwaysConvert.ToString(dr["TrackingNumberData"]);

                if (shipment != null && shipGateway != null)
                {
                    trackingNumber.OrderShipmentId = orderShipmentId;
                    trackingNumber.ShipGatewayId = shipGatewayId;

                    trackingNumber.Save();
                    resultCount++;
                }

                using (System.Data.Common.DbCommand deleteCommand = database.GetSqlStringCommand(deleteSql))
                {
                    deletedCount = database.ExecuteNonQuery(deleteCommand);
                }

            }
        }
        return resultCount;
    }


    // END MOD: AbleMods.com

}
Rick Morris
Brewhaus (America) Inc.
Hot Sauce Depot

Brewhaus
Vice Admiral (VADM)
Vice Admiral (VADM)
Posts: 878
Joined: Sat Jan 19, 2008 4:30 pm

Re: Updating tracking data when orders are shipped as a batch

Post by Brewhaus » Sat Jul 27, 2013 7:37 pm

Is anyone able to help with this? I have pasted the code below (from Admin/Orders/Default.aspx.cs) with the portions that appear to handle the tracking number movement in our 7.0.7 site shown with comments above and below the custom code, but when we copy these pieces across to the same file in Gold we get a compilation error. I am happy to say that this seems to be the last customization that we need to complete in order to move to Gold, but without it we are dead in the water. :-(

I am betting that there is just something in the code that needs to be tweaked for Gold, but I am not seeing it.

Code: Select all

using System;
using System.Data;
using System.Configuration;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CommerceBuilder.Common;
using CommerceBuilder.Orders;
using CommerceBuilder.Payments;
using CommerceBuilder.Reporting;
using CommerceBuilder.Search;
using CommerceBuilder.Utility;
using System.Text;
// BEGIN MOD FOR TRACKING NUMBER EXPORT
// 11/16/2011
using CommerceBuilder.Shipping;
// END MOD FOR TRACKING NUMBER EXPORT

public partial class Admin_Orders_Default : CommerceBuilder.Web.UI.AbleCommerceAdminPage
{
    protected void Page_Init(object sender, EventArgs e)
    {
        //GET ORDER STATUSES FOR STORE
        OrderStatusCollection statuses = OrderStatusDataSource.LoadForStore();
        OrderStatusCollection validStatuses = new OrderStatusCollection();
        OrderStatusCollection invalidStatuses = new OrderStatusCollection();
        //BUILD STATUS FILTER
        String statusNamePrefix = "- ";
        foreach (OrderStatus status in statuses)
        {
            if (status.IsValid)
            {
                validStatuses.Add(status);
            }
            else
            {
                invalidStatuses.Add(status);
            }            
        }
        // ADD VALID STATUSES
        StatusFilter.Items.Add(new ListItem("All Valid", "-2"));
        foreach (OrderStatus status in validStatuses)
        {
            StatusFilter.Items.Add(new ListItem(statusNamePrefix + status.Name, status.OrderStatusId.ToString()));
        }
        // ADD INVALID STATUSES
        StatusFilter.Items.Add(new ListItem("All Invalid", "-3"));
        foreach (OrderStatus status in invalidStatuses)
        {
            StatusFilter.Items.Add(new ListItem(statusNamePrefix + status.Name, status.OrderStatusId.ToString()));
        }
        // SET THE DEFAULT AS ALL-VALID
        StatusFilter.SelectedIndex = 1;

        //APPEND ORDER STATUS ACTIONS TO BATCH LIST
        string updateText = "Update status to {0}";
        foreach (OrderStatus status in statuses)
        {
            
            BatchAction.Items.Add(new ListItem(string.Format(updateText, status.Name), "OS_" + status.OrderStatusId));
        }

        InitDateQuickPick();
    }

    private void InitDateQuickPick()
    {
        StringBuilder js = new StringBuilder();
        js.AppendLine("function dateQP(selectDom) {");
        js.AppendLine("var startPicker = " + OrderStartDate.GetPickerClientId());
        js.AppendLine("var endPicker = " + OrderEndDate.GetPickerClientId());
        js.AppendLine("switch(selectDom.selectedIndex){");
        string setStart= "startPicker.setSelectedDate(new Date('{0}'));";
        string setEnd= "endPicker.setSelectedDate(new Date('{0}'));";
        string clearStart= "startPicker.clearSelectedDate();";
        string clearEnd= "endPicker.clearSelectedDate();";
        int startIndex = 1;

        DateQuickPick.Items.Add(new ListItem("Today"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 7 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-7).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 14 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-14).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 30 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-30).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 60 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-60).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 90 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-90).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last 120 Days"));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, LocaleHelper.LocalNow.AddDays(-120).ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("This Week"));
        DateTime startDate = LocaleHelper.LocalNow.AddDays(-1 * (int)LocaleHelper.LocalNow.DayOfWeek);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last Week"));
        startDate = LocaleHelper.LocalNow.AddDays((-1 * (int)LocaleHelper.LocalNow.DayOfWeek) - 7);
        DateTime endDate = startDate.AddDays(6);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(string.Format(setEnd, endDate.ToString("d")));
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("This Month"));
        startDate = new DateTime(LocaleHelper.LocalNow.Year, LocaleHelper.LocalNow.Month, 1);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("Last Month"));
        DateTime lastMonth = LocaleHelper.LocalNow.AddMonths(-1);
        startDate = new DateTime(lastMonth.Year, lastMonth.Month, 1);
        endDate = new DateTime(startDate.Year, startDate.Month, DateTime.DaysInMonth(lastMonth.Year,lastMonth.Month));
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(string.Format(setEnd, endDate.ToString("d")));
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("This Year"));
        startDate = new DateTime(LocaleHelper.LocalNow.Year, 1, 1);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(string.Format(setStart, startDate.ToString("d")));
        js.Append(clearEnd);
        js.AppendLine("break;");

        DateQuickPick.Items.Add(new ListItem("All Dates"));
        startDate = new DateTime(LocaleHelper.LocalNow.Year, 1, 1);
        js.Append("case " + (startIndex++).ToString() + ": ");
        js.Append(clearStart);
        js.Append(clearEnd);
        js.AppendLine("break;");

        // close switch
        js.Append("}");

        // reset quick picker
        js.AppendLine("selectDom.selectedIndex = 0;");
        js.Append("}");
        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "dateQP", js.ToString(), true);
        DateQuickPick.Attributes.Add("onChange", "dateQP(this)");
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            // GET DATE FROM QUERYSTRING
            int dateFilter = AlwaysConvert.ToInt(Request.QueryString["DateFilter"]);
            if (dateFilter == 1) OrderStartDate.SelectedDate = LocaleHelper.LocalNow;
            else if (dateFilter == 5) OrderStartDate.SelectedDate = LocaleHelper.LocalNow.AddDays(-30);
            else if (dateFilter == 7) OrderStartDate.SelectedDate = LocaleHelper.LocalNow.AddDays(-90);
            else dateFilter = 0;

            // GET ORDER STATUS FROM QUERY STRING
            int orderStatusId = AlwaysConvert.ToInt(Request.QueryString["OrderStatusId"]);
            if (orderStatusId > 0)
            {
                ListItem item = StatusFilter.Items.FindByValue(orderStatusId.ToString());
                if (item != null)
                {
                    StatusFilter.SelectedIndex = StatusFilter.Items.IndexOf(item);
                }
                else orderStatusId = 0;
            }

            //DO NOT LOAD LAST SEARCH IF QUERY STRING PARAMETERS WERE NOT SET
            if (dateFilter == 0 && orderStatusId == 0) LoadLastSearch();
        }
    }

    private void LoadLastSearch()
    {
        // LOAD CRITERIA FROM SESSION?
        OrderFilter criteria = Session["OrderFilter"] as OrderFilter;
        int selectStatusId = AlwaysConvert.ToInt(Session["OrderFilterSelectedStatus"]);
        if (criteria != null)
        {
            // SET THE ORDER STATUS FILTER            
            if (selectStatusId == 0) selectStatusId = -2;
            ListItem statusItem = StatusFilter.Items.FindByValue(selectStatusId.ToString());
            if (statusItem != null) StatusFilter.SelectedIndex = StatusFilter.Items.IndexOf(statusItem);
            //SET THE PAYMENT STATUS FILTER
            statusItem = PaymentStatusFilter.Items.FindByValue(((int)criteria.PaymentStatus).ToString());
            if (statusItem != null) statusItem.Selected = true;
            //SET THE SHIPMENT STATUS FILTER
            statusItem = ShipmentStatusFilter.Items.FindByValue(((int)criteria.ShipmentStatus).ToString());
            if (statusItem != null) statusItem.Selected = true;
            // SET THE ORDERNUMBER
            OrderNumberFilter.Text = criteria.OrderNumberRange;
            // SET THE KEYWORD FILTER
            KeywordSearchText.Text = criteria.Keyword;
            ListItem searchFieldItem = KeywordSearchField.Items.FindByValue(criteria.KeywordField.ToString());
            if (searchFieldItem != null) KeywordSearchField.SelectedIndex = KeywordSearchField.Items.IndexOf(searchFieldItem);
            //IF ORDER START DATE IS SPECIFIED, DETERMINE DEFAULT FOR DATE RANGE
            if (criteria.OrderDateStart > DateTime.MinValue && criteria.OrderDateStart < DateTime.MaxValue)
                OrderStartDate.SelectedDate = criteria.OrderDateStart;
            if (criteria.OrderDateEnd > DateTime.MinValue && criteria.OrderDateEnd < DateTime.MaxValue)
                OrderEndDate.SelectedDate = criteria.OrderDateEnd;
            // DISPLAY A RESET BUTTON
            ResetSearchButton.Visible = true;
        }
    }

    protected void SearchButton_Click(object sender, EventArgs e)
    {
        OrderGrid.PageIndex = 0;
        int pageSize = AlwaysConvert.ToInt(PageSize.SelectedValue);
        if (pageSize == 0) OrderGrid.AllowPaging = false;
        else
        {
            OrderGrid.AllowPaging = true;
            OrderGrid.PageSize = pageSize;
        }

        OrderGrid.DataBind();
        SearchResultAjax.Update();

        // DISPLAY THE RESET BUTTON
        ResetSearchButton.Visible = true;
    }

    protected void ResetButton_Click(object sender, EventArgs e)
    {
        // RESET THE SESSION
        Session.Remove("OrderFilter");
        Session.Remove("OrderFilterSelectedStatus");

        // RESET THE FORM
        // SET THE ORDER STATUS FILTER            
        ListItem statusItem = StatusFilter.Items.FindByValue("-2");
        if (statusItem != null) StatusFilter.SelectedIndex = StatusFilter.Items.IndexOf(statusItem);

        //SET THE PAYMENT STATUS FILTER
        statusItem = PaymentStatusFilter.Items.FindByValue("0");
        if (statusItem != null) PaymentStatusFilter.SelectedIndex = PaymentStatusFilter.Items.IndexOf(statusItem);

        //SET THE SHIPMENT STATUS FILTER
        statusItem = ShipmentStatusFilter.Items.FindByValue("0");
        if (statusItem != null) ShipmentStatusFilter.SelectedIndex = ShipmentStatusFilter.Items.IndexOf(statusItem);

        // SET THE ORDERNUMBER
        OrderNumberFilter.Text = string.Empty;

        // SET THE KEYWORD FILTER
        statusItem = KeywordSearchField.Items.FindByValue("OrderNotes");
        KeywordSearchField.SelectedIndex = KeywordSearchField.Items.IndexOf(statusItem);
        KeywordSearchText.Text = String.Empty;

        //RESET DATES
        OrderStartDate.SelectedDate = DateTime.MinValue;
        OrderEndDate.SelectedDate = DateTime.MinValue;

        // EXECUTE THE SEARCH AND HIDE THE RESET BUTTON
        SearchButton_Click(sender, e);
        ResetSearchButton.Visible = false;
    }

    protected void CreateOrderButton_Click(object sender, EventArgs e)
    {
        Response.Redirect("Create/CreateOrder1.aspx");
    }

    protected string GetOrderStatus(Object orderStatusId)
    {
        OrderStatus status = OrderStatusDataSource.Load((int)orderStatusId);
        if (status != null) return status.Name;
        return string.Empty;
    }

    protected string GetPaymentStatus(object dataItem)
    {
        Order order = (Order)dataItem;
        if (order.PaymentStatus == OrderPaymentStatus.Paid) return "Paid";
        if (order.Payments.Count > 0)
        {
            order.Payments.Sort("PaymentDate");
            Payment lastPayment = order.Payments[order.Payments.Count - 1];
            return StringHelper.SpaceName(lastPayment.PaymentStatus.ToString());
        }
        return order.PaymentStatus.ToString();
    }

    protected void OrderGrid_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName.Equals("Capture") || e.CommandName.Equals("Ship"))
        {
            int orderId = (int)OrderGrid.DataKeys[AlwaysConvert.ToInt(e.CommandArgument)].Value;
            Order order = OrderDataSource.Load(orderId);
            if (order != null)
            {
                if (e.CommandName.Equals("Capture"))
                {
                    if ((order.Payments.Count == 1) && (order.Payments[0].PaymentStatus == PaymentStatus.Authorized))
                    {
                        Response.Redirect("Payments/CapturePayment.aspx?PaymentId=" + order.Payments[0].PaymentId.ToString());
                    }
                }
                else
                {
                    foreach (OrderShipment shipment in order.Shipments)
                    {
                        if (shipment.ShipDate == System.DateTime.MinValue)
                        {
                            Response.Redirect("Shipments/ShipOrder.aspx?OrderShipmentId=" + shipment.OrderShipmentId.ToString());
                        }
                    }
                }
            }
            OrderGrid.DataBind();
        }
    }

    private List<int> GetSelectedOrderIds()
    {
        int indexPeg = OrderGrid.PageSize * OrderGrid.PageIndex;

        List<int> selectedOrders = new List<int>();
        foreach (GridViewRow row in OrderGrid.Rows)
        {
            CheckBox selected = (CheckBox)PageHelper.RecursiveFindControl(row, "Selected");
            if ((selected != null) && selected.Checked)
            {
                selectedOrders.Add((int)OrderGrid.DataKeys[row.DataItemIndex - indexPeg].Values[0]);
            }
        }
        return selectedOrders;
    }


    protected void OrderGrid_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if ((e.Row != null) && (e.Row.RowType == DataControlRowType.DataRow) && (e.Row.DataItem != null))
        {
            //FORCE RELOAD OF DATA ITEM - NEED MORE EFFICIENT SOLUTION TO REFRESH GRID FROM BATCH UPDATES
            //THIS PREVENTS DATA FROM DATABASE AND GRID BECOMING UNSYNCRHONIZED
            Order order = OrderDataSource.Load(((Order)e.Row.DataItem).OrderId, false);
            e.Row.DataItem = order;
        }
    }

    protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if ((e.Row != null) && (e.Row.RowType == DataControlRowType.DataRow) && (e.Row.DataItem != null))
        {
            Order order = (Order)e.Row.DataItem;
            PlaceHolder phPaymentStatus = PageHelper.RecursiveFindControl(e.Row, "phPaymentStatus") as PlaceHolder;
            if (phPaymentStatus != null)
            {
                Image paymentStatus = new Image();
                paymentStatus.SkinID = GetPaymentStatusSkinID(order);
                phPaymentStatus.Controls.Add(paymentStatus);
            }
            PlaceHolder phShipmentStatus = PageHelper.RecursiveFindControl(e.Row, "phShipmentStatus") as PlaceHolder;
            if (phShipmentStatus != null)
            {
                Image shipmentStatus = new Image();
                shipmentStatus.SkinID = GetShipmentStatusSkinID(order);
                phShipmentStatus.Controls.Add(shipmentStatus);
            }
        }
    }

    protected string GetPaymentStatusSkinID(Order order)
    {
        //if (order.OrderStatus.Name.Equals("Cancelled", StringComparison.InvariantCultureIgnoreCase)) return "CodeGreen";
		if (!order.OrderStatus.IsValid) return "CodeRed";
        
        switch (order.PaymentStatus)
        {
            case OrderPaymentStatus.Unspecified:
            case OrderPaymentStatus.Unpaid:
                return "CodeYellow";
            case OrderPaymentStatus.Problem:
                return "CodeRed";
            default:
                return "CodeGreen";
        }
    }

    protected string GetShipmentStatusSkinID(Order order)
    {
        //if (order.OrderStatus.Name.Equals("Cancelled", StringComparison.InvariantCultureIgnoreCase)) return "CodeGreen";
        if (!order.OrderStatus.IsValid) return "CodeRed";
        
        switch (order.ShipmentStatus)
        {
            case OrderShipmentStatus.Unspecified:
            case OrderShipmentStatus.Unshipped:
                return "CodeYellow";
            default:
                return "CodeGreen";
        }
    }

    protected void OrderGrid_DataBound(object sender, EventArgs e)
    {
        foreach (GridViewRow gvr in OrderGrid.Rows)
        {
            CheckBox cb = (CheckBox)gvr.FindControl("Selected");
            ScriptManager.RegisterArrayDeclaration(OrderGrid, "CheckBoxIDs", String.Concat("'", cb.ClientID, "'"));
        }
        selectedOrdersPanel.Visible = (OrderGrid.Rows.Count > 0);
    }

    protected void BatchButton_Click(object sender, EventArgs e)
    {
        List<string> messages = new List<string>();
        List<int> orderIds = GetSelectedOrderIds();
        if (orderIds.Count > 0)
        {
            if (BatchAction.SelectedValue.StartsWith("OS_"))
            {
                //UPDATE ORDER STATUS REQUESTED
                int orderStatusId = AlwaysConvert.ToInt(BatchAction.SelectedValue.Substring(3));
                //VALIDATE STATUS
                OrderStatus status = OrderStatusDataSource.Load(orderStatusId);
                if (status != null)
                {
                    foreach (int orderId in orderIds)
                    {
                        Order order = OrderDataSource.Load(orderId);
                        if (order != null)
                        {
                            order.UpdateOrderStatus(status);
                        }
                    }
                }
            }
            else
            {
                switch (BatchAction.SelectedValue)
                {
                    case "PULLSHEET":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/PullSheet.aspx");
                        break;
                    case "BHINVOICE":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/BHInvoice.aspx");
                        break;
                    case "HSDINVOICE":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/HSDInvoice.aspx");
                        break;
                    case "BHPACKSLIP":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/BHPackSlip.aspx");
                        break;
                    case "HSDPACKSLIP":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Print/HSDPackSlip.aspx");
                        break;
                    case "CANCEL":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Batch/Cancel.aspx");
                        break;
                    case "SHIPOPT":
                        Token.Instance.Session.SelectedOrderIds = orderIds;
                        Response.Redirect("Batch/Ship.aspx");
                        break;
                    case "SHIP":
                        int shipCount = 0;
                        foreach (int orderId in orderIds)
                        {
                            Order order = OrderDataSource.Load(orderId);
                            if (order != null && order.Shipments != null)
                            {
                                bool shipped = false;
                                int shipmentCount = order.Shipments.Count;
                                for (int i = 0; i < shipmentCount; i++)
                                {
                                    OrderShipment shipment = order.Shipments[i];
                                    if (shipment != null && !shipment.IsShipped)
                                    {
                                        shipment.Ship();
                                        shipped = true;
                                    }
                                }
                                if (shipped)
                                {
                                    messages.Add("Order #" + order.OrderNumber + " shipped.");
                                    shipCount++;
                                }
                                else messages.Add("Order #" + order.OrderNumber + " did not have any unshipped items.");
                            }
                        }
                        messages.Add(shipCount + " orders shipped.");
                        //BEGIN MOD FOR TRACKING NUMBER UPDATE
                        int resultCount = 0;
                        resultCount = UpdateTrackingNumbers();
                        messages.Add(String.Format("<br/>Updated tracking status for {0} shipments.", resultCount.ToString()));
                        //END MOD FOR TRACKING NUMBER UPDATE
                        break;
                    case "PAY":
                        int payCount = 0;
                        foreach (int orderId in orderIds)
                        {
                            Order order = OrderDataSource.Load(orderId);
                            if (order != null)
                            {
                                bool paid = false;
                                int paymentCount = order.Payments.Count;
                                for (int i = 0; i < paymentCount; i++)
                                {
                                    Payment payment = order.Payments[i];
                                    if (payment.PaymentStatus == PaymentStatus.Authorized)
                                    {
                                        payment.Capture(payment.Amount, true);
                                        paid = true;
                                    }
                                    else if (payment.PaymentStatus == PaymentStatus.Unprocessed)
                                    {
                                        payment.Authorize();
                                        paid = true;
                                    }
                                }
                                if (paid)
                                {
                                    payCount++;
                                    messages.Add("Order " + order.OrderNumber.ToString() + " processed.");
                                }
                                else messages.Add("Order " + order.OrderNumber.ToString() + " does not have any payments to be processed.");
                            }
                        }
                        messages.Add(payCount + " orders processed.");
                        break;
                }
            }
        }
        if (messages.Count > 0)
        {
            trBatchMessage.Visible = true;
            BatchMessage.Text = string.Join("<br />", messages.ToArray());
        }
        BatchAction.SelectedIndex = -1;
        OrderGrid.DataBind();
    }

    protected OrderFilter GetOrderFilter()
    {
        // CREATE CRITERIA INSTANCE
        OrderFilter criteria = new OrderFilter();
        if (OrderStartDate.SelectedStartDate > DateTime.MinValue)
            criteria.OrderDateStart = OrderStartDate.SelectedStartDate;
        if (OrderEndDate.SelectedEndDate > DateTime.MinValue && OrderEndDate.SelectedEndDate < DateTime.MaxValue)
            criteria.OrderDateEnd = OrderEndDate.SelectedEndDate;
        criteria.OrderNumberRange = OrderNumberFilter.Text;
        criteria.PaymentStatus = (OrderPaymentStatus)AlwaysConvert.ToByte(PaymentStatusFilter.SelectedValue);
        criteria.ShipmentStatus = (OrderShipmentStatus)AlwaysConvert.ToByte(ShipmentStatusFilter.SelectedValue);
        // ADD IN ORDER STATUS FILTER
        int statusId = 0;
        if (StatusFilter.SelectedValue == "-2")
        {
            OrderStatusCollection statuses = OrderStatusDataSource.LoadForStore();            
            foreach (OrderStatus status in statuses)
            {
                if (status.IsValid)
                {
                    criteria.OrderStatus.Add(status.OrderStatusId);
                }
            }
        }
        else if (StatusFilter.SelectedValue == "-3")
        {
            OrderStatusCollection statuses = OrderStatusDataSource.LoadForStore();
            foreach (OrderStatus status in statuses)
            {
                if (!status.IsValid)
                {
                    criteria.OrderStatus.Add(status.OrderStatusId);
                }
            }
        }
        else
        {
            statusId =  AlwaysConvert.ToInt(StatusFilter.SelectedValue);
            if (statusId > 0) criteria.OrderStatus.Add(statusId);
        }
       
        // ADD IN KEYWORD FILTER
        criteria.Keyword = KeywordSearchText.Text;
        criteria.KeywordField = (OrderFilter.KeywordFieldType)Enum.Parse(typeof(OrderFilter.KeywordFieldType), KeywordSearchField.Text, true);

        // RETURN THE CRITERIA OBJECT
        Session["OrderFilter"] = criteria;
        Session["OrderFilterSelectedStatus"] = StatusFilter.SelectedValue;
        return criteria;
    }

    protected void OrderDs_Selecting(object sender, System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs e)
    {
        // ADD IN THE SEARCH CRITERIA
        e.InputParameters["filter"] = GetOrderFilter();
    }

    protected void JumpToOrderButton_Click(Object sender, EventArgs e)
    {
        int tempOrderNumber = AlwaysConvert.ToInt(JumpToOrderNumber.Text);
        Order order = OrderDataSource.Load(OrderDataSource.LookupOrderId(tempOrderNumber));
        if (order != null)
        {
            Response.Redirect("~/Admin/Orders/ViewOrder.aspx?OrderNumber=" + order.OrderNumber.ToString() + "&OrderId=" + order.OrderId.ToString());
        }
        else
        {
            CustomValidator invalidOrderId = new CustomValidator();
            invalidOrderId.ControlToValidate = "JumpToOrderNumber";
            invalidOrderId.Text = "not found, try search!";
            invalidOrderId.IsValid = false;
            invalidOrderId.ValidationGroup = "JumpToOrder";
            phJumpToOrder.Controls.Add(invalidOrderId);
        }
    }

    // BEGIN MOD FOR TRACKING NUMBER UPDATE
    // 11/16/2011
    // NOTE:  You MUST add the reference to CommerceBuilder.Shipping to the top
    // of this page.  Otherwise this code will not work as written
    protected int UpdateTrackingNumbers()
    {
        //Microsoft.Practices.EnterpriseLibrary.Data.Database database = Token.Instance.Database;
        //comment out line above and use the following after an upgrade to 7.0.3 +
        CommerceBuilder.Data.Database database = Token.Instance.Database;
        string sql = ("SELECT * FROM ac_TrackingNumbersTest");
        int resultCount = 0;
        string deleteSql = ("DELETE from ac_TrackingNumbersTest");
        int deletedCount = 0;
        using (System.Data.Common.DbCommand selectCommand = database.GetSqlStringCommand(sql))
        {
            IDataReader dr = database.ExecuteReader(selectCommand);
            while (dr.Read())
            {
                TrackingNumber trackingNumber = new TrackingNumber();
                int orderShipmentId = AlwaysConvert.ToInt(dr["OrderShipmentId"]);
                int shipGatewayId = AlwaysConvert.ToInt(dr["ShipGatewayId"]);
                OrderShipment shipment = new OrderShipment();
                shipment = OrderShipmentDataSource.Load(AlwaysConvert.ToInt(dr["OrderShipmentId"]));
                ShipGateway shipGateway = new ShipGateway();
                shipGateway = ShipGatewayDataSource.Load(shipGatewayId);
                trackingNumber.TrackingNumberData = AlwaysConvert.ToString(dr["TrackingNumberData"]);

                if (shipment != null && shipGateway != null)
                {
                    trackingNumber.OrderShipmentId = orderShipmentId;
                    trackingNumber.ShipGatewayId = shipGatewayId;

                    trackingNumber.Save();
                    resultCount++;
                }

                using (System.Data.Common.DbCommand deleteCommand = database.GetSqlStringCommand(deleteSql))
                {
                    deletedCount = database.ExecuteNonQuery(deleteCommand);
                }

            }
        }
        return resultCount;
    }


    // END MOD FOR TRACKING NUMBER UPDATE

}
Rick Morris
Brewhaus (America) Inc.
Hot Sauce Depot

jguengerich
Commodore (COMO)
Commodore (COMO)
Posts: 436
Joined: Tue May 07, 2013 1:59 pm

Re: Updating tracking data when orders are shipped as a batch

Post by jguengerich » Mon Jul 29, 2013 7:29 am

I think it is more than a simple tweak. Gold doesn't use Token.Instance, it uses AbleContext.Current. However, the object returned by AbleContext.Current.Database of a different type.

Here's some info that may help:
viewtopic.php?f=65&t=17153&start=0

I thought there was similar information in the Wiki, but I can't find it now.
Jay

jguengerich
Commodore (COMO)
Commodore (COMO)
Posts: 436
Joined: Tue May 07, 2013 1:59 pm

Re: Updating tracking data when orders are shipped as a batch

Post by jguengerich » Tue Jul 30, 2013 9:29 am

Another possibility I came across on the forums while looking for some other info:

Get the connection string using:

Code: Select all

            string cs = System.Configuration.ConfigurationManager.ConnectionStrings["AbleCommerce"].ConnectionString;
Then use the various classes in the System.Data.SqlClient namespace to create and use your Commands and DataReaders.
Jay

jguengerich
Commodore (COMO)
Commodore (COMO)
Posts: 436
Joined: Tue May 07, 2013 1:59 pm

Re: Updating tracking data when orders are shipped as a batch

Post by jguengerich » Thu Aug 15, 2013 3:57 pm

I had to do some work with some tables also, so taking what I learned and applying it to your code, I think this should work. However, I didn't test it. But by comparing it to your original code, you may be able to debug any errors.

At the top of the .cs file, you'll need to make sure you have these three using statements:

Code: Select all

    using System.Data;
    using System.Data.SqlClient;
    using CommerceBuilder.Shipping;
Then, your UpdateTrackingNumbers method should look something like this:

Code: Select all

        protected int UpdateTrackingNumbers()
        {
            SqlConnection cnSQLConnection;
            SqlCommand cmSQLCommand;
            string sql = ("SELECT * FROM ac_TrackingNumbersTest");
            int resultCount = 0;
            string deleteSql = ("DELETE from ac_TrackingNumbersTest");
            int deletedCount = 0;
            // Set up connection
            string strCnString = System.Configuration.ConfigurationManager.ConnectionStrings["AbleCommerce"].ConnectionString;
            using (cnSQLConnection = new SqlConnection(strCnString))
            {
                cnSQLConnection.Open();
                // Set up command and reader
                cmSQLCommand = new SqlCommand(sql, cnSQLConnection);
                cmSQLCommand.CommandType = CommandType.Text;
                SqlDataReader dr = cmSQLCommand.ExecuteReader();
                // loop through records
                try
                {
                    while (dr.Read())
                    {
                        TrackingNumber trackingNumber = new TrackingNumber();
                        int orderShipmentId = AlwaysConvert.ToInt(dr["OrderShipmentId"]);
                        int shipGatewayId = AlwaysConvert.ToInt(dr["ShipGatewayId"]);
                        OrderShipment shipment = new OrderShipment();
                        shipment = OrderShipmentDataSource.Load(AlwaysConvert.ToInt(dr["OrderShipmentId"]));
                        ShipGateway shipGateway = new ShipGateway();
                        shipGateway = ShipGatewayDataSource.Load(shipGatewayId);
                        trackingNumber.TrackingNumberData = AlwaysConvert.ToString(dr["TrackingNumberData"]);

                        if (shipment != null && shipGateway != null)
                        {
                            trackingNumber.OrderShipmentId = orderShipmentId;
                            trackingNumber.ShipGatewayId = shipGatewayId;

                            trackingNumber.Save();
                            resultCount++;
                        }
                    }
                }
                finally
                {
                    dr.Close();
                }
                // Set up delete
                SqlCommand scCommand = new SqlCommand();
                scCommand.CommandType = CommandType.Text;
                scCommand.Connection = cnSQLConnection;
                scCommand.CommandText = deleteSql;
                // Execute delete
                deletedCount = scCommand.ExecuteNonQuery();
            }
            return resultCount;
        }
[Edited - added better error handling (using, try).]
Jay

Brewhaus
Vice Admiral (VADM)
Vice Admiral (VADM)
Posts: 878
Joined: Sat Jan 19, 2008 4:30 pm

Re: Updating tracking data when orders are shipped as a batch

Post by Brewhaus » Tue Aug 27, 2013 7:10 pm

I tried the code that you have above and got the following compilation error:


Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: CS1518: Expected class, delegate, enum, interface, or struct

Source Error:

Line 675: }
Line 676: }
Line 677: protected int UpdateTrackingNumbers()
Line 678: {
Line 679: SqlConnection cnSQLConnection;

Source File: e:\Websites\Moonshine Still\Admin\Orders\Default.aspx.cs Line: 677


Thoughts?
Rick Morris
Brewhaus (America) Inc.
Hot Sauce Depot

jguengerich
Commodore (COMO)
Commodore (COMO)
Posts: 436
Joined: Tue May 07, 2013 1:59 pm

Re: Updating tracking data when orders are shipped as a batch

Post by jguengerich » Wed Aug 28, 2013 6:35 am

I think you need to move your code up one bracket level. In other words, take the } on the line before "protected int UpdateTrackingNumbers()" and move it to the bottom of the file.
Jay

Brewhaus
Vice Admiral (VADM)
Vice Admiral (VADM)
Posts: 878
Joined: Sat Jan 19, 2008 4:30 pm

Re: Updating tracking data when orders are shipped as a batch

Post by Brewhaus » Wed Aug 28, 2013 7:48 pm

You are correct. I forgot that I had to make this change on a different customization. In AC7 we had it before the last }, but in Gold (for some reason) we need to have it before the second last }.

Thank you very much for the help. That leaves me with just one customization in order to start final testing and tweaking (and I believe that you are trying to help with that under a different thread).
Rick Morris
Brewhaus (America) Inc.
Hot Sauce Depot

jguengerich
Commodore (COMO)
Commodore (COMO)
Posts: 436
Joined: Tue May 07, 2013 1:59 pm

Re: Updating tracking data when orders are shipped as a batch

Post by jguengerich » Thu Aug 29, 2013 9:53 am

Most (all?) of the Gold .cs files have a namespace statement "around" the using directives and the class, which adds the extra level of brackets. I don't have AC7, but I'm guessing it probably just had the using directives and the class.
Jay

Post Reply