Merge lp:~openobject-italia-core-devs/openobject-italia/l10n_it_invoice_tax_compute into lp:~openobject-italia-core-devs/openobject-italia/italian-addons

Proposed by Lorenzo Battistini
Status: Merged
Merge reported by: Lorenzo Battistini
Merged at revision: not available
Proposed branch: lp:~openobject-italia-core-devs/openobject-italia/l10n_it_invoice_tax_compute
Merge into: lp:~openobject-italia-core-devs/openobject-italia/italian-addons
Diff against target: 535 lines (+493/-0)
8 files modified
account_invoice_tax_by_column/AUTHORS.txt (+4/-0)
account_invoice_tax_by_column/__init__.py (+24/-0)
account_invoice_tax_by_column/__openerp__.py (+58/-0)
account_invoice_tax_by_column/account.py (+55/-0)
account_invoice_tax_by_column/i18n/account_invoice_tax_by_column.pot (+72/-0)
account_invoice_tax_by_column/i18n/it.po (+94/-0)
account_invoice_tax_by_column/invoice.py (+79/-0)
account_invoice_tax_by_column/tests/tests.txt (+107/-0)
To merge this branch: bzr merge lp:~openobject-italia-core-devs/openobject-italia/l10n_it_invoice_tax_compute
Reviewer Review Type Date Requested Status
Lorenzo Battistini Approve
Review via email: mp+60069@code.launchpad.net

This proposal has been superseded by a proposal from 2011-08-23.

To post a comment you must log in.
Revision history for this message
Lorenzo Battistini (elbati) wrote :

Non appena qualcuno conferma che il modulo 'l10n_it_invoice_tax' effettua correttamente il calcolo delle tasse sulle righe della fattura, possiamo approvare il merge sul repository ufficiale

Revision history for this message
Lorenzo Battistini (elbati) wrote :

Sembrano esserci problemi con le tasse parzialmente deducibili.
Ho provato a creare una fattura fornitore con una riga da 123,57 e IVA 20% deducibile al 50%.

Cliccando su 'Compute Taxes' ottengo

ERROR:web-services:Uncaught exception
Traceback (most recent call last):
  File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/osv.py", line 122, in wrapper
    return f(self, dbname, *args, **kwargs)
  File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/osv.py", line 176, in execute
    res = self.execute_cr(cr, uid, obj, method, *args, **kw)
  File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/osv.py", line 167, in execute_cr
    return getattr(object, method)(cr, uid, *args, **kw)
  File "/home/elbati/workspace/openerp/openerp6/server/bin/addons/account/invoice.py", line 644, in button_reset_taxes
    for taxe in ait_obj.compute(cr, uid, id, context=ctx).values():
  File "/home/elbati/workspace/openerp/openerp6/server/bin/addons/l10n_it_invoice_tax/invoice.py", line 79, in compute
    amount = tax_obj.compute_all(cr, uid, t['tax'], t['price'], 1)["taxes"][0]["amount"] #MG
KeyError: 'tax'

review: Needs Fixing
Revision history for this message
Lorenzo Battistini (elbati) wrote :

Per me ora il modulo 'account_invoice_tax_by_column' funziona

review: Approve
Revision history for this message
Lorenzo Battistini (elbati) wrote :

Si potrebbe perfezionare il modulo cercando di usare 'super' ove possibile invece di riscrivere completamente i metodi di calcolo delle tasse

Revision history for this message
Lorenzo Battistini (elbati) wrote :
review: Approve
Revision history for this message
Sergio Corato (icsergio) wrote :

Il 20/08/2011 12:10, Lorenzo Battistini - Agile BG - Domsense ha scritto:
> Review: Approve
> Ecco: http://bazaar.launchpad.net/~openobject-italia-core-devs/openobject-italia/l10n_it_invoice_tax_compute/revision/105
> Qualcuno vuole fare dei test?
L'ho provato sulla 6.0.3, per me è tutto regolare.

Revision history for this message
Davide Corio (enlightx-deactivatedaccount) wrote :

Allora, lato tecnico (codice, funzionamento wizard, stampe...) mi pare tutto ok, quindi il merge è ok per me.
Possiamo quindi iniziare a lavorare alle raffinatezze e all'usabilità. soprattutto per quanto riguarda wizard e stampe.

Cmq bravo Lorenzo

