/// <summary>
        /// Dispenses the specified value.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <returns>DispenseResult</returns>
        public DispenseResult Dispense(decimal value)
        {
            ICoinDispenser coinDispenser = null;
            DispenseResult result = new DispenseResult();
            decimal issuedValue = value;
            decimal rejectedValue = 0;
            decimal? issuedValue2 = 0;
            decimal? rejectedValue2 = 0;
            CoinDispStatus dispStatus = null;
            bool success = false;
            LogManager.WriteLog("|=> (Dispense) : " +
                ((this.DeckType == TypeOfDeck.Lower) ? "Lower" : "Upper") + " " +
                "Value : " + value.ToString(),
                LogManager.enumLogLevel.Info);
            bool canUpdateToDB = false;

            try
            {
                // COM API CALL
                result.Value = value;
                try
                {
                    coinDispenser = GetCoinDispenser();
                    if (this.DeckType == TypeOfDeck.Lower)
                        dispStatus = coinDispenser.DispenseLowDeck((ushort)value);
                    else
                        dispStatus = coinDispenser.DispenseUPDeck((ushort)value);
                }
                catch (Exception ex)
                {
                    ExceptionManager.Publish(ex);
                }
                finally
                {
                    if (dispStatus != null)
                    {
                        LogManager.WriteLog("|=> (Dispense) : Error Code : " + dispStatus.ErrorCode.ToString(), LogManager.enumLogLevel.Info);
                        success = IsSucceeded(dispStatus.ErrorCode);
                        canUpdateToDB = true;
                        string outputMessage = "Output Message => Deck => {0}, Dispensed Value => {1:F}, Rejected Value => {2:F}";

                        if (this.DeckType == TypeOfDeck.Lower)
                        {
                            issuedValue = dispStatus.LowDispNotes;
                            rejectedValue = dispStatus.LowRejNotes;
                            try
                            {
                                outputMessage = string.Format(outputMessage, "Lower", issuedValue, rejectedValue);
                            }
                            catch { }
                        }
                        else
                        {
                            issuedValue = dispStatus.UPDispNotes;
                            rejectedValue = dispStatus.UPRejNotes;
                            try
                            {
                                outputMessage = string.Format(outputMessage, "Upper", issuedValue, rejectedValue);
                            }
                            catch { }
                        }
                        result.ErrorDescription = dispStatus.ErrDesc;
                        LogManager.WriteLog(outputMessage, LogManager.enumLogLevel.Info);
                    }
                    else
                    {
                        result.ErrorDescription = "Unable to dispense from " + this.CassetteAlias + ".";
                        result.Failed = true;
                    }

                    LogManager.WriteLog("|=> (Dispense) : " + result.ErrorDescription, LogManager.enumLogLevel.Info);
                    coinDispenser = null;
                }

                if (canUpdateToDB)
                {
                    // UPDATE IT INTO DATABASE
                    using (CashDispenserDBDataContext context = new CashDispenserDBDataContext(CashDispenserFactory.ExchangeConnectionString))
                    {
                        int? iResult = 0;
                        context.UpdateCashDispenserItemValues(this.CassetteID,
                            issuedValue,
                            rejectedValue,
                            ref issuedValue2,
                            ref rejectedValue2,
                            ref iResult);

                        if (iResult != null && iResult.HasValue)
                        {
                            result.Result = (iResult.Value > 0);
                        }
                        LogManager.WriteLog("|=> (Dispense) : Result : " + result.Result.ToString(), LogManager.enumLogLevel.Info);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Publish(ex);
            }
            finally
            {
                if (result != null)
                {
                    result.Result = success;
                    if (canUpdateToDB)
                    {
                        result.IssuedValue = issuedValue;
                        result.RejectedValue = rejectedValue;

                        if (issuedValue2 != null && issuedValue2.HasValue)
                        {
                            this.IssuedValue = issuedValue2.Value;

                        }
                        if (rejectedValue2 != null && rejectedValue2.HasValue)
                        {
                            this.RejectedValue = rejectedValue2.Value;
                        }
                    }
                }
            }

            return result;
        }
        /// <summary>
        /// Dispenses the specified value.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <returns>DispenseResult</returns>
        public DispenseResult Dispense(decimal value)
        {
            ICoinDispenser coinDispenser  = null;
            DispenseResult result         = new DispenseResult();
            decimal        issuedValue    = value;
            decimal        rejectedValue  = 0;
            decimal?       issuedValue2   = 0;
            decimal?       rejectedValue2 = 0;
            CoinDispStatus dispStatus     = null;
            bool           success        = false;

            LogManager.WriteLog("|=> (Dispense) : " +
                                ((this.DeckType == TypeOfDeck.Lower) ? "Lower" : "Upper") + " " +
                                "Value : " + value.ToString(),
                                LogManager.enumLogLevel.Info);
            bool canUpdateToDB = false;

            try
            {
                // COM API CALL
                result.Value = value;
                try
                {
                    coinDispenser = GetCoinDispenser();
                    if (this.DeckType == TypeOfDeck.Lower)
                    {
                        dispStatus = coinDispenser.DispenseLowDeck((ushort)value);
                    }
                    else
                    {
                        dispStatus = coinDispenser.DispenseUPDeck((ushort)value);
                    }
                }
                catch (Exception ex)
                {
                    ExceptionManager.Publish(ex);
                }
                finally
                {
                    if (dispStatus != null)
                    {
                        LogManager.WriteLog("|=> (Dispense) : Error Code : " + dispStatus.ErrorCode.ToString(), LogManager.enumLogLevel.Info);
                        success       = IsSucceeded(dispStatus.ErrorCode);
                        canUpdateToDB = true;
                        string outputMessage = "Output Message => Deck => {0}, Dispensed Value => {1:F}, Rejected Value => {2:F}";

                        if (this.DeckType == TypeOfDeck.Lower)
                        {
                            issuedValue   = dispStatus.LowDispNotes;
                            rejectedValue = dispStatus.LowRejNotes;
                            try
                            {
                                outputMessage = string.Format(outputMessage, "Lower", issuedValue, rejectedValue);
                            }
                            catch { }
                        }
                        else
                        {
                            issuedValue   = dispStatus.UPDispNotes;
                            rejectedValue = dispStatus.UPRejNotes;
                            try
                            {
                                outputMessage = string.Format(outputMessage, "Upper", issuedValue, rejectedValue);
                            }
                            catch { }
                        }
                        result.ErrorDescription = dispStatus.ErrDesc;
                        LogManager.WriteLog(outputMessage, LogManager.enumLogLevel.Info);
                    }
                    else
                    {
                        result.ErrorDescription = "Unable to dispense from " + this.CassetteAlias + ".";
                        result.Failed           = true;
                    }

                    LogManager.WriteLog("|=> (Dispense) : " + result.ErrorDescription, LogManager.enumLogLevel.Info);
                    coinDispenser = null;
                }

                if (canUpdateToDB)
                {
                    // UPDATE IT INTO DATABASE
                    using (CashDispenserDBDataContext context = new CashDispenserDBDataContext(CashDispenserFactory.ExchangeConnectionString))
                    {
                        int?iResult = 0;
                        context.UpdateCashDispenserItemValues(this.CassetteID,
                                                              issuedValue,
                                                              rejectedValue,
                                                              ref issuedValue2,
                                                              ref rejectedValue2,
                                                              ref iResult);

                        if (iResult != null && iResult.HasValue)
                        {
                            result.Result = (iResult.Value > 0);
                        }
                        LogManager.WriteLog("|=> (Dispense) : Result : " + result.Result.ToString(), LogManager.enumLogLevel.Info);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Publish(ex);
            }
            finally
            {
                if (result != null)
                {
                    result.Result = success;
                    if (canUpdateToDB)
                    {
                        result.IssuedValue   = issuedValue;
                        result.RejectedValue = rejectedValue;

                        if (issuedValue2 != null && issuedValue2.HasValue)
                        {
                            this.IssuedValue = issuedValue2.Value;
                        }
                        if (rejectedValue2 != null && rejectedValue2.HasValue)
                        {
                            this.RejectedValue = rejectedValue2.Value;
                        }
                    }
                }
            }

            return(result);
        }