//
        /// <summary>
        /// Performs the auto cash dispense.
        /// </summary>
        /// <returns>True if succeeded; otherwise false.</returns>
        public bool AutoCashDispense(string fieldName, string fieldValue, decimal value)
        {
            DispenserWorkerResult result = DispenserWorkerResult.None;
            string message = string.Empty;

            this.EnsureDecksAreLoaded();
            IDictionary <string, DeckDenomValue> pairs =
                new SortedDictionary <string, DeckDenomValue>(StringComparer.InvariantCultureIgnoreCase);
            string keyLower = "LOWER";
            string keyUpper = "UPPER";

            decimal upperCount    = 0;
            decimal lowerCount    = 0;
            decimal receiptAmount = 0;

            try
            {
                // Determine the number of counts from lower and upper deck
                decimal upperAvailAmount = this.UpperDeck.RemainingValueCalculated;
                decimal lowerAvailAmount = this.LowerDeck.RemainingValueCalculated;

                // denominations
                decimal upperDenom = this.UpperDeck.Denimination;
                decimal lowerDenom = this.LowerDeck.Denimination;
                if (lowerDenom > upperDenom)
                {
                    // denom
                    decimal tempDenom = lowerDenom;
                    lowerDenom = upperDenom;
                    upperDenom = tempDenom;

                    // total amount
                    decimal tempAmount = lowerAvailAmount;
                    lowerAvailAmount = upperAvailAmount;
                    upperAvailAmount = tempAmount;

                    keyLower = "UPPER";
                    keyUpper = "LOWER";
                }

                // mapping for upper and lower deck
                pairs.Add(keyLower, new DeckDenomValue()
                {
                    Denomination = lowerDenom, Value = lowerAvailAmount
                });
                pairs.Add(keyUpper, new DeckDenomValue()
                {
                    Denomination = upperDenom, Value = upperAvailAmount
                });

                // if valid amount is passed
                if (value > 0)
                {
                    decimal inputValue = value;

                    // upper count
                    upperCount = Math.Floor(inputValue / pairs[keyUpper].Denomination);
                    if (upperCount > pairs[keyUpper].TotalCount)
                    {
                        upperCount = pairs[keyUpper].TotalCount;
                    }
                    inputValue -= (upperCount * pairs[keyUpper].Denomination);

                    // lower count
                    lowerCount = Math.Floor(inputValue / pairs[keyLower].Denomination);
                    if (lowerCount > pairs[keyLower].TotalCount)
                    {
                        lowerCount = pairs[keyLower].TotalCount;
                    }
                    inputValue -= (lowerCount * pairs[keyLower].Denomination);

                    // updated values
                    pairs[keyUpper].Value = upperCount;
                    pairs[keyLower].Value = lowerCount;
                    receiptAmount         = inputValue;
                }

                // dispense
                result = this.Dispense(pairs["UPPER"].Value, pairs["LOWER"].Value, out message);
                if (result != (DispenserWorkerResult.Success |
                               DispenserWorkerResult.LowerDeckOK |
                               DispenserWorkerResult.UpperDeckOK))
                {
                    LogManager.WriteLog(message, LogManager.enumLogLevel.Error);
                }
                else
                {
                    LogManager.WriteLog(message, LogManager.enumLogLevel.Info);
                }

                // try to print the remaing amount as receipt
                if (receiptAmount > 0)
                {
                    try
                    {
                        using (CReportViewer objReportViewer = new CReportViewer())
                        {
                            objReportViewer.PrintCashDispenserReceipt(System.Environment.MachineName, fieldName, fieldValue,
                                                                      Convert.ToDecimal(receiptAmount));
                        }
                    }
                    catch (Exception ex)
                    {
                        ExceptionManager.Publish(ex);
                    }
                }

                WriteAuditLog(this.UpperDeck, this.LowerDeck, upperCount, lowerCount, "Receipt", receiptAmount);
            }
            catch (Exception ex)
            {
                ExceptionManager.Publish(ex);
            }

            return(result == (DispenserWorkerResult.Success |
                              DispenserWorkerResult.LowerDeckOK |
                              DispenserWorkerResult.UpperDeckOK));
        }
        /// <summary>
        /// Dispenses the specified show message box.
        /// </summary>
        /// <param name="showMessageBox">if set to <c>true</c> [show message box].</param>
        public DispenserWorkerResult Dispense(decimal cd1Value, decimal cd2Value, out string outputString)
        {
            CDC.CashDispenserItem.DispenseResult result1 = null;
            CDC.CashDispenserItem.DispenseResult result2 = null;
            string cd1 = string.Empty;
            string cd2 = string.Empty;
            DispenserWorkerResult result = DispenserWorkerResult.None;

            outputString = string.Empty;
            this.EnsureDecksAreLoaded();

            try
            {
                if (cd1Value > 0)
                {
                    try
                    {
                        CDC.CashDispenserItem item1 = this.UpperDeck;
                        cd1     = item1.CassetteAlias;
                        result1 = item1.Dispense(cd1Value);
                    }
                    catch (Exception ex)
                    {
                        ExceptionManager.Publish(ex);
                    }
                }
                else
                {
                    result1 = new BMC.CashDispenser.Core.CashDispenserItem.DispenseResult()
                    {
                        Result = true
                    };
                }

                if (cd2Value > 0)
                {
                    try
                    {
                        CDC.CashDispenserItem item2 = this.LowerDeck;
                        cd2     = item2.CassetteAlias;
                        result2 = item2.Dispense(cd2Value);
                    }
                    catch (Exception ex)
                    {
                        ExceptionManager.Publish(ex);
                    }
                }
                else
                {
                    result2 = new BMC.CashDispenser.Core.CashDispenserItem.DispenseResult()
                    {
                        Result = true
                    };
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Publish(ex);
            }
            finally
            {
                string        currencySymbol = ExtensionMethods.GetCurrencySymbol(string.Empty);
                StringBuilder sb             = new StringBuilder();

                if (result1 != null)
                {
                    sb.Append(result1.IssuedValue.ToString() + " " + currencySymbol);
                    sb.Append(" issued, ");
                    sb.Append(result1.RejectedValue.ToString() + " " + currencySymbol);
                    sb.Append(" rejected from " + cd1);
                    sb.Append(" (" + result1.ErrorDescription + ")");

                    // Upper Deck
                    if (result1.Result)
                    {
                        result |= DispenserWorkerResult.UpperDeckOK;
                    }
                    else
                    {
                        result |= DispenserWorkerResult.UpperDeckFail;
                    }
                }

                // Lower Deck
                if (result2 != null)
                {
                    if (sb.Length > 0)
                    {
                        sb.Append(Environment.NewLine);
                    }
                    sb.Append(result2.IssuedValue.ToString() + " " + currencySymbol);
                    sb.Append(" issued, ");
                    sb.Append(result2.RejectedValue.ToString() + " " + currencySymbol);
                    sb.Append(" rejected from " + cd2);
                    sb.Append(" (" + result2.ErrorDescription + ")");

                    if (result2.Result)
                    {
                        result |= DispenserWorkerResult.LowerDeckOK;
                    }
                    else
                    {
                        result |= DispenserWorkerResult.LowerDeckFail;
                    }
                }

                outputString = sb.ToString();
            }

            // Final Condition
            if (((result & DispenserWorkerResult.LowerDeckOK) == DispenserWorkerResult.LowerDeckOK) &&
                ((result & DispenserWorkerResult.UpperDeckOK) == DispenserWorkerResult.UpperDeckOK))
            {
                result = DispenserWorkerResult.Success |
                         DispenserWorkerResult.LowerDeckOK |
                         DispenserWorkerResult.UpperDeckOK;
            }
            else
            {
                result &= ~DispenserWorkerResult.None;
                result |= DispenserWorkerResult.Failed;
            }
            return(result);
        }