From de648148799ae45df50ecf5882f6ba17c7502dbb Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@ebay.com>
Date: Fri, 26 Jun 2015 15:32:37 +0300
Subject: [PATCH] MAGETWO-38647: credit card validation issue

---
 .../credit-card-type.js                       | 21 +++++-----
 .../frontend/web/js/view/payment/cc-form.js   | 32 ++++++++++++++--
 .../web/template/payment/cc-form.html         | 38 ++++++++++++-------
 3 files changed, 62 insertions(+), 29 deletions(-)

diff --git a/app/code/Magento/Payment/view/frontend/web/js/model/credit-card-validation/credit-card-number-validator/credit-card-type.js b/app/code/Magento/Payment/view/frontend/web/js/model/credit-card-validation/credit-card-number-validator/credit-card-type.js
index 7ace4e1594b..f0685c6d67c 100644
--- a/app/code/Magento/Payment/view/frontend/web/js/model/credit-card-validation/credit-card-number-validator/credit-card-type.js
+++ b/app/code/Magento/Payment/view/frontend/web/js/model/credit-card-validation/credit-card-number-validator/credit-card-type.js
@@ -14,7 +14,7 @@ define(
         var types = [
             {
                 niceType: 'Visa',
-                type: 'visa',
+                type: 'VI',
                 pattern: '^4\\d*$',
                 gaps: [4, 8, 12],
                 lengths: [16],
@@ -25,7 +25,7 @@ define(
             },
             {
                 niceType: 'MasterCard',
-                type: 'master-card',
+                type: 'MC',
                 pattern: '^5([1-5]\\d*)?$',
                 gaps: [4, 8, 12],
                 lengths: [16],
@@ -36,7 +36,7 @@ define(
             },
             {
                 niceType: 'American Express',
-                type: 'american-express',
+                type: 'AE',
                 pattern: '^3([47]\\d*)?$',
                 isAmex: true,
                 gaps: [4, 10],
@@ -47,8 +47,8 @@ define(
                 }
             },
             {
-                niceType: 'DinersClub',
-                type: 'diners-club',
+                niceType: 'Diners',
+                type: 'DN',
                 pattern: '^3((0([0-5]\\d*)?)|[689]\\d*)?$',
                 gaps: [4, 10],
                 lengths: [14],
@@ -59,7 +59,7 @@ define(
             },
             {
                 niceType: 'Discover',
-                type: 'discover',
+                type: 'DI',
                 pattern: '^6(0|01|011\\d*|5\\d*|4|4[4-9]\\d*)?$',
                 gaps: [4, 8, 12],
                 lengths: [16],
@@ -70,7 +70,7 @@ define(
             },
             {
                 niceType: 'JCB',
-                type: 'jcb',
+                type: 'JC',
                 pattern: '^((2|21|213|2131\\d*)|(1|18|180|1800\\d*)|(3|35\\d*))$',
                 gaps: [4, 8, 12],
                 lengths: [16],
@@ -81,7 +81,7 @@ define(
             },
             {
                 niceType: 'UnionPay',
-                type: 'unionpay',
+                type: 'UN',
                 pattern: '^6(2\\d*)?$',
                 gaps: [4, 8, 12],
                 lengths: [16, 17, 18, 19],
@@ -92,8 +92,8 @@ define(
             },
             {
                 niceType: 'Maestro',
-                type: 'maestro',
-                pattern: '^((5((0|[6-9])\\d*)?)|(6|6[37]\\d*))$',
+                type: 'SM',
+                pattern: '(^(5[0678])[0-9]{11,18}$)|(^(6[^05])[0-9]{11,18}$)|(^(601)[^1][0-9]{9,16}$)|(^(6011)[0-9]{9,11}$)|(^(6011)[0-9]{13,16}$)|(^(65)[0-9]{11,13}$)|(^(65)[0-9]{15,18}$)|(^(49030)[2-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49033)[5-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49110)[1-2]([0-9]{10}$|[0-9]{12,13}$))|(^(49117)[4-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49118)[0-2]([0-9]{10}$|[0-9]{12,13}$))|(^(4936)([0-9]{12}$|[0-9]{14,15}$))',
                 gaps: [4, 8, 12],
                 lengths: [12, 13, 14, 15, 16, 17, 18, 19],
                 code: {
@@ -102,7 +102,6 @@ define(
                 }
             }
         ];
-
         return {
             getCardTypes: function (cardNumber) {
                 var i, value,
diff --git a/app/code/Magento/Payment/view/frontend/web/js/view/payment/cc-form.js b/app/code/Magento/Payment/view/frontend/web/js/view/payment/cc-form.js
index 4e9c7b83332..8a6170c79c9 100644
--- a/app/code/Magento/Payment/view/frontend/web/js/view/payment/cc-form.js
+++ b/app/code/Magento/Payment/view/frontend/web/js/view/payment/cc-form.js
@@ -9,9 +9,10 @@ define(
         'underscore',
         'Magento_Checkout/js/view/payment/default',
         'Magento_Payment/js/model/credit-card-validation/credit-card-data',
+        'Magento_Payment/js/model/credit-card-validation/credit-card-number-validator',
         'mage/translate'
     ],
-    function (_, Component, creditCardData, $t) {
+    function (_, Component, creditCardData, cardNumberValidator, $t) {
         return Component.extend({
             defaults: {
                 creditCardType: '',
@@ -20,8 +21,10 @@ define(
                 creditCardNumber: '',
                 creditCardSsStartMonth: '',
                 creditCardSsStartYear: '',
-                creditCardVerificationNumber: ''
+                creditCardVerificationNumber: '',
+                selectedCardType: null
             },
+
             initObservable: function () {
                 this._super()
                     .observe([
@@ -31,17 +34,38 @@ define(
                         'creditCardNumber',
                         'creditCardVerificationNumber',
                         'creditCardSsStartMonth',
-                        'creditCardSsStartYear'
+                        'creditCardSsStartYear',
+                        'selectedCardType'
                     ]);
                 return this;
             },
 
             initialize: function() {
+                var self = this;
                 this._super();
 
                 //Set credit card number to credit card data object
                 this.creditCardNumber.subscribe(function(value) {
-                    console.log(value);
+                    var result;
+                    self.selectedCardType(null);
+
+                    if (value == '' || value == null) {
+                        return false;
+                    }
+                    result = cardNumberValidator(value);
+
+                    if (!result.isPotentiallyValid && !result.isValid) {
+                        return false;
+                    }
+                    if (result.card !== null) {
+                        self.selectedCardType(result.card.type);
+                        creditCardData.creditCard = result.card;
+                    }
+
+                    if (result.isValid) {
+                        creditCardData.creditCardNumber = value;
+                        self.creditCardType(result.card.type);
+                    }
                 });
 
                 //Set expiration year to credit card data object
diff --git a/app/code/Magento/Payment/view/frontend/web/template/payment/cc-form.html b/app/code/Magento/Payment/view/frontend/web/template/payment/cc-form.html
index e6d2a8dc4c2..09048a925c0 100644
--- a/app/code/Magento/Payment/view/frontend/web/template/payment/cc-form.html
+++ b/app/code/Magento/Payment/view/frontend/web/template/payment/cc-form.html
@@ -5,6 +5,12 @@
  */
 -->
 
+<style>
+    .credit-card-types div.active{
+        font-weight: bold;
+    }
+</style>
+
 <fieldset data-bind="attr: {class: 'fieldset payment items ccard ' + getCode(), id: 'payment_form_' + getCode()}">
     <!-- ko if: (isShowLegend())-->
     <legend class="legend">
@@ -16,18 +22,18 @@
             <span><!-- ko text: $t('Credit Card Type')--><!-- /ko --></span>
         </label>
         <div class="control">
-            <select name="payment[cc_type]" class="select"
-                    data-bind="attr: {id: getCode() + '_cc_type',
-                               'data-container': getCode() + '-cc-type',
-                               'data-validate': JSON.stringify({required:true, 'validate-cc-type-select':'#' + getCode() + '_cc_number'})},
-                               mageInit: {creditCardType:{creditCardTypeContainer:'#' + getCode() + '_cc_type_ss_div'}},
-                               enable: isActive($parents),
-                               options: getCcAvailableTypesValues(),
-                               optionsValue: 'value',
-                               optionsText: 'type',
-                               optionsCaption: $t('Please Select'),
-                               value: creditCardType">
-            </select>
+            <div class="credit-card-types">
+                <!-- ko foreach: {data: getCcAvailableTypesValues(), as: 'item'} -->
+                <div data-bind="css: {active: $parent.selectedCardType() == item.value} ">
+                    <!-- ko text: item.type --><!-- /ko -->
+                </div>
+                <!--/ko-->
+                <input type="hidden"
+                       name="payment[cc_number]"
+                       class="input-text"
+                       value=""
+                       data-bind="attr: {id: getCode() + '_cc_type'}, value: creditCardType">
+            </div>
         </div>
     </div>
     <div class="field number required">
@@ -36,10 +42,14 @@
         </label>
         <div class="control">
             <input type="text" name="payment[cc_number]" class="input-text" value=""
-                   data-bind="attr: {id: getCode() + '_cc_number', title: $t('Credit Card Number'), 'data-container': getCode() + '-cc-number', 'data-validate': JSON.stringify({'required-number':true, 'validate-card-number':'#' + getCode() + '_cc_type', 'validate-cc-type':'#' + getCode() + '_cc_type'})},
+                   data-bind="attr: {
+                                    id: getCode() + '_cc_number',
+                                    title: $t('Credit Card Number'),
+                                    'data-container': getCode() + '-cc-number',
+                                    'data-validate': JSON.stringify({'required-number':true, 'validate-card-number':'#' + getCode() + '_cc_type', 'validate-cc-type':'#' + getCode() + '_cc_type'})},
                               enable: isActive($parents),
                               value: creditCardNumber,
-                              valueUpdate: 'keyup',"/>
+                              valueUpdate: 'keyup' "/>
         </div>
     </div>
     <div class="field date required" data-bind="attr: {id: getCode() + '_cc_type_exp_div'}">
-- 
GitLab