@@ -230,41 +230,52 @@ class _CardSystemDatas {
230230 /// рекурсивно ищет в номере карты код системы, начиная с конца
231231 /// нужно для того, чтобы даже после setState и обнуления данных карты
232232 /// снова правильно отформатировать ее номер
233- static CardSystemData ? getCardSystemDataByNumber (String cardNumber,
234- {int ? subscringLength}) {
233+ static CardSystemData ? getCardSystemDataByNumber (
234+ String cardNumber, {
235+ int ? subscringLength,
236+ }) {
235237 if (cardNumber.isEmpty) return null ;
236238 subscringLength = subscringLength ?? cardNumber.length;
237239
238240 if (subscringLength < 1 ) return null ;
239- var systemCode = cardNumber.substring (0 , subscringLength);
240-
241- var rawData = _data.firstWhere ((Map <String , dynamic >? data) {
242- if (data != null ) {
243- var numericValue = toNumericString (data['systemCode' ]);
244- var numDigits = data['numDigits' ];
245- return numericValue == systemCode &&
246- numDigits >= cardNumber.length &&
247- numDigits <= _maxDigitsInCard;
241+ Map ? rawData;
242+ List <Map > tempSystems = [];
243+ for (var data in _data) {
244+ final systemCode = data['systemCode' ];
245+ if (cardNumber.startsWith (systemCode)) {
246+ tempSystems.add (data);
248247 }
249- return false ;
250- }, orElse: () => null );
251- if (rawData != null ) {
252- return CardSystemData .fromMap (rawData);
253248 }
254- return getCardSystemDataByNumber (
255- cardNumber,
256- subscringLength: subscringLength - 1 ,
257- );
258- }
249+ if (tempSystems.isEmpty) {
250+ return null ;
251+ }
252+ if (tempSystems.length == 1 ) {
253+ rawData = tempSystems.first;
254+ } else {
255+ tempSystems.sort ((a, b) => b['systemCode' ].compareTo (a['systemCode' ]));
256+ final int maxCodeLength = tempSystems.first['systemCode' ].length;
257+ tempSystems = tempSystems
258+ .where (
259+ (e) => e['systemCode' ].length == maxCodeLength,
260+ )
261+ .toList ();
259262
260- static int get _maxDigitsInCard {
261- return _data.map ((data) {
262- int numDigits = data! ['numDigits' ];
263- return numDigits;
264- }).reduce (max);
263+ tempSystems.sort ((a, b) => a['systemCode' ].compareTo (b['systemCode' ]));
264+ for (var data in tempSystems) {
265+ final int numMaskDigits = data['numDigits' ]! ;
266+ if (cardNumber.length <= numMaskDigits) {
267+ rawData = data;
268+ break ;
269+ }
270+ }
271+ if (rawData == null ) {
272+ rawData = tempSystems.last;
273+ }
274+ }
275+ return CardSystemData .fromMap (rawData);
265276 }
266277
267- static List <Map <String , dynamic >? > _data = < Map <String , dynamic >? > [
278+ static List <Map <String , dynamic >> _data = < Map <String , dynamic >> [
268279 {
269280 'system' : CardSystem .VISA ,
270281 'systemCode' : '4' ,
@@ -327,16 +338,16 @@ class _CardSystemDatas {
327338 },
328339 {
329340 'system' : CardSystem .JCB ,
330- 'systemCode' : '3589' ,
331- 'numberMask' : '0000 0000 0000 0000 000' ,
332- 'numDigits' : 19 ,
333- },
334- {
335- 'system' : CardSystem .JCB ,
336- 'systemCode' : '3528' ,
341+ 'systemCode' : '35' ,
337342 'numberMask' : '0000 0000 0000 0000' ,
338343 'numDigits' : 16 ,
339344 },
345+ // {
346+ // 'system': CardSystem.JCB,
347+ // 'systemCode': '35',
348+ // 'numberMask': '0000 0000 0000 0000 000',
349+ // 'numDigits': 19,
350+ // },
340351 {
341352 'system' : CardSystem .DISCOVER ,
342353 'systemCode' : '60' ,
0 commit comments