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// if ($writeoff_acc==0) return goods into $cart->Location 14// if src_docs!=0 => credit invoice else credit note 15// 16function write_credit_note(&$credit_note, $write_off_acc) 17{ 18 global $Refs; 19 20 if (is_array($credit_note->src_docs)) 21 { 22 $docs = array_keys($credit_note->src_docs); 23 $credit_invoice = reset($docs); 24 } 25 else 26 $credit_invoice = $credit_note->src_docs; 27 28 $credit_date = $credit_note->document_date; 29 $tax_group_id = $credit_note->tax_group_id; 30 31 $trans_no = $credit_note->trans_no; 32 if (is_array($trans_no)) { 33 $trans_no = key($trans_no); 34 } 35 36 $credit_type = $write_off_acc == 0 ? 'Return' : 'WriteOff'; 37 38 begin_transaction(); 39 hook_db_prewrite($credit_note, ST_CUSTCREDIT); 40 41 $company_data = get_company_prefs(); 42 $branch_data = get_branch_accounts($credit_note->Branch); 43 44 add_new_exchange_rate(get_customer_currency($credit_note->customer_id), $credit_date, $credit_note->ex_rate); 45 46 $credit_note_total = $credit_note->get_items_total_dispatch(); 47 $freight_tax = $credit_note->get_shipping_tax(); 48 49 $taxes = $credit_note->get_taxes(); 50 51 $tax_total = 0; 52 foreach ($taxes as $taxitem) { 53 $taxitem['Value'] = round2($taxitem['Value'], user_price_dec()); 54 $tax_total += $taxitem['Value']; 55 } 56 57 if ($credit_note->tax_included == 0) { 58 $items_added_tax = $tax_total-$freight_tax; 59 $freight_added_tax = $freight_tax; 60 } else { 61 $items_added_tax = 0; 62 $freight_added_tax = 0; 63 } 64 // 2006-06-14. If the Customer Branch AR Account is set to a Bank Account, 65 // the transaction will be settled at once. 66 if (is_bank_account($branch_data['receivables_account'])) 67 $alloc = $credit_note_total + $items_added_tax + $credit_note->freight_cost + $freight_added_tax; 68 else 69 $alloc = 0; 70 71// $sales_order=$invoice->order_no; //? 72// if (is_array($sales_order)) $sales_order = $sales_order[0]; //? 73 if (!isset($credit_note->order_no)) 74 $credit_note->order_no = 0; 75 76 /*Now insert the Credit Note into the debtor_trans table with the allocations as calculated above*/ 77 // all amounts in debtor's currency 78 $credit_no = write_customer_trans(ST_CUSTCREDIT, $trans_no, $credit_note->customer_id, 79 $credit_note->Branch, $credit_date, $credit_note->reference, 80 $credit_note_total, 0, $items_added_tax, 81 $credit_note->freight_cost, $freight_added_tax, 82 $credit_note->sales_type, $credit_note->order_no, $credit_note->ship_via, 83 null, $alloc, 0, $credit_note->dimension_id, $credit_note->dimension2_id, 84 $credit_note->payment); 85 // 2008-06-14 extra $alloc, 2008-11-12 dimension_id Joe Hunt 86 87 if ($trans_no==0) { 88 $credit_note->trans_no = array($credit_no=>0); 89 } else { 90 delete_comments(ST_CUSTCREDIT, $credit_no); 91 void_cust_allocations(ST_CUSTCREDIT, $credit_no, $credit_date); 92 void_gl_trans(ST_CUSTCREDIT, $credit_no, true); 93 void_stock_move(ST_CUSTCREDIT, $credit_no); 94 void_trans_tax_details(ST_CUSTCREDIT, $credit_no); 95 } 96 if ($credit_invoice) { 97 update_customer_trans_version(get_parent_type(ST_CUSTCREDIT), $credit_note->src_docs ); 98 99 $total = $credit_note_total + $credit_note->freight_cost + $items_added_tax 100 + $freight_added_tax; 101 102 if (!credit_sales_invoice_allocate($credit_invoice, $credit_no, $total, $credit_date)) 103 return false; 104 } 105 106 $total = 0; 107 foreach ($credit_note->line_items as $credit_line) { 108 109 if ($credit_invoice && $credit_line->qty_dispatched!=$credit_line->qty_old ) { 110 update_parent_line(ST_CUSTCREDIT, $credit_line->src_id,($credit_line->qty_dispatched 111 -$credit_line->qty_old)); 112 } 113 114 $line_taxfree_price = get_tax_free_price_for_item($credit_line->stock_id, $credit_line->price, 115 0, $credit_note->tax_included, $credit_note->tax_group_array); 116 117 $line_tax = get_full_price_for_item($credit_line->stock_id, $credit_line->price, 118 0, $credit_note->tax_included, $credit_note->tax_group_array) - $line_taxfree_price; 119 120 write_customer_trans_detail_item(ST_CUSTCREDIT, $credit_no, $credit_line->stock_id, 121 $credit_line->item_description, $credit_line->qty_dispatched, 122 $credit_line->line_price(), $line_tax, $credit_line->discount_percent, 123 $credit_line->standard_cost, $credit_line->src_id, $trans_no==0 ? 0: $credit_line->id); 124 125 add_credit_movements_item($credit_note, $credit_line, 126 $credit_type, $line_taxfree_price+$line_tax, $credit_invoice); 127 128 $total += add_gl_trans_credit_costs($credit_note, $credit_line, $credit_no, 129 $credit_date, $credit_type, $write_off_acc, $branch_data); 130 } /*end of credit_line loop */ 131 132 /*Post credit note transaction to GL credit debtors, 133 debit freight re-charged and debit sales */ 134 135 if (($credit_note_total + $credit_note->freight_cost) != 0) { 136 137 $total += add_gl_trans_customer(ST_CUSTCREDIT, $credit_no, $credit_date, $branch_data["receivables_account"], 0, 0, 138 -($credit_note_total + $credit_note->freight_cost + $items_added_tax + $freight_added_tax), 139 $credit_note->customer_id, 140 "The total debtor GL posting for the credit note could not be inserted"); 141 } 142 143 if ($credit_note->freight_cost != 0) { 144 $total += add_gl_trans_customer(ST_CUSTCREDIT, $credit_no, $credit_date, $company_data["freight_act"], 0, 0, 145 $credit_note->get_tax_free_shipping(), $credit_note->customer_id, 146 "The freight GL posting for this credit note could not be inserted"); 147 } 148 149 foreach ($taxes as $taxitem) { 150 if ($taxitem['Net'] != 0) { 151 152 $ex_rate = get_exchange_rate_from_home_currency(get_customer_currency($credit_note->customer_id), $credit_note->document_date); 153 add_trans_tax_details(ST_CUSTCREDIT, $credit_no, $taxitem['tax_type_id'], 154 $taxitem['rate'], $credit_note->tax_included, $taxitem['Value'], 155 $taxitem['Net'], $ex_rate, 156 $credit_note->document_date, $credit_note->reference); 157 158 $total += add_gl_trans_customer(ST_CUSTCREDIT, $credit_no, $credit_date, $taxitem['sales_gl_code'], 0, 0, 159 $taxitem['Value'], $credit_note->customer_id, 160 "A tax GL posting for this credit note could not be inserted"); 161 } 162 } 163 /*Post a balance post if $total != 0 */ 164 add_gl_balance(ST_CUSTCREDIT, $credit_no, $credit_date, -$total, PT_CUSTOMER, $credit_note->customer_id); 165 166 add_comments(ST_CUSTCREDIT, $credit_no, $credit_date, $credit_note->Comments); 167 168 if ($trans_no == 0) { 169 $Refs->save(ST_CUSTCREDIT, $credit_no, $credit_note->reference); 170 } 171 hook_db_postwrite($credit_note, ST_CUSTCREDIT); 172 commit_transaction(); 173 174 return $credit_no; 175} 176 177//---------------------------------------------------------------------------------------- 178// Insert a stock movement coming back in to show the credit note and 179// a reversing stock movement to show the write off 180// 181 182function add_credit_movements_item(&$credit_note, &$credit_line, 183 $credit_type, $price, $credited_invoice=0) 184{ 185 186 //Chaitanya : Stamp current cost in stock moves $credit_line does not fetch cost 187 $curr_std_cost = get_standard_cost($credit_line->stock_id); 188 189 if ($credit_type == "Return") { 190 191 $reference = "Return "; 192 if ($credited_invoice) { 193 $reference .= "Ex Inv: " . $credited_invoice; 194 } 195 196 } elseif ($credit_type == "WriteOff") { 197 198 $reference = "WriteOff "; 199 if ($credited_invoice) 200 $reference .= "Ex Inv: " . $credited_invoice; 201 202 add_stock_move_customer(ST_CUSTCREDIT, $credit_line->stock_id, 203 key($credit_note->trans_no), $credit_note->Location, 204 $credit_note->document_date, $reference, -$credit_line->qty_dispatched, 205 $curr_std_cost, 0, $price, 206 $credit_line->discount_percent); 207 208 } 209 add_stock_move_customer(ST_CUSTCREDIT, $credit_line->stock_id, 210 key($credit_note->trans_no), $credit_note->Location, 211 $credit_note->document_date, $reference, $credit_line->qty_dispatched, 212 $curr_std_cost, 0, $price, 213 $credit_line->discount_percent); 214 215} 216 217//---------------------------------------------------------------------------------------- 218 219function add_gl_trans_credit_costs($order, $order_line, $credit_no, $date_, 220 $credit_type, $write_off_gl_code, &$branch_data) 221{ 222 $stock_gl_codes = get_stock_gl_code($order_line->stock_id); 223 $customer = get_customer($order->customer_id); 224 // 2008-08-01. If there is a Customer Dimension, then override with this, 225 // else take the Item Dimension (if any) 226 $dim = ($order->dimension_id != $customer['dimension_id'] ? $order->dimension_id : 227 ($customer['dimension_id'] != 0 ? $customer["dimension_id"] : $stock_gl_codes["dimension_id"])); 228 $dim2 = ($order->dimension2_id != $customer['dimension2_id'] ? $order->dimension2_id : 229 ($customer['dimension2_id'] != 0 ? $customer["dimension2_id"] : $stock_gl_codes["dimension2_id"])); 230 231 $total = 0; 232 /* insert gl_trans to credit stock and debit cost of sales at standard cost*/ 233 $standard_cost = get_standard_cost($order_line->stock_id); 234 if ($standard_cost != 0) { 235 /*first the cost of sales entry*/ 236 237 $total += add_gl_trans_std_cost(ST_CUSTCREDIT, $credit_no, $date_, $stock_gl_codes["cogs_account"], 238 $dim, $dim2, "", -($standard_cost * $order_line->qty_dispatched), 239 PT_CUSTOMER, $order->customer_id, 240 "The cost of sales GL posting could not be inserted"); 241 242 /*now the stock entry*/ 243 if ($credit_type == "WriteOff") { 244 $stock_entry_account = $write_off_gl_code; 245 } else { 246 $stock_gl_code = get_stock_gl_code($order_line->stock_id); 247 $stock_entry_account = $stock_gl_code["inventory_account"]; 248 } 249 250 $total += add_gl_trans_std_cost(ST_CUSTCREDIT, $credit_no, $date_, $stock_entry_account, 0, 0, 251 "", ($standard_cost * $order_line->qty_dispatched), 252 PT_CUSTOMER, $order->customer_id, 253 "The stock side (or write off) of the cost of sales GL posting could not be inserted"); 254 255 } /* end of if GL and stock integrated and standard cost !=0 */ 256 257 if ($order_line->line_price() != 0) { 258 259 $line_taxfree_price = 260 get_tax_free_price_for_item($order_line->stock_id, $order_line->price, 261 0, $order->tax_included, $order->tax_group_array); 262 263 $line_tax = get_full_price_for_item($order_line->stock_id, $order_line->price, 264 0, $order->tax_included, $order->tax_group_array) - $line_taxfree_price; 265 266 267 //Post sales transaction to GL credit sales 268 269 // 2008-06-14. If there is a Branch Sales Account, then override with this, 270 // else take the Item Sales Account 271 if ($branch_data['sales_account'] != "") 272 $sales_account = $branch_data['sales_account']; 273 else 274 $sales_account = $stock_gl_codes['sales_account']; 275 $total += add_gl_trans_customer(ST_CUSTCREDIT, $credit_no, $date_, $sales_account, $dim, $dim2, 276 ($line_taxfree_price * $order_line->qty_dispatched), $order->customer_id, 277 "The credit note GL posting could not be inserted"); 278 279 if ($order_line->discount_percent != 0) { 280 281 $total += add_gl_trans_customer(ST_CUSTCREDIT, $credit_no, $date_, $branch_data["sales_discount_account"], 282 $dim, $dim2, -($line_taxfree_price * $order_line->qty_dispatched * $order_line->discount_percent), 283 $order->customer_id, 284 "The credit note discount GL posting could not be inserted"); 285 286 } /*end of if discount !=0 */ 287 } /*if line_price!=0 */ 288 return $total; 289} 290 291?>