Bug 4817: g/l account inquiry can timeout due to slow sql. @Braath Waate.
[fa-stable.git] / sales / credit_note_entry.php
index 98a7442f3feaa70e93204ea785ec2b3f7ab67b29..2a3077b4c5787b5e6c9680d26e92b50fae916284 100644 (file)
 <?php
-
-/*The credit selection screen uses the Cart class used for the making up orders
-some of the variable names refer to order - please think credit when you read order */
-
-$page_security = 3;
-$path_to_root="..";
+/**********************************************************************
+    Copyright (C) FrontAccounting, LLC.
+       Released under the terms of the GNU General Public License, GPL, 
+       as published by the Free Software Foundation, either version 3 
+       of the License, or (at your option) any later version.
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+    See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
+***********************************************************************/
+//---------------------------------------------------------------------------
+//
+//     Entry/Modify free hand Credit Note
+//
+$page_security = 'SA_SALESCREDIT';
+$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 . "/sales/includes/sales_db.inc");
-
 include_once($path_to_root . "/sales/includes/sales_ui.inc");
-
+include_once($path_to_root . "/sales/includes/db/sales_types_db.inc");
 include_once($path_to_root . "/sales/includes/ui/sales_credit_ui.inc");
 include_once($path_to_root . "/sales/includes/ui/sales_order_ui.inc");
+include_once($path_to_root . "/reporting/includes/reporting.inc");
 
 $js = "";
-if ($use_popup_windows)
+if ($SysPrefs->use_popup_windows) {
        $js .= get_js_open_window(900, 500);
-if ($use_date_picker)
+}
+if (user_use_date_picker()) {
        $js .= get_js_date_picker();
-page(_("Customer Credit Note"), false, false, "", $js);
+}
 
-//-----------------------------------------------------------------------------------------------
+if(isset($_GET['NewCredit'])) {
+       $_SESSION['page_title'] = _($help_context = "Customer Credit Note");
+       handle_new_credit(0);
+} elseif (isset($_GET['ModifyCredit'])) {
+       $_SESSION['page_title'] = sprintf(_("Modifying Customer Credit Note #%d"), $_GET['ModifyCredit']);
+       handle_new_credit($_GET['ModifyCredit']);
+       $help_context = "Modifying Customer Credit Note";
+}
+
+page($_SESSION['page_title'],false, false, "", $js);
+
+//-----------------------------------------------------------------------------
 
 check_db_has_stock_items(_("There are no items defined in the system."));
 
 check_db_has_customer_branches(_("There are no customers, or there are no customers with branches. Please define customers and customer branches."));
 
