Fixed language modules locale.inc integration.
[fa-stable.git] / includes / hooks.inc
index b27fc35501788654afcd15ab69df50d23d5ad73c..85b7ae93544ada5e3cda343d8464ebee5d692d49 100644 (file)
@@ -20,7 +20,7 @@
 //
 class hooks {
        var $module_name; // extension module name.
-
+       var $path = null;
        // 
        // Helper for updating databases with extension scheme
        //
@@ -116,6 +116,7 @@ class hooks {
        function price_in_words($amount, $doc_type)
        {
        }
+
        //
        // Exchange rate currency $curr as on date $date.
        // Keep in mind FA has internally implemented 3 exrate providers
@@ -190,42 +191,71 @@ 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');
+       }
+
 }
 
 /*
        Installs hooks provided by extension modules
 */
-function install_hooks()
+function install_hooks($lang_code=null)
 {
        global $path_to_root, $Hooks, $installed_extensions;
 
        $Hooks = array();
-       
        // include current language related $Hooks object if locale file exists
-       if (file_exists($path_to_root . "/lang/".$_SESSION['language']->code."/locale.inc"))
+       if (!$lang_code)
+               $lang_code = $_SESSION['language']->code;
+       $lang_code  = clean_file_name($lang_code);
+
+       if (file_exists($path_to_root . "/lang/" . $lang_code . "/locale.inc"))
        {
-               include_once($path_to_root . "/lang/".$_SESSION['language']->code."/locale.inc");
-               $code = $_SESSION['language']->code;
+               include_once($path_to_root . "/lang/" . $lang_code . "/locale.inc");
+               $code = $lang_code;
                $hook_class = 'hooks_'.$code;
                $Hooks[$code] = new $hook_class;
+               $Hooks[$code]->path = "/lang/" . $lang_code . "/locale.inc";
                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;
+                               $Hooks[$ext['package']]->path = $ext['path'];
                        }
+               }       
        }
 }
 /*
        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;
-       
+
        $hooks = @$Hooks[$ext];
        if (!$hooks) {
                $hookclass = 'hooks_'.$ext;
@@ -236,8 +266,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)
@@ -249,7 +281,7 @@ function hook_invoke($ext, $method, &$data, $opts=null)
 
        $ret = null;
        if (isset($Hooks[$ext]) && method_exists($Hooks[$ext], $method)) {
-               set_ext_domain('modules/'.$ext);
+               set_ext_domain($Hooks[$ext]->path);
                $ret = $Hooks[$ext]->$method($data, $opts);
                set_ext_domain();
        } 
@@ -269,7 +301,7 @@ function hook_invoke_all($method, &$data, $opts=null)
        {
                foreach($Hooks as $ext => $hook)
                        if (method_exists($hook, $method)) {
-                               set_ext_domain('modules/'.$ext);
+                               set_ext_domain($hook->path);
                                $result = $hook->$method($data, $opts);
                                if (isset($result) && is_array($result)) {
                                        $return = array_merge_recursive($return, $result);
@@ -288,11 +320,11 @@ function hook_invoke_first($method, &$data, $opts=null)
 {
 
        global $Hooks;
-       
+
        $result = null;
        foreach($Hooks as $ext => $hook) {
                if (method_exists($hook, $method)) {
-                       set_ext_domain('modules/'.$ext);
+                       set_ext_domain($hook->path);
                        $result = $hook->$method($data, $opts);
                        set_ext_domain();
                        if (isset($result))
@@ -314,7 +346,7 @@ function hook_invoke_last($method, &$data, $opts=null)
        $Reverse = array_reverse($Hooks);
        foreach($Reverse as $ext => $hook) {
                if (method_exists($hook, $method)) {
-                       set_ext_domain('modules/'.$ext);
+                       set_ext_domain($hook->path);
                        $result = $hook->$method($data, $opts);
                        set_ext_domain();
                        if (isset($result))
@@ -415,3 +447,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);
+}