Huge sales module changes toward delivery and invoicing separation. Includes some...
[fa-stable.git] / sales / customer_invoice.php
index 8e6fce155926e80303b0851d7be375cf180c6b54..27d5d22066f51f125c2e43ad3b6d6f59b4dfb178 100644 (file)
@@ -18,138 +18,136 @@ if ($use_popup_windows)
        $js .= get_js_open_window(900, 500);
 if ($use_date_picker)
        $js .= get_js_date_picker();
-if ($_SESSION['Items']->direct_invoice)
-       page(_("Issue an Invoice"), false, false, "", $js);
-else
-       page(_("Issue an Invoice and Deliver Items for a Sales Order"), false, false, "", $js);
+page(_("Issue an Invoice for Delivery Note(s)"), false, false, "", $js);
 
 //---------------------------------------------------------------------------------------------------------------
 
-if (isset($_GET['AddedID']))
+if (isset($_GET['AddedID'])) 
 {
        $invoice_no = $_GET['AddedID'];
        $trans_type = 10;
 
-       display_notification(_("Invoice processed"), true);
+       display_notification(_("Selected deliveries has been processed"), true);
+
        display_note(get_customer_trans_view_str($trans_type, $invoice_no, _("View this invoice")), 0, 1);
 
-       display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL Journal Entries for this Invoice")));
+       display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL Journal Entries for this Invoice")));
 
-       if ($_SESSION['Items']->direct_invoice)
-               hyperlink_params("$path_to_root/sales/sales_order_entry.php", _("Issue Another Invoice"), "NewInvoice=Yes");
-       else
-               hyperlink_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select Another Order For Invoicing"), "OutstandingOnly=1");
+       hyperlink_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select Another Delivery For Invoicing"), "OutstandingOnly=1");
 
-       unset($_SESSION['Items']->line_items);
-       unset($_SESSION['Items']);
        display_footer_exit();
 }
 
 //---------------------------------------------------------------------------------------------------------------
 
-if (!isset($_GET['OrderNumber']) && !isset($_SESSION['ProcessingOrder']) &&
-       !isset($_GET['process_invoice']))
+if (!isset($_GET['DeliveryNumber']) && !isset($_SESSION['ProcessingDelivery']) && 
+       !isset($_GET['BatchInvoice']) && !isset($_GET['process_invoice'])) 
 {
-       /* This page can only be called with an order number for invoicing*/
-       display_error(_("This page can only be opened if an order has been selected. Please select an order first."));
+       /* This page can only be called with a delivery for invoicing*/
+       display_error(_("This page can only be opened after delivery selection. Please select delivery to invoicing first."));
 
-       hyperlink_no_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select a sales order to invoice"));
+       hyperlink_no_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select Delivery to Invoice"));
 
        end_page();
        exit;
-
-}
-elseif (isset($_GET['OrderNumber']) && $_GET['OrderNumber'] > 0)
+} 
+elseif (isset($_GET['DeliveryNumber'])|| isset($_GET['BatchInvoice'])) 
 {
 
+
        if (isset($_SESSION['Items']))
        {
                unset($_SESSION['Items']->line_items);
                unset ($_SESSION['Items']);
        }
 
-       session_register("Items");
-       session_register("ProcessingOrder");
-
-       $_SESSION['ProcessingOrder'] = $_GET['OrderNumber'];
-       $_SESSION['Items'] = new cart;
+    if(isset($_GET['BatchInvoice'])) {
+         $_SESSION['ProcessingDelivery'] = $_SESSION['DeliveryBatch'];
+         unset($_SESSION['DeliveryBatch']);
+    }
+    else
+         $_SESSION['ProcessingDelivery'] = array($_GET['DeliveryNumber']);
 
-       /*read in all the selected order into the Items cart  */
+    $_SESSION['Items'] = new cart('delivery');
+    $_SESSION['Items']->trans_no = $_SESSION['ProcessingDelivery'];
 
-       if (read_sales_order($_SESSION['ProcessingOrder'], $_SESSION['Items'], true))
+       /*read in all the selected deliveries into the Items cart  */
+       if (read_sales_delivery($_SESSION['ProcessingDelivery'], $_SESSION['Items'])) 
        {
-
-       if ($_SESSION['Items']->count_items() == 0)
-       {
-               hyperlink_params($path_to_root . "/sales/inquiry/sales_orders_view.php", _("Select a different sales order to invoice"), "OutstandingOnly=1");
-               die ("<br><b>" . _("There are no ordered items with a quantity left to deliver. There is nothing left to invoice.") . "</b>");
-       }
-       }
-       else
+         if ($_SESSION['Items']->count_items() == 0) 
+         {
+               hyperlink_params($path_to_root . "/sales/inquiry/sales_deliveries_view.php", _("Select a different delivery to invoice"), "OutstandingOnly=1");
+               die ("<br><b>" . _("There are no delivered items with a quantity left to invoice. There is nothing left to invoice.") . "</b>");
+      }
+       } 
+       else 
        {
-               hyperlink_no_params("/sales_orders_view.php", _("Select a sales order to invoice"));
-               die ("<br><b>" . _("This order item could not be retrieved. Please select another order.") . "</b>");
+               hyperlink_no_params("/sales_deliveries_view.php", _("Select a delivery note to invoice"));
+               die ("<br><b>" . _("This delivery note could not be retrieved. Please select another delivery.") . "</b>");
        }
