<?php
include_once($path_to_root."/includes/ui/ui_input.inc");
+/* This utility function remove beginning <td> and </td> from a string
+ * generated by the above *_cell function.
+ * This is usefull to use the result of the function within a pager
+ * which already include the <td>...</td>
+ * However, for function which doesn't return a string
+ * but echo, we need to capture the output of the echo first.
+ */
+function start_extract_cell() {
+ // We need
+ ob_start();
+}
+
+function end_extract_cell() {
+ $content = ob_get_contents();
+ ob_end_clean();
+ return extract_cell($content);
+}
+
+function extract_cell($td) {
+ if(preg_match('/\s*<td>(.*)<\/td>\s*/s', $td, $matches)) {
+ return $matches[1];
+ }
+ else {
+ 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]";
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);
if(count($comments) == 0)
return $first;
else {
- $tooltip = implode('<br>', $comments);
- return "$first <span class='before-tooltip'>more</span><span class='tooltip'> $tooltip</span>";
+ $tooltip = implode('<br> - ', $comments);
+ return "$first <span class='before-tooltip'>more<span class='tooltip'> $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);
";
}
+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 "
";
}
-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
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
)
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;