2014-02-06 2 views
0

Я пытаюсь пересчитать налог на продажу после его ввода в базу данных. Я могу правильно вычислить информацию перед хранением в базе данных, но вычисление ее из базы данных для целей отчетности оказалось затруднительным из-за ошибок округления.Правильный расчет налога с использованием Mysql и php

Приложение отображает интерфейс, который позволяет добавлять элементы и просматривать промежуточные итоги, налоги и суммы.

Пример входных данных:

Пункт 1: 9,95

Пункт 2: 2,95

Итого: 12.90

налогов (может быть различным для каждого элемента, но теперь они все то же для каждого элемента)

2,900%: 0,37

1,000%: 0,13

1,100%: 0,14

3,000%: 0,39

Tax Всего: 1,03

Итого: 13,93

То, как рассчитать перед хранением в базе данных:

foreach Item as $price 
{ 
    foreach Tax as $percent 
    { 
    $taxes[$percent]+=$price*($percent/100); 
    } 
} 

foreach($taxes as $percent => $tax_amount) 
{ 
    $taxes[$percent] = ROUND_TO_2_DECIMALS($tax_amount); 
} 

После расчета всей этой информации я храню информацию в базе данных, которую можно получить позже для целей отчетности.

Пример схемы:

phppos_sales_items 
- sale_id 
- item_id 
- price 

phppos_sales_items_taxes 
- sale_id 
- item_id 
- tax_percent 

Примеры данных для таблицы phppos_sales_items

sale_id: 1, item_id: 1, item_unit_price: 9.95

sale_id: 1, item_id: 2, item_unit_price: 2.95

Данные примера для таблицы phppos_sales_items_taxes

sale_id: 1, item_id: 1, процент: 2.90

sale_id: 1, item_id: 1, процент: 1,00

sale_id: 1, item_id: 1, процент: 1.10

sale_id: 1, item_id: 1, процентов: 3.00

sale_id: 1, item_id: 2, в процентах: 2,90

sale_id: 1, item_id: 2, процентов: 1.00

sale_id: 1, item_id: 2, проценты: 1,10

sale_id: 1, item_id: 2, проценты: 3,00

Пример запрос для расчета налога для продажи

(SELECT SUM(tax) FROM (SELECT ROUND((item_unit_price)*(SUM(percent)/100),2) as tax 
FROM phppos_sales_items 
INNER JOIN phppos_sales_items_taxes USING (sale_id, item_id) 
WHERE sale_id = 1 
GROUP BY sale_id, item_id) as tax) 

Выход 1.04, когда мне нужно получить 1.03. Этот запрос работает в большинстве случаев, но он сильно терпит неудачу, когда возникают проблемы округления.

Мне нужно иметь возможность генерировать сводную информационную информацию с помощью sql. Я открыт для любых предложений о том, как рассчитать информацию до продажи и в базе данных.

+0

Просто круглый в самом конце. Вокруг вашей СУМ вместо каждого налога отдельно. Как я понимаю, налог выплачивается по окончательной сумме, поэтому только округлить. В противном случае, если налог взимается за каждый товар отдельно, тогда ваш запрос будет правильным. Это две разные формулы, и это неверно, зависит от того, как это делается на самом деле. – sashkello

+0

Как вы думаете, что я должен настроить свою php-логику? Моя проблема в том, что предметы могут иметь разные налоги, поэтому каждый предмет может облагаться налогом по-разному. –

+0

Вы обходите его при вставке в свою базу данных. Вы не можете восстановить его, если вы его округлите. То, что вы можете сделать, это хранить его без округления. – sashkello

ответ

3

ОК, поэтому, ваш вопрос, как я понимаю, не имеет никакого отношения к программированию.

Итак, у вас есть предмет стоимостью 1 доллар. Теперь у вас есть два налога, один составляет 1,4%, а другой - 1,3%. Вот, что вы делаете

tax1 = round($1*0.014, 2) = $0.01 
tax2 = round($1*0.013, 2) = $0.01 
totaltax = $0.02 

Пока все хорошо ... Хорошо, давайте сделаем это по-другому. Если сложить налоги, мы должны заплатить в общей сложности 1.4 + 1.3 = 2.7%, что означает:

totaltax = round($1*0.027, 2) = $0.03 

Посмотрите, что здесь произошло?

Теперь, какой из этих способов является правильным? Если вам физически нужно платить налог1 отдельно от tax2, то каждый из них определяется количественно в центах, и первый способ является правильным. Но, я чувствую, что вы, скорее всего, только платите окончательный общий налог, то есть вы сначала добавляете проценты, рассчитываете свой налог, а затем платите ему до ближайшего процента.


В отношении вашего кода, вы должны получить 1,03, что это правильно, но ваш запрос делает ошибку, аналогичную первый вариант, округляя результат для каждого элемента, прежде чем добавлять их (это делает round(price1*tax1, 2) + round(price2*tax2, 2)) , (На самом деле, просто чтобы быть полным, то есть три места в раунд:. Индивидуальный налоговый уровень, уровень пункта и на общем уровне)

Чтобы округлить в конце вместо того, чтобы для каждого элемента, переместите свой ROUND:

(SELECT ROUND(SUM(tax),2) FROM (SELECT (item_unit_price)*(SUM(percent)/100) as tax 
FROM phppos_sales_items 
INNER JOIN phppos_sales_items_taxes USING (sale_id, item_id) 
WHERE sale_id = 1 
GROUP BY sale_id, item_id) as tax) 
0

Извините, что ответили, так как комментарий не может правильно отобразить код.

Как насчет

(SELECT ROUND(SUM(tax)/100,2) FROM (SELECT item_unit_price*SUM(percent) as tax 
FROM phppos_sales_items 
INNER JOIN phppos_sales_items_taxes USING (sale_id, item_id) 
WHERE sale_id = 1 
GROUP BY sale_id, item_id) as tax) 

Вы можете экспортировать таблицы как SQL, так что я могу попробовать на мой местный? Если ничего не слишком конфиденциально.

+0

Я много окунул структуру sql ... есть гигантский запрос, который создает временную таблицу и выполняет все вычисления. Если вы заинтересованы в оказании помощи, я могу предложить компенсацию, чтобы проанализировать проблему и придумать решение. Если вы посмотрите на мой профиль stackoverflow и затем -> веб-сайт, у меня есть адрес электронной почты, указанный в списке. Я не могу предложить много, так как я нахожусь в невысоком бюджете, но сегодня я попытался исправить его около 5 часов без везения. Это происходит только в случаях с двумя краями ... Я исправляю это для одного, и он ломается для другого. –

Смежные вопросы