Revision history for this message
Davide Corio (enlightx-deactivatedaccount) wrote :

Ooooops, ho fatto casino :-)

per qualche link confuso stavo testando il branch sui registri iva.

su questo branch invece ho trovato un errore di calcolo con aliquote parzialmente deducibili

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'account_invoice_tax_by_column'
=== added file 'account_invoice_tax_by_column/AUTHORS.txt'
--- account_invoice_tax_by_column/AUTHORS.txt 1970-01-01 00:00:00 +0000
+++ account_invoice_tax_by_column/AUTHORS.txt 2011-08-20 10:12:24 +0000
@@ -0,0 +1,4 @@
1Matteo Grolla <magrolla@yahoo.it>
2Marco Marchiori <marcomarkiori@gmail.com>
3Massimo Biancalani <massimo.biancalani@gmail.com>
4Lorenzo Battistini <lorenzo.battistini@domsense.com>
05
=== added file 'account_invoice_tax_by_column/__init__.py'
--- account_invoice_tax_by_column/__init__.py 1970-01-01 00:00:00 +0000
+++ account_invoice_tax_by_column/__init__.py 2011-08-20 10:12:24 +0000
@@ -0,0 +1,24 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2011
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import invoice
24import account
025
=== added file 'account_invoice_tax_by_column/__openerp__.py'
--- account_invoice_tax_by_column/__openerp__.py 1970-01-01 00:00:00 +0000
+++ account_invoice_tax_by_column/__openerp__.py 2011-08-20 10:12:24 +0000
@@ -0,0 +1,58 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2011
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22{
23 'name': 'Account Invoice Tax - Computation By Column',
24 'version': '0.1',
25 'category': 'Generic Modules/Accounting',
26 'description': """
27 -Invoice taxes:
28 legend:
29 TA(l) TaxAmount for line l
30 TBA(l) TaxBaseAmount for line l
31 TA(t) TaxAmount for tax t
32 TBA(t) TaxBaseAmount for tax t
33
34 default behaviour:
35 openerp by default calculates taxes line by line as a function of line tax base amount
36 and then groups these amounts by tax.
37 TA(l) = f(TBA(l)
38 TA(t) = sum( round( TA(l) ) ) /sum on lines l to which tax t is applied
39 this module behaviour:
40 In Italy the correct way to compute taxes is to first compute the tax base amount TBA(t)
41 and the compute TA as a function of TBA(t)
42 TBA(t) = sum( TBA(t) ) /sum on lines l to which tax t is applied
43 TA(t) = f( TBA(t) )
44 the result difference is small but important
45
46 """,
47 'author': 'OpenERP Italian Community',
48 'website': 'http://www.openerp-italia.org',
49 'license': 'AGPL-3',
50 "depends" : ['account', 'account_voucher'],
51 "init_xml" : [],
52 "update_xml" : [],
53 "demo_xml" : [],
54 "active": False,
55 "installable": True
56}
57# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
58
059
=== added file 'account_invoice_tax_by_column/account.py'
--- account_invoice_tax_by_column/account.py 1970-01-01 00:00:00 +0000
+++ account_invoice_tax_by_column/account.py 2011-08-20 10:12:24 +0000
@@ -0,0 +1,55 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2010-2010 Camptocamp Austria (<http://www.camptocamp.at>)
6# Copyright (C) 2011
7# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU Affero General Public License as
11# published by the Free Software Foundation, either version 3 of the
12# License, or (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU Affero General Public License for more details.
18#
19# You should have received a copy of the GNU Affero General Public License
20# along with this program. If not, see <http://www.gnu.org/licenses/>.
21#
22##############################################################################
23
24from osv import fields, osv
25import decimal_precision as dp
26from decimal import *
27
28class account_tax(osv.osv):
29
30 _inherit = 'account.tax'
31
32 _columns = {
33 'line_precision' : fields.boolean('Rounding Precision', help="Calculates floating point tax per line to simulate vertical calculation"),
34 }
35
36 _defaults = {
37 'line_precision': True
38 }
39
40 def _compute(self, cr, uid, taxes, price_unit, quantity, address_id=None, product=None, partner=None):
41 res = super(account_tax, self)._compute(cr, uid, taxes, price_unit, quantity, address_id, product, partner)
42 tax_pool=self.pool.get('account.tax')
43 total = 0.0
44 for r in res:
45 tax = tax_pool.browse(cr, uid, r['id'])
46 if tax.line_precision:
47 if r.get('balance',False):
48 r['amount'] = r.get('balance', 0.0) * quantity - total
49 else:
50 r['amount'] = r.get('amount', 0.0) * quantity
51 total += r['amount']
52 return res
53
54
55account_tax()
056
=== added directory 'account_invoice_tax_by_column/i18n'
=== added file 'account_invoice_tax_by_column/i18n/account_invoice_tax_by_column.pot'
--- account_invoice_tax_by_column/i18n/account_invoice_tax_by_column.pot 1970-01-01 00:00:00 +0000
+++ account_invoice_tax_by_column/i18n/account_invoice_tax_by_column.pot 2011-08-20 10:12:24 +0000
@@ -0,0 +1,72 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_invoice_tax_by_column
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 6.0.2\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2011-07-23 14:32+0000\n"
10"PO-Revision-Date: 2011-07-23 14:32+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_invoice_tax_by_column
19#: model:ir.model,name:account_invoice_tax_by_column.model_account_invoice_tax
20msgid "Invoice Tax"
21msgstr ""
22
23#. module: account_invoice_tax_by_column
24#: model:ir.module.module,description:account_invoice_tax_by_column.module_meta_information
25msgid " \n"
26" -Invoice taxes: \n"
27" legend:\n"
28" TA(l) TaxAmount for line l\n"
29" TBA(l) TaxBaseAmount for line l\n"
30" TA(t) TaxAmount for tax t\n"
31" TBA(t) TaxBaseAmount for tax t\n"
32" \n"
33" default behaviour: \n"
34" openerp by default calculates taxes line by line as a function of line tax base amount \n"
35" and then groups these amounts by tax.\n"
36" TA(l) = f(TBA(l)\n"
37" TA(t) = sum( round( TA(l) ) ) /sum on lines l to which tax t is applied\n"
38" this module behaviour: \n"
39" In Italy the correct way to compute taxes is to first compute the tax base amount TBA(t) \n"
40" and the compute TA as a function of TBA(t)\n"
41" TBA(t) = sum( TBA(t) ) /sum on lines l to which tax t is applied\n"
42" TA(t) = f( TBA(t) )\n"
43" the result difference is small but important\n"
44"\n"
45" "
46msgstr ""
47
48#. module: account_invoice_tax_by_column
49#: help:account.tax,line_precision:0
50msgid "Calculates floating point tax per line to simulate vertical calculation"
51msgstr ""
52
53#. module: account_invoice_tax_by_column
54#: field:account.tax,line_precision:0
55msgid "Rounding Precision"
56msgstr ""
57
58#. module: account_invoice_tax_by_column
59#: model:ir.module.module,shortdesc:account_invoice_tax_by_column.module_meta_information
60msgid "Account Invoice Tax - Computation By Column"
61msgstr ""
62
63#. module: account_invoice_tax_by_column
64#: model:ir.model,name:account_invoice_tax_by_column.model_account_tax
65msgid "account.tax"
66msgstr ""
67
68#. module: account_invoice_tax_by_column
69#: sql_constraint:account.tax:0
70msgid "The tax name must be unique!"
71msgstr ""
72
073
=== added file 'account_invoice_tax_by_column/i18n/it.po'
--- account_invoice_tax_by_column/i18n/it.po 1970-01-01 00:00:00 +0000
+++ account_invoice_tax_by_column/i18n/it.po 2011-08-20 10:12:24 +0000
@@ -0,0 +1,94 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_invoice_tax_by_column
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 6.0.2\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2011-07-23 14:32+0000\n"
10"PO-Revision-Date: 2011-07-23 16:35+0100\n"
11"Last-Translator: Lorenzo Battistini <lorenzo.battistini@agilebg.com>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: 8bit\n"
16"Plural-Forms: \n"
17
18#. module: account_invoice_tax_by_column
19#: model:ir.model,name:account_invoice_tax_by_column.model_account_invoice_tax
20msgid "Invoice Tax"
21msgstr "Imposta della fattura"
22
23#. module: account_invoice_tax_by_column
24#: model:ir.module.module,description:account_invoice_tax_by_column.module_meta_information
25msgid ""
26" \n"
27" -Invoice taxes: \n"
28" legend:\n"
29" TA(l) TaxAmount for line l\n"
30" TBA(l) TaxBaseAmount for line l\n"
31" TA(t) TaxAmount for tax t\n"
32" TBA(t) TaxBaseAmount for tax t\n"
33" \n"
34" default behaviour: \n"
35" openerp by default calculates taxes line by line as a function of line tax base amount \n"
36" and then groups these amounts by tax.\n"
37" TA(l) = f(TBA(l)\n"
38" TA(t) = sum( round( TA(l) ) ) /sum on lines l to which tax t is applied\n"
39" this module behaviour: \n"
40" In Italy the correct way to compute taxes is to first compute the tax base amount TBA(t) \n"
41" and the compute TA as a function of TBA(t)\n"
42" TBA(t) = sum( TBA(t) ) /sum on lines l to which tax t is applied\n"
43" TA(t) = f( TBA(t) )\n"
44" the result difference is small but important\n"
45"\n"
46" "
47msgstr ""
48" \n"
49" -Invoice taxes: \n"
50" legend:\n"
51" TA(l) TaxAmount for line l\n"
52" TBA(l) TaxBaseAmount for line l\n"
53" TA(t) TaxAmount for tax t\n"
54" TBA(t) TaxBaseAmount for tax t\n"
55" \n"
56" default behaviour: \n"
57" openerp by default calculates taxes line by line as a function of line tax base amount \n"
58" and then groups these amounts by tax.\n"
59" TA(l) = f(TBA(l)\n"
60" TA(t) = sum( round( TA(l) ) ) /sum on lines l to which tax t is applied\n"
61" this module behaviour: \n"
62" In Italy the correct way to compute taxes is to first compute the tax base amount TBA(t) \n"
63" and the compute TA as a function of TBA(t)\n"
64" TBA(t) = sum( TBA(t) ) /sum on lines l to which tax t is applied\n"
65" TA(t) = f( TBA(t) )\n"
66" the result difference is small but important\n"
67"\n"
68" "
69
70#. module: account_invoice_tax_by_column
71#: help:account.tax,line_precision:0
72msgid "Calculates floating point tax per line to simulate vertical calculation"
73msgstr "Calculates floating point tax per line to simulate vertical calculation"
74
75#. module: account_invoice_tax_by_column
76#: field:account.tax,line_precision:0
77msgid "Rounding Precision"
78msgstr "Precisione arrotondamento"
79
80#. module: account_invoice_tax_by_column
81#: model:ir.module.module,shortdesc:account_invoice_tax_by_column.module_meta_information
82msgid "Account Invoice Tax - Computation By Column"
83msgstr "Imposte fattura - Calcolo per colonna"
84
85#. module: account_invoice_tax_by_column
86#: model:ir.model,name:account_invoice_tax_by_column.model_account_tax
87msgid "account.tax"
88msgstr "account.tax"
89
90#. module: account_invoice_tax_by_column
91#: sql_constraint:account.tax:0
92msgid "The tax name must be unique!"
93msgstr "Il nome della tasse deve essere unico"
94
095
=== added file 'account_invoice_tax_by_column/invoice.py'
--- account_invoice_tax_by_column/invoice.py 1970-01-01 00:00:00 +0000
+++ account_invoice_tax_by_column/invoice.py 2011-08-20 10:12:24 +0000
@@ -0,0 +1,79 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2011
6# Associazione OpenERP Italia (<http://www.openerp-italia.org>)
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22import time
23from osv import fields, osv
24
25
26class account_invoice_tax(osv.osv):
27 _inherit = "account.invoice.tax"
28
29 def compute(self, cr, uid, invoice_id, context=None):
30 tax_grouped = super(account_invoice_tax, self).compute(cr, uid, invoice_id, context)
31 total_base = 0
32 total_tax = {}
33 total_amount_of_taxes_horizontal = 0
34 number_deductible_account = 0
35 cur_obj = self.pool.get('res.currency')
36 inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id, context=context)
37 cur = inv.currency_id
38 for line in inv.invoice_line:
39 # workout of total amount of taxes
40 for tax in line.invoice_line_tax_id:
41 key = tax['amount']
42 if not key in total_tax:
43 # Total_tax
44 total_tax[key] = [0]
45 total_tax[key][0] += (line.price_unit* (1-(line.discount or 0.0)/100.0)) * tax['amount']
46
47 index = 0
48 for t in tax_grouped.values():
49 if inv.type in ('in_invoice') and t['base_code_id'] == False:
50 number_deductible_account += 1
51 total_amount_of_taxes_horizontal += t['tax_amount']
52
53 total_amount_of_taxes_vertical = 0
54 # round the total amount of taxes
55 for t in total_tax.values():
56 t[0] = cur_obj.round(cr, uid, cur, t[0])
57 total_amount_of_taxes_vertical += t[0]
58 total_amount_of_taxes_vertical = cur_obj.round(cr, uid, cur, total_amount_of_taxes_vertical)
59 total_amount_of_taxes_horizontal = cur_obj.round(cr, uid, cur, total_amount_of_taxes_horizontal)
60 if number_deductible_account != 0:
61 quotient = (total_amount_of_taxes_vertical - total_amount_of_taxes_horizontal) / number_deductible_account
62 quotient = cur_obj.round(cr, uid, cur, quotient)
63 remainder = (total_amount_of_taxes_vertical - total_amount_of_taxes_horizontal) - number_deductible_account * quotient
64 remainder = cur_obj.round(cr, uid, cur, remainder)
65 # change at least a deductible tax amount to to make coincide total amount of taxes
66 counter = 0
67 if inv.type in ('in_invoice') and total_amount_of_taxes_vertical != total_amount_of_taxes_horizontal:
68 for t in tax_grouped.values():
69 if t['base_code_id'] == False:
70 counter += 1
71 t['tax_amount'] = t['tax_amount'] + quotient
72 t['amount'] = t['amount'] + quotient
73 if counter == number_deductible_account:
74 t['tax_amount'] = t['tax_amount'] + remainder
75 t['amount'] = t['amount'] + remainder
76 return tax_grouped
77
78account_invoice_tax()
79
080
=== added directory 'account_invoice_tax_by_column/tests'
=== added file 'account_invoice_tax_by_column/tests/tests.txt'
--- account_invoice_tax_by_column/tests/tests.txt 1970-01-01 00:00:00 +0000
+++ account_invoice_tax_by_column/tests/tests.txt 2011-08-20 10:12:24 +0000
@@ -0,0 +1,107 @@
1Manual tests on tax calculation (should write automated tests)
2
31) arrotondamento IVA ordinaria 20%
4fattura VENDJ/2011/016
5IVA20 12,29 2,46
6IVA20 12,29 2,46
7IVA20 12,29 2,46
8IVA10
9
10IVA10
11
12IVA10
13
14IVA10
15
16IVA10
17
18IVA10
19
20IVA10
21
22IVA10
23
24IVA10
25
26somma 36,87 7,38
27
28
29
30IVA10 0 0
31IVA20 36,87 7,37
32
33
34
35
36 36,87 7,37
37L'IVA corretta è 7,37, e cioè il 20% del totale imponibile al 20%
38
392) arrotondamento IVA ordinaria e agevolata 4%
40fattura VENDJ/2011/018
41IVA4 12,33 0,49
42IVA20 12,29 2,46
43IVA20 12,29 2,46
44IVA20 12,29 2,46
45IVA4 12,33 0,49
46IVA4 12,33 0,49
47IVA20 12,29 2,46
48IVA20 12,29 2,46
49IVA20 12,29 2,46
50IVA20
51
52IVA20
53
54IVA20
55
56
57
58
59somma 110,73 16,23
60
61
62
63IVA4 36,99 1,48
64IVA20 73,74 14,75
65
66
67
68TOTALE IVA 110,73 16,23
69
70l'IVA viene correttamente ripartita fra IVA 4 ed IVA 20
71
72arrotondamento IVA ordinaria 20% ed agevolata 10%
73
74fattura VENDJ/2011/019
75IVA20 12,29 2,46
76IVA20 12,29 2,46
77IVA20 12,29 2,46
78IVA10 10,56 1,06
79IVA10 10,56 1,06
80IVA10 10,56 1,06
81IVA10
82
83IVA10
84
85IVA10
86
87IVA10
88
89IVA10
90
91IVA10
92
93
94
95
96somma 68,55 10,56
97
98
99
100IVA10 31,68 3,17
101IVA20 36,87 7,37
102
103
104
105TOTALE IVA 68,55 10,54
106
107L'IVA viene correttamente calcolata ed indicata secondo le aliquote