Revision: 2297
          http://mrbs.svn.sourceforge.net/mrbs/?rev=2297&view=rev
Author:   cimorrison
Date:     2012-05-23 09:17:11 +0000 (Wed, 23 May 2012)
Log Message:
-----------
Extended maximum number of bookings per day/week/month/etc so that they can be 
used per area as well as system wide.  Note that you can set a setting per 
system as well as setting per area enabling you to set policies of the sort 
"Max 2 bookings per week in this area and max 5 bookings per week across the 
system".   Note also that setting 0 bookings per period for an area is a way of 
stopping ordinary users from making bookings in a particular area.

Modified Paths:
--------------
    mrbs/trunk/tables.my.pre41.sql
    mrbs/trunk/tables.my.sql
    mrbs/trunk/tables.pg.pre73.sql
    mrbs/trunk/tables.pg.sql
    mrbs/trunk/web/Themes/default/header.inc
    mrbs/trunk/web/areadefaults.inc.php
    mrbs/trunk/web/dbsys.inc
    mrbs/trunk/web/edit_area_room.php
    mrbs/trunk/web/functions.inc
    mrbs/trunk/web/internalconfig.inc.php
    mrbs/trunk/web/lang.en
    mrbs/trunk/web/mrbs.css.php
    mrbs/trunk/web/mrbs_sql.inc

Added Paths:
-----------
    mrbs/trunk/web/upgrade/30/
    mrbs/trunk/web/upgrade/30/mysql.sql
    mrbs/trunk/web/upgrade/30/pgsql.sql

Modified: mrbs/trunk/tables.my.pre41.sql
===================================================================
--- mrbs/trunk/tables.my.pre41.sql      2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/tables.my.pre41.sql      2012-05-23 09:17:11 UTC (rev 2297)
@@ -39,6 +39,16 @@
   min_book_ahead_secs       int,
   max_book_ahead_enabled    tinyint(1),
   max_book_ahead_secs       int,
+  max_per_day_enabled       tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_day               int DEFAULT 0 NOT NULL,
+  max_per_week_enabled      tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_week              int DEFAULT 0 NOT NULL,
+  max_per_month_enabled     tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_month             int DEFAULT 0 NOT NULL,
+  max_per_year_enabled      tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_year              int DEFAULT 0 NOT NULL,
+  max_per_future_enabled    tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_future            int DEFAULT 0 NOT NULL,
   custom_html               text,
   approval_enabled          tinyint(1),
   reminders_enabled         tinyint(1),
@@ -151,6 +161,6 @@
 );
 
 INSERT INTO mrbs_variables (variable_name, variable_content)
-  VALUES ( 'db_version', '29');
+  VALUES ( 'db_version', '30');
 INSERT INTO mrbs_variables (variable_name, variable_content)
   VALUES ( 'local_db_version', '1');

Modified: mrbs/trunk/tables.my.sql
===================================================================
--- mrbs/trunk/tables.my.sql    2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/tables.my.sql    2012-05-23 09:17:11 UTC (rev 2297)
@@ -39,6 +39,16 @@
   min_book_ahead_secs       int,
   max_book_ahead_enabled    tinyint(1),
   max_book_ahead_secs       int,
+  max_per_day_enabled       tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_day               int DEFAULT 0 NOT NULL,
+  max_per_week_enabled      tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_week              int DEFAULT 0 NOT NULL,
+  max_per_month_enabled     tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_month             int DEFAULT 0 NOT NULL,
+  max_per_year_enabled      tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_year              int DEFAULT 0 NOT NULL,
+  max_per_future_enabled    tinyint(1) DEFAULT 0 NOT NULL,
+  max_per_future            int DEFAULT 0 NOT NULL,
   custom_html               text CHARACTER SET utf8 COLLATE utf8_general_ci,
   approval_enabled          tinyint(1),
   reminders_enabled         tinyint(1),
@@ -151,6 +161,6 @@
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 INSERT INTO mrbs_variables (variable_name, variable_content)
-  VALUES ( 'db_version', '29');
+  VALUES ( 'db_version', '30');
 INSERT INTO mrbs_variables (variable_name, variable_content)
   VALUES ( 'local_db_version', '1');

