//todo:  is this returning a model, not a dto all the way up to the client web site???
        public Account GetAccount(string accountNumber)
        {
            var billingAccount = odsDao.GetBillingAccount(accountNumber);

            if ( billingAccount == null )
            {
                logger.ErrorFormat(string.Format("Account with accountNumber {0} does not exist", accountNumber));

                throw new ApplicationException(string.Format("Account with accountNumber {0} does not exist", accountNumber));
            }

            var CartAccount = accountDao.GetAccount(accountNumber);

            Account acct = new Account();

            var groups = new Dictionary<string,LineItemGroup>();

            acct.AccountNumber = accountNumber;
            //acct.FormattedCustomerName = billingAccount.tblParty.FullName;

            Balance dueBalance = billingAccount.tblBalances.FirstOrDefault(b => b.BalanceTypeId == OdsValueConsts.BalanceTypes.AccountBilledAmount);
            acct.DueDate = dueBalance == null ? "" : dueBalance.BalanceDate.ToString();
            acct.DueAmount = dueBalance == null ? 0m : dueBalance.BalanceAmount ?? 0m;

            billingAccount.tblPolicyBillingAccounts.ToList()
            .ForEach(billAccts=> //groups roughly correlate to product types and lineItems to policy terms/modules
                    {

                        //Handle Lines / terms
                        List<Balance> balances = billAccts.tblBalances.ToList();
                        var due = balances
                            .FirstOrDefault(bal => bal.BalanceTypeId == OdsValueConsts.BalanceTypes.PolOpenRecievableDueAmount );

                        var balance = balances
                            .FirstOrDefault(bal => bal.BalanceTypeId == OdsValueConsts.BalanceTypes.PolOutstandingBalanceAmount);

                        if ( due != null && balance != null)
                        {
                            var line =
                            new LineItem()
                            {
                                Id = due.BalanceId.ToString()
                                , Name = billAccts.tblPolicy.Number + "-" + billAccts.PBPolicyModule.ToString()
                                , ProductNumber= billAccts.tblPolicy.Number + "-" + billAccts.PBPolicyModule.ToString()
                                , AmountDue = due.BalanceAmount ?? 0m
                                , ProductBalance = balance.BalanceAmount ?? 0m
                                , ProductMasterCompanyNumber = billAccts.tblPolicy.Product.FBCompany.CompanyCode
                                , AmountDescription = "Some Amount Description" //TODO: fix value
                                , ProductIssueSystemCode = "ABC"  //TODO: fix value
                                , Status = billAccts.tblPolicyStatu.Description //TODO: apply description logic
                            };

                        //Handle Groups / line of business
                            LineItemGroup group; //if there isn't already a group for this lob, build it.
                            string groupName = billAccts.tblPolicy.Product.LineOfBusiness.LongName;
                            if ( ! groups.ContainsKey(groupName))
                            {
                                group = new LineItemGroup();
                                group.GroupName = groupName;
                                groups[groupName] = group;
                                acct.LineItemGroups.Add(group);
                            }
                            group = groups[groupName];
                            group.LineItems.Add(line);
                        }
                    }
            );

            if ( CartAccount != null )
            {
                acct.Carts = CartAccount.Carts;
                acct.Payments = CartAccount.Payments;
            }

            return acct;
        }
        public bool SaveAmountsToCart(String AccountId, ICollection<AmountToPayDTO> Amounts)
        {
            //todo: transact service
            //todo: account pessimistic lock?

            var acct = accountDao.GetAccount(AccountId); //cart account

            if ( acct == null )
            {
                accountDao.AddAccount(acct = new Account(){Id = Guid.NewGuid(), AccountNumber = AccountId} );
            }

            acct.Cart = new Cart()
            {
                Id = Guid.NewGuid()
                , CartItems = new Collection<CartItem>()
            };

            //Add a cart item for each AmountToPayDTO
            Amounts.ToList().ForEach(amt=>acct.Cart.CartItems.Add(new CartItem() {AmountToPay=amt.AmountToPay , LineItemId = amt.LineItemId}) );

            accountDao.SaveAll();

            return true;
        }