Sears eCommerce debacle

No wonder Sears is getting kicked in the rear by Amazon and others. I want to buy a socket set, cool it’s on sale at sears for $17.99 regularly $29.99. The Newington store has two in stock. Continuing with my iPad I start the order.

I notice on the checkout page,it say something about use your “shop you way rewards points”. I think I may have some because we bought some school uniform pant’s for Jameson last fall.I login and sure enough, I’ve got a 7,000 surprise points good for $7 off the order. I click the apply points button and it places the order without applying the points. Great.

That’s OK, I’ll just cancel the order and be more careful the next time. After hunting around for a while, I find the hidden cancel order button and cancel the first order and I find the set again start a second order. This time when I click the apply points and checkout button I see there is a “enter your pin code” text box several inches over and down with some tiny text about rewards points.

Great so once again, I’ve ordered without the credit so this time I call customer service…no help there, the first level rep and supervisor both tell me they can’t apply the credit after the order is placed.

While on the phone with the reps who are continuing to be unhelpful, I use my desktop and start a third order. This time I enter a usual pin code and click apply. No that’s not it. I try another likely code. No that’s not it. OK I’ll try one more I use sometimes and it’s still not it. Still on the phone with the rep, I say it won’t take a pin code, what do I do. He says enter your zip code. Wow that works! How I was supposed to know that my pin code is my zip code I have no idea. I know I didn’t set that up.

Good, now I can place the third order however it’s now showing 3-5 day before it will be ready. I know that both of the two in stock are being held for me. I ask the rep how long before the system will catch up and return to stock the first one I purchased…three to five days.

I was tempted to cancel the second order but I’ve decided to leave it, when I go to pick it up, I’m going to make them cancel it and fulfill the third order with that set. Wonder how that’s going to go.

How a half price coupon for a state inspection almost cost me $700 at Portsmouth Ford.

…or how the service department at Portsmouth Ford tried to get me to purchase unneeded services for over $700.
March is car tag and state inspection due month for my 2010 F150. Being thrifty, I looked online at Portsmouth Ford’s coupon specials and found a half price coupons for a state inspection and another for an oil change. Portsmouth Ford is conveniently just across the highway from my office so I dropped it off on Monday. They called a couple hours later to tell me the front shoes were “frozen” and had ruined the rotors and that the rear rotors were “rotted”. Of course it wouldn’t pass inspection until I paid over $700 for calipers and shoes all around. It didn’t sound right to me, I had my last oil change at Bill Dube Ford in Dover in September. I called them and they checked my records and said my front shoes were half worn at the time.

I decided to get a second opinion and called Steve’s Accurate Auto in Madbury. They were highly recommended by a good friend, and I had recently discovered that Jeff Sinon who we used a decade ago was one of their mechanics. Jeff and I put together a chicken coop a couple weeks ago for the PCA fund raising auction.

Steve’s checked it out and the rotors were fine and the pads pass as well.

I may file a complaint with the state.

Migrating Sitecore users from one instance to another without losing their passwords using SQL 2008 R2.

You can copy Sitecore users from one instance to another using a package however their passwords will be reset. If you want to copy users without losing passwords The Inside Corner site has a page that describes how to migrate Sitecore users from one installation to another: http://www.theinsidecorner.com/en/SiteAdmins/SiteSecurity/SitecoreAccounts/MigratingAccounts.

This description is a bit out of date if you are using the database script method with SQL Server 2008 R2 because the SSMS wizard has been changed.
Here’s how to do it with SQL 2008 R2:

  1. Right click on the core database and choose Generate Scripts
  2. If SSMS shows an Introduction page, click next
  3. Select specific database objects
  4. Expand Tables
  5. Select all tables with a name starting with aspnet_
  6. Click next
  7. Select the advanced button
  8. Change “Script DROP and CREATE” to Script DROP and CREATE
  9. Change “Types of data to script” to Schema and data
  10. Choose whatever option to save the script that works for you, clipboard, file or new query editor window.

Cheers,
Paul
PS: I suspect this would work with any ASP.NET site that uses the membership provider but who does regular asp.net sites anymore?

How to redirect a specific domain to a sublevel page on a different domain using URL Rewrites in IIS7

