1<?php 2/********************************************************************** 3 Copyright (C) FrontAccounting, LLC. 4 Released under the terms of the GNU General Public License, GPL, 5 as published by the Free Software Foundation, either version 3 6 of the License, or (at your option) any later version. 7 This program is distributed in the hope that it will be useful, 8 but WITHOUT ANY WARRANTY; without even the implied warranty of 9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>. 11***********************************************************************/ 12//--------------------------------------------------------------------------- 13// 14// Entry/Modify Credit Note for selected Sales Invoice 15// 16 17$page_security = 'SA_SALESCREDITINV'; 18$path_to_root = ".."; 19 20include_once($path_to_root . "/sales/includes/cart_class.inc"); 21include_once($path_to_root . "/includes/session.inc"); 22include_once($path_to_root . "/includes/data_checks.inc"); 23include_once($path_to_root . "/includes/manufacturing.inc"); 24include_once($path_to_root . "/sales/includes/sales_db.inc"); 25include_once($path_to_root . "/sales/includes/sales_ui.inc"); 26include_once($path_to_root . "/reporting/includes/reporting.inc"); 27 28$js = ""; 29if ($use_popup_windows) { 30 $js .= get_js_open_window(900, 500); 31} 32 33if ($use_date_picker) { 34 $js .= get_js_date_picker(); 35} 36 37if (isset($_GET['ModifyCredit'])) { 38 $_SESSION['page_title'] = sprintf(_("Modifying Credit Invoice # %d."), $_GET['ModifyCredit']); 39 $help_context = "Modifying Credit Invoice"; 40 processing_start(); 41} elseif (isset($_GET['InvoiceNumber'])) { 42 $_SESSION['page_title'] = _($help_context = "Credit all or part of an Invoice"); 43 processing_start(); 44} 45page($_SESSION['page_title'], false, false, "", $js); 46 47//----------------------------------------------------------------------------- 48 49if (isset($_GET['AddedID'])) { 50 $credit_no = $_GET['AddedID']; 51 $trans_type = ST_CUSTCREDIT; 52 53 display_notification_centered(_("Credit Note has been processed")); 54 55 display_note(get_customer_trans_view_str($trans_type, $credit_no, _("&View This Credit Note")), 0, 0); 56 57 display_note(print_document_link($credit_no."-".$trans_type, _("&Print This Credit Note"), true, $trans_type),1); 58 display_note(print_document_link($credit_no."-".$trans_type, _("&Email This Credit Note"), true, $trans_type, false, "printlink", "", 1),1); 59 60 display_note(get_gl_view_str($trans_type, $credit_no, _("View the GL &Journal Entries for this Credit Note")),1); 61 62 hyperlink_params("$path_to_root/admin/attachments.php", _("Add an Attachment"), "filterType=$trans_type&trans_no=$credit_no"); 63 64 display_footer_exit(); 65 66} elseif (isset($_GET['UpdatedID'])) { 67 $credit_no = $_GET['UpdatedID']; 68 $trans_type = ST_CUSTCREDIT; 69 70 display_notification_centered(_("Credit Note has been updated")); 71 72 display_note(get_customer_trans_view_str($trans_type, $credit_no, _("&View This Credit Note")), 0, 0); 73 74 display_note(print_document_link($credit_no."-".$trans_type, _("&Print This Credit Note"), true, $trans_type),1); 75 display_note(print_document_link($credit_no."-".$trans_type, _("&Email This Credit Note"), true, $trans_type, false, "printlink", "", 1),1); 76 77 display_note(get_gl_view_str($trans_type, $credit_no, _("View the GL &Journal Entries for this Credit Note")),1); 78 79 display_footer_exit(); 80} else 81 check_edit_conflicts(); 82 83 84//----------------------------------------------------------------------------- 85 86function can_process() 87{ 88 global $Refs; 89 90 if (!is_date($_POST['CreditDate'])) { 91 display_error(_("The entered date is invalid."));; 92 set_focus('CreditDate'); 93 return false; 94 } elseif (!is_date_in_fiscalyear($_POST['CreditDate'])) { 95 display_error(_("The entered date is not in fiscal year.")); 96 set_focus('CreditDate'); 97 return false; 98 } 99 100 if ($_SESSION['Items']->trans_no==0) { 101 if (!$Refs->is_valid($_POST['ref'])) { 102 display_error(_("You must enter a reference."));; 103 set_focus('ref'); 104 return false; 105 } 106 107 } 108 if (!check_num('ChargeFreightCost', 0)) { 109 display_error(_("The entered shipping cost is invalid or less than zero."));; 110 set_focus('ChargeFreightCost'); 111 return false; 112 } 113 if (!check_quantities()) { 114 display_error(_("Selected quantity cannot be less than zero nor more than quantity not credited yet.")); 115 return false; 116 } 117 return true; 118} 119 120//----------------------------------------------------------------------------- 121 122if (isset($_GET['InvoiceNumber']) && $_GET['InvoiceNumber'] > 0) { 123 124 $_SESSION['Items'] = new Cart(ST_SALESINVOICE, $_GET['InvoiceNumber'], true); 125 copy_from_cart(); 126 127} elseif ( isset($_GET['ModifyCredit']) && $_GET['ModifyCredit']>0) { 128 129 $_SESSION['Items'] = new Cart(ST_CUSTCREDIT, $_GET['ModifyCredit']); 130 copy_from_cart(); 131 132} elseif (!processing_active()) { 133 /* This page can only be called with an invoice number for crediting*/ 134 die (_("This page can only be opened if an invoice has been selected for crediting.")); 135} elseif (!check_quantities()) { 136 display_error(_("Selected quantity cannot be less than zero nor more than quantity not credited yet.")); 137} 138 139function check_quantities() 140{ 141 $ok =1; 142 foreach ($_SESSION['Items']->line_items as $line_no=>$itm) { 143 if ($itm->quantity == $itm->qty_done) { 144 continue; // this line was fully credited/removed 145 } 146 if (isset($_POST['Line'.$line_no])) { 147 if (check_num('Line'.$line_no, 0, $itm->quantity)) { 148 $_SESSION['Items']->line_items[$line_no]->qty_dispatched = 149 input_num('Line'.$line_no); 150 } 151 else { 152 $ok = 0; 153 } 154 } 155 156 if (isset($_POST['Line'.$line_no.'Desc'])) { 157 $line_desc = $_POST['Line'.$line_no.'Desc']; 158 if (strlen($line_desc) > 0) { 159 $_SESSION['Items']->line_items[$line_no]->item_description = $line_desc; 160 } 161 } 162 } 163 return $ok; 164} 165//----------------------------------------------------------------------------- 166 167function copy_to_cart() 168{ 169 $cart = &$_SESSION['Items']; 170 $cart->ship_via = $_POST['ShipperID']; 171 $cart->freight_cost = input_num('ChargeFreightCost'); 172 $cart->document_date = $_POST['CreditDate']; 173 $cart->Location = (isset($_POST['Location']) ? $_POST['Location'] : ""); 174 $cart->Comments = $_POST['CreditText']; 175 if ($_SESSION['Items']->trans_no == 0) 176 $cart->reference = $_POST['ref']; 177} 178//----------------------------------------------------------------------------- 179 180function copy_from_cart() 181{ 182 $cart = &$_SESSION['Items']; 183 $_POST['ShipperID'] = $cart->ship_via; 184 $_POST['ChargeFreightCost'] = price_format($cart->freight_cost); 185 $_POST['CreditDate']= $cart->document_date; 186 $_POST['Location']= $cart->Location; 187 $_POST['CreditText']= $cart->Comments; 188 $_POST['cart_id'] = $cart->cart_id; 189 $_POST['ref'] = $cart->reference; 190} 191//----------------------------------------------------------------------------- 192 193if (isset($_POST['ProcessCredit']) && can_process()) { 194 $new_credit = ($_SESSION['Items']->trans_no == 0); 195 196 if (!isset($_POST['WriteOffGLCode'])) 197 $_POST['WriteOffGLCode'] = 0; 198 199 copy_to_cart(); 200 if ($new_credit) 201 new_doc_date($_SESSION['Items']->document_date); 202 $credit_no = $_SESSION['Items']->write($_POST['WriteOffGLCode']); 203 if ($credit_no == -1) 204 { 205 display_error(_("The entered reference is already in use.")); 206 set_focus('ref'); 207 } elseif($credit_no) { 208 processing_end(); 209 if ($new_credit) { 210 meta_forward($_SERVER['PHP_SELF'], "AddedID=$credit_no"); 211 } else { 212 meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$credit_no"); 213 } 214 } 215} 216 217//----------------------------------------------------------------------------- 218 219if (isset($_POST['Location'])) { 220 $_SESSION['Items']->Location = $_POST['Location']; 221} 222 223//----------------------------------------------------------------------------- 224 225function display_credit_items() 226{ 227 start_form(); 228 hidden('cart_id'); 229 230 start_table(TABLESTYLE2, "width='80%'", 5); 231 echo "<tr><td>"; // outer table 232 233 start_table(TABLESTYLE, "width='100%'"); 234 start_row(); 235 label_cells(_("Customer"), $_SESSION['Items']->customer_name, "class='tableheader2'"); 236 label_cells(_("Branch"), get_branch_name($_SESSION['Items']->Branch), "class='tableheader2'"); 237 label_cells(_("Currency"), $_SESSION['Items']->customer_currency, "class='tableheader2'"); 238 end_row(); 239 start_row(); 240 241// if (!isset($_POST['ref'])) 242// $_POST['ref'] = $Refs->get_next(11); 243 244 if ($_SESSION['Items']->trans_no==0) { 245 ref_cells(_("Reference"), 'ref', '', null, "class='tableheader2'"); 246 } else { 247 label_cells(_("Reference"), $_SESSION['Items']->reference, "class='tableheader2'"); 248 } 249 label_cells(_("Crediting Invoice"), get_customer_trans_view_str(ST_SALESINVOICE, array_keys($_SESSION['Items']->src_docs)), "class='tableheader2'"); 250 251 if (!isset($_POST['ShipperID'])) { 252 $_POST['ShipperID'] = $_SESSION['Items']->ship_via; 253 } 254 label_cell(_("Shipping Company"), "class='tableheader2'"); 255 shippers_list_cells(null, 'ShipperID', $_POST['ShipperID']); 256// if (!isset($_POST['sales_type_id'])) 257// $_POST['sales_type_id'] = $_SESSION['Items']->sales_type; 258// label_cell(_("Sales Type"), "class='tableheader2'"); 259// sales_types_list_cells(null, 'sales_type_id', $_POST['sales_type_id']); 260 261 end_row(); 262 end_table(); 263 264 echo "</td><td>";// outer table 265 266 start_table(TABLESTYLE, "width='100%'"); 267 268 label_row(_("Invoice Date"), $_SESSION['Items']->src_date, "class='tableheader2'"); 269 270 date_row(_("Credit Note Date"), 'CreditDate', '', $_SESSION['Items']->trans_no==0, 0, 0, 0, "class='tableheader2'"); 271 272 end_table(); 273 274 echo "</td></tr>"; 275 276 end_table(1); // outer table 277 278 div_start('credit_items'); 279 start_table(TABLESTYLE, "width='80%'"); 280 $th = array(_("Item Code"), _("Item Description"), _("Invoiced Quantity"), _("Units"), 281 _("Credit Quantity"), _("Price"), _("Discount %"), _("Total")); 282 table_header($th); 283 284 $k = 0; //row colour counter 285 286 foreach ($_SESSION['Items']->line_items as $line_no=>$ln_itm) { 287 if ($ln_itm->quantity == $ln_itm->qty_done) { 288 continue; // this line was fully credited/removed 289 } 290 alt_table_row_color($k); 291 292 293 // view_stock_status_cell($ln_itm->stock_id); alternative view 294 label_cell($ln_itm->stock_id); 295 296 text_cells(null, 'Line'.$line_no.'Desc', $ln_itm->item_description, 30, 50); 297 $dec = get_qty_dec($ln_itm->stock_id); 298 qty_cell($ln_itm->quantity, false, $dec); 299 label_cell($ln_itm->units); 300 amount_cells(null, 'Line'.$line_no, number_format2($ln_itm->qty_dispatched, $dec), 301 null, null, $dec); 302 $line_total =($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent)); 303 304 amount_cell($ln_itm->price); 305 percent_cell($ln_itm->discount_percent*100); 306 amount_cell($line_total); 307 end_row(); 308 } 309 310 if (!check_num('ChargeFreightCost')) { 311 $_POST['ChargeFreightCost'] = price_format($_SESSION['Items']->freight_cost); 312 } 313 $colspan = 7; 314 start_row(); 315 label_cell(_("Credit Shipping Cost"), "colspan=$colspan align=right"); 316 small_amount_cells(null, "ChargeFreightCost", price_format(get_post('ChargeFreightCost',0))); 317 end_row(); 318 319 $inv_items_total = $_SESSION['Items']->get_items_total_dispatch(); 320 321 $display_sub_total = price_format($inv_items_total + input_num($_POST['ChargeFreightCost'])); 322 label_row(_("Sub-total"), $display_sub_total, "colspan=$colspan align=right", "align=right"); 323 324 $taxes = $_SESSION['Items']->get_taxes(input_num($_POST['ChargeFreightCost'])); 325 326 $tax_total = display_edit_tax_items($taxes, $colspan, $_SESSION['Items']->tax_included); 327 328 $display_total = price_format(($inv_items_total + input_num('ChargeFreightCost') + $tax_total)); 329 330 label_row(_("Credit Note Total"), $display_total, "colspan=$colspan align=right", "align=right"); 331 332 end_table(); 333 div_end(); 334} 335 336//----------------------------------------------------------------------------- 337function display_credit_options() 338{ 339 global $Ajax; 340 br(); 341 342 if (isset($_POST['_CreditType_update'])) 343 $Ajax->activate('options'); 344 345 div_start('options'); 346 start_table(TABLESTYLE2); 347 348 credit_type_list_row(_("Credit Note Type"), 'CreditType', null, true); 349 350 if ($_POST['CreditType'] == "Return") 351 { 352 353 /*if the credit note is a return of goods then need to know which location to receive them into */ 354 if (!isset($_POST['Location'])) 355 $_POST['Location'] = $_SESSION['Items']->Location; 356 locations_list_row(_("Items Returned to Location"), 'Location', $_POST['Location']); 357 } 358 else 359 { 360 /* the goods are to be written off to somewhere */ 361 gl_all_accounts_list_row(_("Write off the cost of the items to"), 'WriteOffGLCode', null); 362 } 363 364 textarea_row(_("Memo"), "CreditText", null, 51, 3); 365 echo "</table>"; 366 div_end(); 367} 368 369//----------------------------------------------------------------------------- 370if (get_post('Update')) 371{ 372 copy_to_cart(); 373 $Ajax->activate('credit_items'); 374} 375//----------------------------------------------------------------------------- 376 377display_credit_items(); 378display_credit_options(); 379 380echo "<br><center>"; 381submit('Update', _("Update"), true, _('Update credit value for quantities entered'), true); 382echo " "; 383submit('ProcessCredit', _("Process Credit Note"), true, '', 'default'); 384echo "</center>"; 385 386end_form(); 387 388 389end_page(); 390 391?> 392