protected void lbSelect_Click(object sender, EventArgs e)
        {
            LinkButton lbUpdate = sender as LinkButton;

            if (lbUpdate.CommandArgument.Length > 1)
            {
                Entities.PalletDelivery pd = PalletDeliveries.SingleOrDefault(lpd => lpd.Identifier == lbUpdate.CommandArgument);

                if (pd != null)
                {
                    SelectedPalletDelivery = pd;
                    BindPalletHandling(pd);
                    Rebind(pd);
                    LoadSelectedPallets(pd, m_isUpdateable);

                    if (pd.PalletOrder.OrderID > 0)
                    {
                        btnGenerateUpdate.Style.Add("display", "none");
                    }

                    btnCancelUpdate.Style.Remove("display");
                    palletButtonBar.Style.Remove("display");
                }
            }
        }
        protected void lbUndo_Click(object sender, EventArgs e)
        {
            LinkButton lbUndo = sender as LinkButton;

            if (lbUndo.CommandArgument.Length > 1)
            {
                Entities.PalletDelivery pd = PalletDeliveries.SingleOrDefault(lpd => lpd.Identifier == lbUndo.CommandArgument);

                if (pd != null)
                {
                    Entities.PalletDelivery foundUpdatedPalletDelivery = UpdatedPalletDeliveries.FirstOrDefault(fupd => fupd.PalletOrder.OrderID == pd.PalletOrder.OrderID);

                    if (foundUpdatedPalletDelivery != null)
                    {
                        UpdatedPalletDeliveries.Remove(foundUpdatedPalletDelivery);
                    }

                    pd.UpdatedNoPallets = 0;
                    pd.IsDirty          = false;
                    pd.ToBeRemoved      = false;

                    Rebind(null);

                    btnGenerateUpdate.Visible = !PalletDeliveries.Exists(lpds => lpds.IsDirty || lpds.PalletOrder.OrderID < 1);
                }
            }
        }
        private void LoadExistingPalletHandling(Entities.PalletDelivery selectedPalletDelivery)
        {
            List <Entities.PalletDelivery> lpds = new List <Entities.PalletDelivery>();

            if (PalletDeliveries.Count > 0 && selectedPalletDelivery != null && PalletDeliveries.Exists(pd => pd.PalletOrder.OrderID == selectedPalletDelivery.PalletOrder.OrderID))
            {
                PalletDeliveries.Remove(selectedPalletDelivery);
            }

            if (UpdatedPalletDeliveries.Count > 0)
            {
                List <int> uppd = new List <int>();
                foreach (Entities.PalletDelivery pd in UpdatedPalletDeliveries)
                {
                    uppd.Add(pd.PalletOrder.OrderID);
                }

                lpds.AddRange(PalletDeliveries.Where(lpd => !uppd.Contains(lpd.PalletOrder.OrderID)));
                lpds.AddRange(UpdatedPalletDeliveries.Where(lpd => selectedPalletDelivery == null || lpd.PalletOrder.OrderID != selectedPalletDelivery.PalletOrder.OrderID));
            }
            else
            {
                lpds = PalletDeliveries;
            }

            lvExisingPalletHandling.DataSource = lpds;
            lvExisingPalletHandling.DataBind();
        }
        protected void lbRemove_Click(object sender, EventArgs e)
        {
            LinkButton lbRemove = sender as LinkButton;

            if (lbRemove.CommandArgument.Length > 1)
            {
                Entities.PalletDelivery pd = PalletDeliveries.SingleOrDefault(lpd => lpd.Identifier == lbRemove.CommandArgument);

                if (pd != null)
                {
                    if (pd.PalletOrder.OrderID > 0)
                    {
                        pd.ToBeRemoved = true;
                        pd.IsDirty     = true;
                    }
                    else
                    {
                        PalletDeliveries.Remove(pd);
                    }
                }
            }

            GetSelectedPallets();
            Rebind(null);
            ClearPalletHandling();

            btnGenerateUpdate.Visible = !PalletDeliveries.Exists(lpds => lpds.IsDirty || lpds.PalletOrder.OrderID < 1);
        }
        void lvExisingPalletHandling_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            if (e.Item.ItemType == ListViewItemType.DataItem)
            {
                Entities.PalletDelivery pd = ((ListViewDataItem)e.Item).DataItem as Entities.PalletDelivery;

                LinkButton lbRemove = e.Item.FindControl("lbRemove") as LinkButton;
                LinkButton lbSelect = e.Item.FindControl("lbSelect") as LinkButton;
                LinkButton lbUndo   = e.Item.FindControl("lbUndo") as LinkButton;

                //Only set to be visible before the order has been created.
                lbUndo.Visible   = pd.IsDirty;
                lbRemove.Visible = !lbUndo.Visible;

                if (m_job.Instructions.Count == 2 && this.PalletDeliveries.Count == 1) // If this is a simple load / drop, you cannot have less than 2 instructions on a run for Groupage Runs.
                {
                    lbRemove.Visible = false;
                }

                if (PalletDeliveries.Where(lpd => lpd.PalletOrder.OrderID < 1).Count() != 0)
                {
                    lbUndo.OnClientClick = string.Format("javascript:if(!pendingActionsWarning()) return false;");
                }

                //lblConfirmation.Visible = lbRemove.Visible = lbUndo.Visible = pd.PalletOrder.OrderID < 1;
            }
        }
        private void LoadSelectedPallets(Entities.PalletDelivery selectedPalletDelivery, bool isUpdateable)
        {
            m_emptyPalletCount = 0;
            foreach (ListViewDataItem lvdi in lvEmptyPallets.Items)
            {
                ListView lvItems             = lvdi.FindControl("lvItems") as ListView;
                Label    lblPalletTotal      = lvdi.FindControl("lblPalletTotal") as Label;
                CheckBox chkResourceSelected = lvdi.FindControl("chkResourceSelected") as CheckBox;

                if (chkResourceSelected != null)
                {
                    chkResourceSelected.Checked = true;
                }

                foreach (ListViewDataItem ilvdi in lvItems.Items)
                {
                    HiddenField       hdnPalletTypeID = ilvdi.FindControl("hdnPalletTypeID") as HiddenField;
                    HiddenField       hdnIdentifier   = ilvdi.FindControl("hdnIdentifier") as HiddenField;
                    RadNumericTextBox rntNoOfPallets  = ilvdi.FindControl("rntNoOfPallets") as RadNumericTextBox;

                    if (hdnIdentifier != null)
                    {
                        hdnIdentifier.Value = selectedPalletDelivery.Identifier;
                    }

                    int palletTypeID = int.Parse(hdnPalletTypeID.Value);

                    int hp = selectedPalletDelivery.UpdatedNoPallets > 0 ? selectedPalletDelivery.UpdatedNoPallets : selectedPalletDelivery.NoOfPallets;

                    if (hp > 0)
                    {
                        HtmlTableCell NoOfPalletsWrapper     = ilvdi.FindControl("NoOfPalletsWrapper") as HtmlTableCell;
                        HtmlTableCell SelectedPalletsWrapper = ilvdi.FindControl("SelectedPalletsWrapper") as HtmlTableCell;
                        HiddenField   hdnNoOfPallets         = ilvdi.FindControl("hdnNoOfPallets") as HiddenField;
                        Label         lblNoOfPallets         = ilvdi.FindControl("lblNoOfPallets") as Label;

                        int hNoOfPallets = int.Parse(hdnNoOfPallets.Value);

                        rntNoOfPallets.MaxValue = hNoOfPallets;
                        rntNoOfPallets.Value    = hp;
                        NoOfPalletsWrapper.Style.Add("background-color", "#FFADAD");
                        SelectedPalletsWrapper.Style.Add("background-color", "#FFADAD");
                    }

                    m_emptyPalletCount += (int)rntNoOfPallets.Value.Value;
                }

                if (lblPalletTotal != null)
                {
                    lblPalletTotal.Text = m_emptyPalletCount.ToString();
                }
            }
        }
        void btnGenerate_Click(object sender, EventArgs e)
        {
            btnCancelUpdate.Style.Add("display", "none");
            palletButtonBar.Style.Add("display", "none");
            btnGenerateUpdate.Style.Remove("display");

            Entities.PalletDelivery currentPalletDelivery = null;

            if (btnGenerate.Text == "Update" && SelectedPalletDelivery.PalletOrder.OrderID > 0)
            {
                currentPalletDelivery = SelectedPalletDelivery;
            }

            GetSelectedPallets();
            //LoadEmptyPallets(currentPalletDelivery);
            //LoadExistingPalletHandling(null);
            Rebind(null);

            btnGenerate.Text = "Generate";
            ClearPalletHandling();

            btnGenerateUpdate.Visible = !PalletDeliveries.Exists(lpds => lpds.IsDirty || lpds.PalletOrder.OrderID < 1);
        }
        private void GetSelectedPallets()
        {
            Entities.Instruction palletHandlingInstruction = new Entities.Instruction();

            eInstructionType selectedPalletAction = (eInstructionType)int.Parse(rcbPalletHandlingAction.SelectedValue);

            foreach (ListViewDataItem lvdi in lvEmptyPallets.Items)
            {
                CheckBox chkResourceSelected = lvdi.FindControl("chkResourceSelected") as CheckBox;

                if (chkResourceSelected != null && chkResourceSelected.Checked)
                {
                    HiddenField hdnResource    = lvdi.FindControl("hdnResource") as HiddenField;
                    HiddenField hidResourceID  = lvdi.FindControl("hidResourceID") as HiddenField;
                    HiddenField hidIsFixedUnit = lvdi.FindControl("hidIsFixedUnit") as HiddenField;
                    ListView    lvItems        = lvdi.FindControl("lvItems") as ListView;

                    int resourceID = 0;
                    int.TryParse(hidResourceID.Value, out resourceID);

                    bool isFixedUnit      = false;
                    int  isFixedUnitValue = 0;
                    int.TryParse(hidIsFixedUnit.Value, out isFixedUnitValue);
                    isFixedUnit = isFixedUnitValue > 0;

                    foreach (ListViewDataItem ilvdi in lvItems.Items)
                    {
                        #region Generate Pallet Orders

                        RadNumericTextBox rntNoOfPallets = ilvdi.FindControl("rntNoOfPallets") as RadNumericTextBox;

                        if (rntNoOfPallets != null && rntNoOfPallets.Value.Value > 0)
                        {
                            HiddenField hdnPalletTypeID = ilvdi.FindControl("hdnPalletTypeID") as HiddenField;
                            HiddenField hdnPalletType   = ilvdi.FindControl("hdnPalletType") as HiddenField;
                            HiddenField hdnIdentifier   = ilvdi.FindControl("hdnIdentifier") as HiddenField;

                            string                  destination    = string.Empty;
                            Entities.Order          palletDelivery = null;
                            Entities.PalletDelivery pd             = null;

                            if (hdnIdentifier != null && hdnIdentifier.Value != string.Empty)
                            {
                                #region Update Order
                                pd = SelectedPalletDelivery;

                                if (pd.PalletOrder.OrderID > 0)
                                {
                                    Entities.PalletDelivery updatedDelivery = null;

                                    if (UpdatedPalletDeliveries.Count > 0)
                                    {
                                        updatedDelivery = UpdatedPalletDeliveries.Find(upd => upd.PalletOrder.OrderID == pd.PalletOrder.OrderID);
                                    }

                                    if (updatedDelivery == null)
                                    {
                                        updatedDelivery = new Entities.PalletDelivery();
                                    }
                                    else
                                    {
                                        UpdatedPalletDeliveries.Remove(updatedDelivery);
                                    }

                                    if (updatedDelivery.PalletOrder == null || updatedDelivery.PalletOrder.OrderID < 1)
                                    {
                                        updatedDelivery.PalletOrder         = GeneratePalletOrder(int.Parse(hdnPalletTypeID.Value), (int)rntNoOfPallets.Value.Value, selectedPalletAction, ref destination);
                                        updatedDelivery.PalletOrder.OrderID = pd.PalletOrder.OrderID;
                                    }
                                    else
                                    {
                                        updatedDelivery.PalletOrder.NoPallets = (int)rntNoOfPallets.Value.Value;
                                    }

                                    updatedDelivery.PalletAction            = selectedPalletAction;
                                    updatedDelivery.PalletActionDescription = Utilities.UnCamelCase(selectedPalletAction.ToString());
                                    updatedDelivery.ResourceID  = resourceID;
                                    updatedDelivery.IsFixedUnit = isFixedUnit;

                                    updatedDelivery.PalletType  = hdnPalletType.Value;
                                    updatedDelivery.Resource    = hdnResource.Value;
                                    updatedDelivery.Destination = destination;

                                    updatedDelivery.UpdatedNoPallets = updatedDelivery.PalletOrder.NoPallets;
                                    //pd.UpdatedNoPallets = updatedDelivery.PalletOrder.NoPallets;
                                    updatedDelivery.IsDirty = true;

                                    UpdatedPalletDeliveries.Add(updatedDelivery);
                                }

                                //pd.PalletOrder.NoPallets = (int)rntNoOfPallets.Value.Value;
                                pd.UpdatedNoPallets = (int)rntNoOfPallets.Value.Value;
                                pd.IsDirty          = true;

                                #endregion
                            }
                            else
                            {
                                #region Generate Order

                                palletDelivery = GeneratePalletOrder(int.Parse(hdnPalletTypeID.Value), (int)rntNoOfPallets.Value.Value, selectedPalletAction, ref destination);

                                pd = new Entities.PalletDelivery();

                                pd.PalletOrder = palletDelivery;

                                pd.PalletAction            = selectedPalletAction;
                                pd.PalletActionDescription = Utilities.UnCamelCase(selectedPalletAction.ToString());
                                pd.ResourceID  = resourceID;
                                pd.IsFixedUnit = isFixedUnit;

                                pd.PalletType  = hdnPalletType.Value;
                                pd.Resource    = hdnResource.Value;
                                pd.Destination = destination;

                                #endregion
                            }

                            PalletDeliveries.Add(pd);
                        }

                        #endregion
                    }
                }
            }
        }
        private void BindPalletHandling(Entities.PalletDelivery palletDelivery)
        {
            btnGenerate.Text = "Update";

            m_isUpdateable = palletDelivery.PalletOrder.OrderStatus == eOrderStatus.Approved;

            rcbPalletHandlingAction.FindItemByValue(((int)palletDelivery.PalletAction).ToString()).Selected = true;

            if (palletDelivery.PalletAction == eInstructionType.DeHirePallets)
            {
                // Set the Customer Identity
                Facade.IOrganisation  facOrg = new Facade.Organisation();
                Entities.Organisation org    = facOrg.GetForIdentityId(palletDelivery.PalletOrder.CustomerIdentityID);

                rcbDeHireOrganisation.Text          = org.OrganisationName;
                rcbDeHireOrganisation.SelectedValue = org.IdentityId.ToString();

                deHireRow.Style.Remove("display");
            }

            Facade.IPoint facPoint = new Facade.Point();
            ucDeliveryPoint.SelectedPoint = facPoint.GetPointForPointId(palletDelivery.PalletOrder.DeliveryPointID);

            #region Delivery Date Time

            //Delivery Date
            dteDeliveryFromDate.SelectedDate = palletDelivery.PalletOrder.DeliveryFromDateTime;
            dteDeliveryByDate.SelectedDate   = palletDelivery.PalletOrder.DeliveryDateTime;
            dteDeliveryByTime.SelectedDate   = palletDelivery.PalletOrder.DeliveryDateTime;
            dteDeliveryFromTime.SelectedDate = palletDelivery.PalletOrder.DeliveryFromDateTime;

            if (palletDelivery.PalletOrder.DeliveryIsAnytime)
            {
                // Anytime
                rdDeliveryIsAnytime.Checked     = true;
                rdDeliveryTimedBooking.Checked  = false;
                rdDeliveryBookingWindow.Checked = false;

                dteDeliveryFromTime.Enabled   = false;
                hidDeliveryTimingMethod.Value = "anytime";
            }
            else if (palletDelivery.PalletOrder.DeliveryFromDateTime == palletDelivery.PalletOrder.DeliveryDateTime)
            {
                // Timed booking
                rdDeliveryIsAnytime.Checked     = false;
                rdDeliveryTimedBooking.Checked  = true;
                rdDeliveryBookingWindow.Checked = false;

                hidDeliveryTimingMethod.Value = "timed";
            }
            else
            {
                // Booking window
                rdDeliveryIsAnytime.Checked     = false;
                rdDeliveryTimedBooking.Checked  = false;
                rdDeliveryBookingWindow.Checked = true;

                hidDeliveryTimingMethod.Value = "window";
            }

            #endregion

            rntPalletDeliveryCharge.Value   = (double)palletDelivery.PalletOrder.ForeignRate;
            rntPalletDeliveryCharge.Culture = new CultureInfo(palletDelivery.PalletOrder.LCID);

            //Set Updateable flags.

            rcbPalletHandlingAction.Enabled = m_isUpdateable;
            rcbDeHireOrganisation.Enabled   = m_isUpdateable;

            ucDeliveryPoint.CanUpdatePoint = m_isUpdateable;

            dteDeliveryFromDate.Enabled = m_isUpdateable;
            dteDeliveryByDate.Enabled   = m_isUpdateable;
            dteDeliveryByTime.Enabled   = m_isUpdateable;
            dteDeliveryFromTime.Enabled = m_isUpdateable;

            rdDeliveryIsAnytime.Disabled     = !m_isUpdateable;
            rdDeliveryTimedBooking.Disabled  = !m_isUpdateable;
            rdDeliveryBookingWindow.Disabled = !m_isUpdateable;

            rntPalletDeliveryCharge.Enabled = m_isUpdateable;
        }
 private void Rebind(Entities.PalletDelivery selectedPalletDelivery)
 {
     LoadEmptyPallets(selectedPalletDelivery);
     LoadExistingPalletHandling(selectedPalletDelivery);
 }
        private void LoadEmptyPallets(Entities.PalletDelivery selectedPalletDelivery)
        {
            Facade.IJob facJob = new Facade.Job();
            DataSet     ds     = facJob.GetUnhandledPalletsForJob(m_jobId, null);

            // If this is an update, then add the selected orders pallets to the unhandled pallets available - as this orders pallets will be updated.
            if (selectedPalletDelivery != null && selectedPalletDelivery.PalletOrder.OrderID > 0)
            {
                var     existingRows = ds.Tables[0].Rows.Cast <DataRow>().AsEnumerable();
                DataRow dr           = existingRows.FirstOrDefault(ldr => ldr.Field <int>("PalletTypeID") == selectedPalletDelivery.PalletTypeID && ldr.Field <int>("ResourceID") == selectedPalletDelivery.ResourceID);

                if (dr == null)
                {
                    #region Insert New Row

                    dr = ds.Tables[0].NewRow();
                    dr.SetField <string>("PalletType", selectedPalletDelivery.PalletType);
                    dr.SetField <int>("PalletTypeID", selectedPalletDelivery.PalletTypeID);

                    int currentPallets = selectedPalletDelivery.UpdatedNoPallets > 0 ? selectedPalletDelivery.UpdatedNoPallets : selectedPalletDelivery.NoOfPallets;

                    dr.SetField <int>("NoOfPallets", currentPallets);
                    dr.SetField <int>("TrailerPallets", selectedPalletDelivery.NoOfPallets);
                    dr.SetField <int>("HandledPallets", currentPallets);
                    dr.SetField <int>("CollectDropID", selectedPalletDelivery.CollectDropID);
                    dr.SetField <int>("ResourceID", selectedPalletDelivery.ResourceID);
                    dr.SetField <string>("Resource", selectedPalletDelivery.Resource);
                    dr.SetField <bool>("IsFixedUnit", selectedPalletDelivery.IsFixedUnit);
                    ds.Tables[0].Rows.Add(dr);

                    #endregion
                }
                else
                {
                    int currentPallets = dr.Field <int>("NoOfPallets");
                    currentPallets += selectedPalletDelivery.UpdatedNoPallets > 0 ? selectedPalletDelivery.NoOfPallets - selectedPalletDelivery.UpdatedNoPallets : 0;
                    dr.SetField <int>("NoOfPallets", currentPallets);
                }
            }

            // Check for any updated pallet handling instructions.
            foreach (Entities.PalletDelivery pd in PalletDeliveries.Where(cpd => cpd.IsDirty))//&& (selectedPalletDelivery == null || cpd.PalletOrder.OrderID != selectedPalletDelivery.PalletOrder.OrderID)))
            {
                var     existingRows = ds.Tables[0].Rows.Cast <DataRow>().AsEnumerable();
                DataRow dr           = existingRows.FirstOrDefault(ldr => ldr.Field <int>("PalletTypeID") == pd.PalletTypeID && ldr.Field <int>("ResourceID") == pd.ResourceID);

                if (dr == null)
                {
                    #region Insert New Row

                    dr = ds.Tables[0].NewRow();
                    dr.SetField <string>("PalletType", pd.PalletType);
                    dr.SetField <int>("PalletTypeID", pd.PalletTypeID);

                    int currentPallets = pd.UpdatedNoPallets > 0 ? pd.NoOfPallets - pd.UpdatedNoPallets : pd.NoOfPallets;

                    dr.SetField <int>("NoOfPallets", currentPallets);
                    dr.SetField <int>("TrailerPallets", currentPallets);
                    dr.SetField <int>("HandledPallets", currentPallets);
                    dr.SetField <int>("CollectDropID", pd.CollectDropID);
                    dr.SetField <int>("ResourceID", pd.ResourceID);
                    dr.SetField <string>("Resource", pd.Resource);
                    dr.SetField <bool>("IsFixedUnit", pd.IsFixedUnit);
                    ds.Tables[0].Rows.Add(dr);

                    #endregion
                }
                else
                {
                    int currentPallets = dr.Field <int>("NoOfPallets");
                    currentPallets += (pd.NoOfPallets - pd.UpdatedNoPallets); //pd.UpdatedNoPallets >= 0 ? pd.NoOfPallets - pd.UpdatedNoPallets : 0;
                    dr.SetField <int>("NoOfPallets", currentPallets);
                }
            }

            // Cast Datarows as Enumerated List
            var returndRows = ds.Tables[0].Rows.Cast <DataRow>().AsEnumerable();

            // If supplied with an existing pallet delivery, find this from the data rows provided.
            if (selectedPalletDelivery != null)
            {
                returndRows = returndRows.Where(rr => rr.Field <int>("ResourceID") == selectedPalletDelivery.ResourceID && rr.Field <int>("PalletTypeID") == selectedPalletDelivery.PalletTypeID);
            }

            // If there are still unhandled pallets and this is not a update.
            if (returndRows.Count() > 0 && selectedPalletDelivery == null)
            {
                var pendingPalletDeliveries = PalletDeliveries.Where(ppd => ppd.PalletOrder.OrderID < 1);

                if (pendingPalletDeliveries.Count() > 0)
                {
                    foreach (DataRow dr in returndRows)
                    {
                        int resourceID   = dr.Field <int>("ResourceID");
                        int palletTypeId = dr.Field <int>("PalletTypeID");

                        var foundPalletDeliveries = pendingPalletDeliveries.Where(ppd => ppd.ResourceID == resourceID && ppd.PalletTypeID == palletTypeId);

                        foreach (Entities.PalletDelivery pd in foundPalletDeliveries)
                        {
                            dr.SetField <int>("NoOfPallets", (dr.Field <int>("NoOfPallets") - pd.NoOfPallets));
                        }
                    }
                }
            }

            // Get all the rows that have pallets remaining.
            var retValRows = returndRows.Where(rr => rr.Field <int>("NoOfPallets") > 0);

            // If Any exist, run the queries and bind them up.
            if (retValRows.Count() > 0)
            {
                // If is an update, only bind rows with the same pallet type as the one on the selected order.
                var resourceEmptyPallets = from row in retValRows
                                           group row by
                                           new { ResourceID = row["ResourceID"], PalletContainer = row["Resource"], IsFixedUnit = row["IsFixedUnit"] } into g
                orderby g.Key.ResourceID, g.Key.PalletContainer, g.Key.IsFixedUnit
                    select new
                {
                    Resources = g.Key,
                    Items     = selectedPalletDelivery == null ? g : g.Where(ite => ite.Field <int>("PalletTypeID") == selectedPalletDelivery.PalletTypeID)
                };

                currentResources = (from row in retValRows
                                    where (int)row["ResourceID"] != 0
                                    select new KeyValuePair <int, string>
                                    (
                                        (int)row["ResourceID"],
                                        (string)row["Resource"]
                                    )).Distinct <KeyValuePair <int, string> >();

                // If is an update, only bind the resource associated with this order.
                lvEmptyPallets.DataSource = selectedPalletDelivery == null ? resourceEmptyPallets : resourceEmptyPallets.Where(rep => (int)rep.Resources.ResourceID == selectedPalletDelivery.ResourceID);
            }

            lvEmptyPallets.DataBind();
        }