/// <summary>
        /// Approves/Reviews/Disburses an expense.
        /// </summary>
        /// <param name="expense">An Expense object.</param>
        /// <param name="review">An ExpenseReview object.</param>
        public void ApproveExpense(Expense expense, ExpenseReview review)
        {
            // Create message contract.
               ExpenseWorkflowService.ApproverRequestMessage requestMessage =
                new ExpenseWorkflowService.ApproverRequestMessage(expense.WorkflowID, expense, review);

            ExpenseWorkflowServiceClient proxy = new ExpenseWorkflowServiceClient();
            try
            {
                // For Manager.
                if (expense.Status == ExpenseStatus.Pending)
                {
                    proxy.ReviewExpense(requestMessage);
                }

                // For Head of Department/HR Manager.
                else if (expense.Status == ExpenseStatus.Reviewed ||
                    expense.Status == ExpenseStatus.Escalated)
                {
                    proxy.ApproveExpense(requestMessage);
                }

                // For Financial Controller.
                else if (expense.Status == ExpenseStatus.Approved)
                {
                    proxy.DisburseExpense(requestMessage);
                }

                proxy.Close();
            }
            catch (FaultException<ProcessExecutionFault> ex)
            {
                throw new ApplicationException(ex.Message);
            }
        }
        /// <summary>
        /// Cancel a pending expense.
        /// </summary>
        /// <param name="expense">An Expense instance.</param>
        /// <returns>A boolean value indicating the request has been made.</returns>
        public bool CancelExpense(Expense expense)
        {
            bool result = false;

            // Cancel the expense.
            try
            {
                ExpenseWorkflowService.SubmitterRequestMessage requestMessage =
                    new ExpenseWorkflowService.SubmitterRequestMessage(expense.WorkflowID, expense);

                ExpenseWorkflowServiceClient proxy = new ExpenseWorkflowServiceClient();

                proxy.CancelExpense(requestMessage);
            }
            catch (FaultException<ProcessExecutionFault> ex)
            {
                throw new ApplicationException(ex.Message);
            }

            result = true;

            return result;
        }
        /// <summary>
        /// Submit an expense.
        /// </summary>
        /// <param name="expense">An Expense instance.</param>
        public void SubmitExpense(Expense expense)
        {
            // Submit the expense.
            try
            {
                expense.WorkflowID = Guid.NewGuid();

                ExpenseWorkflowService.SubmitterRequestMessage requestMessage =
                    new ExpenseWorkflowService.SubmitterRequestMessage(expense.WorkflowID, expense);

                ExpenseWorkflowServiceClient proxy = new ExpenseWorkflowServiceClient();
                proxy.SubmitExpense(requestMessage);
                proxy.Close();
            }
            catch (FaultException<ProcessExecutionFault> ex)
            {
                throw new ApplicationException(ex.Message);
            }
        }