Modified: mrbs/trunk/tables.pg.pre73.sql
===================================================================
--- mrbs/trunk/tables.pg.pre73.sql      2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/tables.pg.pre73.sql      2012-05-23 09:17:11 UTC (rev 2297)
@@ -42,6 +42,16 @@
   min_book_ahead_secs       int,
   max_book_ahead_enabled    smallint,
   max_book_ahead_secs       int,
+  max_per_day_enabled       smallint DEFAULT 0 NOT NULL,
+  max_per_day               int DEFAULT 0 NOT NULL,
+  max_per_week_enabled      smallint DEFAULT 0 NOT NULL,
+  max_per_week              int DEFAULT 0 NOT NULL,
+  max_per_month_enabled     smallint DEFAULT 0 NOT NULL,
+  max_per_month             int DEFAULT 0 NOT NULL,
+  max_per_year_enabled      smallint DEFAULT 0 NOT NULL,
+  max_per_year              int DEFAULT 0 NOT NULL,
+  max_per_future_enabled    smallint DEFAULT 0 NOT NULL,
+  max_per_future            int DEFAULT 0 NOT NULL,
   custom_html               text,
   approval_enabled          smallint,
   reminders_enabled         smallint,
@@ -140,6 +150,6 @@
 );
 
 INSERT INTO mrbs_variables (variable_name, variable_content)
-  VALUES ('db_version', '29');
+  VALUES ('db_version', '30');
 INSERT INTO mrbs_variables (variable_name, variable_content)
   VALUES ('local_db_version', '1');

Modified: mrbs/trunk/tables.pg.sql
===================================================================
--- mrbs/trunk/tables.pg.sql    2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/tables.pg.sql    2012-05-23 09:17:11 UTC (rev 2297)
@@ -55,6 +55,16 @@
   min_book_ahead_secs       int,
   max_book_ahead_enabled    smallint,
   max_book_ahead_secs       int,
+  max_per_day_enabled       smallint DEFAULT 0 NOT NULL,
+  max_per_day               int DEFAULT 0 NOT NULL,
+  max_per_week_enabled      smallint DEFAULT 0 NOT NULL,
+  max_per_week              int DEFAULT 0 NOT NULL,
+  max_per_month_enabled     smallint DEFAULT 0 NOT NULL,
+  max_per_month             int DEFAULT 0 NOT NULL,
+  max_per_year_enabled      smallint DEFAULT 0 NOT NULL,
+  max_per_year              int DEFAULT 0 NOT NULL,
+  max_per_future_enabled    smallint DEFAULT 0 NOT NULL,
+  max_per_future            int DEFAULT 0 NOT NULL,
   custom_html               text,
   approval_enabled          smallint,
   reminders_enabled         smallint,
@@ -153,6 +163,6 @@
 );
 
 INSERT INTO mrbs_variables (variable_name, variable_content)
-  VALUES ('db_version', '29');
+  VALUES ('db_version', '30');
 INSERT INTO mrbs_variables (variable_name, variable_content)
   VALUES ('local_db_version', '1');

Modified: mrbs/trunk/web/Themes/default/header.inc
===================================================================
--- mrbs/trunk/web/Themes/default/header.inc    2012-05-08 16:07:58 UTC (rev 
2296)
+++ mrbs/trunk/web/Themes/default/header.inc    2012-05-23 09:17:11 UTC (rev 
2297)
@@ -649,26 +649,6 @@
     }
   }
   
-  // disable the min and max book ahead values and units if the corresponding
-  // checkbox isn't checked;  and enable it it is.
-  function check_book_ahead()
-  {
-    var form = document.getElementById('edit_area');
-    
-    if (form)
-    {
-      if (form.area_min_ba_enabled)
-      {
-        form.area_min_ba_value.disabled = !form.area_min_ba_enabled.checked;
-        form.area_min_ba_units.disabled = !form.area_min_ba_enabled.checked;
-      }
-      if (form.area_max_ba_enabled)
-      {
-        form.area_max_ba_value.disabled = !form.area_max_ba_enabled.checked;
-        form.area_max_ba_units.disabled = !form.area_max_ba_enabled.checked;
-      }
-    }
-  }
 <?php
 } // edit_area_room
 
@@ -2576,7 +2556,7 @@
     // Also show or hide the periods note as appropriate
     // [This method works if there are no periods-specific settings.
     // When we get those we will have to do something different]
-  ?>
+    ?>
     var form = document.getElementById('edit_area');
     if (form)
     {
@@ -2590,10 +2570,20 @@
       {
         $('#book_ahead_periods_note').hide();
       }
-      check_book_ahead();
     }
     