-
-}
-else
+} 
+else 
 {
-       /* if processing, a dispatch page has been called and ${$StkItm->stock_id} would have been set from the post */
-       foreach ($_SESSION['Items']->line_items as $itm)
+       foreach ($_SESSION['Items']->line_items as $line=>$itm) 
        {
-
-               if (isset($_POST[$itm->stock_id]) && is_numeric($_POST[$itm->stock_id]) &&
-                       $_POST[$itm->stock_id] <= ($_SESSION['Items']->line_items[$itm->line_no]->quantity -
-                       $_SESSION['Items']->line_items[$itm->line_no]->qty_inv))
+         if(isset($_POST['Line'.$line])) {
+               $line_qty = $_POST['Line'.$line];
+               if (is_numeric($line_qty) && $_POST['Line'.$line] <= ($itm->quantity - $itm->qty_done))
                {
-                       $_SESSION['Items']->line_items[$itm->line_no]->qty_dispatched = $_POST[$itm->stock_id];
+                       $_SESSION['Items']->line_items[$line]->qty_dispatched = $line_qty;
                }
-
-               if (isset($_POST[$itm->stock_id . "Desc"]) && strlen($_POST[$itm->stock_id . "Desc"]) > 0)
+         }
+       
+         if(isset($_POST['Line'.$line.'Desc'])) {
+               $line_desc = $_POST['Line'.$line.'Desc'];
+               if (strlen($line_desc) > 0) 
                {
-                       $_SESSION['Items']->line_items[$itm->line_no]->item_description = $_POST[$itm->stock_id . "Desc"];
+                       $_SESSION['Items']->line_items[$line]->item_description = $line_desc;
                }
+         }
        }
 }
 
 //---------------------------------------------------------------------------------------------------------------
 
-function order_changed_error()
+function delivery_changed_error()
 {
        global $path_to_root;
-       display_note(_("This order has been changed or invoiced since this delivery was started to be confirmed. Processing halted."), 1, 0);
-       display_note(_("To enter and confirm this dispatch/invoice the order must be re-selected and re-read again to update the changes made by the other user."), 1, 0);
+       display_note(_("This delivery note has been changed or invoiced since this invoice was started to be confirmed. Processing halted."), 1, 0);
+       display_note(_("To enter and confirm this invoice the order must be re-selected and re-read again to update the changes made by the other user."), 1, 0);
 
-       hyperlink_no_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select a sales order for confirming deliveries and invoicing"));
+       hyperlink_no_params("$path_to_root/sales/inquiry/sales_deliveries_view.php", _("Select a sales order for invoicing"));
 
-       unset($_SESSION['Items']->line_items);
-       unset($_SESSION['Items']);
-       unset($_SESSION['ProcessingOrder']);
+       unset($_SESSION['ProcessingDelivery']);
        exit;
 }
 
 //---------------------------------------------------------------------------------------------------------------
 
