Fixed error creating customer credit note: Undefined index: sales_gl_code. @notrinos.
[fa-stable.git] / includes / hooks.inc
index 361a56eca52d95d7852ca9e6370ad0be1a7bc3fc..393fc8720a96a1d45116931554b76576c25304c4 100644 (file)
@@ -191,6 +191,28 @@ class hooks {
        {
                return true;
        }
+
+       /*
+        * Returns the quantity allowed to be dispatched for a particular item 
+        * and a status (which can be used to style the row).
+        * This quantity would be the default value on the delivery note.
+        * The usual use case for this is when a item is in stock,
+        * but has been reserved by someone else.
+        * This allows extensions to implements its own priority algorithm.
+        * This function is by detail_id and not item in case the item is present
+        * more than one in  the cart.
+        */
+       /* Default behavior check if there is enough quantity on hand and change the css
+        * class if needed */
+       static function  default_get_dispatchable_quantity($line_item, $location, $date, $qoh) {
+       global $SysPrefs;
+
+               if ($SysPrefs->allow_negative_stock() || ($line_item->qty_dispatched <= $qoh)) {
+                       return true;
+               }
+               return array($qoh, 'stockmankobg');
+       }
+
 }
 
 /*
@@ -203,27 +225,30 @@ function install_hooks()
        $Hooks = array();
        
        // include current language related $Hooks object if locale file exists
-       if (file_exists($path_to_root . "/lang/".$_SESSION['language']->code."/locale.inc"))
+       $lang_code  = clean_file_name($_SESSION['language']->code);
+       if (file_exists($path_to_root . "/lang/" . $lang_code . "/locale.inc"))
        {
-               include_once($path_to_root . "/lang/".$_SESSION['language']->code."/locale.inc");
+               include_once($path_to_root . "/lang/" . $lang_code . "/locale.inc");
                $code = $_SESSION['language']->code;
                $hook_class = 'hooks_'.$code;
                $Hooks[$code] = new $hook_class;
                unset($code, $hook_class);
        }
        // install hooks provided by active extensions
-       foreach($installed_extensions as $ext) {
+       if (isset($installed_extensions) && !empty($installed_extensions)) {
+               foreach($installed_extensions as $ext) {
                        $hook_class = 'hooks_'.$ext['package'];
                        if ($ext['active'] && class_exists($hook_class)) {
                                $Hooks[$ext['package']] = new $hook_class;
                        }
+               }       
        }
 }
 /*
        Non active hooks are not included in $Hooks array, so we can use special function to 
        activate.
 */
-function activate_hooks($ext, $comp)
+function activate_hooks($ext, $comp, $on=true)
 {
        global $Hooks;
 
@@ -237,8 +262,10 @@ function activate_hooks($ext, $comp)
        }
        if (!$hooks)
                return false;
-       else
+       elseif ($on)
                return $hooks->activate_extension($comp, false);
+       else
+               return $hooks->deactivate_extension($comp, false);
 }
 /*
        Calls hook $method defined in extension $ext (if any)
@@ -416,3 +443,19 @@ function hook_authenticate($login, $password)
 {
        return hook_invoke_last('authenticate', $login, $password);
 }
+
+       /*
+        * Returns the quantity allowed to be dispatched for a particular item 
+        * and a "reason" (css classes).
+        * This quantity would be the default value on the delivery note.
+        * The usual use case for this is when a item is in stock,
+        * but has been reserved by someone else.
+        * This allows extensions to implements its own priority algorithm.
+        * This function is by detail_id and not item in case the item is present
+        * more than one in  the cart.
+        * If 'skip' is returned, the line will be skipped and not displayed
+        */
+function hook_get_dispatchable_quantity($line_item, $location, $date, $qoh) {
+               $result =  hook_invoke_first('get_dispatchable_quantity', $line_item, array($location, $date, $qoh));
+               return $result !== null ? $result : hooks::default_get_dispatchable_quantity($line_item, $location, $date, $qoh);
+}