-//---------------------------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
-if (isset($_GET['AddedID'])) 
-{
+if (list_updated('branch_id')) {
+       // when branch is selected via external editor also customer can change
+       $br = get_branch(get_post('branch_id'));
+       $_POST['customer_id'] = $br['debtor_no'];
+       $Ajax->activate('customer_id');
+}
+
+if (isset($_GET['AddedID'])) {
        $credit_no = $_GET['AddedID'];
-       $trans_type = 11;
+       $trans_type = ST_CUSTCREDIT;
 
-       display_notification_centered(_("Credit Note has been processed"));
-       display_note(get_customer_trans_view_str($trans_type, $credit_no, _("View this credit note")), 0, 1);
-       
-       display_note(get_gl_view_str($trans_type, $credit_no, _("View the GL Journal Entries for this Credit Note")));
+       display_notification_centered(sprintf(_("Credit Note # %d has been processed"),$credit_no));
 
-       hyperlink_params($_SERVER['PHP_SELF'], _("Enter Another Credit Note"), "NewCredit=yes");
+       display_note(get_customer_trans_view_str($trans_type, $credit_no, _("&View this credit note")), 0, 1);
 
-       display_footer_exit();
-}
+       display_note(print_document_link($credit_no."-".$trans_type, _("&Print This Credit Invoice"), true, ST_CUSTCREDIT),0, 1);
+       display_note(print_document_link($credit_no."-".$trans_type, _("&Email This Credit Invoice"), true, ST_CUSTCREDIT, false, "printlink", "", 1),0, 1);
 
-//--------------------------------------------------------------------------------------------------
+       display_note(get_gl_view_str($trans_type, $credit_no, _("View the GL &Journal Entries for this Credit Note")));
 
-function copy_to_cn()
-{
-       $_SESSION['credit_items']->memo_ = $_POST['CreditText'];
+       hyperlink_params($_SERVER['PHP_SELF'], _("Enter Another &Credit Note"), "NewCredit=yes");
 
-       $_SESSION['credit_items']->orig_order_date = $_POST['OrderDate'];
-       $_SESSION['credit_items']->freight_cost = $_POST['ChargeFreightCost'];
+       hyperlink_params("$path_to_root/admin/attachments.php", _("Add an Attachment"), "filterType=$trans_type&trans_no=$credit_no");
 
-       $_SESSION['credit_items']->Location = $_POST["Location"];
+       display_footer_exit();
+} else
+       check_edit_conflicts(get_post('cart_id'));
+
+//--------------------------------------------------------------------------------
 
-       $_SESSION['credit_items']->default_sales_type = $_POST['sales_type_id'];
-       $_SESSION['credit_items']->tax_group_id = $_POST["tax_group_id"];
+function line_start_focus() {
+       global $Ajax;
+       $Ajax->activate('items_table');
+       set_focus('_stock_id_edit');
 }
 
-//--------------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
-function copy_from_cn()
+function copy_to_cn()
 {
-       $_POST['CreditText'] = $_SESSION['credit_items']->memo_;
-
-       $_POST['OrderDate'] = $_SESSION['credit_items']->orig_order_date;
-       $_POST['ChargeFreightCost'] = $_SESSION['credit_items']->freight_cost;
-
-       $_POST["Location"] = $_SESSION['credit_items']->Location;
-
-       $_POST['sales_type_id'] = $_SESSION['credit_items']->default_sales_type;
-       $_POST["tax_group_id"] = $_SESSION['credit_items']->tax_group_id;
+       $cart = &$_SESSION['Items'];
+       $cart->Comments = $_POST['CreditText'];
+       $cart->document_date = $_POST['OrderDate'];
+       $cart->freight_cost = input_num('ChargeFreightCost');
+       $cart->Location = (isset($_POST["Location"]) ? $_POST["Location"] : "");
+       $cart->sales_type = $_POST['sales_type_id'];
+       if ($cart->trans_no == 0)
+               $cart->reference = $_POST['ref'];
+       $cart->ship_via = $_POST['ShipperID'];
+       $cart->dimension_id = $_POST['dimension_id'];
+       $cart->dimension2_id = $_POST['dimension2_id'];
 }
 
-//-----------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
-function handle_new_order()
+function copy_from_cn()
 {
-       if (isset($_SESSION['credit_items']))
-       {
-               unset ($_SESSION['credit_items']->line_items);
-               unset ($_SESSION['credit_items']);
-       }
+       $cart = &$_SESSION['Items'];
+       $_POST['CreditText'] = $cart->Comments;
+       $_POST['OrderDate'] = $cart->document_date;
+       $_POST['ChargeFreightCost'] = price_format($cart->freight_cost);
+       $_POST['Location'] = $cart->Location;
+       $_POST['sales_type_id'] = $cart->sales_type;
+       if ($cart->trans_no == 0)
+               $_POST['ref'] = $cart->reference;
+       $_POST['ShipperID'] = $cart->ship_via;
+       $_POST['dimension_id'] = $cart->dimension_id;
+       $_POST['dimension2_id'] = $cart->dimension2_id;
+       $_POST['cart_id'] = $cart->cart_id;
+}
 
-    session_register("credit_items");
+//-----------------------------------------------------------------------------
 
-    $_SESSION['credit_items'] = new cart;
-       $_POST['OrderDate'] = Today();
-       if (!is_date_in_fiscalyear($_POST['OrderDate']))
-               $_POST['OrderDate'] = end_fiscalyear();
-       $_SESSION['credit_items']->orig_order_date = $_POST['OrderDate'];       
-    
+function handle_new_credit($trans_no)
+{
+       processing_start();
+       $_SESSION['Items'] = new Cart(ST_CUSTCREDIT,$trans_no);
+       copy_from_cn();
 }
 
-//-----------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
-if (isset($_POST['ProcessCredit']))
+function can_process()
 {
+       global $Refs;
 
        $input_error = 0;
 
-       if (!references::is_valid($_POST['ref'])) 
-       {
-               display_error( _("You must enter a reference."));
-               $input_error = 1;
-       } 
-       elseif (!is_new_reference($_POST['ref'], 11)) 
-       {
-               display_error( _("The entered reference is already in use."));
-               $input_error = 1;
-       } 
-       elseif (!is_date($_POST['OrderDate'])) 
-       {
+       if ($_SESSION['Items']->count_items() == 0 && (!check_num('ChargeFreightCost',0)))
+               return false;
+       if($_SESSION['Items']->trans_no == 0) {
+           if (!$Refs->is_valid($_POST['ref'], ST_CUSTCREDIT)) {
+                       display_error( _("You must enter a reference."));
+                       set_focus('ref');
+                       $input_error = 1;
+               }
+       }
+       if (!is_date($_POST['OrderDate'])) {
                display_error(_("The entered date for the credit note is invalid."));
+               set_focus('OrderDate');
                $input_error = 1;
-       } 
-       elseif (!is_date_in_fiscalyear($_POST['OrderDate'])) 
-       {
-               display_error(_("The entered date is not in fiscal year."));
+       } elseif (!is_date_in_fiscalyear($_POST['OrderDate'])) {
+               display_error(_("The entered date is out of fiscal year or is closed for further data entry."));
+               set_focus('OrderDate');
                $input_error = 1;
        }
-       if ($input_error == 1)
-               unset($_POST['ProcessCredit']);
+       return ($input_error == 0);
 }
 
-//------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
-if (isset($_POST['ProcessCredit']))
-{
-       //alert("WriteOffGLCode = ".$_POST['WriteOffGLCode'].", CreditType = ".$_POST['CreditType']);
-       if ($_POST['CreditType'] == "WriteOff" && (!isset($_POST['WriteOffGLCode']) || 
-               $_POST['WriteOffGLCode'] == ''))
-       {
+if (isset($_POST['ProcessCredit']) && can_process()) {
+       copy_to_cn();
+       if ($_POST['CreditType'] == "WriteOff" && (!isset($_POST['WriteOffGLCode']) ||
+               $_POST['WriteOffGLCode'] == '')) {
                display_note(_("For credit notes created to write off the stock, a general ledger account is required to be selected."), 1, 0);
-               display_note(_("Please select an account to write the cost of the stock off to, then click on Process again."), 1, 0);
+               display_note(_("Please select an account to write the cost of the stock off to, then click on Process again."), 1, 0);
                exit;
        }
-       if (!isset($_POST['WriteOffGLCode']))
-               $_POST['WriteOffGLCode'] = "";
-       if (!isset($_POST['ShipperID']))
-               $_POST['ShipperID'] = 0;
-       $credit_no = add_credit_note($_SESSION['credit_items'], $_POST['OrderDate'],
-               $_POST['CreditType'], $_POST['tax_group_id'],
-               $_POST['ChargeFreightCost'], $_POST['sales_type_id'], $_POST['ShipperID'],
-               $_POST['ref'], $_POST['CreditText'], $_POST['WriteOffGLCode']);
-
-       unset($_SESSION['credit_items']->line_items);
-       unset($_SESSION['credit_items']);
-
-       meta_forward($_SERVER['PHP_SELF'], "AddedID=$credit_no");
-
+       if (!isset($_POST['WriteOffGLCode'])) {
+               $_POST['WriteOffGLCode'] = 0;
+       }
+       copy_to_cn();
+       $credit_no = $_SESSION['Items']->write($_POST['WriteOffGLCode']);
+       if ($credit_no == -1)
+       {
+               display_error(_("The entered reference is already in use."));
+               set_focus('ref');
+       }
+       else
+       {
+               new_doc_date($_SESSION['Items']->document_date);
+               processing_end();
+               meta_forward($_SERVER['PHP_SELF'], "AddedID=$credit_no");
+       }
 } /*end of process credit note */
 
-//---------------------------------------------------------------------------------------------------
-
-function get_details_from_customer()
-{
-       return get_customer_details_to_order($_SESSION['credit_items'], $_POST['customer_id'], $_POST['branch_id']);
-}
-
-//-----------------------------------------------------------------------------------------------
+  //-----------------------------------------------------------------------------
 
 function check_item_data()
 {
-       if ($_POST['qty'] <= 0)
-       {
+       if (!check_num('qty',0)) {
                display_error(_("The quantity must be greater than zero."));
+               set_focus('qty');
                return false;
        }
-       if (!is_numeric($_POST['price']) || $_POST['price'] < 0)
-       {
+       if (!check_num('price',0)) {
                display_error(_("The entered price is negative or invalid."));
+               set_focus('price');
                return false;
        }
-       if (!is_numeric($_POST['Disc']) || $_POST['Disc'] > 100 || $_POST['Disc'] < 0)
-       {
+       if (!check_num('Disc', 0, 100)) {
                display_error(_("The entered discount percent is negative, greater than 100 or invalid."));
+               set_focus('Disc');
                return false;
        }
-       return true;
+       return true;
 }
 
-//-----------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
 function handle_update_item()
 {
-    if($_POST['UpdateItem'] != "" && check_item_data())
-    {
-       $_SESSION['credit_items']->update_cart_item($_POST['stock_id'], $_POST['qty'], 
-               $_POST['price'], ($_POST['Disc'] / 100));
-    }
+       if ($_POST['UpdateItem'] != "" && check_item_data()) {
+               $_SESSION['Items']->update_cart_item($_POST['line_no'], input_num('qty'),
+                       input_num('price'), input_num('Disc') / 100);
+       }
+    line_start_focus();
 }
 
-//-----------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
-function handle_delete_item()
+function handle_delete_item($line_no)
 {
-       $_SESSION['credit_items']->remove_from_cart($_GET['Delete']);
+       $_SESSION['Items']->remove_from_cart($line_no);
+    line_start_focus();
 }
 
-//-----------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
 function handle_new_item()
 {
+
        if (!check_item_data())
                return;
 
-       add_to_order($_SESSION['credit_items'], $_POST['stock_id'], $_POST['qty'],
-               $_POST['price'], $_POST['Disc'] / 100);
+       add_to_order($_SESSION['Items'], $_POST['stock_id'], input_num('qty'),
+               input_num('price'), input_num('Disc') / 100);
+    line_start_focus();
 }
-
-//-----------------------------------------------------------------------------------------------
-if (isset($_GET['Delete']) || isset($_GET['Edit']))
-       copy_from_cn();
-
-if (isset($_GET['Delete']))
-       handle_delete_item();
-
-if (isset($_POST['AddItem']) || isset($_POST['UpdateItem']))
-       copy_to_cn();
+//-----------------------------------------------------------------------------
+$id = find_submit('Delete');
+if ($id!=-1)
+       handle_delete_item($id);
 
 if (isset($_POST['AddItem']))
        handle_new_item();
@@ -231,53 +253,38 @@ if (isset($_POST['AddItem']))
 if (isset($_POST['UpdateItem']))
        handle_update_item();
 
-//-----------------------------------------------------------------------------------------------
+if (isset($_POST['CancelItemChanges']))
+       line_start_focus();
 
-if (isset($_GET['NewCredit']) || !isset($_SESSION['credit_items']))
-{
-       handle_new_order();
-} 
-else 
-{
-       if (!isset($_POST['customer_id']))
-               $_POST['customer_id'] = $_SESSION['credit_items']->customer_id;
-       if (!isset($_POST['branch_id']))
-               $_POST['branch_id'] = $_SESSION['credit_items']->Branch;
+//-----------------------------------------------------------------------------
+
+if (!processing_active()) {
+       handle_new_credit(0);
 }
 
-//-----------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 
-start_form(false, true);
+start_form();
+hidden('cart_id');
 
-$customer_error = display_credit_header($_SESSION['credit_items']);
+$customer_error = display_credit_header($_SESSION['Items']);
 
-if ($customer_error == "")
-{
-       start_table("$table_style width=80%", 10);
+if ($customer_error == "") {
+       start_table(TABLESTYLE, "width='80%'", 10);
        echo "<tr><td>";
-    display_credit_items(_("Credit Note Items"), $_SESSION['credit_items']);
-    credit_options_controls();
-    echo "</td></tr>";
-    end_table();
-} 
-else
-{
+       display_credit_items(_("Credit Note Items"), $_SESSION['Items']);
+       credit_options_controls($_SESSION['Items']);
+       echo "</td></tr>";
+       end_table();
+} else {
        display_error($customer_error);
 }
 
-if (!isset($_POST['ProcessCredit']))
-{
-    echo "<br><center><table><tr>";
-    submit_cells('Update', _("Update"));
-       if ($_SESSION['credit_items']->count_items() >= 1
-                       /*OR $_POST['ChargeTax'] > 0*/ || (isset($_POST['ChargeFreightCost']) && $_POST['ChargeFreightCost'] > 0))
-       {
-           submit_cells('ProcessCredit', _("Process Credit Note"));
-       }
-       echo "</tr></table>";
-}
+echo "<br><center><table><tr>";
+submit_cells('Update', _("Update"));
+submit_cells('ProcessCredit', _("Process Credit Note"), '', false, 'default');
+echo "</tr></table></center>";
 
 end_form();
 end_page();
 
-?>