-function check_order_changed()
+function check_delivery_changed()
 {
        global $debug;
 
-       /*Now need to check that the order details are the same as they were when
-                       they were read into the Items array.
-       If they've changed then someone else may have invoiced them  -
-               as modified for bug pointed out by Sherif 1-7-03*/
+       /*Now need to check that the delivery note details are the same 
+       as they were when they were read into the Items array.
+       If they've changed then someone else may have invoiced them */
 
-       $sql = "SELECT stk_code, quantity, qty_invoiced FROM ".TB_PREF."sales_order_details WHERE
-               quantity - qty_invoiced > 0
-               AND order_no = " . $_SESSION['ProcessingOrder'];
+       $sql = "SELECT id, stock_id, quantity, qty_done FROM "
+               .TB_PREF."debtor_trans_details WHERE
+               debtor_trans_type = 13 AND (";
 
-       $result = db_query($sql,"retreive sales order details");
+       foreach($_SESSION['Items']->trans_no as $key=>$num) {
+           if($key!=0) $sql .= ' OR ';
+           $sql .= 'debtor_trans_no =' . $num;
+       }
+       $sql .= ') ORDER BY id';
+       $result = db_query($sql,"while checking delivery changes");
 
        if (db_num_rows($result) != count($_SESSION['Items']->line_items))
        {
 
                /*there should be the same number of items returned from this query as there are lines on the invoice -
-                       if  not then someone has already invoiced or credited some lines */
+                       if not then someone has already invoiced or credited some lines */
        if ($debug == 1)
        {
                display_note($sql, 1, 0);
@@ -159,30 +157,26 @@ function check_order_changed()
 
                return false;
        }
-
-       while ($myrow = db_fetch($result))
+       $line=0;
+       while ($myrow = db_fetch($result)) 
        {
-               foreach($_SESSION['Items']->line_items as $line)
+               $stk_itm = $myrow["stock_id"];
+
+               if ($_SESSION['Items']->line_items[$line]->quantity != -$myrow["quantity"] ||
+                       $_SESSION['Items']->line_items[$line]->qty_done != -$myrow["qty_done"])
                {
-                       if ($line->stock_id == $myrow["stk_code"])
-                       {
-                               if ($line->quantity != $myrow["quantity"] ||
-                                       $line->qty_inv != $myrow["qty_invoiced"])
-                               {
-                                       display_note(_("Original order for") . " " . $myrow["stk_code"] . " " .
-                                               _("has a quantity of") . " " . $myrow["quantity"] . " " .
-                                               _("and an invoiced quantity of") . " " . $myrow["qty_invoiced"] . " " .
-                                               _("the session shows quantity of") . " " .
-                                               $line->quantity . " " .
-                                               _("and quantity invoice of") . " " .
-                                               $line->qty_inv, 1, 0);
-
-                                       return false;
-                               }
-                       }
+                       display_note(_("Original delivery for line #") . $line+1 . ' '.
+                               _("has a quantity of") . " " . -$myrow["quantity"] . " " . 
+                               _("and an delivered quantity of") . " " . -$myrow["qty_done"] . "." .
+                               _("Now the quantity of") . " " . 
+                               $_SESSION['Items']->line_items[$line]->quantity . " " . 
+                               _("and invoiced quantity of") . " " . 
+                               $_SESSION['Items']->line_items[$line]->qty_done, 1, 0);
+
+                       return false;
                }
+       $line++;
        } /*loop through all line items of the order to ensure none have been invoiced */
-
        return true;
 }
 
@@ -191,42 +185,42 @@ function check_order_changed()
 
 function check_data()
 {
-       if (!isset($_POST['DispatchDate']) || !is_date($_POST['DispatchDate']))
+       if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate']))   
        {
                display_error(_("The entered invoice date is invalid."));
                return false;
        }
-       if (!is_date_in_fiscalyear($_POST['DispatchDate']))
+       if (!is_date_in_fiscalyear($_POST['InvoiceDate'])) 
        {
                display_error(_("The entered invoice date is not in fiscal year."));
                return false;
        }
-       if (!isset($_POST['due_date']) || !is_date($_POST['due_date']))
+       if (!isset($_POST['due_date']) || !is_date($_POST['due_date'])) 
        {
                display_error(_("The entered invoice due date is invalid."));
                return false;
        }
 
-       if (!references::is_valid($_POST['ref']))
+       if (!references::is_valid($_POST['ref'])) 
        {
                display_error(_("You must enter a reference."));
                return false;
        }
 
-       if (!is_new_reference($_POST['ref'], 10))
+       if (!is_new_reference($_POST['ref'], 10)) 
        {
                display_error(_("The entered reference is already in use."));
                return false;
        }
        if ($_POST['ChargeFreightCost'] == "")
                $_POST['ChargeFreightCost'] = 0;
-       if (!is_numeric($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] < 0)
+       if (!is_numeric($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] < 0)        
        {
                display_error(_("The entered shipping value is not numeric."));
                return false;
        }
 
-       if ($_SESSION['Items']->has_items_dispatch() == 0 && $_POST['ChargeFreightCost'] == 0)
+       if ($_SESSION['Items']->has_items_dispatch() == 0 && $_POST['ChargeFreightCost'] == 0)  
        {
                display_error(_("There are no item quantities on this invoice."));
                return false;
@@ -237,71 +231,37 @@ function check_data()
 
 //---------------------------------------------------------------------------------------------------------------
 
-function check_qoh()
-{
-       if (!sys_prefs::allow_negative_stock())
-       {
-       foreach ($_SESSION['Items']->line_items as $itm)
-       {
-
-                       if ($itm->qty_dispatched && has_stock_holding($itm->mb_flag))
-                       {
-                               $qoh = get_qoh_on_date($itm->stock_id, $_POST['Location'], $_POST['DispatchDate']);
-
-                       if ($itm->qty_dispatched > $qoh)
-                       {
-                               display_error(_("The invoice cannot be processed because there is an insufficient quantity for component:") .
-                                       " " . $itm->stock_id . " - " .  $itm->item_description);
-                               return false;
-                       }
-               }
-       }
-       }
-
-       return true;
-}
-
-//---------------------------------------------------------------------------------------------------------------
-
 function process_invoice($invoicing=false)
 {
-       if ($invoicing)
+       if ($invoicing) 
        {
-
-               read_sales_order($_SESSION['Items']->order_no, $_SESSION['Items'], true);
+               read_sales_delivery($_SESSION['Items']->trans_no, $_SESSION['Items']);
                $duedate = get_invoice_duedate($_SESSION['Items']->customer_id, $_SESSION['Items']->delivery_date);
                $invoice_no = add_sales_invoice($_SESSION['Items'],
-                       $_SESSION['Items']->delivery_date, $duedate, $_SESSION['Items']->order_no,
+                       $_SESSION['Items']->delivery_date, $duedate,
                        $_SESSION['Items']->tax_group_id, $_SESSION['Items']->freight_cost,
                        $_SESSION['Items']->Location, $_SESSION['Items']->ship_via,
                        $_SESSION['Items']->default_sales_type, references::get_next(10),
-                       $_SESSION['Items']->memo_, 0);
-       }
-       else
+                       $_SESSION['Items']->memo_);
+       } 
+       else 
        {
-
+       
                if (!check_data())
                        return;
 
-               if (!check_order_changed())
-                       order_changed_error();
-
-               if (!check_qoh())
-                       return;
-
-               if ($_POST['bo_policy'])
-                       $bo_policy = 0;
-               else
-                       $bo_policy = 1;
+               if (!check_delivery_changed())
+                       delivery_changed_error();
 
                $invoice_no = add_sales_invoice($_SESSION['Items'],
-                       $_POST['DispatchDate'], $_POST['due_date'],     $_SESSION['ProcessingOrder'],
-                       $_POST['tax_group_id'], $_POST['ChargeFreightCost'], $_POST['Location'],
+                       $_POST['InvoiceDate'], $_POST['due_date'],
+                       $_SESSION['Items']->tax_group_id,       
+                       $_POST['ChargeFreightCost'], 
+                       $_SESSION['Items']->Location, 
                        $_POST['ship_via'],     $_POST['sales_type_id'], $_POST['ref'],
-                       $_POST['InvoiceText'], $bo_policy);
-               unset($_SESSION['ProcessingOrder']);
+                       $_POST['InvoiceText']); 
+               unset($_SESSION['ProcessingDelivery']);
        }
-
        meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no");
 }
 
@@ -316,9 +276,9 @@ elseif (isset($_POST['process_invoice']))
 start_form(false, true);
 
 start_table("$table_style2 width=80%", 5);
-echo "<tr><td>"; // outer table
+//echo "<tr><td>"; // outer table
 
-start_table("$table_style width=100%");
+//start_table("$table_style width=100%");
 start_row();
 label_cells(_("Customer"), $_SESSION['Items']->customer_name, "class='tableheader2'");
 label_cells(_("Branch"), get_branch_name($_SESSION['Items']->Branch), "class='tableheader2'");
@@ -331,95 +291,75 @@ if (!isset($_POST['ref']))
 
 ref_cells(_("Reference"), 'ref', null, "class='tableheader2'");
 
-if (!isset($_POST['tax_group_id']))
-       $_POST['tax_group_id'] = $_SESSION['Items']->tax_group_id;
-label_cell(_("Tax Group"), "class='tableheader2'");
-tax_groups_list_cells(null, 'tax_group_id', $_POST['tax_group_id'], false, null, true);
+label_cells(_("Delivery Notes:"), get_customer_trans_view_str(systypes::cust_dispatch(), $_SESSION['ProcessingDelivery']), "class='tableheader2'");
 
-label_cells(_("For Sales Order"), get_customer_trans_view_str(systypes::sales_order(), $_SESSION['ProcessingOrder']), "class='tableheader2'");
-
-end_row();
-start_row();
 
 if (!isset($_POST['sales_type_id']))
        $_POST['sales_type_id'] = $_SESSION['Items']->default_sales_type;
-label_cell(_("Sales Type"), "class='tableheader2'");
+label_cell(_("Sales Type"), "class='tableheader2'");   
 sales_types_list_cells(null, 'sales_type_id', $_POST['sales_type_id']);
 
-if (!isset($_POST['Location']))
-       $_POST['Location'] = $_SESSION['Items']->Location;
-label_cell(_("Delivery From"), "class='tableheader2'");
-locations_list_cells(null, 'Location', $_POST['Location'], false, true);
+end_row();
+start_row();
 
 if (!isset($_POST['ship_via']))
        $_POST['ship_via'] = $_SESSION['Items']->ship_via;
-label_cell(_("Shipping Company"), "class='tableheader2'");
+label_cell(_("Shipping Company"), "class='tableheader2'");     
 shippers_list_cells(null, 'ship_via', $_POST['ship_via']);
-end_row();
 
-end_table();
+if (!isset($_POST['InvoiceDate']) || !is_date($_POST['InvoiceDate']))
+{
+       $_POST['InvoiceDate'] = Today();
+       if (!is_date_in_fiscalyear($_POST['InvoiceDate']))
+               $_POST['InvoiceDate'] = end_fiscalyear();
+}
 
-echo "</td><td>";// outer table
+date_cells(_("Date"), 'InvoiceDate', $_POST['InvoiceDate'], 0, 0, 0, "class='tableheader'");
+//end_table();
 
-start_table("$table_style width=90%");
+//echo "</td><td>";// outer table
 
-// set this up here cuz it's used to calc qoh
-if (!isset($_POST['DispatchDate']) || !is_date($_POST['DispatchDate']))
-{
-       $_POST['DispatchDate'] = Today();
-       if (!is_date_in_fiscalyear($_POST['DispatchDate']))
-               $_POST['DispatchDate'] = end_fiscalyear();
-}
-date_row(_("Date"), 'DispatchDate', $_POST['DispatchDate'], 0, 0, 0, "class='tableheader'");
+//start_table("$table_style width=90%");
 
 if (!isset($_POST['due_date']) || !is_date($_POST['due_date']))
-       //$_POST['due_date'] = $_POST['DispatchDate'];
-       $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->customer_id, $_POST['DispatchDate']);
 
