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 include_once($path_to_root . "/purchasing/includes/supp_trans_class.inc");
14 include_once($path_to_root . "/includes/banking.inc");
15 include_once($path_to_root . "/includes/inventory.inc");
17 include_once($path_to_root . "/includes/date_functions.inc");
19 include_once($path_to_root . "/includes/db/allocations_db.inc");
21 include_once($path_to_root . "/purchasing/includes/db/supp_trans_db.inc");
22 include_once($path_to_root . "/purchasing/includes/db/po_db.inc");
23 include_once($path_to_root . "/purchasing/includes/db/grn_db.inc");
24 include_once($path_to_root . "/purchasing/includes/db/invoice_db.inc");
25 include_once($path_to_root . "/purchasing/includes/db/suppalloc_db.inc");
26 include_once($path_to_root . "/purchasing/includes/db/supp_payment_db.inc");
27 include_once($path_to_root . "/purchasing/includes/db/suppliers_db.inc");
29 //-------------------------------------------------------------------------------------------------------------
31 // add a supplier-related gl transaction
32 // $date_ is display date (non-sql)
33 // $amount is in SUPPLIERS'S currency
35 function add_gl_trans_supplier($type, $type_no, $date_, $account, $dimension, $dimension2,
36 $amount, $supplier_id, $rate=0, $memo="")
38 return add_gl_trans($type, $type_no, $date_, $account, $dimension, $dimension2, $memo,
39 $amount, get_supplier_currency($supplier_id),
40 PT_SUPPLIER, $supplier_id, $rate);
43 //----------------------------------------------------------------------------------------
45 function get_purchase_price($supplier_id, $stock_id)
47 $sql = "SELECT price, conversion_factor FROM ".TB_PREF."purch_data
48 WHERE supplier_id = ".db_escape($supplier_id) . "
49 AND stock_id = ".db_escape($stock_id);
50 $result = db_query($sql, "The supplier pricing details for " . $stock_id . " could not be retrieved");
52 if (db_num_rows($result) == 1)
54 $myrow = db_fetch($result);
55 return $myrow["price"] / $myrow['conversion_factor'];
63 function get_purchase_conversion_factor($supplier_id, $stock_id)
65 $sql = "SELECT conversion_factor FROM ".TB_PREF."purch_data
66 WHERE supplier_id = ".db_escape($supplier_id)."
67 AND stock_id = ".db_escape($stock_id);
68 $result = db_query($sql, "The supplier pricing details for " . $stock_id . " could not be retrieved");
70 if (db_num_rows($result) == 1)
72 $myrow = db_fetch($result);
73 return $myrow['conversion_factor'];
80 //----------------------------------------------------------------------------------------
82 function get_purchase_data($supplier_id, $stock_id)
84 $sql = "SELECT * FROM ".TB_PREF."purch_data
85 WHERE supplier_id = ".db_escape($supplier_id) . "
86 AND stock_id = ".db_escape($stock_id);
87 $result = db_query($sql, "The supplier pricing details for " . $stock_id . " could not be retrieved");
89 return db_fetch($result);
92 function add_or_update_purchase_data($supplier_id, $stock_id, $price, $description="", $uom="")
94 $data = get_purchase_data($supplier_id, $stock_id);
97 $sql = "INSERT INTO ".TB_PREF."purch_data (supplier_id, stock_id, price, suppliers_uom,
98 conversion_factor, supplier_description) VALUES (".db_escape($supplier_id)
99 .", ".db_escape($stock_id).", ".db_escape($price).", "
100 .db_escape($uom).", 1, ".db_escape($description).")";
101 db_query($sql,"The supplier purchasing details could not be added");
104 $price = round($price * $data['conversion_factor'], user_price_dec());
105 $sql = "UPDATE ".TB_PREF."purch_data SET price=".db_escape($price);
107 $sql .= ",suppliers_uom=".db_escape($uom);
108 if ($description != "")
109 $sql .= ",supplier_description=".db_escape($description);
110 $sql .= " WHERE stock_id=".db_escape($stock_id)." AND supplier_id=".db_escape($supplier_id);
111 db_query($sql,"The supplier purchasing details could not be updated");
115 function get_po_prepayments($supp_trans)
117 // collect purchase order line ids
118 $allocations = array();
120 foreach($supp_trans->grn_items as $item)
121 if ($item->po_detail_item)
122 $line_ids[] = $item->po_detail_item;
124 if (!count($line_ids))
127 $sql = "SELECT DISTINCT allocs.*
128 FROM ".TB_PREF."supp_allocations allocs
129 LEFT JOIN ".TB_PREF."purch_order_details line ON line.order_no=allocs.trans_no_to AND trans_type_to=".ST_PURCHORDER."
130 WHERE line.po_detail_item IN(".implode(',', array_values($line_ids)).")";
132 $result = db_query($sql, "Cannot retrieve po prepayments");
134 while($dat = db_fetch($result))
136 $allocations[] = $dat;
143 //------------------------------------ Backend interfaces--------------------------------------------
145 //---------------------------------------------------------------------------------------------------
147 // Add Purchase Order, GRN or Purchase Invoice with parent auto documents (if any)
149 function add_direct_supp_trans($cart)
151 global $Refs, $type_shortcuts;
153 begin_transaction(__FUNCTION__, func_get_args());
155 if ($cart->trans_type != ST_PURCHORDER) {
156 // for direct grn/invoice set same dates for lines as for whole document
157 foreach ($cart->line_items as $line_no =>$line)
158 $cart->line_items[$line_no]->req_del_date = $cart->tran_date;
161 $ref = $cart->reference;
162 if ($cart->trans_type != ST_PURCHORDER) {
163 $cart->reference = 'auto';
165 $order_no = add_po($cart);
166 $cart->order_no = $order_no;
168 if ($cart->trans_type == ST_PURCHORDER) {
169 commit_transaction();
174 if ($cart->trans_type == ST_SUPPRECEIVE)
175 $cart->reference = $ref;
176 if ($cart->trans_type != ST_SUPPINVOICE)
177 $cart->Comments = $cart->reference; //grn does not hold supp_ref
179 $grn_no = write_grn($cart);
180 if ($cart->trans_type == ST_SUPPRECEIVE) {
181 commit_transaction(); // save PO+GRN
184 // Direct Purchase Invoice
185 $inv = new supp_trans(ST_SUPPINVOICE);
186 $inv->Comments = $cart->Comments;
187 $inv->supplier_id = $cart->supplier_id;
188 $inv->tran_date = $cart->tran_date;
189 $inv->due_date = $cart->due_date;
190 $inv->dimension = $cart->dimension;
191 $inv->dimension2 = $cart->dimension2;
192 $inv->reference = $ref;
193 $inv->supp_reference = $cart->supp_ref;
194 $inv->tax_included = $cart->tax_included;
195 $supp = get_supplier($cart->supplier_id);
196 $inv->tax_group_id = $supp['tax_group_id'];
197 $inv->ov_amount = $inv->ov_gst = $inv->ov_discount = 0;
199 foreach($cart->line_items as $key => $line) {
200 $inv->add_grn_to_trans($line->grn_item_id, $line->po_item_id, $line->stock_id,
201 $line->item_description, $line->quantity, 0, $line->quantity,
202 $line->price, $line->price, true, get_unit_cost($line->stock_id), '');
204 $total += round2(($line->quantity * $line->price), user_price_dec());
206 $inv->tax_overrides = $cart->tax_overrides;
207 if (!$inv->tax_included) {
208 $taxes = $inv->get_taxes();
209 foreach( $taxes as $taxitem) {
210 $total += isset($taxitem['Override']) ? $taxitem['Override'] : $taxitem['Value'];
213 $inv->ex_rate = $cart->ex_rate;
215 $inv_no = add_supp_invoice($inv);
217 if ($cart->cash_account) {
218 $pmt_no = write_supp_payment(0, $inv->supplier_id, $cart->cash_account, $inv->tran_date, $Refs->get_next(ST_SUPPAYMENT, null, $inv->tran_date),
219 $total, 0, _('Payment for:').$inv->supp_reference .' ('.$type_shortcuts[ST_SUPPINVOICE].$inv_no.')');
220 add_supp_allocation($total, ST_SUPPAYMENT, $pmt_no, ST_SUPPINVOICE, $inv_no, $inv->supplier_id, $inv->tran_date);
221 update_supp_trans_allocation(ST_SUPPINVOICE, $inv_no, $inv->supplier_id);
222 update_supp_trans_allocation(ST_SUPPAYMENT, $pmt_no, $inv->supplier_id);
224 commit_transaction(); // save PO+GRN+PI(+SP)
228 function write_supplier($supplier_id, $supp_name, $ref, $address, $supp_address, $gst_no,
229 $website, $supp_account_no, $bank_account, $credit_limit = 0, $dim1, $dim2, $curr_code,
230 $payment_terms, $payable_account, $purchase_account, $payment_discount_account,
231 $notes, $tax_group_id, $tax_included, $contact, $phone, $phone2, $fax, $email, $lang, $inactive=null)
233 begin_transaction(__FUNCTION__, func_get_args());
235 update_supplier($supplier_id, $supp_name, $ref, $address, $supp_address, $gst_no,
236 $website, $supp_account_no, $bank_account, $credit_limit = 0, $dim1, $dim2, $curr_code,
237 $payment_terms, $payable_account, $purchase_account, $payment_discount_account,
238 $notes, $tax_group_id, $tax_included);
240 if ( isset($inactive) )
241 update_record_status($supplier_id, $inactive, 'suppliers', 'supplier_id');
243 add_supplier($supp_name, $ref, $address, $supp_address, $gst_no,
244 $website, $supp_account_no, $bank_account, $credit_limit = 0, $dim1, $dim2, $curr_code,
245 $payment_terms, $payable_account, $purchase_account, $payment_discount_account,
246 $notes, $tax_group_id, $tax_included);
247 $supplier_id = db_insert_id();
249 add_crm_person($ref, $contact, '', $address, $phone, $phone2, $fax, $email, $lang, '');
251 add_crm_contact('supplier', 'general', $supplier_id, db_insert_id());
253 commit_transaction();
257 function write_supp_allocation($cart)
259 begin_transaction(__FUNCTION__, func_get_args());
260 $result = $cart->write();
261 commit_transaction();
265 function save_supp_payment($cart, $supplier_id, $bank_account, $trans_date, $ref, $amount, $memo, $charge, $bank_amount)
267 begin_transaction(__FUNCTION__, func_get_args());
270 foreach($cart->allocs as $alloc)
271 if ($alloc->discount_confirmed)
272 $discount += $alloc->early_discount*$alloc->amount;
274 $payment_no = write_supp_payment($cart->trans_no, $supplier_id, $bank_account, $trans_date, $ref, $amount,
275 $discount, $memo, $charge, $bank_amount);
277 $cart->trans_no = $payment_no;
278 $cart->date_ = $trans_date;
281 commit_transaction();