Final rewriting of sales module
[fa-stable.git] / sales / customer_credit_invoice.php
index c97930ee7cfd032462329e03caa0f5407704f8f5..31306707c7597736e1fa05bb833bcdc009b81468 100644 (file)
@@ -1,76 +1,96 @@
 <?php
+//---------------------------------------------------------------------------
+//
+//     Entry/Modify Credit Note for selected Sales Invoice
+//
 
-$page_security =3;
-$path_to_root="..";
+$page_security = 3;
+$path_to_root = "..";
 
 include_once($path_to_root . "/sales/includes/cart_class.inc");
 include_once($path_to_root . "/includes/session.inc");
-
 include_once($path_to_root . "/includes/data_checks.inc");
-
 include_once($path_to_root . "/includes/manufacturing.inc");
 include_once($path_to_root . "/sales/includes/sales_db.inc");
 include_once($path_to_root . "/sales/includes/sales_ui.inc");
+include_once($path_to_root . "/reporting/includes/reporting.inc");
+
 $js = "";
-if ($use_popup_windows)
+if ($use_popup_windows) {
        $js .= get_js_open_window(900, 500);
-if ($use_date_picker)
+}
+
+if ($use_date_picker) {
        $js .= get_js_date_picker();
-page(_("Credit all or part of an Invoice"), false, false, "", $js);
+}
 
-//---------------------------------------------------------------------------------------------------------------
+if (isset($_GET['ModifyCredit'])) {
+       $_SESSION['page_title'] = sprintf(_("Modifying Credit Invoice # %d."), $_GET['ModifyCredit']);
+       $help_page_title =_("Modifying Credit Invoice");
+       processing_start();
+} elseif (isset($_GET['InvoiceNumber'])) {
+       $_SESSION['page_title'] = _("Credit all or part of an Invoice");
+       processing_start();
+}
+page($_SESSION['page_title'], false, false, "", $js);
 