-date_row(_("Due Date"), 'due_date', $_POST['due_date'], 0, 0, 0, "class='tableheader'");
-end_table();
+       $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->customer_id, $_POST['InvoiceDate']);
 
-echo "</td></tr>";
-end_table(1); // outer table
+date_cells(_("Due Date"), 'due_date', $_POST['due_date'], 0, 0, 0, "class='tableheader'");
+//end_table();
+
+//echo "</td></tr>";
+end_row();
+end_table(); // outer table
 
 display_heading(_("Invoice Items"));
 
 start_table("$table_style width=80%");
-$th = array(_("Item Code"), _("Item Description"), _("Ordered"), _("Units"), _("Delivered"),
-       _("This Delivery"), _("Price"), _("Tax Type"), _("Discount"), _("Total"));
+$th = array(_("Item Code"), _("Item Description"), _("Delivered"), _("Units"), _("Invoiced"),
+       _("This Invoice"), _("Price"), _("Tax Type"), _("Discount"), _("Total"));
 table_header($th);
 $k = 0;
 $has_marked = false;
 $show_qoh = true;
 
-foreach ($_SESSION['Items']->line_items as $ln_itm)
+foreach ($_SESSION['Items']->line_items as $line=>$ln_itm) 
 {
+       if($ln_itm->quantity==$ln_itm->qty_done) continue; //this line is fully delivered
+       alt_table_row_color($k);
 
-    // if it's a non-stock item (eg. service) don't show qoh
-    if (sys_prefs::allow_negative_stock() || !has_stock_holding($ln_itm->mb_flag) ||
-               $ln_itm->qty_dispatched == 0)
-       $show_qoh = false;
-
-       if ($show_qoh)
-               $qoh = get_qoh_on_date($ln_itm->stock_id, $_POST['Location'], $_POST['DispatchDate']);
-
-       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);
+       view_stock_status_cell($ln_itm->stock_id); // ?
 
