X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=includes%2Fhooks.inc;h=63e1684ce853f990eef9ca71866da04d5ee384d1;hb=7ad222595e84451daea8aaa06c83d817cc3c774c;hp=81e1a17a69da5db554b8c6efa3f12b90aaf6c607;hpb=76ca9fef9bb510236a6a7740fa0f60eb7db384c9;p=fa-stable.git diff --git a/includes/hooks.inc b/includes/hooks.inc index 81e1a17a..63e1684c 100644 --- a/includes/hooks.inc +++ b/includes/hooks.inc @@ -18,7 +18,7 @@ // // To find how various hooks are processed look into respective hook_* functions below. // -class hooks { +class hooks extends \stdClass { var $module_name; // extension module name. // @@ -93,6 +93,19 @@ class hooks { // return array($security_areas, $security_sections); } + // + // Invoked for all modules before page header is displayed + // + function pre_header($fun_args) + { + } + // + // Invoked for all modules before page footer is displayed + // + function pre_footer($fun_args) + { + } + // // Price in words. $doc_type is set to document type and can be used to suppress // price in words printing for selected document types. @@ -118,6 +131,12 @@ class hooks { return null; } + // External authentication + // If used should return true after successfull athentication, false otherwise. + function authenticate($login, $password) + { + return null; + } // Generic function called at the end of Tax Report (report 709) // Can be used e.g. for special database updates on every report printing // or to print special tax report footer @@ -172,39 +191,67 @@ 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; 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; @@ -218,8 +265,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) @@ -231,7 +280,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(); } @@ -247,17 +296,20 @@ function hook_invoke_all($method, &$data, $opts=null) global $Hooks; $return = array(); - foreach($Hooks as $ext => $hook) - if (method_exists($hook, $method)) { - set_ext_domain('modules/'.$ext); - $result = $hook->$method($data, $opts); - if (isset($result) && is_array($result)) { - $return = array_merge_recursive($return, $result); - } else if (isset($result)) { - $return[] = $result; - } - } - set_ext_domain(); + if (isset($Hooks)) + { + foreach($Hooks as $ext => $hook) + if (method_exists($hook, $method)) { + set_ext_domain($hook->path); + $result = $hook->$method($data, $opts); + if (isset($result) && is_array($result)) { + $return = array_merge_recursive($return, $result); + } else if (isset($result)) { + $return[] = $result; + } + set_ext_domain(); + } + } return $return; } /* @@ -271,38 +323,36 @@ function hook_invoke_first($method, &$data, $opts=null) $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)) break; } } - set_ext_domain(); return $result; } /* - Returns result of last hook installed. Helps implement hooks overriding by + Returns last non-null result returned from modules method. Helps implement hooks overriding by extensions installed later. - */ function hook_invoke_last($method, &$data, $opts=null) { global $Hooks; - $found = false; - foreach($Hooks as $ext => $hook) { + $result = null; + $Reverse = array_reverse($Hooks); + foreach($Reverse as $ext => $hook) { if (method_exists($hook, $method)) { - $found = $ext; + set_ext_domain($hook->path); + $result = $hook->$method($data, $opts); + set_ext_domain(); + if (isset($result)) + break; } } - $ret = null; - if ($found) { - set_ext_domain('modules/'.$found); - $ret = $Hooks[$found]->$method($data, $opts); - set_ext_domain(); - } - return $ret; + return $result; } //------------------------------------------------------------------------------------------ // Database transaction hooks. @@ -388,3 +438,27 @@ function hook_session_start($company) } return false; } +// +// Third party authentication modules. +// Returns true after successfull authentication, false otherwise, null if no login hook is defined. +// +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); +}