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;
        }
        private PaymentSummary CreatePaymentSummary(UserShows userShow, bool AddAdminCharge = false, bool campingFull = false)
        {
            var paymentSummary = new PaymentSummary();
            var thisShow = new Shows(userShow.ShowID);

            var DiscountMgr = new DiscountManager();
            return DiscountMgr.GetDiscounts(userShow.ShowID, userShow.Userid, userShow.HandlerType, AddAdminCharge, campingFull);
        }
        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;
        }
        // From Website
        public StatusCls GetSummaryForm(int ShowId, int UserId)
        {
            StatusCls status = new StatusCls();
            PaymentSummary paymentSummary = new PaymentSummary();
            Shows thisShow = new Shows(ShowId);
            User currentUser = new User(UserId);
            var us = new UserShows(UserId, ShowId);

            var singleEntryId = getSingleEntry(ShowId);

            decimal totals = 0;
            var transactions = GetTransactionDetails(us.ID, ref totals);

            String showDetailsBox = "";
            showDetailsBox += "<div class='showDetails summary themeText'>";
            showDetailsBox += "<div class='title' style='width:700px'>" + thisShow.ShowName + "</div>";
            showDetailsBox += "<div class='showdate'>" + thisShow.ShowDate.ToString("dd MMM yyyy") + "</div>";
            showDetailsBox += "</div >";

            String totalsBox = "";
            totalsBox += status.ShowSummary;
            totalsBox += "<div class='ctrlButtons'></div>";
            totalsBox += "<div class='totalSummary '>";
            if (us.Status == (int)UserShows.UserStatus.STATUS_ENTERED_AND_PAID)
            {
                if (totals < 0)
                {
                    var refundRequests = transactions.Where(x => x.TransactionType == TransactionTypes.RefundRequest );
                    var refundPaid = transactions.Where(x => x.TransactionType == TransactionTypes.RefundPaid || x.TransactionType == TransactionTypes.RefundPaid);
                    if (refundRequests.Any() && (refundRequests.Count() != refundPaid.Count()))
                    {
                        totalsBox += string.Format("<div class='notpaid'><h3>Pending Refund: £{0:0.00}</h3></div>", Math.Abs(totals));
                    }
                    else
                    {
                        totalsBox += string.Format("<div class='notpaid'><h3>Awaiting payment: £{0:0.00}</h3></div>", Math.Abs(totals));
                        totalsBox += createPaymentForm(currentUser, thisShow, us.ID, Math.Abs(totals));
                    }
                }
                else if (totals > 0)
                {
                    if (transactions.Any(x => x.TransactionType == TransactionTypes.ShowEntryPayment))
                    {
                        totalsBox += "<div class='notpaid'><h3>Show Paid</h3></div>";
                    }
                    else
                    {
                        totalsBox += string.Format("<div class='notpaid'><h3>Awaiting payment: £{0:0.00}</h3></div>", Math.Abs(totals));
                        totalsBox += createPaymentForm(currentUser, thisShow, us.ID, totals);
                    }
                }
                else
                {
                    totalsBox += "<div class='paid'><h3>Show Paid</h3></div>";
                }
            }
            else if (us.Status == (int)UserShows.UserStatus.STATUS_ENTERED_NOT_PAID || us.Status == (int)UserShows.UserStatus.STATUS_SAVED)
            {
                if (transactions.Any())
                {
                    totals = GetOutstandingBalance(us) * -1;

                    if (totals < 0)
                    {
                        totalsBox += string.Format("<div class='notpaid'><h3>Awaiting payment: £{0:0.00}</h3></div>", Math.Abs(totals));
                        totalsBox += createPaymentForm(currentUser, thisShow, us.ID, totals * -1);
                    }
                    else if (totals > 0)
                    {
                        totalsBox += "<div class='notpaid'>Refund Due</div>";
                    }
                }
                else
                {

                }
            }
            String userRefNo = us.ID.ToString().PadLeft(6, '0');

            totalsBox += "</div >";

            String docbox = "<div class='summaryDocs'>";
            docbox += "</div>";
            docbox += "<div class='buttons'>";
            if (thisShow.Status == (int)Shows.SHOW_STATUS.SHOWDOCS_AVAILABLE)
            {
                docbox += "<input type='button' class='button-document bigButtons' data-action='rp' value='Your Running Plan' />";
                docbox += "<input type='button' class='button-document bigButtons' data-action='rpb' value='Blank Running Plan' />";

                String baseURL = "/Schedules/" + thisShow.ShowDate.ToString("yyyy") + "/";
                List<ShowDocuments> showDocs = Shows.getShowDocuments(ShowId);
                foreach (ShowDocuments doc in showDocs.Where( x=> x.Name == "other" ) )
                {
                    docbox += String.Format("<input type='button' class='button-document bigButtons' style='text-transform:Capitalize;' data-action='other' data-url='{0}{1}' value='Show Information' />", baseURL, doc.Url, doc.Name);
                }

            }
            if (thisShow.Status >= (int)Shows.SHOW_STATUS.CLOSED)
            {
                //docbox += "<input type='button' class='btns' action='os' value='View Entry' showstatus='" + thisShow.Status.ToString() + "' />";
                if (us.Status == (int)UserShows.UserStatus.STATUS_ENTERED_AND_PAID)
                {
                    docbox += "<div class='entrySummary'>" + getEntrySummary(us) + "</div>";
                }
            }
            else
            {
                docbox += "<div class='entrySummary'>" + getEntrySummary(us) + "</div>";
                if (thisShow.Status != (int)Shows.SHOW_STATUS.SHOWDOCS_AVAILABLE)
                {
                    docbox += "<input type='button' class='btns' action='os' value='Edit Entry'  />";
                    docbox += "<input type='button' class='btns' action='ce' value='Cancel Entry'  />";
                }
            }
            docbox += "<input type='button' class='btns' action='close' value='Close' />";
            docbox += "</div>";
            status.Status = 0;
            status.UserID = currentUser.ID;
            status.Camping = new Camping(ShowId);
            status.CampingSummary = UserCamping.GetCampingSummary(ShowId, currentUser.ID);
            if (!status.CampingSummary.Any())
            {
                for (DateTime dt = status.Camping.Startdate; dt <= status.Camping.Enddate; dt = dt.AddDays(1))
                {
                    status.CampingSummary.Add(new Core.Dto.CampingSummary
                    {
                        CampingDay = dt,
                        Count = 0
                    });
                }
            }
            else
            {
                status.CampingFull = status.CampingSummary.Where(x => x.Count >= status.Camping.Limit).Count() == status.CampingSummary.Count();
            }
            status.PaymentSummary = CreatePaymentSummary(us, false, status.CampingFull);
            if (status.Camping.ID > -1 && !status.CampingFull)
            {
                status.UserCamping = new UserCamping(us.ID);
            }

            status.Data = "<input id='ShowID' type='hidden' value='" + ShowId.ToString() + "' />" +
                          "<div class='summary' showid='" + ShowId.ToString() + "'>" + showDetailsBox + totalsBox + docbox + "</div>";

            status.Extra = totalsBox;
            if (us.Status == (int)UserShows.UserStatus.STATUS_ENTERED_NOT_PAID)
            {
                status.Extra = createPaymentForm(currentUser, thisShow, us.ID, totals);
            }
            status.ShowStatus = thisShow.Status;
            status.PaymentSummary = CreatePaymentSummary(us);
            status.Helping = Business.Helpers.HelperForShow(us.ShowID, us.Userid);
            return status;
        }