-  <?php
+    <?php
+    // Where we've got enabling checkboxes, apply a change event to them so 
that
+    // when the enabling checkbox is changed the associated inputs are enabled 
or
+    // disabled as appropriate.   Also trigger the change event when the page 
is loaded
+    // so that the inputs are enabled/disabled correctly initially.
+    ?>
+    $('.enabler').change(function(){
+        $(this).nextAll('input, select').attr('disabled', 
!$(this).is(':checked'));
+      })
+      .change();
+    
+    <?php
   }
   
   // EDIT_ENTRY.PHP

Modified: mrbs/trunk/web/areadefaults.inc.php
===================================================================
--- mrbs/trunk/web/areadefaults.inc.php 2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/web/areadefaults.inc.php 2012-05-23 09:17:11 UTC (rev 2297)
@@ -131,7 +131,27 @@
 // will allow somebody to make a booking at 11:59 pm for the first period the 
next day, which
 // which may occur at 8.00 am.
 
+// DEFAULT VALUES FOR NEW AREAS
+// Set the maximum number of bookings that can be made in an area by any one 
user, in an
+// interval, which can be a day, week, month or year, or else in the future.  
(A week is
+// defined by the $weekstarts setting).   These are per-area settings but you 
can use them
+// in conjunction with the global settings.   This would allow you to set 
policies such as
+// allowing a maximum of 10 bookings per month in total with a maximum of 1 
per day in Area A.
+$max_per_interval_area_enabled['day']    = FALSE;
+$max_per_interval_area['day'] = 1;      // max 1 bookings per day in an area
 
+$max_per_interval_area_enabled['week']   = FALSE;
+$max_per_interval_area['week'] = 5;     // max 5 bookings per week in an area
+
+$max_per_interval_area_enabled['month']  = FALSE;
+$max_per_interval_area['month'] = 10;   // max 10 bookings per month in an area
+
+$max_per_interval_area_enabled['year']   = FALSE;
+$max_per_interval_area['year'] = 50;    // max 50 bookings per year in an area
+
+$max_per_interval_area_enabled['future'] = FALSE;
+$max_per_interval_area['future'] = 100; // max 100 bookings in the future in 
an area
+
 /************************
  * Miscellaneous settings
  ************************/

Modified: mrbs/trunk/web/dbsys.inc
===================================================================
--- mrbs/trunk/web/dbsys.inc    2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/web/dbsys.inc    2012-05-23 09:17:11 UTC (rev 2297)
@@ -16,7 +16,7 @@
 $tbl_zoneinfo  = $db_tbl_prefix . "zoneinfo";
 
 
-$db_schema_version = 29;
+$db_schema_version = 30;
 $local_db_schema_version = 1;
 
 

Modified: mrbs/trunk/web/edit_area_room.php
===================================================================
--- mrbs/trunk/web/edit_area_room.php   2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/web/edit_area_room.php   2012-05-23 09:17:11 UTC (rev 2297)
@@ -173,6 +173,15 @@
 $change_room = get_form_var('change_room', 'string');
 $change_area = get_form_var('change_area', 'string');
 
+// Get the max_per_interval form variables
+foreach ($interval_types as $interval_type)
+{
+  $var = "area_max_per_${interval_type}";
+  $$var = get_form_var($var, 'int');
+  $var = "area_max_per_${interval_type}_enabled";
+  $$var = get_form_var($var, 'string');
+}
+
 // Get the information about the fields in the room table
 $fields = sql_field_info($tbl_room);
 
@@ -447,6 +456,11 @@
     $area_enable_periods = (!empty($area_enable_periods)) ? 1 : 0;
     $area_confirmation_enabled = (!empty($area_confirmation_enabled)) ? 1 : 0;
     $area_confirmed_default = (!empty($area_confirmed_default)) ? 1 : 0;
+    foreach ($interval_types as $interval_type)
+    {
+      $var = "area_max_per_${interval_type}_enabled";
+      $$var = (!empty($$var)) ? 1 : 0;
+    }
     
     if (!$area_enable_periods)
     { 
@@ -510,6 +524,22 @@
         $assign_array[] = "max_book_ahead_secs=" . $area_max_ba_value;
       }
       
+      foreach($interval_types as $interval_type)
+      {
+        $var = "max_per_${interval_type}_enabled";
+        $area_var = "area_" . $var;
+        $assign_array[] = "$var=" . $$area_var;
+        
+        $var = "max_per_${interval_type}";
+        $area_var = "area_" . $var;
+        if (isset($$area_var))
+        {
+          // only update these fields if they are set;  they might be NULL 
because
+          // they have been disabled by JavaScript
+          $assign_array[] = "$var=" . $$area_var;
+        }
+      }
+      
       $assign_array[] = "private_enabled=" . $area_private_enabled;
       $assign_array[] = "private_default=" . $area_private_default;
       $assign_array[] = "private_mandatory=" . $area_private_mandatory;
@@ -1096,10 +1126,9 @@
       // Minimum book ahead
       echo "<div>\n";
       echo "<label>" . get_vocab("min_book_ahead") . ":</label>\n";
-      echo "<input class=\"checkbox\" type=\"checkbox\" 
id=\"area_min_ba_enabled\" name=\"area_min_ba_enabled\"" .
-           (($min_book_ahead_enabled) ? " checked=\"checked\"" : "") .
-           " onChange=\"check_book_ahead()\">\n";
-      echo "<input class=\"text\" type=\"text\" name=\"area_min_ba_value\" 
value=\"$min_ba_value\">";
+      echo "<input class=\"enabler checkbox\" type=\"checkbox\" 
id=\"area_min_ba_enabled\" name=\"area_min_ba_enabled\"" .
+           (($min_book_ahead_enabled) ? " checked=\"checked\"" : "") . ">\n";
+      echo "<input class=\"text\" type=\"number\" min=\"0\" step=\"1\" 
name=\"area_min_ba_value\" value=\"$min_ba_value\">";
       echo "<select id=\"area_min_ba_units\" name=\"area_min_ba_units\">\n";
       $units = array("seconds", "minutes", "hours", "days", "weeks");
       foreach ($units as $unit)
@@ -1113,10 +1142,9 @@
       // Maximum book ahead
       echo "<div>\n";
       echo "<label>" . get_vocab("max_book_ahead") . ":</label>\n";
-      echo "<input class=\"checkbox\" type=\"checkbox\" 
id=\"area_max_ba_enabled\" name=\"area_max_ba_enabled\"" .
-           (($max_book_ahead_enabled) ? " checked=\"checked\"" : "") .
-           " onChange=\"check_book_ahead()\">\n";
-      echo "<input class=\"text\" type=\"text\" name=\"area_max_ba_value\" 
value=\"$max_ba_value\">";
+      echo "<input class=\"enabler checkbox\" type=\"checkbox\" 
id=\"area_max_ba_enabled\" name=\"area_max_ba_enabled\"" .
+           (($max_book_ahead_enabled) ? " checked=\"checked\"" : "") . ">\n";
+      echo "<input class=\"text\" type=\"number\" min=\"0\" step=\"1\" 
name=\"area_max_ba_value\" value=\"$max_ba_value\">";
       echo "<select id=\"area_max_ba_units\" name=\"area_max_ba_units\">\n";
       $units = array("seconds", "minutes", "hours", "days", "weeks");
       foreach ($units as $unit)
@@ -1127,6 +1155,42 @@
       }
       echo "</select>\n";
       echo "</div>\n";
