So I can't quite figure out what is wrong here. I am trying to calculate Sales Tax into a grand total. I'm trying to get two variables here:
A. The total amount of sales tax that is being charged (i.e. $0.61 for sales tax)
B. The Grand total including the item price times the quantity plus the sales tax.
My script is as below, The way I have this set up right now it only adds a penny to the sub total. (instead of $7.00 the total is $7.01)
If the sub total after each item is $7.00 and the tax rate is 8.650% then the tax total should be $0.61 and the grand total should be $7.61 but it's making it $7.01 instead.
public function invoice_totals($invoice_id)
{
$query = $this->CI->db->select('*');
$query = $this->CI->db->from('invoice_to_items');
$query = $this->CI->db->where('invoice_id', $invoice_id);
$query = $this->CI->db->join('items', 'items.item_id = invoice_to_items.item_id');
$query = $this->CI->db->get();
$items = $query->result();
$sub_total = '0.00';
$grand_total = '0.00';
$tax_rate = '0.0865';
$tax_total = '0.00';
foreach($items as $item)
{
$sub_total = $sub_total + ($item->item_price*$item->item_qty);
$tax_total = $tax_total + ($sub_total * $tax_rate) / 100;
}
$grand_total = $grand_total + $sub_total + $tax_total;
return array(
'sub_total' => number_format($sub_total,2),
'tax_total' => number_format($tax_total, 2),
'grand_total' => number_format($grand_total,2),
);
}
The main line I am concerned with in this question is:
$tax_total = $tax_total + ($sub_total * $tax_rate) / 100;
You're applying your taxes to your subtotal on EVERY iteration of the loop.
let's say there's 3 items: $5, $15, $40
loop #1:
subtotal = 0 + ($5 * 1) = $5
total = 0 + ($5 + 8.65%) = $5.43
loop #2: $5.43 + ($15 * 1) = $20.43
total = $5.43 + ($20.43 + 8.65%) = etc...
etc...
your #2 item has now double-taxed the first item, and your third item will be TRIPLE taxing the first item and DOUBLE taxing the second item, etc...
As well, your tax rate value is ALREADY a decimal (0.0865), yet you're doing a /100 division as if you had $tax_rate = 8.65. So effectively your tax rate is really 0.0865%
Your loop should be:
$taxrate = 8.65; // % value
foreach($items as $item) {
$item_sub = $items->quantity * $items->price;
$item_total = $item_sub * ($taxrate / 100);
$grand_total = $grand_total + $item_total;
}
Related
How do I subtract all taxes from a price with tax in OpenCart?
In the example below I use the default "Taxable goods" tax setting from OpenCart, which is 20% VAT + $2,00 Eco-Tax.
$number = 20.80
// Get $number tax:
$tax = $this->tax->getTax( $number , $product_info['tax_class_id'] , $this->config->get('config_tax') );
// Subtract tax from total price:
$result = $this->currency->format( ( $number - $tax ) , $this->session->data['currency'] );
This returns an incorrect value of $14,64 because it calculates the tax on $number (20,80), which already is a price with tax. The correct price for $20,80 without tax should be $15,67
This should be the formula in this case:
(20.80 - 2.00) / 120 * 100 = 15.6667
Is there any way to subtract all taxes from a price that already has tax included?
$taxRate = 20;
$gross = 150;
$divisor = (100 + $taxRate) / 100;
$net = round( $gross / $divisor, 2);
$tax = round( $gross - $net, 2 );
Echo "Gross was $gross - Net is $net Tax is $tax";
RESULT with 20% tax
Gross was 150 - Net is 133.33 Tax is 16.67
RESULT with 15% tax
Gross was 150 - Net is 130.43 Tax is 19.57
Try a few dry runs and then check with this code
if your tax for example is 21% and you have product with tax=120.. Without tax will be: 120/1.21.
so if Tax rate:
$tax_rate = 21;
product price:
$price = 120;
Price without tax:
$price_without_tax = $price/($tax_rate/100 +1);
I'm having trouble calculating the discount of total order amount of products that is multiplied by 100.
In my database I'm saving the product price multiplied by 100 e.g.: $price = 33.5 * 100 I'm doing this to prevent wrong calculation of the decimal point .5 when retrieving the data and adding those to other products.
So I have this for now
$test_product_price = 10000 // actual price is 100 because it's save multiplied by 100
$quantity = 3;
$discount = 10.5%;
$order_amount = $test_product_price * 3 // will produce 30000 but actual price is 300 when divided by 100
Now what I want is deduct the $discount which is 10.5%
for actual amount this is working fine
$discounted_amount = 300 - (300 * (10.5 / 100)); // will produce 268.5
but how can I do that on my end that is my amounts are multiplied by 100
Possibly a bit long winded but accurate;
<?php
$amount = 100;
$number = 3;
$percent = 10.5;
$subtotal = $amount * $number;
$discount = ($percent / 100) * $subtotal;
$total = $subtotal - $discount;
$total = number_format((float)$total, 2, '.', '');
echo $total;
?>
trying to create a loop to calculate a price but cant get my head around how to do it.
$sell = ($price*$vat);
$profit = ((($price*$vat)*0.04)+0.2);
function newSell($price1){
$price1 = $price1 + 0.10;
return $price;
}
do {
$price1 = newSell($price);
$profit = ((($price1*$vat)*0.04)+0.2);
} while ($profit < 0);
$price is the price of my item
$sell is my starting price.
$profit is the calcualtion to work out my profit.
What i want to do is look around and if my profit is less than 0 i want to add 10p (0.10) to my price and then recalculate my profit and evaluate it again. Want to keep going until my profit is above 1 at which point it stops and my new selling price has been set.
Cant for the life of me get my head around this!
Many thanks
First of all your newSell function should look like this:
function newSell($price) {
return $price + .1
}
It currently does nothing.
Second, are you sure this is the way you should be trying to solve this? It seems to me like you are just trying to solve for $profit >= 1. It's a simple equation that takes no loops whatsoever.
Apparently $profit = $price * $vat * .04 + .2, so you are really looking at 1 <= $price * $vat * .04 + .2 or 20 / $vat <= $price
So if $price >= 20 / $vat then $profit >= 1.
To do specifically what you asked:
do {
$profit = $price * $vat * .04 + .2;
$price = $price + .1;
} while ($profit < 1);
I am working with some code which will apply a discount to an item should the item be bought in multiples that are dividable by 2, this works if I put in any number dividable by 2.
The problem is if the user inputs say 3, I would still like the discount to be applied as they have bought 2 together plus another.
What would be the best approach to tackling this? This is the code I'm working with:
if($price == 11.99 && $each_item['quantity'] % 2 == 0)
{
$toAdd = 3.98 * ($each_item['quantity'] / 2);
$discount += $toAdd;
$priceTotal = $price * $each_item['quantity'];
$priceTotal -= $discount;
$finalDiscount += $discount;
}
Divide the quantity by 2, and round it down to an integer to get the number of discounts to apply.
if ($price == 11.99) {
$to_add = 3.98 * floor($each_item['quanity']/2);
$discount += $toAdd;
$priceTotal = $price * $each_item['quantity'];
$priceTotal -= $discount;
$finalDiscount += $discount;
}
I trying to calculate but can't get this done, if someone can help
I have the total of the order and the vat at 23%
$vat = 23;
$total = 6.00;
For add the vat to total I will do
$total_with_vat = $total * $vat;
that will be 7.40
I now the total is 6.00, but how can I get the 1.40 of the vat
I need this to make some calculations. Looks simple but I'am not getting only to do it.
Thanks
Pretty simple
$vat = $total * $vat / 100.0;
// 1.38
If you'd like to guarantee 2 digits of precision, you can use round
$vat = round($vat, 2);
Make it into a reusable function
function calculateVat($amount, $vat=23) {
return round($amount * $vat / 100.0, 2);
}
$amount = 6.00;
$vat = calculateVat($amount);
// 1.38
If VAT is a different amount, you can specify it as a second argument
$amount = 6.00;
$vat = calculateVat($amount, 30);
// 1.8