//
// Install additional tabs provided by extension
//
- function install_tabs($app) {
-// set_ext_domain('modules/example'); // set text domain for gettext
+ function install_tabs($app)
+ {
// $app->add_application(new example_class); // add menu tab defined by example_class
-// set_ext_domain();
}
//
// Install additonal menu options provided by extension
//
- function install_options($app) {
+ function install_options($app)
+ {
// global $path_to_root;
-// set_ext_domain('modules/example');
+//
// switch($app->id) {
// case 'orders':
// $app->add_rapp_function( 0, _("&Example option"),
// $path_to_root.'/modules/example/example.php?', 'SA_OPEN');
// }
-// set_ext_domain();
}
+
+ function install_access()
+ {
+// $security_areas['SA_EXAMPLE'] = array(SS_EXAMPLE|100, _("Example security area."));
+//
+// $security_sections = array(SS_EXAMPLE => _("Example module implementation"));
+//
+// 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.
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
{
return true;
}
-}
-//
-// include all extensions hook files.
-//
-foreach ($installed_extensions as $ext)
-{
- @include_once($path_to_root.'/'.$ext['path'].'/hooks.php');
+ /*
+ This method is called after module install.
+ */
+ function install_extension($check_only=true)
+ {
+ return true;
+ }
+ /*
+ This method is called after module uninstall.
+ */
+ function uninstall_extension($check_only=true)
+ {
+ return true;
+ }
+ /*
+ This method is called on extension activation for company.
+ */
+ function activate_extension($company, $check_only=true)
+ {
+ return true;
+ }
+ /*
+ This method is called when extension is deactivated for company.
+ */
+ function deactivate_extension($company, $check_only=true)
+ {
+ 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');
+ return array($line_item->qty_dispatched, 'stockmankobg');
+ }
+
}
/*
Installs hooks provided by extension modules
*/
-function install_hooks() {
+function install_hooks()
+{
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"))
+ $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
-// include($path_to_root.'/installed_extensions.php');
foreach($installed_extensions as $ext) {
-// @include($path_to_root.'/'.$ext['path'].'/hooks.php');
- $hook_class = 'hooks_'.$ext['package'];
- if ($ext['active'] && class_exists($hook_class)) {
- $Hooks[$ext['package']] = new $hook_class;
- }
+ $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)
+{
global $Hooks;
-
+
$hooks = @$Hooks[$ext];
if (!$hooks) {
$hookclass = 'hooks_'.$ext;
/*
Calls hook $method defined in extension $ext (if any)
*/
-function hook_invoke($ext, $method, &$data, $opts=null) {
+function hook_invoke($ext, $method, &$data, $opts=null)
+{
global $Hooks;
+ $ret = null;
if (isset($Hooks[$ext]) && method_exists($Hooks[$ext], $method)) {
- return $Hooks[$ext]->$method($data, $opts);
- } else
- return null;
+ set_ext_domain('modules/'.$ext);
+ $ret = $Hooks[$ext]->$method($data, $opts);
+ set_ext_domain();
+ }
+ return $ret;
}
/*
Calls hook $methods defined in all extensions (if any)
*/
-function hook_invoke_all($method, &$data, $opts=null) {
+function hook_invoke_all($method, &$data, $opts=null)
+{
global $Hooks;
- $result = array();
- foreach($Hooks as $ext => $hook)
- if (method_exists($hook, $method)) {
- $result = $hook->$method($data, $opts);
- if (isset($result) && is_array($result)) {
- $return = array_merge_recursive($return, $result);
- } else if (isset($result)) {
- $return[] = $result;
- }
- }
- return $result;
+ $return = array();
+ if (isset($Hooks))
+ {
+ 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();
+ }
+ }
+ return $return;
}
/*
Returns first non-null result returned from hook.
*/
-function hook_invoke_first($method, &$data, $opts=null) {
+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);
$result = $hook->$method($data, $opts);
+ set_ext_domain();
if (isset($result))
- return $result;
+ break;
}
}
- return null;
+ 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) {
+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('modules/'.$ext);
+ $result = $hook->$method($data, $opts);
+ set_ext_domain();
+ if (isset($result))
+ break;
}
}
- return $found ? $Hooks[$found]->$method($data, $opts) : null;
+ return $result;
}
//------------------------------------------------------------------------------------------
// Database transaction hooks.
{
return hook_invoke_last('price_in_words', $amount, $document);
}
+//
+// Session handling hook. This is special case of hook class which have to be run before session is started.
+// If fa_session_manager class is defined in any installed extension, this class provides session handling
+// for application, otherwise standard php session handling is used.
+//
+function hook_session_start($company)
+{
+ if (class_exists('fa_session_manager')) {
+ global $SessionManager;
+ $SessionManager = new fa_session_manager($company);
+ return $SessionManager->installed;
+ }
+ 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);
+}