+      
+      // The max_per booking policies
+      echo "<table>\n";
+      
+      echo "<thead>\n";
+      echo "<tr>\n";
+      echo "<th></th>\n";
+      echo "<th>" . get_vocab("this_area") . "</th>\n";
+      echo "<th title=\"" . get_vocab("whole_system_note") . "\">" . 
get_vocab("whole_system") . "</th>\n";
+      echo "</tr>\n";
+      echo "</thead>\n";
+      
+      echo "<tbody>\n";
+      foreach ($interval_types as $interval_type)
+      {
+        echo "<tr>\n";
+        echo "<td><label>" . get_vocab("max_per_${interval_type}") . 
":</label></td>\n";
+        $var = "max_per_${interval_type}_enabled";
+        echo "<td><input class=\"enabler checkbox\" type=\"checkbox\" 
id=\"area_max_per_${interval_type}_enabled\" 
name=\"area_max_per_${interval_type}_enabled\"" .
+             (($max_per_interval_area_enabled[$interval_type]) ? " 
checked=\"checked\"" : "") .
+             ">\n";
+        $var = "max_per_${interval_type}";
+        echo "<input class=\"text\" type=\"number\" min=\"0\" step=\"1\" 
name=\"area_max_per_${interval_type}\" 
value=\"$max_per_interval_area[$interval_type]\"></td>\n"; 
+        echo "<td>\n";
+        echo "<input class=\"checkbox\" type=\"checkbox\" 
disabled=\"disabled\"" .
+             (($max_per_interval_global_enabled[$interval_type]) ? " 
checked=\"checked\"" : "") .
+             ">\n";
+        echo "<input class=\"text\" disabled=\"disabled\" value=\"" . 
$max_per_interval_global[$interval_type] . "\">\n";
+        echo "</td>\n";
+        echo "</tr>\n";
+      }
+      echo "</tbody>\n";
+      
+      echo "</table>\n";
+      
+      
       echo "</fieldset>\n";
       ?>
       

