BulkUpdater work.
[order_line_extra.git] / includes / order_lines.inc
index 54b2a7faec8eb4f309827d4492f7b8afe39f0f35..00c1193b67220be696c5f020cf83b80bc1512526 100644 (file)
@@ -23,49 +23,100 @@ function extract_cell($td) {
                return $matches[1];
        }
        else {
-print_r('cacou');
                return $td;
        }
 }
 
-?>
+/* remove unchecked data so each
+ * funcion doesn't to check what's been checked or not. 
+ */
+function filter_data(&$data) {
+       if(!isset($data['detail'])) return;
+       $new_details = array();
+       foreach(@$data['detail'] as $detail_id => $values) {
+               if(@$values['check'] === 'on') $new_details[$detail_id]=$values;
+       }
+       $data['detail'] = $new_details;
+}
 
+function post_to_detail_ids() {
+       if(!isset($_POST['detail'])) return;
+       $detail_ids = array();
+       foreach($_POST['detail'] as $detail_id => $values) {
+               array_push($detail_ids, $detail_id);
+       }
 
+       return $detail_ids;
+}
 
 function update_extra_order_details() {
        if(!isset($_POST['Update']) || $_POST['Update'] != 'Update')  return;
 
+       $cart = post_to_detail_ids();
+       if($cart === null) return;
 begin_transaction();
+       hook_db_prewrite($cart, 'order_xtra');
        // update in database all field
+       $date_fields = array('hold_until_date', 'required_date', 'expiry_date', 'priority');
        foreach($_POST['detail'] as $detail_id => $values) {
                $set = array();
-               if($comment = $values['comment'])  array_push($set, " comment='$comment' ");
-               if(isset($values['required_date'])) {
-                       $required_date = trim($values['required_date']);
-                       if($required_date == "")  {
-                               array_push($set," required_date = NULL");
-                       } else {
-                               $date = date2sql($required_date);
-                               array_push($set," required_date='$date' ");
+               $comment=$values['comment'];
+         array_push($set, " comment='$comment' "); // erase comment if needed.
+               foreach($date_fields as $date_field) {
+                       if(isset($values[$date_field])) {
+                               $input_date = trim($values[$date_field]);
+                               if($input_date == "")  {
+                                       // Only the priority field can be set to null.
+                                       if($date_field == 'priority') array_push($set," $date_field = NULL");
+                               } else {
+                                       $date = date2sql($input_date);
+                                       array_push($set," $date_field='$date' ");
+                               }
                        }
                }
 
                if(!empty($set))  {
                        $sql = "UPDATE ".TB_PREF."sales_order_details  SET ".implode($set,', ')."  WHERE id = $detail_id ";
-                       
+
                        if(!db_query($sql)) {
                                display_error('Problem while updating order details. Try again');
                                cancel_transaction();
                                return;
                        }
                }
-       
        }
+       hook_db_postwrite($cart, 'order_xtra');
+       commit_transaction();
+
 
        display_notification('Order details updated');
 
 }
 
+function split_order_details() {
+       if(!isset($_POST['Split']) || $_POST['Split'] != 'Split')  return;
+       $splitter = new Splitter($_POST);
+       begin_transaction();
+       $cart = post_to_detail_ids();
+       if($cart === null) return;
+       hook_db_prewrite($cart, 'order_xtra');
+               if($splitter->splitAll()) display_warning("Items have been split.");
+       hook_db_postwrite($cart, 'order_xtra');
+       commit_transaction();
+}
+
+function bulk_update_order_details() {
+       if(!isset($_POST['Bulk']) || $_POST['Bulk'] != 'Bulk')  return;
+       $bulk_updater = new BulkUpdater($_POST);
+       begin_transaction();
+       $cart = post_to_detail_ids();
+       if($cart === null) return;
+       hook_db_prewrite($cart, 'order_xtra');
+       $bulk_updater->update();
+       hook_db_postwrite($cart, 'order_xtra');
+       commit_transaction();
+}
+
 function compute_input_name($row, $field) {
        $row_id = $row['id'];
        return "detail[$row_id][$field]";
@@ -76,20 +127,29 @@ function view_link($dummy, $order_no)
        return  get_customer_trans_view_str(ST_SALESORDER, $order_no);
 }
 
+function item_link($dummy, $stock_id)
+{
+       return pager_link( _($stock_id),
+       "/modules/order_line_extra/item_schedule.php?stock_id=" .$stock_id);
+}
 
 function order_link($row)
 {
-  return pager_link( _("Sales Order"),
+       return pager_link( _("Sales Order"),
        "/sales/sales_order_entry.php?NewQuoteToSalesOrder=" .$row['order_no'], ICON_DOC);
 }
 
 function customer_link($row) {
-       return pager_link(_($row['debtor_ref']), "/modules/order_line_extra/order_lines_view.php?customer_id=${row['debtor_no']}");
-       
+       return customer_link2($row['debtor_ref'], $row['debtor_no']);
+}
+
+function customer_link2($name, $id) {
+       return pager_link(_($name), "/modules/order_line_extra/order_lines_view.php?customer_id=${id}");
+
 }
 
 function aggregate_comment($row) {
-       $comment =  $row['order_comment'].$row['detail_comment'];
+       $comment =  $row['order_comment'].";".$row['detail_comment'];
        if($comment) {
                $comments = array_map('trim', explode(';', $comment));
                $comments = array_filter($comments);
@@ -97,16 +157,25 @@ function aggregate_comment($row) {
                if(count($comments) == 0)
                        return $first;
                else {
-                       $tooltip = implode('<br>', $comments);
-                       return "$first <span class='before-tooltip'>more</span><span class='tooltip'>&nbsp$tooltip</span>";
+                       $tooltip = implode('<br> - ', $comments);
+                       return "$first <span class='before-tooltip'>more<span class='tooltip'>&nbsp$tooltip</span><span>";
                }
        }
        return '';
 }
 
-function input_date_details($row, $date) {
+function available_quantity($row, $available) {
+       $quantity = $row['quantity'];
+       $class = '';
+       if($available== 0) $class = 'limited';
+       else if($quantity > $available)  $class = 'partial';
+
+       return "<span class='$class'>$available<span>";
+}
+
+function input_date_details($row, $field_name, $date) {
 $row_id = $row['id'];
-       $name = compute_input_name($row, 'required_date');
+       $name = compute_input_name($row, $field_name);
 
 $_POST[$name] = sql2date($date);
 
@@ -120,6 +189,22 @@ $_POST[$name] = sql2date($date);
 ";
 }
 
+function input_priority_date_details($row, $date) {
+       return input_date_details($row, 'priority', $date);
+}
+
+function input_hold_until_date_details($row, $date) {
+       return input_date_details($row, 'hold_until_date', $date);
+}
+
+function input_required_date_details($row, $date) {
+       return input_date_details($row, 'required_date', $date);
+}
+
+function input_expiry_date_details($row, $date) {
+       return input_date_details($row, 'expiry_date', $date);
+}
+
 function input_comment_details($row, $comment) {
 $row_id = $row['id'];
        return "
@@ -127,12 +212,23 @@ $row_id = $row['id'];
 ";
 }
 
-function get_order_details_extra($customer_id) {
+function input_check_details($row, $dummy) {
+       $row_id = $row['id'];
+               return "
+               <input type='checkbox' class='check_detail' name='detail[$row_id][check]'>";
+}
+
+function get_order_details_extra($customer_id, $location, $item_like) {
        $sql = "SELECT sod.id
        , so.order_no
        , stk_code
-       , quantity - qty_sent
+       , sod.quantity - qty_sent quantity
+       , GREATEST(0, LEAST(qoh.quantity  - quantity_before, sod.quantity - qty_sent))
+       , quantity_before
+       , sod.`priority`
+       , hold_until_date
        , required_date
+       , expiry_date
        ,comment
        FROM ".TB_PREF."sales_order_details sod
        JOIN ".TB_PREF."sales_orders so ON (so.order_no = sod.order_no
@@ -140,20 +236,33 @@ function get_order_details_extra($customer_id) {
                AND so.trans_type = ".ST_SALESORDER."
                AND so.debtor_no = $customer_id
        )
-       WHERE quantity > qty_sent
+       JOIN ".TB_PREF."denorm_qoh qoh ON (stock_id = stk_code AND loc_code = '$location')
+       LEFT JOIN ".TB_PREF."denorm_order_details_queue  d ON (d.id = sod.id)
+       WHERE sod.quantity > qty_sent
        ";
 
+       if($item_like) {
+                       if($item_like[0]=='/')  {
+                               $regexp = substr($item_like, 1);
+                               $sql .= " AND stk_code RLIKE '$regexp'";
+                       }
+                       else 
+                               $sql .= " AND stk_code LIKE '$item_like'";
+       }
+
        return $sql;
 }
 
-function get_order_summary() {
-       $sql = "SELECT debtor_no, debtor_ref, branch_ref
+function get_order_summary($location) {
+/*
+       $sub = "SELECT debtor_no, debtor_ref, branch_ref, stk_code
        , min(delivery_date)
-       , sum(quantity - qty_sent) as quantity
-       , sum((quantity - qty_sent)*unit_price*(1-discount_percent/100)) as amount
+       , sum(sod.quantity - qty_sent) as quantity
+       , sum((sod.quantity - qty_sent)*unit_price*(1-discount_percent/100)) as amount
        , min(required_date)
        , group_concat(distinct comments separator ';') as order_comment
        , group_concat(distinct comment separator ';') as detail_comment
+       , max(quantity_before) as quantity_before
        FROM ".TB_PREF."sales_order_details sod
        JOIN ".TB_PREF."sales_orders so ON (so.order_no = sod.order_no
                AND so.trans_type = sod.trans_type
@@ -161,8 +270,26 @@ function get_order_summary() {
        )
        NATURAL JOIN ".TB_PREF."debtors_master
        NATURAL JOIN ".TB_PREF."cust_branch
-       WHERE quantity > qty_sent AND ".ST_SALESORDER."
-       GROUP BY debtor_no, branch_code
+       JOIN ".TB_PREF."denorm_order_details_queue  d ON (d.id = sod.id)
+       WHERE sod.quantity > qty_sent AND ".ST_SALESORDER."
+       GROUP BY debtor_no, branch_code, stk_code
+       ";
+*/
+
+       $sub = TB_PREF."order_summary_view";
+
+       $sql = "SELECT debtor_no, debtor_ref, branch_ref
+       , `min(delivery_date)`
+       , sum(sub.quantity) as quantity
+       , sum(sub.amount) as amount
+       , sum(greatest(least(sub.quantity, qoh.quantity - quantity_before), 0))
+       , sum(sub.amount*greatest(least(sub.quantity, qoh.quantity - quantity_before), 0)/sub.quantity)
+       ,  min(`min(required_date)`)
+       , group_concat(distinct order_comment separator ';') as order_comment
+       , group_concat(distinct detail_comment separator ';') as detail_comment
+                               FROM $sub sub
+                               LEFT JOIN ".TB_PREF."denorm_qoh qoh ON (stock_id = stk_code AND loc_code = '$location')
+                               GROUP BY debtor_no, debtor_ref
        ";
 
        return $sql;