HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/RMourik/bassol.nl/CMS/CMSModules/Ecommerce/Controls/Filters/OrderFilter.ascx.cs
using System;
using System.Web.UI.WebControls;

using CMS.Controls;
using CMS.DataEngine;
using CMS.Ecommerce;
using CMS.ExtendedControls;
using CMS.Helpers;
using CMS.Globalization;
using CMS.Membership;
using CMS.SiteProvider;
using CMS.UIControls;

/// <summary>
/// Enables the user to specify filter criteria to filter the order list.
/// </summary>
public partial class CMSModules_Ecommerce_Controls_Filters_OrderFilter : CMSAbstractDataFilterControl
{
    #region "Private properties"

    /// <summary>
    /// Gets the customer identifier from the context.
    /// </summary>
    /// <remarks>
    /// The presence of the customer identifier affects the control's appearance.
    /// </remarks>
    private int FilterCustomerID
    {
        get
        {
            return QueryHelper.GetInteger("customerId", 0);
        }
    }


    /// <summary>
    /// Gets the site identifier for filtering.
    /// </summary>
    /// <remarks>
    /// The site identifier depends on whether the site filter is enabled.
    /// </remarks>
    private int FilterSiteID
    {
        get
        {
            return SiteFilterEnabled ? siteSelector.SiteID : SiteContext.CurrentSiteID;
        }
    }


    /// <summary>
    /// Gets or sets a value indicating whether filtering by site is enabled.
    /// </summary>
    private bool SiteFilterEnabled
    {
        get
        {
            return plcSiteFilter.Visible;
        }
        set
        {
            plcSiteFilter.Visible = value;
        }
    }


    /// <summary>
    /// Gets or sets a value indicating whether filtering by customer's properties is enabled.
    /// </summary>
    private bool CustomerFilterEnabled
    {
        get
        {
            return plcCustomerFilter.Visible;
        }
        set
        {
            plcCustomerFilter.Visible = value;
        }
    }


    /// <summary>
    /// Gets or sets a value indicating whether the associated UniGrid control displays a column with the order site's name.
    /// </summary>
    private bool SiteColumnEnabled
    {
        get
        {
            return ValidationHelper.GetBoolean(ViewState["SiteColumnEnabled"], false);
        }
        set
        {
            ViewState["SiteColumnEnabled"] = value;
        }
    }


    /// <summary>
    /// Gets or sets a value indicating whether the advanced filter is displayed or not. 
    /// </summary>
    private bool AdvancedFilterEnabled
    {
        get
        {
            return ValidationHelper.GetBoolean(ViewState["AdvancedFilterEnabled"], false);
        }
        set
        {
            ViewState["AdvancedFilterEnabled"] = value;
        }
    }

    #endregion


    #region "Public properties"

    /// <summary>
    /// Gets or sets the SQL condition for filtering the order list.
    /// </summary>
    public override string WhereCondition
    {
        get
        {
            base.WhereCondition = GetFilterWhereCondition().ToString(true);
            return base.WhereCondition;
        }
        set
        {
            base.WhereCondition = value;
        }
    }

    #endregion


    #region "Life-cycle methods"

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        // Retrieve customer from the database
        CustomerInfo customer = CustomerInfoProvider.GetCustomerInfo(FilterCustomerID);

        // If a valid customer is specified, disable filtering by customer's properties
        if (customer != null)
        {
            CustomerFilterEnabled = false;
        }

        // If the current user is a global administrator, he or she is allowed to filter by site, otherwise, disable filtering by site
        if ((MembershipContext.AuthenticatedUser != null) && MembershipContext.AuthenticatedUser.IsGlobalAdministrator)
        {
            // If a valid customer is specified and he or she is associated with a CMS user, display only sites that the user can access, otherwise, disable filtering by site
            if (customer != null)
            {
                if (customer.CustomerIsRegistered)
                {
                    siteSelector.UserId = customer.CustomerUserID;
                }
                else
                {
                    SiteFilterEnabled = false;
                }
            }
        }
        else
        {
            SiteFilterEnabled = false;
        }

        // Initialize the control with values All, Yes and No
        InitializeThreeStateDropDownList(drpOrderIsPaid);

        // If this control is associated with an UniGrid control, disable UniGrid's buttons and initialize the Reset button
        UniGrid grid = FilteredControl as UniGrid;
        if (grid != null)
        {
            grid.HideFilterButton = true;
            // Reset button is available only when UniGrid remembers its state
            if (grid.RememberState)
            {
                btnReset.Text = GetString("general.reset");
                btnReset.Click += btnReset_Click;
            }
            else
            {
                btnReset.Visible = false;
            }
        }

        // Initialize the Show button
        btnFilter.Text = GetString("general.filter");
        btnFilter.Click += btnFilter_Click;

        // Hide unwanted elements
        plcAdvancedGroup.Visible = false;
        plcSimpleFilter.Visible = false;

        // Initialize site selector
        siteSelector.UniSelector.OnSelectionChanged += DropDownSingleSelect_SelectedIndexChanged;
        CurrencySelector.SiteID = statusSelector.SiteID;