Modified: mrbs/trunk/web/functions.inc
===================================================================
--- mrbs/trunk/web/functions.inc        2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/web/functions.inc        2012-05-23 09:17:11 UTC (rev 2297)
@@ -799,6 +799,8 @@
   global $min_book_ahead_enabled, $max_book_ahead_enabled, 
$min_book_ahead_secs, $max_book_ahead_secs;
   global $approval_enabled, $reminders_enabled, $enable_periods;
   global $confirmation_enabled, $confirmed_default, $timezone;
+  global $max_per_interval_area_enabled, $max_per_interval_area;
+  global $interval_types;
   
   if (empty($area))
   {
@@ -812,6 +814,11 @@
                  private_enabled, private_default, private_mandatory, 
private_override,
                  min_book_ahead_enabled, max_book_ahead_enabled,
                  min_book_ahead_secs, max_book_ahead_secs,
+                 max_per_day_enabled, max_per_day,
+                 max_per_week_enabled, max_per_week,
+                 max_per_month_enabled, max_per_month,
+                 max_per_year_enabled, max_per_year,
+                 max_per_future_enabled, max_per_future,
                  approval_enabled, reminders_enabled, enable_periods,
                  confirmation_enabled, confirmed_default
           FROM $tbl_area 
@@ -835,6 +842,17 @@
   }
   // Set the timezone
   mrbs_default_timezone_set($timezone);
+  
+  // Set the $max_per_interval_area_enabled and $max_per_interval_area arrays,
+  // which are handled slightly differently
+  foreach ($interval_types as $interval_type)
+  {
+    $var = "max_per_${interval_type}_enabled";
+    $max_per_interval_area_enabled[$interval_type] = $$var;
+    $var = "max_per_${interval_type}";
+    $max_per_interval_area[$interval_type] = $$var;
+  }
+  
 }
 
 

Modified: mrbs/trunk/web/internalconfig.inc.php
===================================================================
--- mrbs/trunk/web/internalconfig.inc.php       2012-05-08 16:07:58 UTC (rev 
2296)
+++ mrbs/trunk/web/internalconfig.inc.php       2012-05-23 09:17:11 UTC (rev 
2297)
@@ -224,6 +224,11 @@
                                 'private_mandatory',
                                 'min_book_ahead_enabled',
                                 'max_book_ahead_enabled',
+                                'max_per_day_enabled',
+                                'max_per_week_enabled',
+                                'max_per_month_enabled',
+                                'max_per_year_enabled',
+                                'max_per_future_enabled',
                                 'max_duration_enabled',  // not yet a per-area 
setting, but will be sometime
                                 'approval_enabled',
                                 'reminders_enabled',
@@ -260,6 +265,16 @@
 $area_defaults['max_book_ahead_enabled']   = $max_book_ahead_enabled;
 $area_defaults['min_book_ahead_secs']      = $min_book_ahead_secs;
 $area_defaults['max_book_ahead_secs']      = $max_book_ahead_secs;
