Я пытаюсь пересчитать налог на продажу после его ввода в базу данных. Я могу правильно вычислить информацию перед хранением в базе данных, но вычисление ее из базы данных для целей отчетности оказалось затруднительным из-за ошибок округления.Правильный расчет налога с использованием 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. Я открыт для любых предложений о том, как рассчитать информацию до продажи и в базе данных.
Просто круглый в самом конце. Вокруг вашей СУМ вместо каждого налога отдельно. Как я понимаю, налог выплачивается по окончательной сумме, поэтому только округлить. В противном случае, если налог взимается за каждый товар отдельно, тогда ваш запрос будет правильным. Это две разные формулы, и это неверно, зависит от того, как это делается на самом деле. – sashkello
Как вы думаете, что я должен настроить свою php-логику? Моя проблема в том, что предметы могут иметь разные налоги, поэтому каждый предмет может облагаться налогом по-разному. –
Вы обходите его при вставке в свою базу данных. Вы не можете восстановить его, если вы его округлите. То, что вы можете сделать, это хранить его без округления. – sashkello