Files
opensourcepos/application/libraries/Sale_lib.php
pappastech a8dfa2dbe8 * Ver. 2.0.2
+ Fixed multiple giftcards issue per Bug #4 reported on Sourceforge where a
  second giftcard added would have its balance set to $0 even if the sale did
  not require the total of the second giftcard to pay the remaining amount due.
+ Small code cleanup

git-svn-id: svn+ssh://jekkos@svn.code.sf.net/p/opensourcepos/code/@58 c3eb156b-1dc0-44e1-88ae-e38439141b53
2013-03-05 03:09:38 +00:00

498 lines
11 KiB
PHP

<?php
class Sale_lib
{
var $CI;
function __construct()
{
$this->CI =& get_instance();
}
function get_cart()
{
if(!$this->CI->session->userdata('cart'))
$this->set_cart(array());
return $this->CI->session->userdata('cart');
}
function set_cart($cart_data)
{
$this->CI->session->set_userdata('cart',$cart_data);
}
//Alain Multiple Payments
function get_payments()
{
if( !$this->CI->session->userdata( 'payments' ) )
$this->set_payments( array( ) );
return $this->CI->session->userdata('payments');
}
//Alain Multiple Payments
function set_payments($payments_data)
{
$this->CI->session->set_userdata('payments',$payments_data);
}
function get_comment()
{
return $this->CI->session->userdata('comment');
}
function set_comment($comment)
{
$this->CI->session->set_userdata('comment', $comment);
}
function clear_comment()
{
$this->CI->session->unset_userdata('comment');
}
function get_email_receipt()
{
return $this->CI->session->userdata('email_receipt');
}
function set_email_receipt($email_receipt)
{
$this->CI->session->set_userdata('email_receipt', $email_receipt);
}
function clear_email_receipt()
{
$this->CI->session->unset_userdata('email_receipt');
}
function add_payment( $payment_id, $payment_amount )
{
$payments = $this->get_payments();
$payment = array( $payment_id=>
array(
'payment_type' => $payment_id,
'payment_amount' => $payment_amount
)
);
//payment_method already exists, add to payment_amount
if( isset( $payments[$payment_id] ) )
{
$payments[$payment_id]['payment_amount'] += $payment_amount;
}
else
{
//add to existing array
$payments += $payment;
}
$this->set_payments( $payments );
return true;
}
//Alain Multiple Payments
function edit_payment($payment_id,$payment_amount)
{
$payments = $this->get_payments();
if(isset($payments[$payment_id]))
{
$payments[$payment_id]['payment_type'] = $payment_id;
$payments[$payment_id]['payment_amount'] = $payment_amount;
$this->set_payments($payment_id);
}
return false;
}
//Alain Multiple Payments
function delete_payment( $payment_id )
{
$payments = $this->get_payments();
unset( $payments[urldecode( $payment_id )] );
$this->set_payments( $payments );
}
//Alain Multiple Payments
function empty_payments()
{
$this->CI->session->unset_userdata('payments');
}
//Alain Multiple Payments
function get_payments_total()
{
$subtotal = 0;
foreach($this->get_payments() as $payments)
{
$subtotal+=$payments['payment_amount'];
}
return to_currency_no_money($subtotal);
}
//Alain Multiple Payments
function get_amount_due()
{
$amount_due=0;
$payment_total = $this->get_payments_total();
$sales_total=$this->get_total();
$amount_due=to_currency_no_money($sales_total - $payment_total);
return $amount_due;
}
function get_customer()
{
if(!$this->CI->session->userdata('customer'))
$this->set_customer(-1);
return $this->CI->session->userdata('customer');
}
function set_customer($customer_id)
{
$this->CI->session->set_userdata('customer',$customer_id);
}
function get_mode()
{
if(!$this->CI->session->userdata('sale_mode'))
$this->set_mode('sale');
return $this->CI->session->userdata('sale_mode');
}
function set_mode($mode)
{
$this->CI->session->set_userdata('sale_mode',$mode);
}
function add_item($item_id,$quantity=1,$discount=0,$price=null,$description=null,$serialnumber=null)
{
//make sure item exists
if(!$this->CI->Item->exists($item_id))
{
//try to get item id given an item_number
$item_id = $this->CI->Item->get_item_id($item_id);
if(!$item_id)
return false;
}
//Alain Serialization and Description
//Get all items in the cart so far...
$items = $this->get_cart();
//We need to loop through all items in the cart.
//If the item is already there, get it's key($updatekey).
//We also need to get the next key that we are going to use in case we need to add the
//item to the cart. Since items can be deleted, we can't use a count. we use the highest key + 1.
$maxkey=0; //Highest key so far
$itemalreadyinsale=FALSE; //We did not find the item yet.
$insertkey=0; //Key to use for new entry.
$updatekey=0; //Key to use to update(quantity)
foreach ($items as $item)
{
//We primed the loop so maxkey is 0 the first time.
//Also, we have stored the key in the element itself so we can compare.
if($maxkey <= $item['line'])
{
$maxkey = $item['line'];
}
if($item['item_id']==$item_id)
{
$itemalreadyinsale=TRUE;
$updatekey=$item['line'];
}
}
$insertkey=$maxkey+1;
//array/cart records are identified by $insertkey and item_id is just another field.
$item = array(($insertkey)=>
array(
'item_id'=>$item_id,
'line'=>$insertkey,
'name'=>$this->CI->Item->get_info($item_id)->name,
'item_number'=>$this->CI->Item->get_info($item_id)->item_number,
'description'=>$description!=null ? $description: $this->CI->Item->get_info($item_id)->description,
'serialnumber'=>$serialnumber!=null ? $serialnumber: '',
'allow_alt_description'=>$this->CI->Item->get_info($item_id)->allow_alt_description,
'is_serialized'=>$this->CI->Item->get_info($item_id)->is_serialized,
'quantity'=>$quantity,
'discount'=>$discount,
'price'=>$price!=null ? $price: $this->CI->Item->get_info($item_id)->unit_price
)
);
//Item already exists and is not serialized, add to quantity
if($itemalreadyinsale && ($this->CI->Item->get_info($item_id)->is_serialized ==0) )
{
$items[$updatekey]['quantity']+=$quantity;
}
else
{
//add to existing array
$items+=$item;
}
$this->set_cart($items);
return true;
}
function out_of_stock($item_id)
{
//make sure item exists
if(!$this->CI->Item->exists($item_id))
{
//try to get item id given an item_number
$item_id = $this->CI->Item->get_item_id($item_id);
if(!$item_id)
return false;
}
$item = $this->CI->Item->get_info($item_id);
$quanity_added = $this->get_quantity_already_added($item_id);
if ($item->quantity - $quanity_added < 0)
{
return true;
}
return false;
}
function get_quantity_already_added($item_id)
{
$items = $this->get_cart();
$quanity_already_added = 0;
foreach ($items as $item)
{
if($item['item_id']==$item_id)
{
$quanity_already_added+=$item['quantity'];
}
}
return $quanity_already_added;
}
function get_item_id($line_to_get)
{
$items = $this->get_cart();
foreach ($items as $line=>$item)
{
if($line==$line_to_get)
{
return $item['item_id'];
}
}
return -1;
}
function edit_item($line,$description,$serialnumber,$quantity,$discount,$price)
{
$items = $this->get_cart();
if(isset($items[$line]))
{
$items[$line]['description'] = $description;
$items[$line]['serialnumber'] = $serialnumber;
$items[$line]['quantity'] = $quantity;
$items[$line]['discount'] = $discount;
$items[$line]['price'] = $price;
$this->set_cart($items);
}
return false;
}
function is_valid_receipt($receipt_sale_id)
{
//POS #
$pieces = explode(' ',$receipt_sale_id);
if(count($pieces)==2)
{
return $this->CI->Sale->exists($pieces[1]);
}
return false;
}
function is_valid_item_kit($item_kit_id)
{
//KIT #
$pieces = explode(' ',$item_kit_id);
if(count($pieces)==2)
{
return $this->CI->Item_kit->exists($pieces[1]);
}
return false;
}
function return_entire_sale($receipt_sale_id)
{
//POS #
$pieces = explode(' ',$receipt_sale_id);
$sale_id = $pieces[1];
$this->empty_cart();
$this->remove_customer();
foreach($this->CI->Sale->get_sale_items($sale_id)->result() as $row)
{
$this->add_item($row->item_id,-$row->quantity_purchased,$row->discount_percent,$row->item_unit_price,$row->description,$row->serialnumber);
}
$this->set_customer($this->CI->Sale->get_customer($sale_id)->person_id);
}
function add_item_kit($external_item_kit_id)
{
//KIT #
$pieces = explode(' ',$external_item_kit_id);
$item_kit_id = $pieces[1];
foreach ($this->CI->Item_kit_items->get_info($item_kit_id) as $item_kit_item)
{
$this->add_item($item_kit_item['item_id'], $item_kit_item['quantity']);
}
}
function copy_entire_sale($sale_id)
{
$this->empty_cart();
$this->remove_customer();
foreach($this->CI->Sale->get_sale_items($sale_id)->result() as $row)
{
$this->add_item($row->item_id,$row->quantity_purchased,$row->discount_percent,$row->item_unit_price,$row->description,$row->serialnumber);
}
foreach($this->CI->Sale->get_sale_payments($sale_id)->result() as $row)
{
$this->add_payment($row->payment_type,$row->payment_amount);
}
$this->set_customer($this->CI->Sale->get_customer($sale_id)->person_id);
}
function copy_entire_suspended_sale($sale_id)
{
$this->empty_cart();
$this->remove_customer();
foreach($this->CI->Sale_suspended->get_sale_items($sale_id)->result() as $row)
{
$this->add_item($row->item_id,$row->quantity_purchased,$row->discount_percent,$row->item_unit_price,$row->description,$row->serialnumber);
}
foreach($this->CI->Sale_suspended->get_sale_payments($sale_id)->result() as $row)
{
$this->add_payment($row->payment_type,$row->payment_amount);
}
$this->set_customer($this->CI->Sale_suspended->get_customer($sale_id)->person_id);
$this->set_comment($this->CI->Sale_suspended->get_comment($sale_id));
}
function delete_item($line)
{
$items=$this->get_cart();
unset($items[$line]);
$this->set_cart($items);
}
function empty_cart()
{
$this->CI->session->unset_userdata('cart');
}
function remove_customer()
{
$this->CI->session->unset_userdata('customer');
}
function clear_mode()
{
$this->CI->session->unset_userdata('sale_mode');
}
function clear_all()
{
$this->clear_mode();
$this->empty_cart();
$this->clear_comment();
$this->clear_email_receipt();
$this->empty_payments();
$this->remove_customer();
}
function get_taxes()
{
$customer_id = $this->get_customer();
$customer = $this->CI->Customer->get_info($customer_id);
//Do not charge sales tax if we have a customer that is not taxable
if (!$customer->taxable and $customer_id!=-1)
{
return array();
}
$taxes = array();
foreach($this->get_cart() as $line=>$item)
{
$tax_info = $this->CI->Item_taxes->get_info($item['item_id']);
foreach($tax_info as $tax)
{
$name = $tax['percent'].'% ' . $tax['name'];
$tax_amount=($item['price']*$item['quantity']-$item['price']*$item['quantity']*$item['discount']/100)*(($tax['percent'])/100);
if (!isset($taxes[$name]))
{
$taxes[$name] = 0;
}
$taxes[$name] += $tax_amount;
}
}
return $taxes;
}
function get_subtotal()
{
$subtotal = 0;
foreach($this->get_cart() as $item)
{
$subtotal+=($item['price']*$item['quantity']-$item['price']*$item['quantity']*$item['discount']/100);
}
return to_currency_no_money($subtotal);
}
function get_total()
{
$total = 0;
foreach($this->get_cart() as $item)
{
$total += ( $item['price'] * $item['quantity'] - $item['price'] * $item['quantity'] * $item['discount'] / 100);
}
foreach($this->get_taxes() as $tax)
{
$total+=$tax;
}
return to_currency_no_money($total);
}
}
?>