+$area_defaults['max_per_day_enabled']      = 
$max_per_interval_area_enabled['day'];
+$area_defaults['max_per_day']              = $max_per_interval_area['day'];
+$area_defaults['max_per_week_enabled']     = 
$max_per_interval_area_enabled['week'];
+$area_defaults['max_per_week']             = $max_per_interval_area['week'];
+$area_defaults['max_per_month_enabled']    = 
$max_per_interval_area_enabled['month'];
+$area_defaults['max_per_month']            = $max_per_interval_area['month'];
+$area_defaults['max_per_year_enabled']     = 
$max_per_interval_area_enabled['year'];
+$area_defaults['max_per_year']             = $max_per_interval_area['year'];
+$area_defaults['max_per_future_enabled']   = 
$max_per_interval_area_enabled['future'];
+$area_defaults['max_per_future']           = $max_per_interval_area['future'];
 $area_defaults['approval_enabled']         = $approval_enabled;
 $area_defaults['reminders_enabled']        = $reminders_enabled;
 $area_defaults['enable_periods']           = $enable_periods;
@@ -271,6 +286,9 @@
 // error, we split the requests into batches with a maximum number of ids
 // in the array defined below.
 define('DEL_ENTRY_AJAX_BATCH_SIZE', 100);
+
+// Interval types used in booking policies
+$interval_types = array('day', 'week', 'month', 'year', 'future');
                
 /********************************************************
  * PHP System Configuration - internal use, do not change

Modified: mrbs/trunk/web/lang.en
===================================================================
--- mrbs/trunk/web/lang.en      2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/web/lang.en      2012-05-23 09:17:11 UTC (rev 2297)
@@ -184,6 +184,11 @@
 $vocab["max_per_month_global"]    = "The maximum number of bookings per month 
per user across the whole system is";
 $vocab["max_per_year_global"]     = "The maximum number of bookings per year 
per user across the whole system is";
 $vocab["max_per_future_global"]   = "The maximum number of outstanding 
bookings per user across the whole system is";
+$vocab["max_per_day_area"]        = "The maximum number of bookings per day 
per user in this area is";
+$vocab["max_per_week_area"]       = "The maximum number of bookings per week 
per user in this area is";
+$vocab["max_per_month_area"]      = "The maximum number of bookings per month 
per user in this area is";
+$vocab["max_per_year_area"]       = "The maximum number of bookings per year 
per user in this area is";
+$vocab["max_per_future_area"]     = "The maximum number of outstanding 
bookings per user in this area is";
 $vocab["skip_and_book"]           = "Skip and book";
 $vocab["skip_and_book_note"]      = "Carry on with the booking, skipping past 
the conflicting entries";
 
@@ -385,6 +390,14 @@
 $vocab["booking_policies"]        = "Booking policies";
 $vocab["min_book_ahead"]          = "Advance booking - minimum";
 $vocab["max_book_ahead"]          = "Advance booking - maximum";
+$vocab["this_area"]               = "This area";
+$vocab["whole_system"]            = "Whole system";
+$vocab["whole_system_note"]       = "The values for the whole system are set 
in the config file";
+$vocab["max_per_day"]             = "Maximum number per day";
+$vocab["max_per_week"]            = "Maximum number per week";
+$vocab["max_per_month"]           = "Maximum number per month";
+$vocab["max_per_year"]            = "Maximum number per year";
+$vocab["max_per_future"]          = "Maximum number in the future";
 $vocab["custom_html"]             = "Custom HTML";
 $vocab["custom_html_note"]        = "This field can be used for displaying 
your own HTML, for example an embedded Google map";
 $vocab["email_list_note"]         = "Enter a list of email addresses separated 
by commas or newlines";

Modified: mrbs/trunk/web/mrbs.css.php
===================================================================
--- mrbs/trunk/web/mrbs.css.php 2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/web/mrbs.css.php 2012-05-23 09:17:11 UTC (rev 2297)
@@ -514,7 +514,7 @@
 $db_logon_form_min_width       = number_format($db_logon_form_min_width, 1, 
'.', '');   // get rid of any commas
 
 // Specific to the "edit_area_room" form
-$edit_area_room_left_col_width      = '15';      // em
+$edit_area_room_left_col_width      = '17';      // em
 $edit_area_room_left_col_max_width  = '30';      // em
 $edit_area_room_input_width         = '12';      // em
 $edit_area_room_form_min_width      = $edit_area_room_left_col_width + 
$edit_area_room_input_width + $general_gap;
@@ -584,7 +584,7 @@
 .form_general input.radio {margin-top: 0.1em; margin-right: 2px}
 .form_general input.checkbox {width: auto; margin-top: 0.2em}
 .edit_area_room .form_general input.checkbox {margin-left: <?php echo 
$general_gap ?>em}
-.edit_area_room .form_general #booking_policies input.text {width: 2.0em}
+.edit_area_room .form_general #booking_policies input.text {width: 4em}
 .form_general input.submit {display: block; width: auto; float: left; clear: 
left; margin-top: 1.0em}
 
 div#import_submit     {width: <?php echo $general_left_col_width ?>%; 
max-width: <?php echo $import_left_col_max_width ?>em}
@@ -627,7 +627,11 @@
 div.good {color: green}
 div.bad {color: red}
 
+.form_general table {border-collapse: collapse}
+.form_general table, .form_general tr, .form_general th, .form_general td 
{padding: 0; margin: 0; border: 0}
+.form_general th {font-weight: normal; font-style: italic; text-align: left; 
padding: 0.2em 0 0.2em 1em}
 
+
 /* ------------ EDIT_ENTRY_HANDLER.PHP ------------------*/
 .edit_entry_handler div#submit_buttons {float: left}
 .edit_entry_handler #submit_buttons form {float: left; margin: 1em 2em 1em 0}

