{
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');
+ }
+
}
/*
$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;
}
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)
{
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);
+}