Probably one of the most common features of an ecommerce systems is to "retrieve my details" when logging in -after all that's why you create an account with the seller isn't it?
Out of the box, uCommerce has XSLT to retrieve the customer's last x addresses but one thing it didn't do was automatically re-assign the customer's details when logging in using the built in Umbraco membership code so we need to work around it ourselves -don't worry, it's not too hard (all the code is below for you).
All customer addresses are stored in the uCommerce_Address table automatically, there should be one unique address per customer however if you're on an earlier release you may find you have several copies of the same address for each customer -this is a bug that's been sorted in v184.108.40.206 so upgrade if you can.
Now you'd be forgiven for thinking that you can just select the address from the uCommerce_Address table and then assign the id to the BillingAddressId property of your purchase order however if you do that, you'll find you get the error:
The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_uCommerce_PurchaseOrder_uCommerce_OrderAddress".
The conflict occurred in database "CommsReadyCMS", table "dbo.uCommerce_OrderAddress", column 'OrderAddressId'.
The statement has been terminated.
You'll get this because there is also a second table involved -uCommerce_OrderAddress. uCommerce_OrderAddress stores the actual address used throughout the order process incase the customer changes an address in the future, the order will always have the correct address.
Working around this isn't actually too difficult as mentioned before. The easiest solution is to create a new User Control in Visual Studio (I'll call mine login.ascx) and hook into the LoggedIn event. Once logged in, get the Umbraco member and from that, get the customer's billing address.
There's one caveat that I found with uCommerce and that's the way it gets the address. At the moment, there is a function on customer "GetAddress", this is great however if you check out the code it calls, it actually gets the customer's first address from the database -rather than the last address used. I don't think this is a bug as in most cases the first address you enter is your main address. I'll blog separately about managing a default address within the members section.
The code below however retrieves the most recently added address from the database
<asp:literal runat="server" ID="litLoggedIn" />
<asp:literal runat="server" ID="litLoggedOut" />
<asp:Login runat="server" id="lgnForm" CssClass="checkout-details"
DisplayRememberMe="false" TitleText="" OnLoggedIn="lgnForm_LoggedIn"
UserNameLabelText="Email Address" />
protected void lgnForm_LoggedIn(object sender, EventArgs e)
//If the user has a basket, wire up the shipping address with their last order details
var basket = SiteContext.Current.OrderContext.GetBasket(true);
if (basket != null)
//Get the customers current order
var po = basket.PurchaseOrder;
//Look for a shipping address
var add = po.GetBillingAddress();
//We only need to assign the address if there isn't already one assigned to this order
if (add == null)
//Get the customer who's just logged in
var mem = Membership.GetUser(lgnForm.UserName);
//To be safe check that we have a member
if (mem != null)
//Find the customer
var customer = Customer.ForUmbracoMember(Convert.ToInt32(mem.ProviderUserKey));
if (customer != null)
//Get the customer's most recent address
var previousAddress = customer.Addresses.ToList().LastOrDefault(a => a.AddressName == "Billing");
//If you want to get the customer's first address just uncomment this line
//var previousAddress = customer.GetAddress("Billing");
//Populate the billing address with the address)
if (previousAddress != null)
OrderAddress address = new OrderAddress
FirstName = previousAddress.FirstName,
LastName = previousAddress.LastName,
EmailAddress = previousAddress.EmailAddress,
PhoneNumber = previousAddress.PhoneNumber,
MobilePhoneNumber = previousAddress.MobilePhoneNumber,
CompanyName = previousAddress.CompanyName,
Line1 = previousAddress.Line1,
Line2 = previousAddress.Line2,
PostalCode = previousAddress.PostalCode,
City = previousAddress.City,
State = previousAddress.State,
Attention = previousAddress.Attention,
CountryId = previousAddress.CountryId,
AddressName = "Billing",
OrderId = new int?(po.OrderId)
//Store the address in the database
//Assign the address to the purchase order
po.BillingAddressId = new int?(address.OrderAddressId);
//Save the purchase order (shopping cart)