Modified: mrbs/trunk/web/mrbs_sql.inc
===================================================================
--- mrbs/trunk/web/mrbs_sql.inc 2012-05-08 16:07:58 UTC (rev 2296)
+++ mrbs/trunk/web/mrbs_sql.inc 2012-05-23 09:17:11 UTC (rev 2297)
@@ -98,12 +98,25 @@
 
 // Checks whether the proposed booking $booking would exceed the maximum 
number of
 // bookings in the interval of type $interval_type (can be 'day', 'week', 
'month' or
-// 'year').   Returns NULL if OK, otherwise an error string.
-function checkInterval(&$booking, $interval_type='day')
+// 'year').   If $only_area is set then only the bookings in the same are 
considered.
+// Returns NULL if OK, otherwise an error string.
+function checkInterval(&$booking, $interval_type='day', $only_area=FALSE)
 {
-  global $max_per_interval_global;
-  global $tbl_entry;
+  global $max_per_interval_global, $max_per_interval_area;
+  global $tbl_entry, $tbl_room;
   
+  // Get the area id.   We only need to do this once as all bookings will be
+  // in the same area.
+  static $area_id = NULL;
+  if (!isset($area_id))
+  {
+    $area_id = get_area($booking['room_id']);
+  }
+  
+  // Get the location for indexing the $existing and $proposed arrays.   If 
it's a 
+  // global check then $location = 0, otherwise use the area_id.
+  $location = ($only_area) ? $area_id : 0;
+  
   // Set up arrays recording the number of existing and proposed bookings for 
the interval,
   // indexed by the interval type and the Unix time at the start of that 
interval.  These 
   // are static variables because we test all the proposed bookings, which 
could be for
@@ -155,31 +168,45 @@
         $interval_end = PHP_INT_MAX;
         break;
     }
-      
-    if (!isset($existing[$interval_type][$interval_start]))
+
+    if (!isset($existing[$location][$interval_type][$interval_start]))
     {
       $sql = "SELECT COUNT(*)
-                FROM $tbl_entry
-               WHERE start_time<$interval_end
-                 AND end_time>$interval_start
-                 AND create_by='" . sql_escape($booking['create_by']) . "'";
-      $existing[$interval_type][$interval_start] = sql_query1($sql);
-      if ($existing[$interval_type][$interval_start] < 0)
+                FROM $tbl_entry E, $tbl_room R
+               WHERE E.start_time<$interval_end
+                 AND E.end_time>$interval_start
+                 AND E.create_by='" . sql_escape($booking['create_by']) . "'
+                 AND E.room_id=R.id
+                 AND R.disabled=0";
+      if ($only_area)
       {
+        $sql .= " AND R.area_id=$area_id";
+      }
+      $existing[$location][$interval_type][$interval_start] = sql_query1($sql);
+      if ($existing[$location][$interval_type][$interval_start] < 0)
+      {
         trigger_error(sql_error(), E_USER_WARNING);
         fatal_error(FALSE, get_vocab("fatal_db_error"));
       }
-      $proposed[$interval_type][$interval_start] = 1;
+      $proposed[$location][$interval_type][$interval_start] = 1;
     }
     else
     {
-      $proposed[$interval_type][$interval_start]++;
+      $proposed[$location][$interval_type][$interval_start]++;
     }
