private void CreateSummaryControls( bool setValues ) { lRegistrationTerm.Text = RegistrationTerm; lDiscountCodeLabel.Text = DiscountCodeTerm; if ( RegistrationTemplate.RegistrantsSameFamily == RegistrantsSameFamily.Ask ) { var familyOptions = RegistrationState.GetFamilyOptions( RegistrationTemplate, RegistrationState.RegistrantCount ); if ( familyOptions.Any() ) { familyOptions.Add( familyOptions.ContainsKey( RegistrationState.FamilyGuid ) ? Guid.NewGuid() : RegistrationState.FamilyGuid.Equals( Guid.Empty ) ? Guid.NewGuid() : RegistrationState.FamilyGuid, "None" ); rblRegistrarFamilyOptions.DataSource = familyOptions; rblRegistrarFamilyOptions.DataBind(); pnlRegistrarFamilyOptions.Visible = true; } else { pnlRegistrarFamilyOptions.Visible = false; } } else { pnlRegistrarFamilyOptions.Visible = false; } if ( setValues && RegistrationState != null && RegistrationInstanceState != null ) { lbSummaryNext.Text = "Finish"; // Check to see if this is an existing registration or information has already been entered if ( RegistrationState.RegistrationId.HasValue || !string.IsNullOrWhiteSpace( RegistrationState.FirstName ) || !string.IsNullOrWhiteSpace( RegistrationState.LastName ) || !string.IsNullOrWhiteSpace( RegistrationState.ConfirmationEmail ) ) { // If so, use it tbYourFirstName.Text = RegistrationState.FirstName; tbYourLastName.Text = RegistrationState.LastName; tbConfirmationEmail.Text = RegistrationState.ConfirmationEmail; } else { if ( CurrentPerson != null ) { tbYourFirstName.Text = CurrentPerson.NickName; tbYourLastName.Text = CurrentPerson.LastName; tbConfirmationEmail.Text = CurrentPerson.Email; } else { tbYourFirstName.Text = string.Empty; tbYourLastName.Text = string.Empty; tbConfirmationEmail.Text = string.Empty; } } rblRegistrarFamilyOptions.Label = string.IsNullOrWhiteSpace( tbYourFirstName.Text ) ? "You are in the same family as" : tbYourFirstName.Text + " is in the same family as"; cbUpdateEmail.Visible = CurrentPerson != null && !string.IsNullOrWhiteSpace( CurrentPerson.Email ); //rblRegistrarFamilyOptions.SetValue( RegistrationState.FamilyGuid.ToString() ); // Build Discount info nbDiscountCode.Visible = false; if ( RegistrationTemplate != null && RegistrationTemplate.Discounts.Any() ) { // Only allow discount code to be entered for a new registration divDiscountCode.Visible = !RegistrationState.RegistrationId.HasValue; string discountCode = RegistrationState.DiscountCode; tbDiscountCode.Text = discountCode; if ( !string.IsNullOrWhiteSpace( discountCode ) ) { var discount = RegistrationTemplate.Discounts .Where( d => d.Code.Equals( discountCode, StringComparison.OrdinalIgnoreCase ) ) .FirstOrDefault(); if ( discount == null ) { nbDiscountCode.Text = string.Format( "'{1}' is not a valid {1}.", discountCode, DiscountCodeTerm ); nbDiscountCode.Visible = true; } } } else { divDiscountCode.Visible = false; } decimal? minimumInitialPayment = RegistrationTemplate.MinimumInitialPayment; if ( RegistrationTemplate.SetCostOnInstance ?? false ) { minimumInitialPayment = RegistrationInstanceState.MinimumInitialPayment; } // Get the cost/fee summary var costs = new List<RegistrationCostSummaryInfo>(); foreach ( var registrant in RegistrationState.Registrants ) { if ( registrant.Cost > 0 ) { var costSummary = new RegistrationCostSummaryInfo(); costSummary.Type = RegistrationCostSummaryType.Cost; costSummary.Description = string.Format( "{0} {1}", registrant.GetFirstName( RegistrationTemplate ), registrant.GetLastName( RegistrationTemplate ) ); costSummary.Cost = registrant.Cost; if ( RegistrationState.DiscountPercentage > 0.0m ) { costSummary.DiscountedCost = costSummary.Cost - ( costSummary.Cost * RegistrationState.DiscountPercentage ); } else { costSummary.DiscountedCost = costSummary.Cost; } // If registration allows a minimum payment calculate that amount, otherwise use the discounted amount as minimum costSummary.MinPayment = minimumInitialPayment.HasValue ? minimumInitialPayment.Value : costSummary.DiscountedCost; costs.Add( costSummary ); } foreach ( var fee in registrant.FeeValues ) { var templateFee = RegistrationTemplate.Fees.Where( f => f.Id == fee.Key ).FirstOrDefault(); if ( fee.Value != null ) { foreach ( var feeInfo in fee.Value ) { decimal cost = feeInfo.PreviousCost > 0.0m ? feeInfo.PreviousCost : feeInfo.Cost; string desc = string.Format( "{0}{1} ({2:N0} @ {3})", templateFee != null ? templateFee.Name : "(Previous Cost)", string.IsNullOrWhiteSpace( feeInfo.Option ) ? "" : "-" + feeInfo.Option, feeInfo.Quantity, cost.FormatAsCurrency() ); var costSummary = new RegistrationCostSummaryInfo(); costSummary.Type = RegistrationCostSummaryType.Fee; costSummary.Description = desc; costSummary.Cost = feeInfo.Quantity * cost; if ( RegistrationState.DiscountPercentage > 0.0m && templateFee != null && templateFee.DiscountApplies ) { costSummary.DiscountedCost = costSummary.Cost - ( costSummary.Cost * RegistrationState.DiscountPercentage ); } else { costSummary.DiscountedCost = costSummary.Cost; } // If template allows a minimum payment, then fees are not included, otherwise it is included costSummary.MinPayment = minimumInitialPayment.HasValue ? 0 : costSummary.DiscountedCost; costs.Add( costSummary ); } } } } minimumPayment = 0.0M; // If there were any costs if ( costs.Any() ) { pnlRegistrantsReview.Visible = false; pnlCostAndFees.Visible = true; // Get the total min payment for all costs and fees minimumPayment = costs.Sum( c => c.MinPayment ); // Add row for amount discount if ( RegistrationState.DiscountAmount > 0.0m ) { decimal totalDiscount = 0.0m - ( RegistrationState.Registrants.Count * RegistrationState.DiscountAmount ); costs.Add( new RegistrationCostSummaryInfo { Type = RegistrationCostSummaryType.Discount, Description = "Discount", Cost = totalDiscount, DiscountedCost = totalDiscount } ); } // Get the totals RegistrationState.TotalCost = costs.Sum( c => c.Cost ); RegistrationState.DiscountedCost = costs.Sum( c => c.DiscountedCost ); // If minimum payment is greater than total discounted cost ( which is possible with discounts ), adjust the minimum payment minimumPayment = minimumPayment.Value > RegistrationState.DiscountedCost ? RegistrationState.DiscountedCost : minimumPayment; // Add row for totals costs.Add( new RegistrationCostSummaryInfo { Type = RegistrationCostSummaryType.Total, Description = "Total", Cost = costs.Sum( c => c.Cost ), DiscountedCost = RegistrationState.DiscountedCost, } ); rptFeeSummary.DataSource = costs; rptFeeSummary.DataBind(); // Set the total cost hfTotalCost.Value = RegistrationState.DiscountedCost.ToString(); lTotalCost.Text = RegistrationState.DiscountedCost.FormatAsCurrency(); // Check for previous payments lPreviouslyPaid.Visible = RegistrationState.PreviousPaymentTotal != 0.0m; hfPreviouslyPaid.Value = RegistrationState.PreviousPaymentTotal.ToString(); lPreviouslyPaid.Text = RegistrationState.PreviousPaymentTotal.FormatAsCurrency(); minimumPayment = minimumPayment.Value - RegistrationState.PreviousPaymentTotal; // if min payment is less than 0, set it to 0 minimumPayment = minimumPayment.Value < 0 ? 0 : minimumPayment.Value; // Calculate balance due, and if a partial payment is still allowed decimal balanceDue = RegistrationState.DiscountedCost - RegistrationState.PreviousPaymentTotal; bool allowPartialPayment = balanceDue > 0 && minimumPayment.Value < balanceDue; // If partial payment is allowed, show the minimum payment due lMinimumDue.Visible = allowPartialPayment; hfMinimumDue.Value = minimumPayment.Value.ToString(); lMinimumDue.Text = minimumPayment.Value.FormatAsCurrency(); // Make sure payment amount is within minumum due and balance due. If not, set to balance due if ( !RegistrationState.PaymentAmount.HasValue || RegistrationState.PaymentAmount.Value < minimumPayment.Value || RegistrationState.PaymentAmount.Value > balanceDue ) { RegistrationState.PaymentAmount = balanceDue; } nbAmountPaid.Visible = allowPartialPayment; nbAmountPaid.Text = ( RegistrationState.PaymentAmount ?? 0.0m ).ToString( "N2" ); // If a previous payment was made, or partial payment is allowed, show the amount remaining after selected payment amount lRemainingDue.Visible = allowPartialPayment; lRemainingDue.Text = ( RegistrationState.DiscountedCost - ( RegistrationState.PreviousPaymentTotal + ( RegistrationState.PaymentAmount ?? 0.0m ) ) ).FormatAsCurrency(); lAmountDue.Visible = !allowPartialPayment; lAmountDue.Text = ( RegistrationState.PaymentAmount ?? 0.0m ).FormatAsCurrency(); // Set payment options based on gateway settings if ( balanceDue > 0 && RegistrationTemplate.FinancialGateway != null ) { if ( RegistrationTemplate.FinancialGateway.Attributes == null ) { RegistrationTemplate.FinancialGateway.LoadAttributes(); } var component = RegistrationTemplate.FinancialGateway.GetGatewayComponent(); if ( component != null ) { BindSavedAccounts( component ); if ( rblSavedCC.Items.Count > 0 ) { pnlPaymentInfo.Visible = true; rblSavedCC.Items[0].Selected = true; rblSavedCC.Visible = true; } else { pnlPaymentInfo.Visible = !Using3StepGateway; rblSavedCC.Visible = false; } divNewCard.Style[HtmlTextWriterStyle.Display] = ( rblSavedCC.Items.Count == 0 || rblSavedCC.Items[rblSavedCC.Items.Count - 1].Selected ) ? "block" : "none"; if ( Using3StepGateway ) { divNewCard.Visible = false; lbSummaryNext.Text = "Next"; } else { divNewCard.Visible = true; lbSummaryNext.Text = "Finish"; txtCardFirstName.Visible = component.PromptForNameOnCard( RegistrationTemplate.FinancialGateway ) && component.SplitNameOnCard; txtCardLastName.Visible = component.PromptForNameOnCard( RegistrationTemplate.FinancialGateway ) && component.SplitNameOnCard; txtCardName.Visible = component.PromptForNameOnCard( RegistrationTemplate.FinancialGateway ) && !component.SplitNameOnCard; mypExpiration.MinimumYear = RockDateTime.Now.Year; mypExpiration.MaximumYear = mypExpiration.MinimumYear + 15; acBillingAddress.Visible = component.PromptForBillingAddress( RegistrationTemplate.FinancialGateway ); } } } else { pnlPaymentInfo.Visible = false; } } else { pnlRegistrantsReview.Visible = true; lRegistrantsReview.Text = string.Format( "<p>The following {0} will be registered for {1}:", RegistrationTemplate.RegistrantTerm.PluralizeIf( RegistrationState.Registrants.Count > 0 ).ToLower(), RegistrationInstanceState.Name ); rptrRegistrantReview.DataSource = RegistrationState.Registrants .Select( r => new { RegistrantName = r.GetFirstName( RegistrationTemplate ) + " " + r.GetLastName( RegistrationTemplate ) } ); rptrRegistrantReview.DataBind(); RegistrationState.TotalCost = 0.0m; RegistrationState.DiscountedCost = 0.0m; pnlCostAndFees.Visible = false; pnlPaymentInfo.Visible = false; } } }
private void CreateSummaryControls( bool setValues ) { lDiscountCodeLabel.Text = DiscountCodeTerm; if ( setValues && RegistrationState != null ) { // Check to see if this is an existing registration or information has already been entered if ( RegistrationState.RegistrationId.HasValue || !string.IsNullOrWhiteSpace( RegistrationState.FirstName) || !string.IsNullOrWhiteSpace( RegistrationState.LastName ) || !string.IsNullOrWhiteSpace( RegistrationState.ConfirmationEmail ) ) { // If so, use it tbYourFirstName.Text = RegistrationState.FirstName; tbYourLastName.Text = RegistrationState.LastName; tbConfirmationEmail.Text = RegistrationState.ConfirmationEmail; } else { // If not, find the field information from first registrant if ( RegistrationState.Registrants.Any() ) { var firstRegistrant = RegistrationState.Registrants.First(); tbYourFirstName.Text = firstRegistrant.GetFirstName( RegistrationTemplate ); tbYourLastName.Text = firstRegistrant.GetLastName( RegistrationTemplate ); tbConfirmationEmail.Text = firstRegistrant.GetEmail( RegistrationTemplate ); } else { tbYourFirstName.Text = string.Empty; tbYourLastName.Text = string.Empty; tbConfirmationEmail.Text = string.Empty; } } // Build Discount info nbDiscountCode.Visible = false; if ( RegistrationTemplate != null && RegistrationTemplate.Discounts.Any() ) { // Only allow discount code to be entered for a new registration divDiscountCode.Visible = !RegistrationState.RegistrationId.HasValue; string discountCode = RegistrationState.DiscountCode; tbDiscountCode.Text = discountCode; if ( !string.IsNullOrWhiteSpace( discountCode )) { var discount = RegistrationTemplate.Discounts .Where( d => d.Code.Equals( discountCode, StringComparison.OrdinalIgnoreCase ) ) .FirstOrDefault(); if ( discount == null ) { nbDiscountCode.Text = string.Format( "'{1}' is not a valid {1}.", discountCode, DiscountCodeTerm ); nbDiscountCode.Visible = true; } } } else { divDiscountCode.Visible = false; } // Get the cost/fee summary var costs = new List<RegistrationCostSummaryInfo>(); foreach( var registrant in RegistrationState.Registrants ) { if ( registrant.Cost > 0 ) { var costSummary = new RegistrationCostSummaryInfo(); costSummary.Type = RegistrationCostSummaryType.Cost; costSummary.Description = string.Format( "{0} {1}", registrant.GetFirstName( RegistrationTemplate ), registrant.GetLastName( RegistrationTemplate ) ); costSummary.Cost = registrant.Cost; if ( !RegistrationState.RegistrationId.HasValue && RegistrationState.DiscountPercentage > 0.0m ) { costSummary.DiscountedCost = costSummary.Cost - ( costSummary.Cost * RegistrationState.DiscountPercentage ); } else { costSummary.DiscountedCost = costSummary.Cost; } // If registration allows a minimum payment calculate that amount, otherwise use the discounted amount as minimum costSummary.MinPayment = RegistrationTemplate.MinimumInitialPayment.HasValue ? RegistrationTemplate.MinimumInitialPayment.Value : costSummary.DiscountedCost; costs.Add( costSummary ); } foreach( var fee in registrant.FeeValues ) { var templateFee = RegistrationTemplate.Fees.Where( f => f.Id == fee.Key ).FirstOrDefault(); if ( fee.Value != null ) { foreach ( var feeInfo in fee.Value ) { decimal cost = feeInfo.PreviousCost > 0.0m ? feeInfo.PreviousCost : feeInfo.Cost; string desc = string.Format( "{0}{1} ({2:N0} @ {3:C2})", templateFee != null ? templateFee.Name : "(Previous Cost)", string.IsNullOrWhiteSpace( feeInfo.Option ) ? "" : "-" + feeInfo.Option, feeInfo.Quantity, cost ); var costSummary = new RegistrationCostSummaryInfo(); costSummary.Type = RegistrationCostSummaryType.Fee; costSummary.Description = desc; costSummary.Cost = feeInfo.Quantity * cost; if ( !RegistrationState.RegistrationId.HasValue && RegistrationState.DiscountPercentage > 0.0m && templateFee != null && templateFee.DiscountApplies ) { costSummary.DiscountedCost = costSummary.Cost - ( costSummary.Cost * RegistrationState.DiscountPercentage ); } else { costSummary.DiscountedCost = costSummary.Cost; } // Optional Fees are always included in minimum payment costSummary.MinPayment = costSummary.DiscountedCost; costs.Add( costSummary ); } } } } // If there were any costs if ( costs.Any() ) { pnlMoney.Visible = true; // Get the total min payment for all costs and fees decimal minPayment = costs.Sum( c => c.MinPayment ); // Add row for amount discount if ( RegistrationState.DiscountAmount > 0.0m ) { decimal totalDiscount = 0.0m - ( RegistrationState.Registrants.Count * RegistrationState.DiscountAmount ); costs.Add( new RegistrationCostSummaryInfo { Type = RegistrationCostSummaryType.Discount, Description = "Discount", Cost = totalDiscount, DiscountedCost = totalDiscount } ); } // Get the totals RegistrationState.TotalCost = costs.Sum( c => c.Cost ); RegistrationState.DiscountedCost = costs.Sum( c => c.DiscountedCost ); // If minimum payment is greater than total discounted cost ( which is possible with discounts ), adjust the minimum payment minPayment = minPayment > RegistrationState.DiscountedCost ? RegistrationState.DiscountedCost : minPayment; // Add row for totals costs.Add( new RegistrationCostSummaryInfo { Type = RegistrationCostSummaryType.Total, Description = "Total", Cost = costs.Sum( c => c.Cost ), DiscountedCost = RegistrationState.DiscountedCost, } ); rptFeeSummary.DataSource = costs; rptFeeSummary.DataBind(); // Set the total cost hfTotalCost.Value = RegistrationState.DiscountedCost.ToString( "N2" ); lTotalCost.Text = RegistrationState.DiscountedCost.ToString( "C2" ); // Check for previous payments lPreviouslyPaid.Visible = RegistrationState.PreviousPaymentTotal != 0.0m; hfPreviouslyPaid.Value = RegistrationState.PreviousPaymentTotal.ToString( "N2" ); lPreviouslyPaid.Text = RegistrationState.PreviousPaymentTotal.ToString( "C2" ); minPayment = minPayment - RegistrationState.PreviousPaymentTotal; // if min payment is less than 0, set it to 0 minPayment = minPayment < 0 ? 0 : minPayment; // Calculate balance due, and if a partial payment is still allowed decimal balanceDue = RegistrationState.DiscountedCost - RegistrationState.PreviousPaymentTotal; bool allowPartialPayment = balanceDue > 0 && minPayment < balanceDue; // If partial payment is allowed, show the minimum payment due lMinimumDue.Visible = allowPartialPayment; hfMinimumDue.Value = minPayment.ToString( "N2" ); lMinimumDue.Text = minPayment.ToString( "C2" ); // Make sure payment amount is within minumum due and balance due. If not, set to balance due if ( !RegistrationState.PaymentAmount.HasValue || RegistrationState.PaymentAmount.Value < minPayment || RegistrationState.PaymentAmount.Value > balanceDue ) { RegistrationState.PaymentAmount = balanceDue; } nbAmountPaid.Visible = allowPartialPayment; nbAmountPaid.Text = ( RegistrationState.PaymentAmount ?? 0.0m ).ToString( "N2" ); // If a previous payment was made, or partial payment is allowed, show the amount remaining after selected payment amount lRemainingDue.Visible = allowPartialPayment || RegistrationState.PreviousPaymentTotal != 0.0m; lRemainingDue.Text = ( RegistrationState.DiscountedCost - ( RegistrationState.PreviousPaymentTotal + ( RegistrationState.PaymentAmount ?? 0.0m ) ) ).ToString( "C2" ); divPaymentInfo.Visible = balanceDue > 0; // Set payment options based on gateway settings if ( balanceDue > 0 && RegistrationTemplate.FinancialGateway != null ) { divPaymentInfo.Visible = true; if ( RegistrationTemplate.FinancialGateway.Attributes == null ) { RegistrationTemplate.LoadAttributes(); } var component = RegistrationTemplate.FinancialGateway.GetGatewayComponent(); if ( component != null ) { txtCardFirstName.Visible = component.SplitNameOnCard; txtCardLastName.Visible = component.SplitNameOnCard; txtCardName.Visible = !component.SplitNameOnCard; mypExpiration.MinimumYear = RockDateTime.Now.Year; } } else { divPaymentInfo.Visible = false; } } else { RegistrationState.TotalCost = 0.0m; RegistrationState.DiscountedCost = 0.0m; pnlMoney.Visible = false; } } }
private void BuildFeeTable( Registration registration ) { // Get the cost/fee summary var costs = new List<RegistrationCostSummaryInfo>(); foreach ( var registrant in RegistrantsState ) { if ( registrant.Cost > 0 ) { var costSummary = new RegistrationCostSummaryInfo(); costSummary.Type = RegistrationCostSummaryType.Cost; costSummary.Description = registrant.PersonName; costSummary.Cost = registrant.Cost; if ( registration.DiscountPercentage > 0.0m ) { costSummary.DiscountedCost = costSummary.Cost - ( costSummary.Cost * registration.DiscountPercentage ); } else { costSummary.DiscountedCost = costSummary.Cost; } costs.Add( costSummary ); } foreach ( var fee in registrant.FeeValues ) { var templateFee = RegistrationTemplateState.Fees.Where( f => f.Id == fee.Key ).FirstOrDefault(); if ( fee.Value != null ) { foreach ( var feeInfo in fee.Value ) { decimal cost = feeInfo.PreviousCost > 0.0m ? feeInfo.PreviousCost : feeInfo.Cost; string desc = string.Format( "{0}{1} ({2:N0} @ {3:C2})", templateFee != null ? templateFee.Name : "(Previous Cost)", string.IsNullOrWhiteSpace( feeInfo.Option ) ? "" : "-" + feeInfo.Option, feeInfo.Quantity, cost ); var costSummary = new RegistrationCostSummaryInfo(); costSummary.Type = RegistrationCostSummaryType.Fee; costSummary.Description = desc; costSummary.Cost = feeInfo.Quantity * cost; if ( registration.DiscountPercentage > 0.0m && templateFee != null && templateFee.DiscountApplies ) { costSummary.DiscountedCost = costSummary.Cost - ( costSummary.Cost * registration.DiscountPercentage ); } else { costSummary.DiscountedCost = costSummary.Cost; } costs.Add( costSummary ); } } } } // If there were any costs if ( costs.Any() ) { pnlCosts.Visible = true; // Get the total min payment for all costs and fees decimal minPayment = costs.Sum( c => c.MinPayment ); // Add row for amount discount if ( registration.DiscountAmount > 0.0m ) { decimal totalDiscount = 0.0m - ( RegistrantsState.Count * registration.DiscountAmount ); costs.Add( new RegistrationCostSummaryInfo { Type = RegistrationCostSummaryType.Discount, Description = "Discount", Cost = totalDiscount, DiscountedCost = totalDiscount } ); } // Get the totals // Add row for totals costs.Add( new RegistrationCostSummaryInfo { Type = RegistrationCostSummaryType.Total, Description = "Total", Cost = costs.Sum( c => c.Cost ), DiscountedCost = registration.DiscountedCost, } ); rptFeeSummary.DataSource = costs; rptFeeSummary.DataBind(); // Set the totals decimal balanceDue = registration.BalanceDue; lTotalCost.Text = registration.DiscountedCost.ToString( "C2" ); lPreviouslyPaid.Text = registration.TotalPaid.ToString( "C2" ); lRemainingDue.Text = balanceDue.ToString( "C2" ); lbAddPayment.Visible = ( balanceDue > 0.0m && Registration != null && Registration.PersonAliasId.HasValue && RegistrationTemplateState != null && RegistrationTemplateState.FinancialGateway != null ); } else { pnlCosts.Visible = false; } }