=== modified file 'payment/uc_credit/uc_credit.module' --- payment/uc_credit/uc_credit.module 2008-05-23 20:53:38 +0000 +++ payment/uc_credit/uc_credit.module 2008-05-25 14:26:51 +0000 @@ -329,8 +329,11 @@ 'cc_type' => check_plain($_POST['cc_type']), 'cc_owner' => check_plain($_POST['cc_owner']), 'cc_number' => check_plain($_POST['cc_number']), + 'cc_start_month' => check_plain($_POST['cc_start_month']), + 'cc_start_year' => check_plain($_POST['cc_start_year']), 'cc_exp_month' => check_plain($_POST['cc_exp_month']), 'cc_exp_year' => check_plain($_POST['cc_exp_year']), + 'cc_issue' => check_plain($_POST['cc_issue']), 'cc_cvv' => check_plain($_POST['cc_cvv']), 'cc_bank' => check_plain($_POST['cc_bank']), ); @@ -382,11 +385,26 @@ } } + // Validate the start date (if entered). + if (variable_get('uc_credit_start_enabled', FALSE) && + (!empty($cc_data['cc_start_month']) || !empty($cc_data['cc_start_year'])) + && !_valid_card_start($cc_data['cc_start_month'], $cc_data['cc_start_year'])) { + drupal_set_message(t('The start date you entered is invalid.'), 'error'); + $return = FALSE; + } + // Validate the card expiration date. if (!_valid_card_expiration($cc_data['cc_exp_month'], $cc_data['cc_exp_year'])) { drupal_set_message(t('The credit card you entered has expired.'), 'error'); $return = FALSE; } + + // Validate the issue number (if entered). + // N.B. With issue numbers, '01' is different to '1', but is_numeric() is still appropriate. + if (variable_get('uc_credit_issue_enabled', FALSE) && !_valid_card_issue($cc_data['cc_issue'])) { + drupal_set_message(t('The issue number you entered is invalid.'), 'error'); + $return = FALSE; + } // Validate the CVV number if enabled. if (variable_get('uc_credit_cvv_enabled', TRUE) && !_valid_cvv($cc_data['cc_cvv'])) { @@ -420,7 +438,13 @@ $review[] = array('title' => t('Card Owner'), 'data' => check_plain($arg1->payment_details['cc_owner'])); } $review[] = array('title' => t('Card Number'), 'data' => uc_credit_display_number($arg1->payment_details['cc_number'])); + if (variable_get('uc_credit_start_enabled', TRUE)) { + $review[] = array('title' => t('Start Date'), 'data' => $arg1->payment_details['cc_start_month'] .'/'. $arg1->payment_details['cc_start_year']); + } $review[] = array('title' => t('Expiration'), 'data' => $arg1->payment_details['cc_exp_month'] .'/'. $arg1->payment_details['cc_exp_year']); + if (variable_get('uc_credit_issue_enabled', TRUE)) { + $review[] = array('title' => t('Issue Number'), 'data' => user_access('view cc numbers') ? $arg1->payment_details['cc_issue'] : str_repeat('-', strlen($arg1->payment_details['cc_issue']))); + } if (variable_get('uc_credit_cvv_enabled', TRUE)) { $review[] = array('title' => t('CVV'), 'data' => user_access('view cc numbers') ? $arg1->payment_details['cc_cvv'] : str_repeat('-', strlen($arg1->payment_details['cc_cvv']))); } @@ -456,11 +480,24 @@ $output .= ''. t('Card Number:') .' '. uc_credit_display_number($arg1->payment_details['cc_number']) .''; if (variable_get('uc_credit_debug', FALSE)) { + if (variable_get('uc_credit_start_enabled', FALSE)) { + $start = $arg1->payment_details['cc_start_month'] .'/'. $arg1->payment_details['cc_start_year']; + if (strlen($start) > 1) { + $output .= ''. t('Start Date:') .' '. $start .''; + } + } $exp = $arg1->payment_details['cc_exp_month'] .'/'. $arg1->payment_details['cc_exp_year']; if (strlen($exp) > 1) { $output .= ''. t('Expiration:') .' '. $exp .''; } - + + if (variable_get('uc_credit_issue_enabled', FALSE)) { + $issue = $arg1->payment_details['cc_issue']; + if (strlen($issue) > 0) { + $output .= ''. t('Issue Number:') .' '. $issue .''; + } + } + if (variable_get('uc_credit_cvv_enabled', TRUE)) { $cvv = user_access('view cc numbers') ? $arg1->payment_details['cc_cvv'] : str_repeat('-', strlen($arg1->payment_details['cc_cvv'])); if (strlen($cvv) > 0) { @@ -623,6 +660,16 @@ '#title' => t('Enable card owner text field on checkout form.'), '#default_value' => variable_get('uc_credit_owner_enabled', FALSE), ); + $form['cc_fields']['uc_credit_start_enabled'] = array( + '#type' => 'checkbox', + '#title' => t('Enable card start date text field on checkout form.'), + '#default_value' => variable_get('uc_credit_start_enabled', FALSE), + ); + $form['cc_fields']['uc_credit_issue_enabled'] = array( + '#type' => 'checkbox', + '#title' => t('Enable card issue number text field on checkout form.'), + '#default_value' => variable_get('uc_credit_issue_enabled', FALSE), + ); $form['cc_fields']['uc_credit_bank_enabled'] = array( '#type' => 'checkbox', '#title' => t('Enable issuing bank text field on checkout form.'), @@ -824,9 +871,40 @@ '#maxlength' => 18, ); + if (variable_get('uc_credit_start_enabled', FALSE)) { + $form['cc_start_month'] = uc_select_month(t('Start Month'), $order->payment_details['cc_start_month']); + $form['cc_start_year'] = uc_select_year(t('Start Year'), $order->payment_details['cc_start_year'], date('Y')-10, date('Y')); + } + $form['cc_exp_month'] = uc_select_month(t('Expiration Month'), $order->payment_details['cc_exp_month']); $form['cc_exp_year'] = uc_select_year(t('Expiration Year'), $order->payment_details['cc_exp_year']); + if (variable_get('uc_credit_issue_enabled', FALSE)) { + // Setup the default Issue Number on the credit card form. + if (!_valid_card_issue($order->payment_details['cc_issue'])) { + // Display the Issue Number as is if it does not validate so it can be corrected. + $default_card_issue = $order->payment_details['cc_issue']; + } + elseif (!empty($order->payment_details['cc_issue'])) { + if (user_access('view cc numbers')) { + // Display the full number to those with access. + $default_card_issue = $order->payment_details['cc_issue']; + } + else { + // Otherwise mask it with dashes. + $default_card_issue = str_repeat('-', strlen($order->payment_details['cc_issue'])); + } + } + $form['cc_issue'] = array( + '#type' => 'textfield', + '#title' => t('Issue Number'), + '#default_value' => $default_card_issue, + '#attributes' => array('autocomplete' => 'off'), + '#size' => 2, + '#maxlength' => 2, + ); + } + if (variable_get('uc_credit_cvv_enabled', TRUE)) { // Setup the default CVV on the credit card form. if (!_valid_cvv($order->payment_details['cc_cvv'])) { @@ -871,8 +949,11 @@ function theme_uc_payment_method_credit_form($form) { // Comment out this function to just straight display the form. $form['cc_number']['#title'] = ''; + $form['cc_start_month']['#title'] = ''; + $form['cc_start_year']['#title'] = ''; $form['cc_exp_month']['#title'] = ''; $form['cc_exp_year']['#title'] = ''; + $form['cc_issue']['#title'] = ''; if (arg(1) == 'checkout') { $path = base_path() . drupal_get_path('module', 'uc_credit'); @@ -893,9 +974,18 @@ } $output .= ''. t('Card Number:') .'' . drupal_render($form['cc_number']) .''; + if (variable_get('uc_credit_start_enabled', FALSE)) { + $output .= ''. t('Start Date:') .'' + . drupal_render($form['cc_start_month']) .' ' + . drupal_render($form['cc_start_year']) .t(' (if present)').''; + } $output .= ''. t('Expiration Date:') .'' . drupal_render($form['cc_exp_month']) .' ' . drupal_render($form['cc_exp_year']) .''; + if (variable_get('uc_credit_issue_enabled', FALSE)) { + $output .= ''. t('Issue Number:') .'' + . drupal_render($form['cc_issue']) .t(' (if present)').''; + } if (variable_get('uc_credit_cvv_enabled', TRUE)) { $form['cc_cvv']['#title'] = ''; $output .= ''. t('CVV:') .''. drupal_render($form['cc_cvv']) @@ -1302,6 +1392,38 @@ } /** + * Validates a start date on a card. + * + * @param $month + * The 1 or 2-digit numeric representation of the month, i.e. 1, 6, 12. + * @param $year + * The 4-digit numeric representation of the year, i.e. 2008. + * @return + * TRUE for cards whose start date is in the past, FALSE otherwise. + */ +function _valid_card_start($month, $year) { + if ($year > date('Y')) { + return FALSE; + } + else if ($year == date('Y')) { + if ($month > date('n')) { + return FALSE; + } + } + + return TRUE; +} + +// Validates an issue number on a card. +// Returns true or false. +function _valid_card_issue($issue) { + if (empty($issue) || (is_numeric($issue) && $issue>0)) { + return true; + } + return false; +} + +/** * Returns either an array of options from a multi-line textarea or an array * condensed into a multi-line string depending on the type of $data. */