? 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 the project page 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; + } + } + } +}