Added get_dispatchable_quantity hook.
authorMaxime Bourget <bmx007@gmail.com>
Sun, 23 Jun 2013 20:22:22 +0000 (21:22 +0100)
committerJanusz Dobrowolski <janusz@frontaccounting.eu>
Tue, 16 Jul 2013 12:15:27 +0000 (14:15 +0200)
includes/hooks.inc
includes/ui/ui_controls.inc
sales/customer_delivery.php

index b27fc35501788654afcd15ab69df50d23d5ad73c..ab2d2bdc6af5b1cb00f193e5fb1158c603f6c6b8 100644 (file)
@@ -190,6 +190,29 @@ 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');
+               return array($line_item->qty_dispatched, 'stockmankobg');
+       }
+
 }
 
 /*
@@ -415,3 +438,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);
+}
index bbe4c7f5142f3680055589e48ecbe906daaca390..961798155c66bd0bbd8655fdf7fed6712e880c8c 100644 (file)
@@ -306,18 +306,20 @@ function hyperlink_params_separate_td($target, $label, $params)
 
 //--------------------------------------------------------------------------------------------------
 
-function alt_table_row_color(&$k)
+function alt_table_row_color(&$k, $extra_class=null)
 {
+       $classes = $extra_class ? array($extra_class) : array();
        if ($k == 1)
        {
-               echo "<tr class='oddrow'>\n";
+               array_push($classes, 'oddrow');
                $k = 0;
        }
        else
        {
-               echo "<tr class='evenrow'>\n";
+               array_push($classes, 'evenrow');
                $k++;
        }
+       echo "<tr class='".implode(' ', $classes)."'>\n";
 }
 
 function table_section_title($msg, $colspan=2)
index 90905a2cbbc32267a69e5771a2cf138ce4cd08d1..ef5aa72cac178e12f71104c148facfef2eae3830 100644 (file)
@@ -445,23 +445,25 @@ foreach ($_SESSION['Items']->line_items as $line=>$ln_itm) {
                $ln_itm->qty_dispatched = $ln_itm->quantity-$ln_itm->qty_done;
        }
        // if it's a non-stock item (eg. service) don't show qoh
-       $show_qoh = true;
-       if ($SysPrefs->allow_negative_stock() || !has_stock_holding($ln_itm->mb_flag) ||
-               $ln_itm->qty_dispatched == 0) {
-               $show_qoh = false;
-       }
+       $row_classes = null;
+       if (has_stock_holding($ln_itm->mb_flag) && $ln_itm->qty_dispatched) {
+               // It's a stock : call get_dispatchable_quantity hook  to get which quantity to preset in the
+               // quantity input box. This allows for example a hook to modify the default quantity to what's dispatchable
+               // (if there is not enough in hand), check at other location or other order people etc ...
+               // This hook also returns a 'reason' (css classes) which can be used to theme the row.
 
-       if ($show_qoh) {
                $qoh = get_qoh_on_date($ln_itm->stock_id, $_POST['Location'], $_POST['DispatchDate']);
-       }
+               $q_class =  hook_get_dispatchable_quantity($ln_itm, $_POST['Location'], $_POST['DispatchDate'], $qoh);
+               // Skip line if needed
+               if($q_class === 'skip')  continue;
+               if(is_array($q_class)) {
+                 list($ln_itm->qty_dispatched, $row_classes) = $q_class;
+                       $has_marked = true;
+               }
 
-       if ($show_qoh && ($ln_itm->qty_dispatched > $qoh)) {
-               // oops, we don't have enough of one of the component items
-               start_row("class='stockmankobg'");
-               $has_marked = true;
-       } else {
-               alt_table_row_color($k);
        }
+
+       alt_table_row_color($k, $row_classes);
        view_stock_status_cell($ln_itm->stock_id);
 
        if ($ln_itm->descr_editable)