/// <summary>
        /// Populate a stnadard sentItem model from database into a Postcard object
        /// </summary>
        /// <param name="sentItem"></param>
        /// <returns></returns>
        private PostCard PopulatePostCardItem(SentItem sentItem)
        {
            var postcard = new PostCard();

            postcard.FrontHtml   = sentItem.FrontHtml;
            postcard.BackHtml    = sentItem.BackHtml;
            postcard.ToAddress   = this.GetAddressFromRecipientProfile(sentItem.RecipientProfile);
            postcard.FromAddress = this.GetAddressFromRecipientProfile(sentItem.FromRecipient);
            return(postcard);
        }
        /// <summary>
        /// Transfer a sentItem model from database to a standard letter
        /// </summary>
        /// <param name="sentItem"></param>
        /// <returns></returns>
        private Letter PopulateLetterItem(SentItem sentItem)
        {
            var letter = new Letter();

            letter.FrontHtml   = sentItem.FrontHtml;
            letter.BackHtml    = sentItem.BackHtml;
            letter.ToAddress   = this.GetAddressFromRecipientProfile(sentItem.RecipientProfile);
            letter.FromAddress = this.GetAddressFromRecipientProfile(sentItem.FromRecipient);
            return(letter);
        }
        /// <summary>
        /// Handle the populating of database model object to the relevant PostCard, Letter model for processing
        /// </summary>
        /// <param name="sentItem"></param>
        /// <returns></returns>
        private IPostItem PopulateSendItem(SentItem sentItem)
        {
            switch (sentItem.ItemTypeId)
            {
            case ItemType.PostCard:
                return(PopulatePostCardItem(sentItem));

            case ItemType.Letter:
                return(PopulateLetterItem(sentItem));

            default:
                throw new UnsupportedPostItemException();
            }
        }
        /// <summary>
        /// Method to send an item and control the state
        /// </summary>
        /// <param name="sentItem"></param>
        private void SendItem(SentItem sentItem)
        {
            // Get the service necessary for the given country
            IPostService postService = this.GetServiceForCountry(sentItem.RecipientProfile.CountryId);

            // populate the item into a sendItem
            IPostItem postItem = this.PopulateSendItem(sentItem);

            // Validate the item can be sent
            string outputMessage;

            if (postService.ValidatePostItem(postItem, out outputMessage))
            {
                // Update to sending item status to SendingMail
                using (var db = new PostessDB())
                    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions {
                        IsolationLevel = IsolationLevel.RepeatableRead
                    }))
                    {
                        var sentItemDB = db.SentItems.Find(sentItem.Id);

                        // Do not attempt to send if the item is not in a default state
                        if (sentItemDB.SentItemStateId == SentItemState.SendingMail ||
                            sentItemDB.SentItemStateId == SentItemState.MailSent ||
                            sentItemDB.SentItemStateId == SentItemState.MailSendingError
                            )
                        {
                            return;
                        }

                        sentItemDB.SentItemStateId = SentItemState.SendingMail;
                        db.SaveChanges();
                    }

                try
                {
                    postService.SendPost(postItem);
                }
                catch (Exception e)
                {
                    // Update sending item status to MailSendingError
                    using (var db = new PostessDB())
                    {
                        // Mail sending error
                        var sentItemDB = db.SentItems.Find(sentItem.Id);
                        sentItemDB.SentItemStateId = SentItemState.MailSendingError;
                        db.SaveChanges();
                    }
                }

                // Update sending item status to SendingSuccess
                using (var db = new PostessDB())
                {
                    var sentItemDB = db.SentItems.Find(sentItem.Id);
                    sentItemDB.SentItemStateId = SentItemState.MailSent;
                    db.SaveChanges();
                }
            }
            else
            {
                // Process that this item could not be sent because of outputMessage
            }
        }