namespace Books.Api.Tests.Helpers; /// /// Generates valid Danish CVR numbers for testing. /// public static class CvrGenerator { private static readonly int[] Weights = [2, 7, 6, 5, 4, 3, 2, 1]; private static readonly Random Random = new(); /// /// Generates a random valid CVR number with correct modulus 11 checksum. /// public static string Generate() { // Generate 7 random digits var digits = new int[8]; for (var i = 0; i < 7; i++) { digits[i] = Random.Next(0, 10); } // Ensure first digit is not 0 (CVR numbers don't start with 0) if (digits[0] == 0) digits[0] = Random.Next(1, 10); // Calculate checksum digit using modulus 11 // Sum of (digit * weight) for first 7 digits var sum = 0; for (var i = 0; i < 7; i++) { sum += digits[i] * Weights[i]; } // Find the last digit that makes sum % 11 == 0 // We need: (sum + digit * 1) % 11 == 0 // So: digit = (11 - (sum % 11)) % 11 var remainder = sum % 11; var checkDigit = (11 - remainder) % 11; // If checkDigit is 10, we can't use it (single digit only) // So regenerate if (checkDigit == 10) { return Generate(); } digits[7] = checkDigit; return string.Join("", digits); } }