? 548594.patch
Index: uc_vat_number.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/uc_vat_number/uc_vat_number.install,v
retrieving revision 1.2
diff -u -p -r1.2 uc_vat_number.install
--- uc_vat_number.install	15 Mar 2010 13:45:13 -0000	1.2
+++ uc_vat_number.install	6 Jan 2011 19:12:45 -0000
@@ -60,3 +60,66 @@ function uc_vat_number_update_2() {
   db_create_table($ret, 'uc_vat_validation', $schema['uc_vat_validation']);
   return $ret;
 }
+
+function uc_vat_number_update_6200() {
+  $on_roles = user_roles(FALSE, 'Have to fill VAT number');
+  $off_roles = array_diff(user_roles(FALSE), $on_roles);
+    
+  if(count($on_roles)) {
+    drupal_set_message('Version 2 of Ubercart VAT Number significantly changes the way the module handles role permissions. Please refer to <a href="http://drupal.org/project/uc_vat_number">the project page</a> for further details.', 'warning');
+    
+    // Removes wrong permission from roles that have it
+    $permissions = array();
+    foreach($on_roles as $rid => $role) {
+      $q = db_query("SELECT perm FROM {permission} WHERE rid = %d;", $rid);
+      $obj = db_fetch_object($q);
+      $perm = explode(", ", $obj->perm);
+      // If wrong permission is the only permission, permissions for this role won't be regenerated
+      if(count($perm) > 1) {
+        foreach($perm as $key => $val) {
+          if($val == 'Have to fill VAT number') {
+            unset($perm[$key]);
+          }
+        }
+        $permissions[$rid] = implode(", ", $perm);
+       }
+    }
+        
+    // Restores permissions for remaining roles
+    foreach($off_roles as $rid => $role) {
+      $q = db_query("SELECT perm FROM {permission} WHERE rid = %d;", $rid);
+      $obj = db_fetch_object($q);
+      if($obj->perm != '') {
+        $permissions[$rid] = $obj->perm;
+      }
+    }
+    
+    ksort($permissions);
+    
+    // Empties permission table
+    $ret[] = update_sql("TRUNCATE {permission};");
+    
+    // Assigns updated roles
+    if(count($permissions)) {
+      $values = array();
+      foreach($permissions as $rid => $perm) {
+        $values[] = "('$rid', '$perm')";
+      }
+      $values = implode(", ", $values);
+      $ret[] = update_sql("INSERT INTO {permission} (rid, perm) VALUES $values;");
+    }
+    
+    $uc_vat_number_roles = array();
+    foreach($on_roles as $rid => $role) {
+      $uc_vat_number_roles[$rid] = $rid;
+    }
+    
+    foreach($off_roles as $rid => $role) {
+      $uc_vat_number_roles[$rid] = 0;
+    }
+    
+    variable_set('uc_vat_number_roles', $uc_vat_number_roles);
+    
+    return $ret;
+  }
+}
Index: uc_vat_number.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/uc_vat_number/uc_vat_number.module,v
retrieving revision 1.4
diff -u -p -r1.4 uc_vat_number.module
--- uc_vat_number.module	15 Mar 2010 14:05:06 -0000	1.4
+++ uc_vat_number.module	6 Jan 2011 19:12:46 -0000
@@ -18,9 +18,54 @@
  * Implementation of hook_perm()
  */
 function uc_vat_number_perm() {
-  return array('Have to fill VAT number');
+  return array('administer VAT number settings');
 }
 
+/**
+ * Implementation of hook_menu().
+ */
+function uc_vat_number_menu()
+{
+ $items['admin/store/settings/vat-number'] = array(
+    'title' => 'VAT number settings',
+    'description' => 'Basic settings for VAT-number requirement.',
+    'page callback' => 'drupal_get_form',
+    'page arguments'    => array('uc_vat_number_settings'),
+    'access arguments' => array('administer VAT number settings'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+  
+  $items['uc_vat_number/vat_autocomplete'] = array(
+    'title' => t('VAT number autocomplete callback'),
+    'page callback' => 'uc_vat_number_vat_autocomplete',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  
+  return $items;
+}
+
+/**
+ * Module settings
+ */
+function uc_vat_number_settings() {
+  $form['vat_roles'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Require VAT number by role'),
+    '#collapsed' => FALSE,
+    '#collapsible' => FALSE,
+  );
+  
+   $form['vat_roles']['uc_vat_number_roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Roles'),
+    '#default_value' => variable_get('uc_vat_number_roles', array()),
+    '#description' => t('Select roles required to enter a VAT number.'),
+    '#options' => user_roles(),
+  );
+  
+  return system_settings_form($form);
+}
 
 /**
  * Implementation of hook_form_alter()
@@ -161,7 +206,7 @@ function uc_vat_number_checkout_pane_vat
         '#size' => 32,
         '#maxlength' => 32,
         '#weight' => 1,
-        '#required' => user_access('Have to fill VAT number') ? TRUE : FALSE,
+        '#required' => __uc_vat_number_required() ? TRUE : FALSE,
         '#default_value' => $order->data['vat_number'],
         '#autocomplete_path' => 'uc_vat_number/vat_autocomplete',
       );
@@ -186,19 +231,6 @@ function uc_vat_number_checkout_pane_vat
   }
 }
 
-
-function uc_vat_number_menu()
-{
-  $items['uc_vat_number/vat_autocomplete'] = array(
-    'title' => t('VAT number autocomplete callback'),
-    'page callback' => 'uc_vat_number_vat_autocomplete',
-    'access arguments' => array('access content'),
-    'type' => MENU_CALLBACK,
-  );
-  return $items;
-}
-
-
 function uc_vat_number_vat_autocomplete($string) {
   global $user;
   $matches = array();
@@ -285,7 +317,7 @@ function uc_vat_number_checkout_validate
   }
 
   if (empty($form_state['values']['panes']['vat_number']['vat_number']))
-    if (user_access('Have to fill VAT number'))
+    if (_uc_vat_number_required())
       form_set_error('panes][billing][vat_number', t('VAT Number field is required.'));
     else
       return;
@@ -478,10 +510,6 @@ function uc_vat_number_condition_should_
   return array();
 }
 
-
-
-
-
 /*List of European countries (in order of the array)
   Allemagne
   Autriche
@@ -512,3 +540,37 @@ function uc_vat_number_condition_should_
 function uc_vat_number_european_countries() {
   return array(276, 40, 56, 208, 724, 246, 250, 300, 372, 380, 442, 528, 620, 826, 752, 196, 233, 348, 428, 440, 470, 616, 203, 703, 705);
 }
+
+/*******************************************************************************
+ * Helper functions
+ ******************************************************************************/
+function _uc_vat_number_required() {
+  global $user;
+
+  // User 1 is never restricted
+  if($user->uid == 1) {
+    return FALSE;
+  }
+  
+  // Retrieve the variable and remove the roles with no requirement
+  $roles = array_flip(variable_get('uc_vat_number_roles', array()));
+  unset($roles[0]);
+  
+  // Check anonymous user
+  if(user_is_anonymous() && $roles[1]) {
+    return TRUE;
+  }
+  
+  if(user_is_logged_in()) {
+    if($roles[2]) {
+      return TRUE;
+    }
+    else {
+      $roles = implode(", ", $roles);
+      $q = db_query("SELECT COUNT(rid) FROM {users_roles} WHERE uid = %d AND rid IN (%s);", $user->uid, $roles);
+      if(db_result($q) == 0) {
+        return TRUE;
+      }
+    }
+  }
+}
