public PaymentSummary GetDiscounts(int ShowId, int UserId, int HandlerType, bool fromAdmin = false, bool campingFull = false)
        {
            var paymentSummary = new PaymentSummary();
            var us = new UserShows(UserId, ShowId) {HandlerType = HandlerType};
            UserCamping.GetCampingSummary(ShowId, UserId);

            var charges = ShowCharges.getClassChargeDetails(ShowId);
            var discountList = ShowDiscounts.getDiscountsByType(ShowId, HandlerType, (int)DiscountTypes.TransactionCharge);

            var allDiscounts = ShowDiscounts.getClassChargeDetails(ShowId);
            var adminCharge = allDiscounts.FirstOrDefault(x => x.DiscountName == "Admin Charge");
            var onlineCharge = allDiscounts.FirstOrDefault(x => x.DiscountName == "Transaction Charge");
            //
            // Added display what has already been paid and add/subtract difference.
            var showTransactions = new List<Transaction>();
            if (us.ID > -1)
            {
                showTransactions = Transaction.getTransactionForShowUser(us.RefCode);
                if (showTransactions.Any(x => x.EnteredBy == (int)Transaction.ENTERED_BY.SHOW_ADMIN_ENTRY))
                {
                    if (adminCharge != null)
                    {
                        paymentSummary.add("Admin Charge", adminCharge.Amount, 0, ChargableTypes.OFFLINE_CHARGE);
                    }
                }
                if (showTransactions.Any(x => x.EnteredBy == (int)Transaction.ENTERED_BY.ONLINE_ENTRY)
                    || us.Status  != 3 )
                {
                    if (onlineCharge!= null)
                    {
                        if (fromAdmin)
                        {
                            var onlineEntryCnt = showTransactions.Count(x => x.EnteredBy == 0 && x.TransactionType == TransactionTypes.ShowEntryPayment && x.Amount > 0);
                            if (onlineEntryCnt > 0)
                            {
                                paymentSummary.add("'n' Online Charges ", onlineCharge.Amount, onlineEntryCnt, ChargableTypes.TRANSACTION_CHARGE_ADMIN);
                            }
                        }
                        else
                        {
                            paymentSummary.add("Transaction Charge", onlineCharge.Amount, 0, ChargableTypes.TRANSACTION_CHARGE);
                        }
                    }
                }
            }
            else
            {
                if (fromAdmin)
                {
                    if (adminCharge != null)
                    {
                        paymentSummary.add("Admin Charge", adminCharge.Amount, 0, ChargableTypes.OFFLINE_CHARGE);
                    }
                }
                else
                {
                    if (onlineCharge != null)
                    {
                        paymentSummary.add("Transaction Charge", onlineCharge.Amount, 0, ChargableTypes.TRANSACTION_CHARGE);
                    }
                }
            }
            var showCamping = new Camping(ShowId);
            foreach (var sd in discountList)
            {
                var tmp = sd.DiscountName + " discount " + sd.SubTypeName;
                tmp = tmp.Replace("'n'", sd.Amount.ToString());
                if (sd.Subtype == (int)CHARGES_SUBTYPES.n_NightsCamping)
                {
                    if (!campingFull)
                    {
                        paymentSummary.add(tmp, showCamping.Costpernight, Convert.ToInt32(sd.Amount), ChargableTypes.DISCOUNT_CAMPING);
                    }
                }
                else if (sd.Subtype == (int)CHARGES_SUBTYPES.percentCamping)
                {
                    if (!campingFull)
                    {
                        paymentSummary.addDiscount(tmp, sd.Amount, sd.Subtype, ChargableTypes.DISCOUNT_CAMPING, sd.ChargeType);
                    }
                }
                else if (sd.Subtype == (int)CHARGES_SUBTYPES.n_RunsFree)
                {
                    paymentSummary.addDiscount(tmp, sd.Amount, sd.Subtype, ChargableTypes.DISCOUNT, sd.ChargeType);
                }
                else if (sd.Subtype == (int)CHARGES_SUBTYPES.percentOff)
                {
                    paymentSummary.addDiscount(tmp, sd.Amount, sd.Subtype, ChargableTypes.DISCOUNT, sd.ChargeType);
                }
            }

            int lastChargeType = -1;
            var usedAtShow = ShowClasses.GetChargeTypesForShow(ShowId);
            foreach (ShowChargeTypes item in usedAtShow)
            {
                var charge = charges.FirstOrDefault(x => x.ChargeType == item.ChargeTypeId);
                if (charge != null)
                {
                    lastChargeType = charge.ChargeType;
                    paymentSummary.add(charge, ChargableTypes.STANDARD);
                }
            }
            if (showCamping.ID > -1 && !campingFull)
            {
                UserCamping userCamping = new UserCamping(us.ID);
                var maxNights = (showCamping.Enddate - showCamping.Startdate).Days + 1;
                int Nights = 0;
                if (userCamping.ID > -1)
                {
                    var list = userCamping.PitchDetails[0].CampingDays.Split(',').Where(x => x.Length > 0);
                    Nights = list.Count() * userCamping.PitchDetails.Count;
                }
                if (showCamping.Costpershow > 0)
                {
                    paymentSummary.add("Camping", showCamping.Costpershow, maxNights, ChargableTypes.MAXCAMPING);
                }
                if (showCamping.ChargeType == 1)
                {
                    if (showCamping.Costpershow == 0)
                    {
                        paymentSummary.add("Camping", showCamping.Costpershow, maxNights, ChargableTypes.MAXCAMPING);
                    }
                    paymentSummary.add("Camping", showCamping.Costpernight, Nights, ChargableTypes.CAMPING);
                }
                if (showCamping.ChargeType == 2)
                {
                    paymentSummary.add("Camping", showCamping.Costpershow, Nights, ChargableTypes.CAMPING_FIXFEE);
                }
            }

            Decimal val = 0M;
            showTransactions.ForEach(x => val += x.Amount);

            if (showTransactions.Any())
            {
                decimal lastPayment = 0;
                decimal showEntries = 0;
                //                if (showTransactions.LastOrDefault().TransactionType != TransactionTypes.RefundPaid)
                if (showTransactions.Any(x => x.TransactionType == TransactionTypes.ShowEntryPayment))
                {
                    lastPayment = showTransactions.Where(x => x.TransactionType == TransactionTypes.ShowEntryPayment).Sum(x => x.Amount);
                    if (lastPayment != 0)
                    {
                        paymentSummary.add("Payments Received", lastPayment, 0, ChargableTypes.TRANSACTION);
                    }
                }
                if (showTransactions.Any(x => x.TransactionType == TransactionTypes.ShowEntry))
                {
                    showEntries = showTransactions.Where(x => x.TransactionType == TransactionTypes.ShowEntry).Sum(x => x.Amount);
                    paymentSummary.add("Fees", showEntries, 0, ChargableTypes.TRANSACTION);
                }
                if (showTransactions.Any(x => x.TransactionType == TransactionTypes.TransactionCharge))
                {
                    showEntries = showTransactions.Where(x => x.TransactionType == TransactionTypes.TransactionCharge).Sum(x => x.Amount);
                    paymentSummary.add("Transaction Charges", showEntries, 0, ChargableTypes.TRANSACTION);
                }
                if (showTransactions.Any(x => x.TransactionType == TransactionTypes.RefundRequest))
                {
                    showEntries = showTransactions.Where(x => x.TransactionType == TransactionTypes.RefundRequest).Sum(x => x.Amount);
                    paymentSummary.add("RefundRequest", showEntries, 0, ChargableTypes.TRANSACTION);
                }
                if (showTransactions.Any(x => x.TransactionType == TransactionTypes.RefundPaid))
                {
                    var refunds = showTransactions.Where(x => x.TransactionType == TransactionTypes.RefundPaid);
                    showEntries = refunds.Sum(x => x.Amount);
                    paymentSummary.add("RefundPaid", showEntries, 0, ChargableTypes.TRANSACTION);

                    var RefundChargeAmount = DiscountManager.GetRefundCharge(ShowId);
                    paymentSummary.add("RefundCharge", RefundChargeAmount, refunds.Count(), ChargableTypes.REFUND_CHARGE);

                }
                if (showTransactions.Any(x => x.TransactionType == TransactionTypes.RefundCancelled))
                {
                    var refunds = showTransactions.Where(x => x.TransactionType == TransactionTypes.RefundCancelled);
                    showEntries = refunds.Sum(x => x.Amount);
                    paymentSummary.add("RefundCancelled", showEntries, 0, ChargableTypes.TRANSACTION);
                }

            }

            return paymentSummary;
        }
        public PaymentSummary CreateTotalsSummary(int ShowID, int UserID, ref Decimal totals)
        {
            ShowClasses classes = new ShowClasses();
            List<ShowClasses.Totals> totalsList = classes.getShowTotalsForUser(ShowID, UserID);

            PaymentSummary paymentSummary = new PaymentSummary();
            decimal standardClassAmount = 0;
            foreach (ShowClasses.Totals total in totalsList)
            {
                if (total.ChargeType == 1)
                {
                    standardClassAmount = total.ChargeRate;
                }
                paymentSummary.add(new ChargableItem(total.ChargeName, total.ChargeRate, total.Count, ChargableTypes.STANDARD, total.ChargeType));
            }

            UserShows us = new UserShows(UserID, ShowID);
            //
            // check if alt handlers are judging
            //
            if (us.HandlerType == 0)
            {
                List<AltHandler> altHList = AltHandler.GetAllAltHandlersList(us.Userid);
                foreach (AltHandler alt in altHList)
                {
                    if (Judge.isJudgeAtShow(alt.AltHandlerID, ShowID))
                    {
                        us.HandlerType = 2;
                    }
                }
            }

            Decimal val = 0;
            List<ShowDiscounts> list = ShowDiscounts.getDiscountsByType(ShowID, us.HandlerType);
            foreach (ShowDiscounts sd in list)
            {
                String tmp = "";
                if (sd.DiscountType == (int)DiscountTypes.Fixed)
                {
                    val = sd.Amount;
                    tmp = sd.DiscountName + " " + sd.SubTypeName;
                }
                else if (sd.DiscountType == (int)DiscountTypes.Member)
                {
                    tmp = sd.DiscountName + " discount " + sd.SubTypeName;
                    tmp = tmp.Replace("'n'", sd.Amount.ToString());
                    val = -(sd.Amount * standardClassAmount);
                }

                paymentSummary.add(tmp, val, 1, ChargableTypes.DISCOUNT);
                totals += val;
            }

            if (us.ID > -1)
            {
                Camping showCamping = new Camping(us.ShowID);
                UserCamping userCamping = new UserCamping(us.ID);
                int Nights = 0;
                if (userCamping.ID > -1)
                {
                    //ShowCharges chg = new ShowCharges(us.ShowID, 6); // Get Camping Charge for This Show

                    Nights = userCamping.PitchDetails[0].CampingDays.Split(',').Length;
                }
                paymentSummary.add("Camping", showCamping.Costpernight, Nights, ChargableTypes.CAMPING);
            }

            if (totals > 0)
            {
                paymentSummary.add("Outstanding Payments", totals, 0, ChargableTypes.TRANSACTION);
            }
            else if (totals < 0)
            {
                paymentSummary.add("Over Payments", totals, 0, ChargableTypes.TRANSACTION);
            }

            return paymentSummary;
        }