-       view_stock_status_cell($ln_itm->stock_id);
-
-       text_cells(null, $ln_itm->stock_id . "Desc", $ln_itm->item_description, 30, 50);
+       text_cells(null, 'Line'.$line.'Desc', $ln_itm->item_description, 30, 50);
        qty_cell($ln_itm->quantity);
        label_cell($ln_itm->units);
-       qty_cell($ln_itm->qty_inv);
+       qty_cell($ln_itm->qty_done);
 
-       text_cells(null, $ln_itm->stock_id, $ln_itm->qty_dispatched, 10, 10);
+       if(count($_SESSION['Items']->trans_no)>1) {
+           // for batch invoices we can process only whole deliveries
+           qty_cell($ln_itm->qty_dispatched);
+           hidden('Line'.$line,$ln_itm->qty_dispatched );
+       } else
+           text_cells(null, 'Line'.$line, $ln_itm->qty_dispatched, 10, 10);
 
        $display_discount_percent = number_format2($ln_itm->discount_percent*100,user_percent_dec()) . "%";
 
@@ -430,8 +370,6 @@ foreach ($_SESSION['Items']->line_items as $ln_itm)
        label_cell($display_discount_percent, "nowrap align=right");
        amount_cell($line_total);
 
-       //label_cell(get_tax_free_price_for_item($ln_itm->stock_id, $line_total, $_POST['tax_group_id']));
-
        end_row();
 }
 