-      
-    if (($existing[$interval_type][$interval_start] + 
$proposed[$interval_type][$interval_start]) >
-         $max_per_interval_global[$interval_type])
+    
+    $max_allowed = ($only_area) ? $max_per_interval_area[$interval_type] : 
$max_per_interval_global[$interval_type];
+    if (($existing[$location][$interval_type][$interval_start] + 
$proposed[$location][$interval_type][$interval_start]) >
+         $max_allowed)
     {
-      return get_vocab("max_per_${interval_type}_global") . " 
$max_per_interval_global[$interval_type]";
+      if ($only_area)
+      {
+        return get_vocab("max_per_${interval_type}_area") . " 
$max_per_interval_area[$interval_type]";
+      }
+      else
+      {
+        return get_vocab("max_per_${interval_type}_global") . " 
$max_per_interval_global[$interval_type]";
+      }
     }
       
     $interval_start = $interval_end;
@@ -211,7 +238,8 @@
   global $min_book_ahead_enabled, $min_book_ahead_secs;
   global $max_book_ahead_enabled, $max_book_ahead_secs;
   global $max_duration_enabled, $max_duration_secs, $max_duration_periods;
-  global $max_per_interval_global_enabled;
+  global $max_per_interval_global_enabled, $max_per_interval_area_enabled;
+  global $interval_types;
 
   $errors = array();
   $secs_in_day = 60*60*24;
@@ -290,17 +318,27 @@
   }
   
   // Check max number of bookings allowed per interval for this user for each 
of
-  // the interval types
-  foreach (array('day', 'week', 'month', 'year', 'future') as $interval_type)
+  // the interval types, both globally and for the area
+  foreach ($interval_types as $interval_type)
   {
+    // globally
     if (!empty($max_per_interval_global_enabled[$interval_type]) && !$delete)
     {
-      $tmp = checkInterval($booking, $interval_type);
+      $tmp = checkInterval($booking, $interval_type, FALSE);
       if (isset($tmp))
       {
         $errors[] = $tmp;
       }
     }
+    // for the area
+    if (!empty($max_per_interval_area_enabled[$interval_type]) && !$delete)
+    {
+      $tmp = checkInterval($booking, $interval_type, TRUE);
+      if (isset($tmp))
+      {
+        $errors[] = $tmp;
+      }
+    }
   }
   
   return $errors;
@@ -1157,7 +1195,7 @@
 }
 
 
-// Adds an area, returning the new id, or FALSE on failute with the
+// Adds an area, returning the new id, or FALSE on failure with the
 // error in $error
 function mrbsAddArea($name, &$error)
 {

Added: mrbs/trunk/web/upgrade/30/mysql.sql
===================================================================
--- mrbs/trunk/web/upgrade/30/mysql.sql                         (rev 0)
+++ mrbs/trunk/web/upgrade/30/mysql.sql 2012-05-23 09:17:11 UTC (rev 2297)
@@ -0,0 +1,15 @@
+# $Id$
+
+# Add the max number of bookings fields
+
+ALTER TABLE %DB_TBL_PREFIX%area 
+ADD COLUMN max_per_day_enabled       tinyint(1) DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_day               int DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_week_enabled      tinyint(1) DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_week              int DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_month_enabled     tinyint(1) DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_month             int DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_year_enabled      tinyint(1) DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_year              int DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_future_enabled    tinyint(1) DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_future            int DEFAULT 0 NOT NULL;


Property changes on: mrbs/trunk/web/upgrade/30/mysql.sql
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Added: mrbs/trunk/web/upgrade/30/pgsql.sql
===================================================================
--- mrbs/trunk/web/upgrade/30/pgsql.sql                         (rev 0)
+++ mrbs/trunk/web/upgrade/30/pgsql.sql 2012-05-23 09:17:11 UTC (rev 2297)
@@ -0,0 +1,15 @@
+-- $Id$
+
+-- Add the max number of bookings fields
+
+ALTER TABLE %DB_TBL_PREFIX%area 
+ADD COLUMN max_per_day_enabled       smallint DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_day               int DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_week_enabled      smallint DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_week              int DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_month_enabled     smallint DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_month             int DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_year_enabled      smallint DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_year              int DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_future_enabled    smallint DEFAULT 0 NOT NULL,
+ADD COLUMN max_per_future            int DEFAULT 0 NOT NULL;


Property changes on: mrbs/trunk/web/upgrade/30/pgsql.sql
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Mrbs-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mrbs-commits

Reply via email to