-if (isset($_GET['AddedID']))
-{
+//-----------------------------------------------------------------------------
+
+if (isset($_GET['AddedID'])) {
        $credit_no = $_GET['AddedID'];
        $trans_type = 11;
+       print_hidden_script(11);
 
-       echo "<center>";
        display_notification_centered(_("Credit Note has been processed"));
-       display_note(get_customer_trans_view_str($trans_type, $credit_no, _("View this credit note")), 0, 0);
 
-       display_note(get_gl_view_str($trans_type, $credit_no, _("View the GL Journal Entries for this Credit Note")));
+       display_note(get_customer_trans_view_str($trans_type, $credit_no, _("View This Credit Note")), 0, 0);
+
+       display_note(print_document_link($credit_no, _("Print This Credit Note"), true, 11),1);
+
+       display_note(get_gl_view_str($trans_type, $credit_no, _("View the GL Journal Entries for this Credit Note")),1);
 
        display_footer_exit();
-}
 
-//--------------------------------------------------------------------------------------
+} elseif (isset($_GET['UpdatedID'])) {
+       $credit_no = $_GET['UpdatedID'];
+       $trans_type = 11;
+       print_hidden_script(11);
 
-if (!isset($_GET['InvoiceNumber']) && !$_SESSION['InvoiceToCredit'])
-{
-       /* This page can only be called with an invoice number for crediting*/
-       die (_("This page can only be opened if an invoice has been selected for crediting."));
+       display_notification_centered(_("Credit Note has been updated"));
+
+       display_note(get_customer_trans_view_str($trans_type, $credit_no, _("View This Credit Note")), 0, 0);
+
+       display_note(print_document_link($credit_no, _("Print This Credit Note"), true, 11),1);
+
+       display_note(get_gl_view_str($trans_type, $credit_no, _("View the GL Journal Entries for this Credit Note")),1);
+
+       display_footer_exit();
 }
 
-//--------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
 function can_process()
 {
-       if (!is_date($_POST['CreditDate']))
-       {
+       if (!is_date($_POST['CreditDate'])) {
                display_error(_("The entered date is invalid."));;
                return false;
-       }
-       elseif (!is_date_in_fiscalyear($_POST['CreditDate']))
-       {
+       } elseif (!is_date_in_fiscalyear($_POST['CreditDate'])) {
                display_error(_("The entered date is not in fiscal year."));
                return false;
        }
 
-       if (!references::is_valid($_POST['ref']))
-       {
-               display_error(_("You must enter a reference."));;
-               return false;
-       }
-
-       if (!is_new_reference($_POST['ref'], 11))
-       {
-               display_error(_("The entered reference is already in use."));;
-               return false;
-       }
+    if ($_SESSION['Items']->trans_no==0) {
+               if (!references::is_valid($_POST['ref'])) {
+                       display_error(_("You must enter a reference."));;
+                       return false;
+               }
 
-       if (!is_numeric($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] < 0)
-       {
+               if (!is_new_reference($_POST['ref'], 11)) {
+                       display_error(_("The entered reference is already in use."));;
+                       return false;
+               }
+    }
+       if (!is_numeric($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] < 0) {
                display_error(_("The entered shipping cost is invalid or less than zero."));;
                return false;
        }
@@ -78,159 +98,109 @@ function can_process()
        return true;
 }
 
-//--------------------------------------------------------------------------------------
-
-function clear_globals()
-{
-       if (isset($_SESSION['Items']))
-       {
-               unset($_SESSION['Items']->line_items);
-               unset($_SESSION['Items']);
-       }
-       unset($_SESSION['InvoiceToCredit']);
-}
-
-//--------------------------------------------------------------------------------------
-
-function process_credit()
-{
-       global $path_to_root;
-       if (can_process())
-       {
-               $credit_no = credit_invoice($_SESSION['Items'], $_SESSION['InvoiceToCredit'],
-                       $_SESSION['Order'],     $_POST['CreditDate'], $_POST['CreditType'],
-                       $_POST['tax_group_id'], $_POST['ChargeFreightCost'], $_POST['ref'],
-                       $_POST['CreditText'], $_POST['WriteOffGLCode']);
-
-               clear_globals();
-
-               meta_forward($_SERVER['PHP_SELF'], "AddedID=$credit_no");
-       }
-}
-
-//--------------------------------------------------------------------------------------
-
-if (isset($_GET['InvoiceNumber']) && $_GET['InvoiceNumber'] > 0)
-{
-
-       clear_globals();
-
-       $_SESSION['InvoiceToCredit'] = $_GET['InvoiceNumber'];
-       $_SESSION['Items'] = new cart;
-
-       /*read in all the guff from the selected invoice into the Items cart    */
-
-       // we need a distinct here so that it only returns 1 line - because there can be multiple moves
-       // per item (for assemblies, etc)
-       $sql = "SELECT DISTINCT ".TB_PREF."debtor_trans.*,
-               ".TB_PREF."cust_branch.default_location, ".TB_PREF."cust_branch.default_ship_via,
-               ".TB_PREF."debtors_master.name, ".TB_PREF."debtors_master.curr_code,
-       ".TB_PREF."tax_groups.name AS tax_group_name, ".TB_PREF."tax_groups.id AS tax_group_id,
-       ".TB_PREF."sales_orders.from_stk_loc
-       FROM ".TB_PREF."debtor_trans, ".TB_PREF."debtors_master, ".TB_PREF."cust_branch, ".TB_PREF."tax_groups, ".TB_PREF."sales_orders
-       WHERE ".TB_PREF."debtor_trans.debtor_no = ".TB_PREF."debtors_master.debtor_no
-       AND ".TB_PREF."debtor_trans.branch_code = ".TB_PREF."cust_branch.branch_code
-       AND ".TB_PREF."debtor_trans.debtor_no = ".TB_PREF."cust_branch.debtor_no
-       AND ".TB_PREF."cust_branch.tax_group_id = ".TB_PREF."tax_groups.id
-       AND ".TB_PREF."debtor_trans.trans_no = " . $_GET['InvoiceNumber'] . "
-               AND ".TB_PREF."debtor_trans.type=10
-       AND ".TB_PREF."sales_orders.order_no=".TB_PREF."debtor_trans.order_";
-
-       $result = db_query($sql,"The invoice details cannot be retrieved");
-
-       if (db_num_rows($result) == 1)
-       {
+//-----------------------------------------------------------------------------
 
-               $myrow = db_fetch($result);
+if (isset($_GET['InvoiceNumber']) && $_GET['InvoiceNumber'] > 0) {
 
-               $_SESSION['Items']->customer_id = $myrow["debtor_no"];
-               $_SESSION['Items']->customer_name = $myrow["name"];
-               $_SESSION['Items']->cust_ref = $myrow["reference"];
-               $_SESSION['Items']->Branch = $myrow["branch_code"];
-               $_SESSION['Items']->customer_currency = $myrow["curr_code"];
+    $ci = new Cart(10, $_GET['InvoiceNumber'], true);
 
-               $_SESSION['Items']->Comments = "";
-               $_SESSION['Items']->default_sales_type =$myrow["tpe"];
-               $_SESSION['Items']->Location = $myrow["from_stk_loc"];
-
-               $_SESSION['Items']->tax_group_name = $myrow["tax_group_name"];
-               $_SESSION['Items']->tax_group_id = $myrow["tax_group_id"];
-
-               $_SESSION['Items']->delivery_date = sql2date($myrow["tran_date"]);
-               $_SESSION['Items']->freight_cost = $myrow["ov_freight"];
-
-               $_SESSION['Items']->ship_via = $myrow["default_ship_via"];
-
-               $_SESSION['Order'] = $myrow["order_"];
-
-               db_free_result($result);
-
-               /*now populate the line items array with the detail records for the invoice*/
+    if ($ci==null) {
+               display_error(_("This invoice can not be credited using the automatic facility."));
+               display_error("Please report that a duplicate debtor_trans header record was found for invoice " . key($ci->src_docs));
+               echo "<br><br>";
+               processing_end();
+               exit;
+    }
+    //valid invoice record returned from the entered invoice number
 
-               $result = get_customer_trans_details(10, $_GET['InvoiceNumber']);
+    $ci->trans_type = 11;
+    $ci->src_docs = $ci->trans_no;
+    $ci->src_date = $ci->document_date;
+    $ci->trans_no = 0;
+    $ci->document_date = Today();
+    $ci->reference = references::get_next(11);
 
-               if (db_num_rows($result) > 0)
-               {
+    for ($line_no=0; $line_no<count($ci->line_items); $line_no++) {
+       $ci->line_items[$line_no]->qty_dispatched = '0';
+    }
 
-                       while ($myrow = db_fetch($result))
-                       {
+    $_SESSION['Items'] = $ci;
+       copy_from_cart();
 
-                               $_SESSION['Items']->add_to_cart($myrow["stock_id"],-$myrow["quantity"],
-                                       $myrow["FullUnitPrice"],$myrow["discount_percent"],$myrow["qty_done"],
-                                       $myrow["standard_cost"],$myrow["description"],$myrow["id"]);
+} elseif ( isset($_GET['ModifyCredit']) && $_GET['ModifyCredit']>0) {
 
+       $_SESSION['Items'] = new Cart(11,$_GET['ModifyCredit']);
+       copy_from_cart();
 
+} elseif (!processing_active()) {
+       /* This page can only be called with an invoice number for crediting*/
+       die (_("This page can only be opened if an invoice has been selected for crediting."));
+} else {
+       foreach ($_SESSION['Items']->line_items as $line_no=>$itm) {
+               if (isset($_POST['Line'.$line_no])) {
+                       $line_qty = $_POST['Line'.$line_no];
+                       if (is_numeric($line_qty) && $_POST['Line'.$line_no] <= ($itm->quantity - $itm->qty_done)) {
+                               $_SESSION['Items']->line_items[$line_no]->qty_dispatched = $line_qty;
                        }
+               }
 
-               } /*else { // there are no item records created for that invoice
-                       // it's ok there might be shipping or only taxes !!
-                       echo "<CENTER><A HREF='$path_to_root/index.php?" . SID . "'>" . _("Back to the main menu") . "</A>";
-                       echo "<P>" . _("There are no line items that were retrieved for this invoice. A credit note cannot be created from this invoice."). "<BR><BR>";
-                       end_page();
-                       exit;
-
-               }*/ //end of checks on returned data set
-               db_free_result($result);
+               if (isset($_POST['Line'.$line_no.'Desc'])) {
+                       $line_desc = $_POST['Line'.$line_no.'Desc'];
+                       if (strlen($line_desc) > 0) {
+                               $_SESSION['Items']->line_items[$line_no]->item_description = $line_desc;
+                       }
+               }
        }
-       else
-       {
-               display_error(_("This invoice can not be credited using the automatic facility."));
-               display_error("Please report that a duplicate debtor_trans header record was found for invoice " . $SESSION['InvoiceToCredit']);
-               echo "<br><br>";
-               exit;
-       } //valid invoice record returned from the entered invoice number
+}
+//-----------------------------------------------------------------------------
 
+function copy_to_cart()
+{
+  $cart = &$_SESSION['Items'];
+  $cart->ship_via = $_POST['ShipperID'];
+  $cart->freight_cost = $_POST['ChargeFreightCost'];
+  $cart->document_date =  $_POST['CreditDate'];
+  $cart->Location = $_POST['Location'];
+  $cart->Comments = $_POST['CreditText'];
 }
-else
+//-----------------------------------------------------------------------------
+
+function copy_from_cart()
 {
+  $cart = &$_SESSION['Items'];
+  $_POST['ShipperID'] = $cart->ship_via;
+  $_POST['ChargeFreightCost'] = $cart->freight_cost;
+  $_POST['CreditDate']= $cart->document_date;
+  $_POST['Location']= $cart->Location;
+  $_POST['CreditText']= $cart->Comments;
+}
+//-----------------------------------------------------------------------------
 
-/* if processing, the page has been called and ${$StkItm->stock_id} would have been set from the post */
-       foreach ($_SESSION['Items']->line_items as $itm)
-       {
-               $_SESSION['Items']->line_items[$itm->line_no]->qty_dispatched = $_POST[$itm->stock_id];
+if (isset($_POST['ProcessCredit']) && can_process()) {
 
-               if (isset($_POST[$itm->stock_id . "Desc"]) && strlen($_POST[$itm->stock_id . "Desc"]) > 0)
-               {
-                       $_SESSION['Items']->line_items[$itm->line_no]->item_description = $_POST[$itm->stock_id . "Desc"];
-               }
-       }
-}
+    $newcredit = ($_SESSION['Items']->trans_no == 0);
 
-//--------------------------------------------------------------------------------------
+    if (!isset($_POST['WriteOffGLCode']))
+               $_POST['WriteOffGLCode'] = 0;
 
-if (isset($_POST['ProcessCredit']))
-{
-       process_credit();
+       copy_to_cart();
+    $credit_no = $_SESSION['Items']->write($_POST['WriteOffGLCode']);
+
+       processing_end();
+       if ($newcredit) {
+               meta_forward($_SERVER['PHP_SELF'], "AddedID=$credit_no");
+       } else {
+               meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$credit_no");
+       }
 }
 
-//--------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
-if (isset($_POST['Location']))
-{
+if (isset($_POST['Location'])) {
        $_SESSION['Items']->Location = $_POST['Location'];
 }
 
-//--------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
 function display_credit_items()
 {
@@ -249,17 +219,27 @@ function display_credit_items()
     end_row();
     start_row();
 
-       if (!isset($_POST['ref']))
-               $_POST['ref'] = references::get_next(11);
+//     if (!isset($_POST['ref']))
+//             $_POST['ref'] = references::get_next(11);
 
-    ref_cells(_("Reference"), 'ref', null, "class='tableheader2'");
+    if ($_SESSION['Items']->trans_no==0) {
+               ref_cells(_("Reference"), 'ref', $_SESSION['Items']->reference, "class='tableheader2'");
+       } else {
+               label_cells(_("Reference"), $_SESSION['Items']->reference, "class='tableheader2'");
+       }
+//    label_cells(_("Crediting Invoice"), get_customer_trans_view_str(10, $_SESSION['InvoiceToCredit']), "class='tableheader2'");
+    label_cells(_("Crediting Invoice"), get_customer_trans_view_str(10, array_keys($_SESSION['Items']->src_docs)), "class='tableheader2'");
 
-    label_cells(_("Crediting Invoice"), get_customer_trans_view_str(10, $_SESSION['InvoiceToCredit']), "class='tableheader2'");
+       if (!isset($_POST['ShipperID'])) {
+               $_POST['ShipperID'] = $_SESSION['Items']->ship_via;
+       }
+       label_cell(_("Shipping Company"), "class='tableheader2'");
+       shippers_list_cells(null, 'ShipperID', $_POST['ShipperID']);
+//     if (!isset($_POST['sales_type_id']))
+//       $_POST['sales_type_id'] = $_SESSION['Items']->default_sales_type;
+//     label_cell(_("Sales Type"), "class='tableheader2'");
+//     sales_types_list_cells(null, 'sales_type_id', $_POST['sales_type_id']);
 
-    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);
        end_row();
        end_table();
 
@@ -267,7 +247,7 @@ function display_credit_items()
 
     start_table("$table_style width=100%");
 
-    label_row(_("Invoice Date"), $_SESSION['Items']->delivery_date, "class='tableheader2'");
+    label_row(_("Invoice Date"), $_SESSION['Items']->src_date, "class='tableheader2'");
 
     date_row(_("Credit Note Date"), 'CreditDate', null, 0, 0, 0, "class='tableheader2'");
 
@@ -284,19 +264,23 @@ function display_credit_items()
 
     $k = 0; //row colour counter
 
-    foreach ($_SESSION['Items']->line_items as $ln_itm)
-    {
-
-       alt_table_row_color($k);
+    foreach ($_SESSION['Items']->line_items as $line_no=>$ln_itm) {
+               if ($ln_itm->quantity==$ln_itm->qty_done) {
+                       continue; // this line was fully credited
+               }
+               alt_table_row_color($k);
 
-       $line_total =($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent));
 
+               //      view_stock_status_cell($ln_itm->stock_id); alternative view
        label_cell($ln_itm->stock_id);
-               text_cells(null, $ln_itm->stock_id . "Desc", $ln_itm->item_description, 30, 50);
+
+               text_cells(null, 'Line'.$line_no.'Desc', $ln_itm->item_description, 30, 50);
+
        qty_cell($ln_itm->quantity);
        label_cell($ln_itm->units);
+           text_cells(null, 'Line'.$line_no, $ln_itm->qty_dispatched, 13, 15);
 
-       text_cells(null, $ln_itm->stock_id, $ln_itm->qty_dispatched, 13, 15);
+       $line_total =($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent));
 
        amount_cell($ln_itm->price);
        amount_cell($ln_itm->discount_percent*100);
@@ -304,10 +288,14 @@ function display_credit_items()
        end_row();
     }
 
-    if (!isset($_POST['ChargeFreightCost']) || ($_POST['ChargeFreightCost'] == ""))
-    {
+    if (!isset($_POST['ChargeFreightCost']) || ($_POST['ChargeFreightCost'] == "")) {
        $_POST['ChargeFreightCost'] = $_SESSION['Items']->freight_cost;
     }
+
+    if (!is_numeric($_POST['ChargeFreightCost']))
+    {
+       $_POST['ChargeFreightCost'] = 0;
+    }
        start_row();
        label_cell(_("Credit Shipping Cost"), "colspan=7 align=right");
     text_cells(null, "ChargeFreightCost", $_POST['ChargeFreightCost'], 6, 6);
@@ -318,9 +306,9 @@ function display_credit_items()
     $display_sub_total = number_format2($inv_items_total + $_POST['ChargeFreightCost'],user_price_dec());
     label_row(_("Sub-total"), $display_sub_total, "colspan=7 align=right", "align=right");
 
-    $taxes = $_SESSION['Items']->get_taxes($_POST['tax_group_id'], $_POST['ChargeFreightCost']);
+    $taxes = $_SESSION['Items']->get_taxes($_POST['ChargeFreightCost']);
 
-    $tax_total = display_edit_tax_items($taxes, 7);
+    $tax_total = display_edit_tax_items($taxes, 7, $_SESSION['Items']->tax_included);
 
     $display_total = number_format2(($inv_items_total + $_POST['ChargeFreightCost'] + $tax_total), user_price_dec());
 
@@ -329,7 +317,7 @@ function display_credit_items()
     end_table();
 }
 
-//--------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
 function display_credit_options()
 {
@@ -340,41 +328,32 @@ function display_credit_options()
 
     echo "<tr><td>" . _("Credit Note Type") . "</td>";
     echo "<td><select name='CreditType' onchange='this.form.submit();'>";
-    if (!isset($_POST['CreditType']) || $_POST['CreditType'] == "Return")
-    {
+    if (!isset($_POST['CreditType']) || $_POST['CreditType'] == "Return") {
        echo "<option value='WriteOff'>" . _("Items Written Off") . "</option>";
        echo "<option selected value='Return'>" . _("Items Returned to Inventory Location") . "</option>";
-    }
-    else
-    {
+    } else {
        echo "<option selected value='WriteOff'>" . _("Items Written Off") . "</option>";
        echo "<option value='Return'>" . _("Items Returned to Inventory Location") . "</option>";
     }
     echo "</select>";
     echo"</td></tr>";
 
-    if (!isset($_POST['CreditType']) || $_POST['CreditType'] == "Return")
-    {
+    if (!isset($_POST['CreditType']) || $_POST['CreditType'] == "Return") {
 
        /*if the credit note is a return of goods then need to know which location to receive them into */
-       if (!isset($_POST['Location']))
-       {
+       if (!isset($_POST['Location'])) {
                $_POST['Location'] = $_SESSION['Items']->Location;
        }
 
        locations_list_row(_("Items Returned to Inventory Location"), 'Location', $_POST['Location']);
-
-    }
-    else
-    {  /* the goods are to be written off to somewhere */
-
+    } else {   /* the goods are to be written off to somewhere */
        gl_all_accounts_list_row(_("Write Off the Cost of the Items to"), 'WriteOffGLCode', $_POST['WriteOffGLCode']);
     }
     textarea_row(_("Memo"), "CreditText", null, 45, 3);
     end_table();
 }
 
-//--------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
 display_credit_items();
 display_credit_options();
@@ -387,7 +366,6 @@ echo "</center>";
 
 end_form();
 
-//--------------------------------------------------------------------------------------
 
 end_page();