using System.Text.RegularExpressions;
namespace PowderCoating.Web.Helpers;
///
/// Parses payment terms strings (e.g., "Net 30", "2/10 Net 30", "Due on Receipt")
/// to compute due dates and extract early-payment discount terms.
///
public static class PaymentTermsParser
{
private static readonly Regex NetDaysRegex = new(@"\bnet\s+(\d+)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex EarlyDiscountRegex = new(@"(\d+(?:\.\d+)?)/(\d+)\s+net", RegexOptions.IgnoreCase | RegexOptions.Compiled);
///
/// Returns the due date calculated from and the supplied terms.
/// Returns null when the terms string cannot be parsed.
///
public static DateTime? CalculateDueDate(string? terms, DateTime invoiceDate)
{
if (string.IsNullOrWhiteSpace(terms)) return null;
var normalized = terms.Trim().ToLowerInvariant();
if (Regex.IsMatch(normalized, @"\b(receipt|due\s*now|cod|immediate)\b"))
return invoiceDate;
var match = NetDaysRegex.Match(terms);
if (match.Success && int.TryParse(match.Groups[1].Value, out var days))
return invoiceDate.AddDays(days);
return null;
}
///
/// Extracts early-payment discount terms from a string like "2/10 Net 30".
/// Returns (percent: 2, days: 10) for that example, or (0, 0) if not present.
///
public static (decimal Percent, int Days) ParseEarlyPaymentDiscount(string? terms)
{
if (string.IsNullOrWhiteSpace(terms)) return (0, 0);
var match = EarlyDiscountRegex.Match(terms);
if (match.Success
&& decimal.TryParse(match.Groups[1].Value, out var percent)
&& int.TryParse(match.Groups[2].Value, out var days))
return (percent, days);
return (0, 0);
}
}