/// <summary> /// Formats as currency. /// </summary> /// <param name="input">The input.</param> /// <param name="currencyCodeDefinedValueId">The currency code defined value identifier.</param> /// <returns></returns> public static string FormatAsCurrency(this string input, int?currencyCodeDefinedValueId) { var exportValueString = input; if (exportValueString != null) { var currencyInfo = new RockCurrencyCodeInfo(currencyCodeDefinedValueId); var currencySymbol = currencyInfo.Symbol; var decimalString = exportValueString; // Remove currency symbol if exist. if (exportValueString.Contains(currencySymbol)) { decimalString = exportValueString.Replace(currencySymbol, string.Empty); } decimal exportValueDecimal; // Try to parse the string as decimal if (decimal.TryParse(decimalString, out exportValueDecimal)) { // return the input as a currency formatted string. return(exportValueDecimal.FormatAsCurrency()); } } // Otherwise just return the input back out return(input); }
/// <summary> /// Reverses the currency formatting. /// </summary> /// <param name="input">The input.</param> /// <param name="currencyCodeDefinedValueId">The currency code defined value identifier.</param> /// <returns></returns> public static object ReverseCurrencyFormatting(this object input, int?currencyCodeDefinedValueId) { var exportValueString = input as string; // If the object is a string... if (exportValueString != null) { var currencyInfo = new RockCurrencyCodeInfo(currencyCodeDefinedValueId); var currencySymbol = currencyInfo.Symbol; // ... that contains the currency symbol ... if (exportValueString.Contains(currencySymbol)) { var decimalString = exportValueString.Replace(currencySymbol, string.Empty); decimal exportValueDecimal; // ... and the value without the currency symbol is a valid decimal value ... if (decimal.TryParse(decimalString, out exportValueDecimal)) { // ... that matches the input string when formatted as currency ... if (exportValueDecimal.FormatAsCurrency(currencyCodeDefinedValueId) == exportValueString) { // ... return the input as a decimal return(exportValueDecimal); } } } } // Otherwise just return the input back out return(input); }
/// <summary> /// Formats as currency. /// </summary> /// <param name="value">The value.</param> /// <param name="currencyCodeDefinedValueId">The currency code defined value identifier.</param> /// <param name="decimalPlaces">The decimal places.</param> /// <returns></returns> public static string FormatAsCurrency(this decimal value, int?currencyCodeDefinedValueId, int?decimalPlaces) { var currencyCodeInfo = new RockCurrencyCodeInfo(currencyCodeDefinedValueId); var currencyCode = currencyCodeInfo.IsOrganizationCurrency ? string.Empty : currencyCodeInfo.CurrencyCode; var currencySymbol = HttpUtility.HtmlDecode(currencyCodeInfo.Symbol); if (decimalPlaces == null || decimalPlaces > currencyCodeInfo.DecimalPlaces) { decimalPlaces = currencyCodeInfo.DecimalPlaces; } if (currencyCodeInfo.SymbolLocation.Equals("left", System.StringComparison.OrdinalIgnoreCase)) { return(string.Format("{2} {0}{1:N" + decimalPlaces.ToString() + "}", currencySymbol, value, currencyCode)); } return(string.Format("{1:N" + decimalPlaces.ToString() + "}{0}{2}", currencySymbol, value, currencyCode)); }
/// <summary> /// Gets the registration instance discount code report. /// </summary> /// <param name="registrationInstanceId">The registration instance identifier.</param> /// <returns></returns> public IEnumerable <TemplateDiscountReport> GetRegistrationInstanceDiscountCodeReport(int registrationInstanceId) { var currencySymbol = RockCurrencyCodeInfo.GetCurrencySymbol(); string query = $@" WITH cte([RegistrationId], [RegisteredByName], [RegistrationDate], [RegistrantCount], [DiscountCode], [DiscountAmount], [DiscountPercentage], [DiscountType], [TotalCost], [DiscountQualifiedCost]) AS (SELECT [Registration].[Id] AS [RegistrationId] , [Registration].[FirstName] + ' ' + [Registration].[LastName] AS [RegisteredByName] , [Registration].[CreatedDateTime] AS [RegistrationDate] , ( SELECT COUNT(*) FROM [RegistrationRegistrant] WHERE [RegistrationId] = [Registration].[Id]) AS [RegistrantCount] , [Registration].[DiscountCode] AS [DiscountCode] , [Registration].[DiscountAmount] AS [DiscountAmount] , [Registration].[DiscountPercentage] * 100 AS [DiscountPercentage] , CASE WHEN [Registration].[DiscountPercentage] > 0 THEN '%' ELSE '$' END AS [DiscountType] , (( SELECT SUM([Cost]) FROM [RegistrationRegistrant] WHERE [RegistrationId] = [Registration].[id]) + (COALESCE( (SELECT SUM([RegistrationRegistrantFee].[Cost]) FROM [RegistrationRegistrant] LEFT JOIN [RegistrationRegistrantFee] ON [RegistrationRegistrant].[Id] = [RegistrationRegistrantFee].[RegistrationRegistrantId] WHERE [RegistrationId] = [Registration].[id]), 0) ) ) AS [TotalCost] , (( SELECT SUM([Cost]) FROM [RegistrationRegistrant] WHERE [RegistrationId] = [Registration].[Id]) + (COALESCE( (SELECT SUM([RegistrationRegistrantFee].[Cost]) FROM [RegistrationRegistrant] LEFT JOIN [RegistrationRegistrantFee] ON [RegistrationRegistrant].[Id] = [RegistrationRegistrantFee].[RegistrationRegistrantId] JOIN [RegistrationTemplateFee] ON [RegistrationTemplateFee].[Id] = [RegistrationRegistrantFee].[RegistrationTemplateFeeId] WHERE [RegistrationId] = [Registration].[id] AND [RegistrationTemplateFee].[DiscountApplies] = 1) , 0) ) ) AS [DiscountQualifiedCost] FROM [Registration] WHERE [Registration].[RegistrationInstanceId] = @registrationInstanceId) , cte2([RegistrationId], [RegisteredByName], [RegistrationDate], [RegistrantCount], [DiscountCode], [DiscountAmount], [DiscountPercentage], [DiscountType], [TotalCost], [DiscountQualifiedCost], [TotalDiscount]) AS (SELECT [RegistrationId], [RegisteredByName], [RegistrationDate], [RegistrantCount], [DiscountCode], [DiscountAmount], [DiscountPercentage], [DiscountType], [TotalCost], [DiscountQualifiedCost] , CASE WHEN [DiscountPercentage] > 0 THEN [DiscountQualifiedCost] * ([DiscountPercentage]/100) ELSE ([RegistrantCount] * [DiscountAmount]) END AS [TotalDiscount] FROM cte) SELECT [RegistrationId] , [RegisteredByName] , [RegistrationDate] , [RegistrantCount] , [DiscountCode] , [DiscountAmount] , [DiscountPercentage] , CASE WHEN DiscountAmount > 0 THEN '{currencySymbol}' + CAST(DiscountAmount AS varchar) ELSE CAST(DiscountPercentage AS varchar) + '%' END AS [Discount] , [DiscountType] , [TotalCost] , [DiscountQualifiedCost] , [TotalDiscount] , ([TotalCost] - [TotalDiscount]) AS [RegistrationCost] FROM cte2 WHERE [TotalDiscount] > 0"; var param = new System.Data.SqlClient.SqlParameter("@RegistrationInstanceId", registrationInstanceId); return(Context.Database.SqlQuery <TemplateDiscountReport>(query, param)); }
/// <summary> /// Method that will be called on an entity immediately before the item is saved by context /// </summary> /// <param name="dbContext">The database context.</param> /// <param name="entry">The database entity entry.</param> public override void PreSaveChanges(Rock.Data.DbContext dbContext, DbEntityEntry entry) { var rockContext = (RockContext)dbContext; HistoryChangeList = new History.HistoryChangeList(); switch (entry.State) { case EntityState.Added: { HistoryChangeList.AddChange(History.HistoryVerb.Add, History.HistoryChangeType.Record, "Transaction"); string person = History.GetValue <PersonAlias>(AuthorizedPersonAlias, AuthorizedPersonAliasId, rockContext); History.EvaluateChange(HistoryChangeList, "Authorized Person", string.Empty, person); History.EvaluateChange(HistoryChangeList, "Gateway", string.Empty, History.GetValue <FinancialGateway>(FinancialGateway, FinancialGatewayId, rockContext)); History.EvaluateChange(HistoryChangeList, "Gateway Schedule Id", string.Empty, GatewayScheduleId); History.EvaluateChange(HistoryChangeList, "Transaction Code", string.Empty, TransactionCode); History.EvaluateChange(HistoryChangeList, "Summary", string.Empty, Summary); History.EvaluateChange(HistoryChangeList, "Type", (null as int?), TransactionTypeValue, TransactionTypeValueId); History.EvaluateChange(HistoryChangeList, "Source", (null as int?), SourceTypeValue, SourceTypeValueId); History.EvaluateChange(HistoryChangeList, "Frequency", (null as int?), TransactionFrequencyValue, TransactionFrequencyValueId); History.EvaluateChange(HistoryChangeList, "Start Date", (null as DateTime? ), StartDate); History.EvaluateChange(HistoryChangeList, "End Date", (null as DateTime? ), EndDate); History.EvaluateChange(HistoryChangeList, "Number of Payments", (null as int?), NumberOfPayments); History.EvaluateChange(HistoryChangeList, "Is Active", (null as bool?), IsActive); History.EvaluateChange(HistoryChangeList, "Card Reminder Date", (null as DateTime? ), CardReminderDate); History.EvaluateChange(HistoryChangeList, "Last Reminded Date", (null as DateTime? ), LastRemindedDate); var isOrganizationCurrency = new RockCurrencyCodeInfo(ForeignCurrencyCodeValueId).IsOrganizationCurrency; if (!isOrganizationCurrency) { History.EvaluateChange(HistoryChangeList, "Currency Code", (null as int?), ForeignCurrencyCodeValue, ForeignCurrencyCodeValueId); } break; } case EntityState.Modified: { string origPerson = History.GetValue <PersonAlias>(null, entry.OriginalValues["AuthorizedPersonAliasId"].ToStringSafe().AsIntegerOrNull(), rockContext); string person = History.GetValue <PersonAlias>(AuthorizedPersonAlias, AuthorizedPersonAliasId, rockContext); History.EvaluateChange(HistoryChangeList, "Authorized Person", origPerson, person); int?origGatewayId = entry.OriginalValues["FinancialGatewayId"].ToStringSafe().AsIntegerOrNull(); if (!FinancialGatewayId.Equals(origGatewayId)) { History.EvaluateChange(HistoryChangeList, "Gateway", History.GetValue <FinancialGateway>(null, origGatewayId, rockContext), History.GetValue <FinancialGateway>(FinancialGateway, FinancialGatewayId, rockContext)); } History.EvaluateChange(HistoryChangeList, "Gateway Schedule Id", entry.OriginalValues["GatewayScheduleId"].ToStringSafe(), GatewayScheduleId); History.EvaluateChange(HistoryChangeList, "Transaction Code", entry.OriginalValues["TransactionCode"].ToStringSafe(), TransactionCode); History.EvaluateChange(HistoryChangeList, "Summary", entry.OriginalValues["Summary"].ToStringSafe(), Summary); History.EvaluateChange(HistoryChangeList, "Type", entry.OriginalValues["TransactionTypeValueId"].ToStringSafe().AsIntegerOrNull(), TransactionTypeValue, TransactionTypeValueId); History.EvaluateChange(HistoryChangeList, "Source", entry.OriginalValues["SourceTypeValueId"].ToStringSafe().AsIntegerOrNull(), SourceTypeValue, SourceTypeValueId); History.EvaluateChange(HistoryChangeList, "Frequency", entry.OriginalValues["TransactionFrequencyValueId"].ToStringSafe().AsIntegerOrNull(), TransactionFrequencyValue, TransactionFrequencyValueId); History.EvaluateChange(HistoryChangeList, "Start Date", entry.OriginalValues["StartDate"].ToStringSafe().AsDateTime(), StartDate); History.EvaluateChange(HistoryChangeList, "End Date", entry.OriginalValues["EndDate"].ToStringSafe().AsDateTime(), EndDate); History.EvaluateChange(HistoryChangeList, "Number of Payments", entry.OriginalValues["EndDate"].ToStringSafe().AsIntegerOrNull(), NumberOfPayments); History.EvaluateChange(HistoryChangeList, "Is Active", entry.OriginalValues["IsActive"].ToStringSafe().AsBooleanOrNull(), IsActive); History.EvaluateChange(HistoryChangeList, "Card Reminder Date", entry.OriginalValues["CardReminderDate"].ToStringSafe().AsDateTime(), CardReminderDate); History.EvaluateChange(HistoryChangeList, "Last Reminded Date", entry.OriginalValues["LastRemindedDate"].ToStringSafe().AsDateTime(), LastRemindedDate); History.EvaluateChange(HistoryChangeList, "Currency Code", entry.OriginalValues["ForeignCurrencyCodeValueId"].ToStringSafe().AsIntegerOrNull(), ForeignCurrencyCodeValue, ForeignCurrencyCodeValueId); break; } case EntityState.Deleted: { HistoryChangeList.AddChange(History.HistoryVerb.Delete, History.HistoryChangeType.Record, "Transaction"); // If a FinancialPaymentDetail was linked to this FinancialScheduledTransaction and is now orphaned, delete it. var financialPaymentDetailService = new FinancialPaymentDetailService(rockContext); financialPaymentDetailService.DeleteOrphanedFinancialPaymentDetail(entry); break; } } base.PreSaveChanges(dbContext, entry); }