Guest User

Untitled

a guest
May 25th, 2018
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. require 'json'
  2.  
  3. card_networks_string = '[
  4. { "id": 1, "name": "American Express", "bins": ["34", "37"] },
  5. { "id": 2, "name": "Bankcard", "bins": ["5610", "560221-560225"] },
  6. { "id": 3, "name": "China UnionPay", "bins": ["62"] },
  7. { "id": 4, "name": "Dankort", "bins": ["5019", "4571"] },
  8. { "id": 5, "name": "Diners Club enRoute", "bins": ["2014", "2149"] },
  9. { "id": 6, "name": "Diners Club International", "bins": ["36", "300-305", "3095", "38-39"] },
  10. { "id": 7, "name": "Discover Card", "bins": ["6011", "64", "65"] },
  11. { "id": 8, "name": "InstaPayment", "bins": ["637-639"] },
  12. { "id": 9, "name": "InterPayment", "bins": ["636"] },
  13. { "id": 10, "name": "JCB", "bins": ["3528-3589"] },
  14. { "id": 11, "name": "Laser", "bins": ["6304", "6706", "6771", "6709"] },
  15. { "id": 12, "name": "Maestro", "bins": ["50", "56-58", "6"] },
  16. { "id": 13, "name": "MasterCard", "bins": ["2221-2720", "51-55"] },
  17. { "id": 14, "name": "MIR", "bins": ["2200-2204"] },
  18. { "id": 15, "name": "RuPay", "bins": ["60", "6521"] },
  19. { "id": 16, "name": "Solo", "bins": ["6334", "6767"] },
  20. { "id": 17, "name": "Switch", "bins": ["4903", "4905", "4911", "4936", "564182", "633110", "6333", "6759"] },
  21. { "id": 18, "name": "Troy", "bins": ["979200-979289"] },
  22. { "id": 19, "name": "UATP", "bins": ["1"] },
  23. { "id": 20, "name": "Verve", "bins": ["506099-506198", "650002-650027"] },
  24. { "id": 21, "name": "Visa", "bins": ["4"] }
  25. ]'
  26.  
  27. card_networks = JSON.parse(card_networks_string)
  28.  
  29. class CardNetworks
  30. # card_networks - json из конфигурации card-networks.yml
  31. def initialize(card_networks)
  32. @cards_bins_map = map_cards_bins(card_networks)
  33. end
  34.  
  35. # создание массива элементов из заданного интервала чисел
  36. # from = 1, to = 5, результат: [1, 2, 3, 4, 5]
  37. def interval(from, to)
  38. arr = []
  39. while from <= to
  40. arr.push(from)
  41. from += 1
  42. end
  43. arr
  44. end
  45.  
  46. # преобразование списка вида ['5610', '560221-560225'] bin-ов
  47. # в массив элементов ['5610', '560221', '560222', '560223', '560224', '560225']
  48. def bins_list(bins)
  49. result = []
  50. bins.each {
  51. |bin|
  52. # если элемент является интервалом вида "560221-560225", то
  53. # то создаём список вида ['560221', '560222', '560223', '560224', '560225']
  54. if (!(bin =~ /\-/).nil?)
  55. fromTo = bin.split('-')
  56. expanded = interval(fromTo[0].to_i, fromTo[1].to_i)
  57. result.concat(expanded)
  58. else
  59. result.push(bin.to_i)
  60. end
  61. }
  62. result
  63. end
  64.  
  65. # содание массива соотвествия id карты и её бинов [{ cardId: 1, bin: 104212 }, { cardId: 1, bin: 45 }]
  66. def map_card_bins(card_network, bins)
  67. result = []
  68. bins.each {
  69. |bin|
  70. result.push({
  71. id: card_network['id'],
  72. network: card_network['name'],
  73. networkIcon: card_network['icon'],
  74. bin: bin,
  75. })
  76. }
  77. result
  78. end
  79.  
  80. # создание массива объектов вида [{ card_id: 1, bin: 104212 }, { card_id: 1, bin: 45 }, { card_id: 2, bin: 345375 }]
  81. # т.е. соотношение одного bin-а к id карты, которой он соответствует
  82. # на одну и ту же карту может приходиться несколько bin-ов
  83. def map_cards_bins(card_networks)
  84. result = []
  85. card_networks.each {
  86. |card_network|
  87. card_bins = card_network['bins']
  88. bins = bins_list(card_bins)
  89. map_card = map_card_bins(card_network, bins)
  90. result.concat(map_card)
  91. }
  92. result = result.sort_by do |item|
  93. item[:bin]
  94. end
  95. result.reverse
  96. end
  97.  
  98. # поиск карты по bin-у
  99. def search(bin)
  100. item = []
  101. @cards_bins_map.find {
  102. |item|
  103. regexp = Regexp.new('^' + item[:bin].to_s)
  104. !(bin =~ regexp).nil?
  105. }
  106. end
  107. end
  108.  
  109. helper = CardNetworks.new(card_networks)
  110.  
  111. puts helper.search('220220')
Add Comment
Please, Sign In to add comment