        // Use timezones for DateTimePickers
        CMS.Globalization.TimeZoneInfo timeZone = TimeZoneHelper.GetTimeZoneInfo(MembershipContext.AuthenticatedUser, SiteContext.CurrentSite);
        dtpFrom.TimeZone = TimeZoneTypeEnum.Custom;
        dtpFrom.CustomTimeZone = timeZone;
        dtpCreatedTo.TimeZone = TimeZoneTypeEnum.Custom;
        dtpCreatedTo.CustomTimeZone = timeZone;

        // Preselect current siteID by default when siteSelector is enabled
        if (!URLHelper.IsPostback())
        {
            siteSelector.SiteID = SiteContext.CurrentSiteID;
        }
    }


    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        // As the site selector might have changed its value, it is necessary to refresh dependent controls
        RefreshStatusSelector();
        ReloadUniselectors();
    }


    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        // If the site column is not enabled, update the associated UniGrid
        if (!SiteColumnEnabled)
        {
            UniGrid grid = FilteredControl as UniGrid;
            if (grid != null && grid.NamedColumns.ContainsKey("OrderSiteID"))
            {
                grid.NamedColumns["OrderSiteID"].Visible = false;
            }
        }

        AdvancedFilterShowHide();
    }

    #endregion


    #region "Event handlers"

    protected void btnFilter_Click(object sender, EventArgs e)
    {
        ApplyFilter(sender, e);
    }


    protected void btnReset_Click(object sender, EventArgs e)
    {
        UniGrid grid = FilteredControl as UniGrid;
        if (grid != null)
        {
            SiteColumnEnabled = (FilterSiteID < 1);
            grid.Reset();
        }
    }


    void DropDownSingleSelect_SelectedIndexChanged(object sender, EventArgs e)
    {
        ResetSelectors();
        ReloadUniselectors();
    }


    protected void btnAdvancedFilter_Click(object sender, EventArgs e)
    {
        AdvancedFilterEnabled = !AdvancedFilterEnabled;
        ApplyFilter(sender, e);
    }

    #endregion


    #region "Private methods"

    /// <summary>
    /// Applies filter to unigrid.
    /// </summary>
    /// <param name="sender">Sender.</param>
    /// <param name="e">Event args.</param>
    private void ApplyFilter(object sender, EventArgs e)
    {
        UniGrid grid = FilteredControl as UniGrid;
        if (grid != null)
        {
            SiteColumnEnabled = (FilterSiteID < 1);
            grid.ApplyFilter(sender, e);
        }
    }


    /// <summary>
    /// Initializes the specified controls with values All, Yes and No.
    /// </summary>
    /// <param name="control">A control to initialize.</param>
    private void InitializeThreeStateDropDownList(CMSDropDownList control)
    {
        control.Items.Add(new ListItem(GetString("general.selectall"), "-1"));
        control.Items.Add(new ListItem(GetString("general.yes"), "1"));
        control.Items.Add(new ListItem(GetString("general.no"), "0"));
    }


    /// <summary>
    /// Reloads the order status selector if it does not match the current site for filtering
    /// </summary>
    private void RefreshStatusSelector()
    {
        if (statusSelector.SiteID != FilterSiteID)
        {
            statusSelector.SiteID = FilterSiteID;
            statusSelector.Reload();
        }
    }


    /// <summary>
    /// Builds a SQL condition for filtering the order list, and returns it.
    /// </summary>
    /// <returns>A SQL condition for filtering the order list.</returns>
    private WhereCondition GetFilterWhereCondition()
    {
        var condition = new WhereCondition();

        // Order status
        if (statusSelector.SelectedID > 0)
        {
            condition.WhereEquals("OrderStatusID", statusSelector.SelectedID);
        }

        // Order site
        if (FilterSiteID > 0)
        {
            condition.WhereEquals("OrderSiteID", FilterSiteID);
        }

        // Order identifier
        string filterOrderId = txtOrderId.Text.Trim().Truncate(txtOrderId.MaxLength);
        if (filterOrderId != String.Empty)
        {
            int orderId = ValidationHelper.GetInteger(filterOrderId, 0);
            // Include also an invoice number
            condition.Where(w => w.WhereEquals("OrderID", orderId).Or().WhereContains("OrderInvoiceNumber", filterOrderId));
        }

        // Customer's properties, applicable only if a valid customer is not specified
        if (CustomerFilterEnabled)
        {
            // First, Last name and Company search
            string customerNameOrCompanyOrEmail = txtCustomerNameOrCompanyOrEmail.Text.Trim().Truncate(txtCustomerNameOrCompanyOrEmail.MaxLength);
            if (customerNameOrCompanyOrEmail != String.Empty)
            {
                condition.WhereIn("OrderCustomerID", new IDQuery<CustomerInfo>("CustomerID").WhereContains("CustomerFirstName", customerNameOrCompanyOrEmail)
                                                                                .Or()
                                                                                .WhereContains("CustomerLastName", customerNameOrCompanyOrEmail)
                                                                                .Or()
                                                                                .WhereContains("CustomerCompany", customerNameOrCompanyOrEmail)
                                                                                .Or()
                                                                                .WhereContains("CustomerEmail", customerNameOrCompanyOrEmail));
            }
        }

        // Order is paid
        switch (drpOrderIsPaid.SelectedValue)
        {
            case "0":
                condition.Where("ISNULL(OrderIsPaid, 0) = 0");
                break;
            case "1":
                condition.Where("ISNULL(OrderIsPaid, 0) = 1");
                break;
        }

        // Advanced Filter
        if (AdvancedFilterEnabled)
        {
            // Specific currency was selected
            if (CurrencySelector.SelectedID > 0)
            {
                condition.WhereEquals("OrderCurrencyID", CurrencySelector.SelectedID);
            }

            // Specific payment method was selected
            if (PaymentSelector.SelectedID > 0)
            {
                condition.WhereEquals("OrderPaymentOptionID", PaymentSelector.SelectedID);
            }

            // Specific shipping option was selected
            if (ShippingSelector.SelectedID > 0)
            {
                condition.WhereEquals("OrderShippingOptionID", ShippingSelector.SelectedID);
            }

            // Specific tracking number was provided
            var trackingNumber = txtTrackingNumber.Text.Truncate(txtTrackingNumber.MaxLength);
            if (trackingNumber != string.Empty)
            {
                condition.WhereContains("OrderTrackingNumber", trackingNumber);
            }

            // Specific created date was selected
            if ((dtpCreatedTo.SelectedDateTime < dtpCreatedTo.MaxDate) && (dtpCreatedTo.SelectedDateTime > dtpCreatedTo.MinDate))
            {
                condition.WhereLessOrEquals("OrderDate", dtpCreatedTo.SelectedDateTime);
            }

            // Specific from date was selected
            if ((dtpFrom.SelectedDateTime < dtpFrom.MaxDate) && (dtpFrom.SelectedDateTime > dtpFrom.MinDate))
            {
                condition.WhereGreaterOrEquals("OrderDate", dtpFrom.SelectedDateTime);
            }
        }

        return condition;
    }


    /// <summary>
    /// Assigns FilterSiteID to all selectors and reloads them
    /// </summary>
    private void ReloadUniselectors()
    {
        CurrencySelector.SiteID = FilterSiteID;
        PaymentSelector.SiteID = FilterSiteID;
        ShippingSelector.SiteID = FilterSiteID;

        RefreshStatusSelector();
        CurrencySelector.Reload();
        PaymentSelector.Reload();
        ShippingSelector.Reload();
    }


    /// <summary>
    /// Resets selectors.
    /// </summary>
    private void ResetSelectors()
    {
        CurrencySelector.SelectedID = -1;
        PaymentSelector.SelectedID = -1;
        ShippingSelector.SelectedID = -1;
        statusSelector.SelectedID = -1;
        drpOrderIsPaid.SelectedIndex = 0;
    }


    /// <summary>
    /// Change visibility of the filter
    /// </summary>
    private void AdvancedFilterShowHide()
    {
        plcAdvancedFilter.Visible = !AdvancedFilterEnabled;
        plcSimpleFilter.Visible = AdvancedFilterEnabled;

        plcAdvancedGroup.Visible = AdvancedFilterEnabled;
    }

    #endregion


    #region "State management"

    /// <summary>
    /// Stores filter state to the specified object.
    /// </summary>
    /// <param name="state">The object that holds the filter state.</param>
    public override void StoreFilterState(FilterState state)
    {
        base.StoreFilterState(state);

        // Store additional state properties
        state.AddValue("SiteColumnEnabled", SiteColumnEnabled);
        state.AddValue("AdvancedFilterEnabled", AdvancedFilterEnabled);
        state.AddValue("dtpFrom", dtpFrom.SelectedDateTime);
        state.AddValue("dtpCreatedTo", dtpCreatedTo.SelectedDateTime);
    }


    /// <summary>
    /// Restores filter state from the specified object.
    /// </summary>
    /// <param name="state">The object that holds the filter state.</param>
    public override void RestoreFilterState(FilterState state)
    {
        base.RestoreFilterState(state);

        // Restore additional state properties
        SiteColumnEnabled = state.GetBoolean("SiteColumnEnabled");
        AdvancedFilterEnabled = state.GetBoolean("AdvancedFilterEnabled");
        dtpFrom.SelectedDateTime = state.GetDateTime("dtpFrom");
        dtpCreatedTo.SelectedDateTime = state.GetDateTime("dtpCreatedTo");
    }


    /// <summary>
    /// Resets filter to the default state.
    /// </summary>
    public override void ResetFilter()
    {
        txtOrderId.Text = String.Empty;
        txtCustomerNameOrCompanyOrEmail.Text = String.Empty;
        statusSelector.Value = null;
        siteSelector.SiteID = SiteContext.CurrentSiteID;
        siteSelector.Reload(true);
        dtpFrom.DateTimeTextBox.Text = string.Empty;
        dtpCreatedTo.DateTimeTextBox.Text = string.Empty;
        txtTrackingNumber.Text = string.Empty;
        ResetSelectors();
        ReloadUniselectors();
    }

    #endregion
}