Anytime I have to look up something twice in three days I figure I might need that info again. Sometimes you have multiple domains pointing to the same site one of which might be a “marketing domain”. Here’s how to redirect a domain request to a page on a different domain.

  • Select URL Rewrite
  • Select Blank rule
  • Enter the pattern
    (.*)

     NOTE: This means any character, any number of repetitions.

  • Expand Conditions if not already expanded and Click “Add”.
  • Enter
     {HTTP_HOST} 

    for “Condtion Input”. (Curly braces are required)

  • Set “Check if input string” to “Matches the Pattern”
  • Pattern
    (?:www.)?domain.com 

    where domain is the domain to redirect. (The part

     (?:www.)? 

    makes www. optional

  • Enter the URL such as
    http://www.newdomain.com/sub/page1.aspx
  • Enter “Redirect” for action
  • Redirect type should be 302 if this is temporary, 301 for permanent redirects. Browsers cache 301 redirects so if it changes in the future, it may take a while for users to know about it.
  • Another way to redirect mobile devices to m. subdomain

    Mortaza Kamal Nourestani posted here a way to ensure that mobile devices are served at a “m.” subdomain site, and that desktop devices are served at the normal domain.
    Here’s my take on that using a resolver in the httprequest pipeline. This only requires adding a class, and .config file with no modifications to existing files. I’ve reused his IsMobileBrowser method.

    using System;
    using System.Linq;
    using System.Web;
    using Sitecore.Pipelines.HttpRequest;
    
    namespace Samples.Extensions.Resolvers
    {
        public class MobileSiteResolver : Sitecore.Pipelines.HttpRequest.SiteResolver
        {
            public override void Process(HttpRequestArgs args)
            {
                string absoluteUri = String.Format("{0}://{1}{2}", HttpContext.Current.Request.Url.Scheme,
                                                           HttpContext.Current.Request.Url.Host,
                                                           HttpContext.Current.Request.RawUrl);
    
                string host = HttpContext.Current.Request.Url.Host;
    
                if (host.StartsWith("m."))
                {
                    if (!IsMobileBrowser(HttpContext.Current))
                    {
                        host = host.Replace("m.", "");
                        absoluteUri = absoluteUri.Replace(HttpContext.Current.Request.Url.Host, host);
                        HttpContext.Current.Response.Redirect(absoluteUri);
                    }
                }
                else
                {
                    if (IsMobileBrowser(HttpContext.Current))
                    {
                        host = String.Format("{0}.{1}", "m", HttpContext.Current.Request.Url.Host);
                        absoluteUri = absoluteUri.Replace(HttpContext.Current.Request.Url.Host, host);
                        HttpContext.Current.Response.Redirect(absoluteUri);
                    }
                }
            }
    
            public static bool IsMobileBrowser(HttpContext context)
            {
                //FIRST TRY BUILT IN ASP.NT CHECK
                if (context.Request.Browser.IsMobileDevice)
                {
                    return true;
                }
                //THEN TRY CHECKING FOR THE HTTP_X_WAP_PROFILE HEADER
                if (context.Request.ServerVariables["HTTP_X_WAP_PROFILE"] != null)
                {
                    return true;
                }
                //THEN TRY CHECKING THAT HTTP_ACCEPT EXISTS AND CONTAINS WAP
                if (context.Request.ServerVariables["HTTP_ACCEPT"] != null &&
                    context.Request.ServerVariables["HTTP_ACCEPT"].ToLower().Contains("wap"))
                {
                    return true;
                }
                //AND FINALLY CHECK THE HTTP_USER_AGENT
                //HEADER VARIABLE FOR ANY ONE OF THE FOLLOWING
                if (context.Request.ServerVariables["HTTP_USER_AGENT"] != null)
                {
                    //Create a list of all mobile types
                    string[] mobiles =
                        {
                            "midp", "j2me", "avant", "docomo",
                            "novarra", "palmos", "palmsource",
                            "240x320", "opwv", "chtml",
                            "pda", "windows ce", "mmp/",
                            "blackberry", "mib/", "symbian",
                            "wireless", "nokia", "hand", "mobi",
                            "phone", "cdm", "up.b", "audio",
                            "SIE-", "SEC-", "samsung", "HTC",
                            "mot-", "mitsu", "sagem", "sony"
                            , "alcatel", "lg", "eric", "vx",
                            "NEC", "philips", "mmm", "xx",
                            "panasonic", "sharp", "wap", "sch",
                            "rover", "pocket", "benq", "java",
                            "pt", "pg", "vox", "amoi",
                            "bird", "compal", "kg", "voda",
                            "sany", "kdd", "dbt", "sendo",
                            "sgh", "gradi", "jb", "dddi",
                            "moto", "iphone"
                        };
    
    
                    //Loop through each item in the list created above
                    //and check if the header contains that text
                    if (mobiles.Any(s => context.Request.ServerVariables["HTTP_USER_AGENT"].ToLower().Contains(s.ToLower())))
                        return true;
    
                }
    
                return false;
            }
        }
    }
    

    To enable this resolver create a config file in /app_config/includes/ such as mobiledeviceresolver.config with these content:

    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
        <sitecore>
            <pipelines>
                <httpRequestBegin>
                    <processor patch:before="*[@type='Sitecore.Pipelines.HttpRequest.SiteResolver, Sitecore.Kernel']"
                    type="Samples.Extensions.Resolvers.MobileSiteResolver, Logica.Extensions"/>
                </httpRequestBegin>
            </pipelines>
        </sitecore>
    </configuration>
    

    The usual caveats apply, this is untested in a production environment, test throughly before using. It could also be significantly optimized for performance.