@@ -440,13 +378,13 @@ depending on the business logic required this condition may not be required.
 It seems unfair to charge the customer twice for freight if the order
 was not fully delivered the first time ?? */
 
-if (!isset($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] == "")
+if (!isset($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] == "") 
 {
-    if ($_SESSION['Items']->any_already_delivered() == 1)
+    if ($_SESSION['Items']->any_already_delivered() == 1) 
     {
        $_POST['ChargeFreightCost'] = 0;
-    }
-    else
+    } 
+    else 
     {
        $_POST['ChargeFreightCost'] = $_SESSION['Items']->freight_cost;
     }
@@ -466,7 +404,7 @@ $display_sub_total = number_format2($inv_items_total + $_POST['ChargeFreightCost
 
 label_row(_("Sub-total"), $display_sub_total, "colspan=9 align=right","align=right");
 
-$taxes = $_SESSION['Items']->get_taxes($_POST['tax_group_id'], $_POST['ChargeFreightCost']);
+$taxes = $_SESSION['Items']->get_taxes($_SESSION['Items']->tax_group_id, $_POST['ChargeFreightCost']);
 $tax_total = display_edit_tax_items($taxes, 9);
 
 $display_total = number_format2(($inv_items_total + $_POST['ChargeFreightCost'] + $tax_total), user_price_dec());
@@ -475,13 +413,11 @@ label_row(_("Invoice Total"), $display_total, "colspan=9 align=right","align=rig
 
 end_table(1);
 
-if ($has_marked)
-       display_note(_("Marked items have insufficient quantities in stock."), 0, 1, "class='red'");
+//if ($has_marked)
+//     display_note(_("Marked items have insufficient quantities in stock."), 0, 1, "class='red'");
 
 start_table($table_style2);
 
-policy_list_row(_("Action For Balance"), "bo_policy", null);
-
 textarea_row(_("Memo"), 'InvoiceText', null, 50, 4);
 
 end_table(1);