//[23-02-2009] End Changes for improving performance of CustomerAccount service

        #endregion ctors

        #region inquireAccount
        /// <summary>
        /// This method returns account and statement information for the given account.
        /// </summary>
        /// <param name="accountNumber13"></param>
        /// <returns></returns>
        public Account InquireAccount([RequiredItem()][StringLength(13, 13)][CustomerAccountNumberAttribute()] string accountNumber13)
        {
            BillingLogEntry logEntry = new BillingLogEntry(eBillingActivityType.AccountInquiry, accountNumber13 != null?accountNumber13.PadLeft(16, '0'):string.Empty);

            using (Log log = CreateLog(logEntry))
            {
                try
                {
                    // validate the parameters.
                    MethodValidator validator = new MethodValidator(MethodBase.GetCurrentMethod(), accountNumber13);
                    validator.Validate();
                    // convert the accountNumber.
                    CustomerAccountNumber accountNumber = (CustomerAccountNumber)TypeDescriptor.GetConverter(
                        typeof(CustomerAccountNumber)).ConvertFrom(accountNumber13);

                    // get the siteid/sitecode information
                    PopulateSiteInfo(accountNumber);
                    logEntry.SiteId = this.SiteId;

                    // setup return
                    Account account = new Account();

                    // setup adapter and fill account object.
                    AccountAdapter adapter = new AccountAdapter(accountNumber, _userName, _siteId, _siteCode);
                    adapter.Fill(account);

                    //set the AllowOnlineOrdering flag
                    SetAllowOnlineOrderingFlag(ref account);

                    // all done.
                    return(account);
                }
                catch (ValidationException ve)
                {
                    logEntry.SetError(new ExceptionFormatter(ve).Format());
                    throw;
                }
                catch (BusinessLogicLayerException blle)
                {
                    logEntry.SetError(new ExceptionFormatter(blle).Format());
                    throw;
                }
                catch (Exception e)
                {
                    logEntry.SetError(new ExceptionFormatter(e).Format());
                    throw new UnexpectedSystemException(e);
                }
            }
        }
        /// <summary>
        /// This method returns the account address information for the given account.
        /// </summary>
        /// <param name="accountNumber13"></param>
        /// <returns></returns>
        public AccountAddress InquireServiceAddress(
            [RequiredItem()][StringLength(13, 13)]
            [CustomerAccountNumber()] string accountNumber13)
        {
            BillingLogEntry logEntry = new BillingLogEntry(
                eBillingActivityType.AccountAddress,
                accountNumber13.PadLeft(16, '0'));

            using (Log log = CreateLog(logEntry))
            {
                try
                {
                    // validate the parameters.
                    MethodValidator validator = new MethodValidator(MethodBase.GetCurrentMethod(), accountNumber13);
                    validator.Validate();

                    // convert the accountNumber.
                    CustomerAccountNumber accountNumber = (CustomerAccountNumber)TypeDescriptor.GetConverter(
                        typeof(CustomerAccountNumber)).ConvertFrom(accountNumber13);

                    // setup site information.
                    PopulateSiteInfo(accountNumber);
                    logEntry.SiteId = SiteId;

                    // setup the return
                    AccountAddress accountAddress = new AccountAddress();
                    AccountAdapter adapter        = new AccountAdapter(accountNumber, _userName, _siteId, _siteCode);
                    adapter.Fill(accountAddress);
                    return(accountAddress);
                }
                catch (ValidationException ve)
                {
                    logEntry.SetError(new ExceptionFormatter(ve).Format());
                    throw;
                }
                catch (BusinessLogicLayerException blle)
                {
                    logEntry.SetError(new ExceptionFormatter(blle).Format());
                    throw;
                }
                catch (Exception e)
                {
                    logEntry.SetError(new ExceptionFormatter(e).Format());
                    throw new UnexpectedSystemException(e);
                }
            }
        }
        /// <summary>
        /// This method returns account and statement information for the given account.
        /// </summary>
        /// <param name="siteId"></param>
        /// <param name="setTopBoxId"></param>
        /// <returns></returns>
        public Account InquireAccount([RequiredItem()] int siteId, [RequiredItem()][StringLength(1, 16)] string setTopBoxId)
        {
            BillingLogEntry logEntry = new BillingLogEntry(eBillingActivityType.AccountInquiry, siteId, setTopBoxId);

            using (Log log = CreateLog(logEntry))
            {
                try
                {
                    // validate the parameters.
                    MethodValidator validator = new MethodValidator(MethodBase.GetCurrentMethod(), siteId, setTopBoxId);
                    validator.Validate();

                    //look up the sitecode
                    string siteCode = DalSiteCode.Instance.GetSiteCode(siteId);

                    //get account number
                    string       accountNumber9 = null;
                    DalEquipment dalEquipment   = new DalEquipment();
                    accountNumber9 = dalEquipment.GetAccountFromSetTopBoxId(siteId, siteCode,
                                                                            setTopBoxId).PadLeft(9, '0');

                    if (accountNumber9 == null || accountNumber9 == string.Empty)
                    {
                        throw new InvalidSetTopBoxIdException(string.Format(
                                                                  __setTopBoxIdToAccountNumberException, setTopBoxId));
                    }

                    //look up division for this account
                    DalAccount dalAccount = new DalAccount();
                    CompanyDivisionFranchise companyDivisionFranchise = dalAccount.GetCompanyDivisionFranchise(siteId,
                                                                                                               siteCode, accountNumber9);

                    //turn accountNumber9 into accountNumber13
                    string accountNumber13 = companyDivisionFranchise.Company.ToString().PadLeft(2, '0') + companyDivisionFranchise.Division.ToString().PadLeft(2, '0') + accountNumber9;

                    // convert to CustomerAccountNumber
                    CustomerAccountNumber accountNumber = (CustomerAccountNumber)TypeDescriptor.GetConverter(
                        typeof(CustomerAccountNumber)).ConvertFrom(accountNumber13);

                    // get the siteid/sitecode information
                    PopulateSiteInfo(accountNumber);
                    logEntry.CustomerAccountNumber = accountNumber.AccountNumber16;

                    // setup return
                    Account account = new Account();

                    // setup adapter and fill account object.
                    AccountAdapter adapter = new AccountAdapter(accountNumber, _userName, _siteId, _siteCode);
                    adapter.Fill(account);

                    //set the AllowOnlineOrdering flag
                    SetAllowOnlineOrderingFlag(ref account);

                    // all done.
                    return(account);
                }
                catch (ValidationException ve)
                {
                    logEntry.SetError(ve.Message);
                    throw;
                }
                catch (BusinessLogicLayerException blle)
                {
                    logEntry.SetError(new ExceptionFormatter(blle).Format());
                    throw;
                }
                catch (DataSourceException de)
                {
                    logEntry.SetError(de.Message);
                    throw new DataSourceUnavailableException(de);
                }
                catch (Exception e)
                {
                    logEntry.SetError(e.Message);
                    throw new UnexpectedSystemException(e);
                }
            }
        }
        /// <summary>
        /// This method returns account and statement information for the given account.
        /// </summary>
        /// <param name="accountNumber9"></param>
        /// <param name="siteId"></param>
        /// <returns></returns>
        public Account InquireAccount([RequiredItem()][StringLength(9, 9)] string accountNumber9, [RequiredItem()] int siteId)
        {
            BillingLogEntry logEntry = new BillingLogEntry(eBillingActivityType.AccountInquiry, accountNumber9 == null?string.Empty:accountNumber9.PadLeft(16, '0'));

            using (Log log = CreateLog(logEntry))
            {
                try
                {
                    // validate the parameters.
                    MethodValidator validator = new MethodValidator(MethodBase.GetCurrentMethod(), accountNumber9, siteId);
                    validator.Validate();

                    //log the site id
                    logEntry.SiteId = siteId;

                    //look up the company and division for this account
                    string     siteCode   = DalSiteCode.Instance.GetSiteCode(siteId);
                    DalAccount dalAccount = new DalAccount();
                    CompanyDivisionFranchise companyDivisionFranchise = dalAccount.GetCompanyDivisionFranchise(siteId, siteCode, accountNumber9);

                    //turn accountNumber9 into accountNumber13
                    string accountNumber13 = companyDivisionFranchise.Company.ToString().PadLeft(2, '0') + companyDivisionFranchise.Division.ToString().PadLeft(2, '0') + accountNumber9;

                    // convert to CustomerAccountNumber
                    CustomerAccountNumber accountNumber = (CustomerAccountNumber)TypeDescriptor.GetConverter(
                        typeof(CustomerAccountNumber)).ConvertFrom(accountNumber13);

                    PopulateSiteInfo(accountNumber);

                    //log the account number
                    logEntry.CustomerAccountNumber = accountNumber.AccountNumber16;

                    // setup return
                    Account account = new Account();

                    // setup adapter and fill account object.
                    AccountAdapter adapter = new AccountAdapter(accountNumber, _userName, _siteId, _siteCode);
                    adapter.Fill(account);

                    //set the AllowOnlineOrdering flag
                    SetAllowOnlineOrderingFlag(ref account);

                    // all done.
                    return(account);
                }
                catch (ValidationException ve)
                {
                    logEntry.SetError(ve.Message);
                    throw;
                }
                catch (InvalidAccountNumberException ie)
                {
                    logEntry.SetError(ie.Message);
                    throw;
                }
                catch (DataSourceException de)
                {
                    logEntry.SetError(de.Message);
                    throw new DataSourceUnavailableException(de);
                }
                catch (UnexpectedSystemException ue)
                {
                    logEntry.SetError(ue.Message);
                    throw;
                }
                catch (Exception e)
                {
                    logEntry.SetError(e.Message);
                    throw new UnexpectedSystemException(e);
                }
            }
        }