X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=sales%2Fincludes%2Fcart_class.inc;h=13f383bfb8b70ff3e43634c7c25612bc475bb34c;hb=4fb55e726607d40a22272c0c432c3df8b422b447;hp=501ab6a93120346b69ec13acf685719d6b8f9668;hpb=0c760ea65c8c6f0a45ea8328abab53be649f2105;p=fa-stable.git diff --git a/sales/includes/cart_class.inc b/sales/includes/cart_class.inc index 501ab6a9..13f383bf 100644 --- a/sales/includes/cart_class.inc +++ b/sales/includes/cart_class.inc @@ -21,7 +21,7 @@ iv) a delivery note include_once($path_to_root . "/inventory/includes/inventory_db.inc"); include_once($path_to_root . "/taxes/tax_calc.inc"); -class cart +class Cart { var $trans_type; // invoice, order, quotation, delivery note ... var $trans_no = array();// array (num1=>ver1,..) or 0 for new @@ -73,13 +73,16 @@ class cart var $payment; var $payment_terms; // cached payment terms var $credit; - // prepayment mode: var $prepaid; // true for documents issued in prepayment mode var $prep_amount; // prepayment required for SO, invoiced amount for prepaiament invoice var $sum_paid; // sum of all allocated prepayments both to order and related invoices var $alloc; // sum of payments allocated to this document var $prepayments = array(); // allocation records for this document + var $ex_rate; + + var $fixed_asset = false; + //------------------------------------------------------------------------- // // $trans_no==0 => open new/direct document @@ -101,7 +104,28 @@ class cart $this->read($type, $trans_no, $prepare_child); $this->cart_id = uniqid(''); } - + + /* + Optional sorting items by stock_id. + */ + function _cmp_lines($a, $b) + { + return strcmp($a->stock_id, $b->stock_id); + } + + /* + Returns items array optionally sorted by item code. + */ + function get_items() + { + global $SysPrefs; + + $items = $this->line_items; + if (@$SysPrefs->sort_sales_items) + uasort($items, array($this, '_cmp_lines')); + + return $items; + } // // Prepare cart to new child document entry, just after initial parent doc read. // @@ -113,7 +137,11 @@ class cart $type = get_child_type($this->trans_type); $this->trans_type = $type; - $this->reference = $Refs->get_next($this->trans_type); + $this->reference = $Refs->get_next($this->trans_type, null, array('date' => $this->document_date, + 'customer' => $this->customer_id, 'branch' => $this->Branch)); + if ($type == ST_CUSTCREDIT) + $this->src_date = $this->document_date; + $this->document_date = new_doc_date(); for($line_no = 0; $line_no < count($this->line_items); $line_no++) { @@ -135,9 +163,6 @@ class cart $this->due_date = get_invoice_duedate($this->payment, $this->document_date); } - if ($type == ST_CUSTCREDIT) - $this->src_date = $this->document_date; - $this->src_docs = $this->trans_no; $this->trans_no = 0; } @@ -157,6 +182,11 @@ class cart while (($line_no < count($this->line_items)) && ($srcline = db_fetch($srcdetails))) { $line = &$this->line_items[$line_no]; $src_docs[] = $src_type == ST_SALESORDER ? $srcline['order_no'] : $srcline['debtor_trans_no']; + while($srcline['id'] != $line->src_id) // Logic : This will increment the line_items array till sales_order line is matched. + { // Fixes Delivery note bug : Parent constraints not working if sales order line deleted after delivery + $line_no++; + $line = &$this->line_items[$line_no]; + } if ($srcline['id'] == $line->src_id) { if ($this->trans_type == ST_SALESINVOICE) $line->src_no = $srcline['debtor_trans_no']; @@ -187,64 +217,65 @@ class cart if ($type == ST_SALESORDER || $type == ST_SALESQUOTE) { // sales order || sales quotation read_sales_order($trans_no[0], $this, $type); } else { // other type of sales transaction - read_sales_trans($type, $trans_no, $this); - $this->prepayments = get_payments_for($trans_no[0], $type); - if ($this->order_no) { // free hand credit notes have no order_no - $sodata = get_sales_order_header($this->order_no, ST_SALESORDER); - $this->cust_ref = $sodata["customer_ref"]; - // currently currency is hard linked to debtor account - // $this->customer_currency = $sodata["curr_code"]; - $this->delivery_to = $sodata["deliver_to"]; - $this->delivery_address = $sodata["delivery_address"]; - // child transaction reedition - update with parent info unless it is freehand - if (!$this->is_prepaid() && !$prepare_child) // this is read for view/reedition - $this->set_parent_constraints($sodata, $trans_no[0]); - } + read_sales_trans($type, $trans_no, $this); + $this->prepayments = get_payments_for($trans_no[0], $type, $this->customer_id); + $this->update_payments(); + if ($this->order_no) { // free hand credit notes have no order_no + $sodata = get_sales_order_header($this->order_no, ST_SALESORDER); + $this->cust_ref = $sodata["customer_ref"]; + // currently currency is hard linked to debtor account + $this->delivery_to = $sodata["deliver_to"]; + $this->delivery_address = $sodata["delivery_address"]; + // child transaction reedition - update with parent info unless it is freehand + if (!$this->is_prepaid() && !$prepare_child) // this is read for view/reedition + $this->set_parent_constraints($sodata, $trans_no[0]); + } } // convert document into child and prepare qtys for entry if ($prepare_child) $this->prepare_child($prepare_child); } else { // new document - $this->trans_type = $type; - $this->trans_no = 0; - $this->customer_currency = get_company_currency(); - // set new sales document defaults here - if (get_global_customer() != ALL_TEXT) - $this->customer_id = get_global_customer(); - else - $this->customer_id = ''; - $this->document_date = new_doc_date(); - if (!is_date_in_fiscalyear($this->document_date)) - $this->document_date = end_fiscalyear(); - $this->reference = $Refs->get_next($this->trans_type); - if ($type != ST_SALESORDER && $type != ST_SALESQUOTE) // Added 2.1 Joe Hunt 2008-11-12 + $this->trans_type = $type; + $this->trans_no = 0; + $this->customer_currency = get_company_currency(); + // set new sales document defaults here + if (get_global_customer() != ALL_TEXT) + $this->customer_id = get_global_customer(); + else + $this->customer_id = ''; + $this->document_date = new_doc_date(); + if (!is_date_in_fiscalyear($this->document_date)) + $this->document_date = end_fiscalyear(); + $this->reference = $Refs->get_next($this->trans_type, null, array('date' => Today(), + 'customer' => $this->customer_id)); + if ($type != ST_SALESORDER && $type != ST_SALESQUOTE) // Added 2.1 Joe Hunt 2008-11-12 + { + $dim = get_company_pref('use_dimension'); + if ($dim > 0) { - $dim = get_company_pref('use_dimension'); - if ($dim > 0) + if ($this->customer_id == '') + $this->dimension_id = 0; + else + { + $cust = get_customer($this->customer_id); + $this->dimension_id = $cust['dimension_id']; + } + if ($dim > 1) { if ($this->customer_id == '') - $this->dimension_id = 0; + $this->dimension2_id = 0; else - { - $cust = get_customer($this->customer_id); - $this->dimension_id = $cust['dimension_id']; - } - if ($dim > 1) - { - if ($this->customer_id == '') - $this->dimension2_id = 0; - else - $this->dimension2_id = $cust['dimension2_id']; - } + $this->dimension2_id = $cust['dimension2_id']; } - } - if ($type == ST_SALESINVOICE) { - $this->due_date = - get_invoice_duedate($this->payment, $this->document_date); - } else - $this->due_date = - add_days($this->document_date, $SysPrefs->default_delivery_required_by()); + } + } + if ($type == ST_SALESINVOICE) { + $this->due_date = + get_invoice_duedate($this->payment, $this->document_date); + } else + $this->due_date = + add_days($this->document_date, $SysPrefs->default_delivery_required_by()); } $this->credit = get_current_cust_credit($this->customer_id); } @@ -266,6 +297,8 @@ class cart $ref = $this->reference; $date = $this->document_date; $due_date = $this->due_date; + $dimension_id = $this->dimension_id; + $dimension2_id = $this->dimension2_id; $this->trans_type = get_parent_type($this->trans_type); $this->reference = 'auto'; @@ -276,6 +309,8 @@ class cart $this->document_date = $date; $this->reference = $ref; $this->due_date = $due_date; + $this->dimension_id = $dimension_id; + $this->dimension2_id = $dimension2_id; } $this->reference = @html_entity_decode($this->reference, ENT_QUOTES); $this->Comments = @html_entity_decode($this->Comments, ENT_QUOTES); @@ -476,7 +511,7 @@ class cart } $taxes = get_tax_for_items($items, $prices, $shipping_cost, - $this->tax_group_id, $this->tax_included, $this->tax_group_array); + $this->tax_group_id, $this->tax_included, $this->tax_group_array); // Adjustment for swiss franken, we always have 5 rappen = 1/20 franken if ($this->customer_currency == 'CHF') { @@ -532,12 +567,46 @@ class cart return $total; } + /* + Checks cart quantities on document_date. + Returns array of stock_ids which stock quantities would go negative on some day. + */ + function check_qoh($date=null, $location=null) + { + $low_stock = array(); + // check only for customer delivery and direct sales invoice + if (!($this->trans_type == ST_CUSTDELIVERY || ($this->trans_type == ST_SALESINVOICE && $this->trans_no==0))) + return $low_stock; + + // collect quantities by stock_id + $qtys = array(); + foreach ($this->line_items as $line_no => $line_item) + { + if (has_stock_holding($line_item->mb_flag)) + { + if (!$this->trans_no) // new delivery + $qtys[$line_item->stock_id]['qty'] = $line_item->qty_dispatched + @$qtys[$line_item->stock_id]['qty']; + else // DN modification: check change in quantity + $qtys[$line_item->stock_id]['qty'] = ($line_item->qty_dispatched-$line_item->qty_old) + @$qtys[$line_item->stock_id]['qty']; + $qtys[$line_item->stock_id]['line'] = $line_no; + } + } + + foreach($qtys as $stock_id => $sum) + { + if (check_negative_stock($stock_id, -$sum['qty'], $location ? $location : $this->Location, $date ? $date : $this->document_date)) + $low_stock[] = $stock_id; + } + + return $low_stock; + } + /* Returns true for documents issued in prepayment cycle. */ function is_prepaid() { - return $this->prepaid; //floatcmp($this->prep_amount, 0) > 0; + return $this->prepaid; } /* Order is ready for delivery in prepament mode. @@ -568,12 +637,12 @@ class cart $remainder = prepaid_invoice_remainder($this->order_no); // recalculate prepaid part from payments - if ($this->payment_terms['days_before_due'] < 0) + if ($this->payment_terms['days_before_due'] == -1) { // this is partial invoice for selected prepayments made. $paid = 0; foreach($this->prepayments as $payment) $paid += $payment['amt']; - $this->prep_amount = min($remainder, $paid); + $this->prep_amount = $this->trans_no ? $paid : min($remainder, $paid); } else // this is final invoice $this->prep_amount = $remainder; } @@ -644,7 +713,6 @@ class line_details $this->item_description = $item_row["description"]; else $this->item_description = $description; - //$this->standard_cost = $item_row["material_cost"] + $item_row["labour_cost"] + $item_row["overhead_cost"]; $this->tax_type = $item_row["tax_type_id"]; $this->tax_type_name = $item_row["tax_type_name"]; $this->stock_id = $stock_id; @@ -664,4 +732,3 @@ class line_details } } -?>