Verbetering van de code voor berekenen BTW?
Ik heb een open source programma gevonden voor het aanmaken en versturen van digitale ( PDF ) facturen.
Het programma werkt perfect voor wat ik wil maar telde helaas de bedragen van de verschillende BTW tarieven ( 6% en 21% ) bij elkaar op.
Op de factuur werd de BTW dan ook weergegeven als bijvoorbeeld "BTW Producten: €24,85".
Hierdoor was niet duidelijk wat het totaal van 6% BTW en het totaal van de 21% was.
De BTW bedragen worden tevens niet los van elkaar in de database opgeslagen.
Om toch deze bedragen te kunnen laten weergeven heb ik de volgende code in elkaar geknutseld.
Ik ben alles behalve een PHP programmeur en hoop middels dit forum wat advies te kunnen krijgen.
De code doet precies wat ik wil, maar zou graag willen weten of/hoe en waarom ik deze code eventueel zou kunnen/moeten verbeteren.
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// start BTW 6% calculatie
$invoice_id = $invoice->invoice_id;
$totaal_a = 0;
$query = "SELECT * FROM fi_invoice_items WHERE invoice_id = $invoice_id AND item_tax_rate_id = 2";
$query_run = mysql_query($query);
while ($num = mysql_fetch_assoc ($query_run)) {
$calc_a = $num['item_price'] * $num['item_quantity'];
$totaal_a += $calc_a;
$btw_laag = $totaal_a * 0.06;
}
echo "<tr><td style=\"text-align: right;\">Totaal BTW 6%:</td><td style=\"text-align: right;\">";
echo number_format(round($btw_laag, 2), 2);
echo "</td></tr>";
// eind BTW 6% calculatie
?>
// start BTW 6% calculatie
$invoice_id = $invoice->invoice_id;
$totaal_a = 0;
$query = "SELECT * FROM fi_invoice_items WHERE invoice_id = $invoice_id AND item_tax_rate_id = 2";
$query_run = mysql_query($query);
while ($num = mysql_fetch_assoc ($query_run)) {
$calc_a = $num['item_price'] * $num['item_quantity'];
$totaal_a += $calc_a;
$btw_laag = $totaal_a * 0.06;
}
echo "<tr><td style=\"text-align: right;\">Totaal BTW 6%:</td><td style=\"text-align: right;\">";
echo number_format(round($btw_laag, 2), 2);
echo "</td></tr>";
// eind BTW 6% calculatie
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// start BTW 21% calculatie
$invoice_id = $invoice->invoice_id;
$totaal_b = 0;
$query = "SELECT * FROM fi_invoice_items WHERE invoice_id = $invoice_id AND item_tax_rate_id = 1";
$query_run = mysql_query($query);
while ($num = mysql_fetch_assoc ($query_run)) {
$calc_b = $num['item_price'] * $num['item_quantity'];
$totaal_b += $calc_b;
$btw_hoog = $totaal_b * 0.21;
}
echo "<tr><td style=\"text-align: right;\">Totaal BTW 21%:</td><td style=\"text-align: right;\">";
echo number_format(round($btw_hoog, 2), 2);
echo "</td></tr>";
// eind BTW 21% calculatie
?>
// start BTW 21% calculatie
$invoice_id = $invoice->invoice_id;
$totaal_b = 0;
$query = "SELECT * FROM fi_invoice_items WHERE invoice_id = $invoice_id AND item_tax_rate_id = 1";
$query_run = mysql_query($query);
while ($num = mysql_fetch_assoc ($query_run)) {
$calc_b = $num['item_price'] * $num['item_quantity'];
$totaal_b += $calc_b;
$btw_hoog = $totaal_b * 0.21;
}
echo "<tr><td style=\"text-align: right;\">Totaal BTW 21%:</td><td style=\"text-align: right;\">";
echo number_format(round($btw_hoog, 2), 2);
echo "</td></tr>";
// eind BTW 21% calculatie
?>
Mvg.
Carmelo
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT SUM(item_price*item_quantity) AS total,
IF(item_tax_rate_id = 1,
SUM(item_price*item_quantity)/100 * 21,
SUM(item_price*item_quantity)/100 * 6) AS tax,
item_tax_rate_id
FROM fi_invoice_items
WHERE invoice_id = ...
GROUP BY item_tax_rate_id;
IF(item_tax_rate_id = 1,
SUM(item_price*item_quantity)/100 * 21,
SUM(item_price*item_quantity)/100 * 6) AS tax,
item_tax_rate_id
FROM fi_invoice_items
WHERE invoice_id = ...
GROUP BY item_tax_rate_id;
Je krijgt nu twee rijen in je resultset, met daarin het totaal (kolom: total), de btw over dat totaal (kolom: tax) en de item_tax_rate_id.
Let wel op overigens hoe je je btw uitrekent. Je doet het nu alsof het bedrag dat is opgeslagen niet het totaalbedrag is, maar het bedrag is exclusief btw. Dat zou kunnen, maar is over het algemeen niet gebruikelijk als je aan consumenten iets aanbiedt. Ik heb jouw berekening overgenomen in mijn sql voorbeeld.
Gewijzigd op 08/01/2014 12:53:23 door Erwin H
Zie ook pagina 39 in het Handboek Ondernemen 2013 (PDF) van de Belastingdienst. Verder even controleren voor de volledigheid: het overzicht van verplichte gegevens voor facturen.
Hartelijk dank voor je info.
De bedragen over de producten op de factuur zijn idd. exclusief BTW en worden tevens niet als totaal opgeslagen in de database maar als losse producten.
Voor de berekening moet je je voorstellen dat de producten die op de factuur staan in de database worden opgeslagen als losse items met de volgende veld-informatie.
item_id -- (id van het product)
invoice_id -- (id van de factuur)
item_tax_rate_id -- (id van het btw - als hier 1 staat is deze 21% en als hier 2 staat 6%)
item_date_added -- (datum wanneer dit product is toegevoegd)
item_name -- (productnaam)
item_description -- (productomschrijving)
item_quantity -- (aantal van de producten op de factuur)
item_price -- (stuksprijs van het product)
item_order -- (volgorde van weergave van de producten op de factuur)
Wat de code ( die voor 21% ) van mij dan ook doet is als volgt: ( sorry voor de jip & janneke taal ).
Haal alle gegevens uit de tabel fi_invoice_items met het betreffende invoice_id en btw_id 1
Reken bij de verkregen resultaten het volgende uit; product_aantal x product_stuks_prijs als waarde $calc_b
Tel alle totaal-resultaten bij elkaar op als $totaal_b
Bereken de BTW door de verkregen waarde van $totaal_b te vermenigvuldigen x 0.21 als resultaat $btw_hoog
Geef de waarde weer van $btw_hoog met 2 cijfers achter de komma
Ik heb dezelfde code vervolgens weer gebruikt om de 6% resultaten te berekenen.
Bij de door jou vermelde code lees ik bij:
IF(item_tax_rate_id = 1,
SUM(item_price*item_quantity)/100 * 21,
SUM(item_price*item_quantity)/100 * 6) AS tax,.....
Wanneer item_tax_rate 1 is bereken de som van productprijs x productaantal : 100 x 21 en bereken de som van productprijs x productaantal : 100 x 6 als tax..., enz
Nu zal ik wel een domme vraag stellen, maar wat doet hij indien item_tax_rate_id "2" is ?
Of moet ik het zo als hieronder lezen...?
Indien item_tax_rate_id "1" is,
SUM(item_price*item_quantity)/100 * 21,
zo niet, dan..,
SUM(item_price*item_quantity)/100 * 6)
Wanneer dit het geval is en ik besluit later om bv. nog een BTW groep aan te maken, bv. BTW Vrij 0%
Deze krijgt vervolgens in de database ID 3.
Loopt die als is 1 anders 2 dan niet stuk op als de waarde 3 is?
Mijn excuses voor mijn waarschijnlijk domme vraag, maar probeer het vooral ook te begrijpen.
Beter zou zijn als je die tarieven in een andere tabel zou hebben staan. In dat geval kan je die andere tabel joinen en wordt altijd het juiste percentage genomen. Ook als je een nieuw tarief aanmaakt, ook als een tarief verandert.
Voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
CREATE TABLE tax_rates(
item_tax_rate_id TINYINT UNSIGNED NOT NULL,
tax_rate_percentage DECIMAL(5,3)
);
SELECT SUM(item_price*item_quantity) AS total,
SUM(item_price*item_quantity)/100 * tax_rate_percentage AS tax,
a.item_tax_rate_id
FROM fi_invoice_items a
LEFT JOIN tax_rates b ON a.item_tax_rate_id = b.item_tax_rate_id
GROUP BY a.item_tax_rate_id;
item_tax_rate_id TINYINT UNSIGNED NOT NULL,
tax_rate_percentage DECIMAL(5,3)
);
SELECT SUM(item_price*item_quantity) AS total,
SUM(item_price*item_quantity)/100 * tax_rate_percentage AS tax,
a.item_tax_rate_id
FROM fi_invoice_items a
LEFT JOIN tax_rates b ON a.item_tax_rate_id = b.item_tax_rate_id
GROUP BY a.item_tax_rate_id;
Gewijzigd op 08/01/2014 14:32:32 door Erwin H
Hartelijk dank voor je reactie.
Dit gebeurd reeds.
De producten worden exclusief BTW weergegeven.
De factuur-layout is nu:
Productnaam 1 - Productomschrijving - Aantal - Stuksprijs - Totaal
------------------------------------------------------------------
Productnaam 2 - Productomschrijving - Aantal - Stuksprijs - Totaal
------------------------------------------------------------------
Enz...
En dan rechtsonderaan:
Subtotaal: € x.xx
BTW 6%: € x.xx
BTW 21%: € x.xx
Totaal: € x.xx
Overige info als contact-, adres- kvk- en bankinfo zijn natuurlijk ook aanwezig.
Ward van der Put op 08/01/2014 13:10:00:
Je moet overigens per product/dienst de prijzen exclusief btw vermelden, uitgesplitst naar btw-tarief. Alleen de btw-totalen splitsen is helaas niet voldoende.
Zie ook pagina 39 in het Handboek Ondernemen 2013 (PDF) van de Belastingdienst. Verder even controleren voor de volledigheid: het overzicht van verplichte gegevens voor facturen.
Zie ook pagina 39 in het Handboek Ondernemen 2013 (PDF) van de Belastingdienst. Verder even controleren voor de volledigheid: het overzicht van verplichte gegevens voor facturen.
Toevoeging op 08/01/2014 14:44:43:
Hallo Erwin H,
Nogmaals dank voor je reactie.
Er is reeds een tabel met deze info genaamd "fi_tax_rates".
Deze heeft nu de volgende 3 velden en waarden:
------------------
tax_rate_id
------------------
1
2
------------------
tax_rate_name
------------------
BTW 21%
BTW 6%
------------------
tax_rate_percent
------------------
21.00
6.00
------------------
Kijk eens aan, dan kan je die dus gebruiken zoals ik net heb voorgedaan. Dan heb je nergens last van.
Zal dit zeker gaan toepassen !
Erwin H op 08/01/2014 14:57:36:
Kijk eens aan, dan kan je die dus gebruiken zoals ik net heb voorgedaan. Dan heb je nergens last van.
Toevoeging op 09/01/2014 10:37:52:
Hallo Erwin H,
Had toch nog even een vraagje.
Maar hoe geef ik nu de betreffende resultaten weer?
Ik bedoel zoals echo ="waarde 21%", echo ="waarde 6%", enz.
In mijn code was dit middels; echo number_format(round($btw_hoog, 2), 2);