ACCOUNT: Add possibilitty to include tax amount in base amount for the computation of the next taxes
bzr revid: ced-2131b8cd119da193d24cc3f7fbd82bebb667e858
This commit is contained in:
parent
5a22519a9c
commit
2dea59f722
|
@ -826,6 +826,7 @@ class account_tax(osv.osv):
|
|||
'ref_tax_code_id': fields.many2one('account.tax.code', 'Tax Code', help="Use this code for the VAT declaration."),
|
||||
'ref_base_sign': fields.float('Base Code Sign', help="Usualy 1 or -1."),
|
||||
'ref_tax_sign': fields.float('Tax Code Sign', help="Usualy 1 or -1."),
|
||||
'include_base_amount': fields.boolean('Include in base amount', help="Indicate if the amount of tax must be included in the base amount for the computation of the next taxes"),
|
||||
}
|
||||
_defaults = {
|
||||
'python_compute': lambda *a: '''# price_unit\n# address : res.partner.address object or False\n\nresult = price_unit * 0.10''',
|
||||
|
@ -839,6 +840,7 @@ class account_tax(osv.osv):
|
|||
'ref_base_sign': lambda *a: -1,
|
||||
'tax_sign': lambda *a: 1,
|
||||
'base_sign': lambda *a: 1,
|
||||
'include_base_amount': lambda *a: False,
|
||||
}
|
||||
_order = 'sequence'
|
||||
|
||||
|
@ -854,24 +856,21 @@ class account_tax(osv.osv):
|
|||
res.append(tax)
|
||||
return res
|
||||
|
||||
def _unit_compute(self, cr, uid, ids, price_unit, address_id=None):
|
||||
taxes = self.browse(cr, uid, ids)
|
||||
return self._unit_compute_br(cr, uid, taxes, price_unit, address_id)
|
||||
|
||||
def _unit_compute_br(self, cr, uid, taxes, price_unit, address_id=None):
|
||||
def _unit_compute(self, cr, uid, taxes, price_unit, address_id=None):
|
||||
taxes = self._applicable(cr, uid, taxes, price_unit, address_id)
|
||||
|
||||
res = []
|
||||
cur_price_unit=price_unit
|
||||
for tax in taxes:
|
||||
# we compute the amount for the current tax object and append it to the result
|
||||
if tax.type=='percent':
|
||||
amount = price_unit * tax.amount
|
||||
res.append({'id':tax.id, 'name':tax.name, 'amount':amount, 'account_collected_id':tax.account_collected_id.id, 'account_paid_id':tax.account_paid_id.id})
|
||||
amount = cur_price_unit * tax.amount
|
||||
res.append({'id':tax.id, 'name':tax.name, 'amount':amount, 'account_collected_id':tax.account_collected_id.id, 'account_paid_id':tax.account_paid_id.id, 'base_code_id': tax.base_code_id.id, 'ref_base_code_id': tax.ref_base_code_id.id, 'sequence': tax.sequence, 'base_sign': tax.base_sign, 'ref_base_sign': tax.ref_base_sign, 'price_unit': cur_price_unit, 'tax_code_id': tax.tax_code_id.id,})
|
||||
elif tax.type=='fixed':
|
||||
res.append({'id':tax.id, 'name':tax.name, 'amount':tax.amount, 'account_collected_id':tax.account_collected_id.id, 'account_paid_id':tax.account_paid_id.id})
|
||||
res.append({'id':tax.id, 'name':tax.name, 'amount':tax.amount, 'account_collected_id':tax.account_collected_id.id, 'account_paid_id':tax.account_paid_id.id, 'base_code_id': tax.base_code_id.id, 'ref_base_code_id': tax.ref_base_code_id.id, 'sequence': tax.sequence, 'base_sign': tax.base_sign, 'ref_base_sign': tax.ref_base_sign, 'price_unit': 1, 'tax_code_id': tax.tax_code_id.id,})
|
||||
elif tax.type=='code':
|
||||
address = address_id and self.pool.get('res.partner.address').browse(cr, uid, address_id) or None
|
||||
localdict = {'price_unit':price_unit, 'address':address}
|
||||
localdict = {'price_unit':cur_price_unit, 'address':address}
|
||||
exec tax.python_compute in localdict
|
||||
amount = localdict['result']
|
||||
res.append({
|
||||
|
@ -879,7 +878,14 @@ class account_tax(osv.osv):
|
|||
'name': tax.name,
|
||||
'amount': amount,
|
||||
'account_collected_id': tax.account_collected_id.id,
|
||||
'account_paid_id': tax.account_paid_id.id
|
||||
'account_paid_id': tax.account_paid_id.id,
|
||||
'base_code_id': tax.base_code_id.id,
|
||||
'ref_base_code_id': tax.ref_base_code_id.id,
|
||||
'sequence': tax.sequence,
|
||||
'base_sign': tax.base_sign,
|
||||
'ref_base_sign': tax.ref_base_sign,
|
||||
'price_unit': cur_price_unit,
|
||||
'tax_code_id': tax.tax_code_id.id,
|
||||
})
|
||||
amount2 = res[-1]['amount']
|
||||
if len(tax.child_ids):
|
||||
|
@ -889,11 +895,13 @@ class account_tax(osv.osv):
|
|||
else:
|
||||
amount = amount2
|
||||
for t in tax.child_ids:
|
||||
parent_tax = self._unit_compute_br(cr, uid, [t], amount, address_id)
|
||||
parent_tax = self._unit_compute(cr, uid, [t], amount, address_id)
|
||||
res.extend(parent_tax)
|
||||
if tax.include_base_amount:
|
||||
cur_price_unit+=amount2
|
||||
return res
|
||||
|
||||
def compute(self, cr, uid, ids, price_unit, quantity, address_id=None):
|
||||
def compute(self, cr, uid, taxes, price_unit, quantity, address_id=None):
|
||||
"""
|
||||
Compute tax values for given PRICE_UNIT, QUANTITY and a buyer/seller ADDRESS_ID.
|
||||
|
||||
|
@ -902,9 +910,9 @@ class account_tax(osv.osv):
|
|||
tax = {'name':'', 'amount':0.0, 'account_collected_id':1, 'account_paid_id':2}
|
||||
one tax for each tax id in IDS and their childs
|
||||
"""
|
||||
res = self._unit_compute(cr, uid, ids, price_unit, address_id)
|
||||
res = self._unit_compute(cr, uid, taxes, price_unit, address_id)
|
||||
for r in res:
|
||||
r['amount'] = round(quantity * r['amount'],2)
|
||||
r['amount'] *= quantity
|
||||
return res
|
||||
account_tax()
|
||||
|
||||
|
|
|
@ -95,20 +95,18 @@ class account_move_line(osv.osv):
|
|||
|
||||
data['partner_id'] = partner_id
|
||||
|
||||
print taxes
|
||||
for t in taxes:
|
||||
if not taxes[t] and t[0]:
|
||||
s=0
|
||||
for l in move.line_id:
|
||||
for tax in l.account_id.tax_ids:
|
||||
taxes = self.pool.get('account.tax').compute(cr, uid, [tax.id], l.debit or l.credit, 1, False)
|
||||
key = (l.debit and 'account_paid_id') or 'account_collected_id'
|
||||
for t2 in taxes:
|
||||
if (t2[key] == t[0]) and (tax.tax_code_id.id==t[1]):
|
||||
if l.debit:
|
||||
s += t2['amount']
|
||||
else:
|
||||
s -= t2['amount']
|
||||
taxes = self.pool.get('account.tax').compute(cr, uid, l.account_id.tax_ids, l.debit or l.credit, 1, False)
|
||||
key = (l.debit and 'account_paid_id') or 'account_collected_id'
|
||||
for t2 in taxes:
|
||||
if (t2[key] == t[0]) and (t2['tax_code_id']==t[1]):
|
||||
if l.debit:
|
||||
s += t2['amount']
|
||||
else:
|
||||
s -= t2['amount']
|
||||
data['debit'] = s>0 and s or 0.0
|
||||
data['credit'] = s<0 and -s or 0.0
|
||||
|
||||
|
|
|
@ -589,7 +589,9 @@
|
|||
<field name="type" select="1"/>
|
||||
<field name="applicable_type"/>
|
||||
<field name="amount" select="1"/>
|
||||
<field name="include_base_amount"/>
|
||||
<field name="domain"/>
|
||||
<newline/>
|
||||
<field name="account_collected_id"/>
|
||||
<label string="Keep empty to use the income account" nolabel="1" colspan="2"/>
|
||||
<field name="account_paid_id"/>
|
||||
|
|
|
@ -566,9 +566,11 @@ class account_invoice_line(osv.osv):
|
|||
res = []
|
||||
tax_grouped = {}
|
||||
tax_obj = self.pool.get('account.tax')
|
||||
cur_obj = self.pool.get('res.currency')
|
||||
#TODO: rewrite using browse instead of the manual SQL queries
|
||||
# cr.execute('SELECT id FROM account_invoice_line WHERE invoice_id=%d', (invoice_id,))
|
||||
inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id)
|
||||
cur = inv.currency_id
|
||||
|
||||
for line in inv.invoice_line:
|
||||
res.append( {
|
||||
|
@ -579,37 +581,36 @@ class account_invoice_line(osv.osv):
|
|||
'price':round(line.quantity*line.price_unit * (1.0- (line.discount or 0.0)/100.0),2),
|
||||
'account_id':line.account_id.id
|
||||
})
|
||||
for tax2 in line.invoice_line_tax_id:
|
||||
for tax in tax_obj.compute(cr, uid, [tax2.id], line.price_unit, line.quantity, inv.address_invoice_id.id):
|
||||
tax['amount'] = tax['amount']*(1.0- (line['discount'] or 0.0)/100.0)
|
||||
tax['sequence'] = tax2.sequence
|
||||
for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, (line.price_unit *(1.0-(line['discount'] or 0.0)/100.0)), line.quantity, inv.address_invoice_id.id):
|
||||
tax['amount'] = cur_obj.round(cr, uid, cur, tax['amount'])
|
||||
tax['sequence'] = tax['sequence']
|
||||
|
||||
#
|
||||
# Setting the tax account and amount for the line
|
||||
#
|
||||
if inv.type in ('out_invoice','out_refund'):
|
||||
res[-1]['tax_code_id'] = tax2.base_code_id.id
|
||||
res[-1]['tax_amount'] = line['price_unit'] * line['quantity'] * (1.0- (line['discount'] or 0.0)/100.0) * tax2.base_sign
|
||||
else:
|
||||
res[-1]['tax_code_id'] = tax2.ref_base_code_id.id
|
||||
res[-1]['tax_amount'] = line['price_unit'] * line['quantity'] * (1.0- (line['discount'] or 0.0)/100.0) * tax2.ref_base_sign
|
||||
if inv.type in ('out_refund','in_refund'):
|
||||
res[-1]['tax_amount'] = -res[-1]['tax_amount']
|
||||
#
|
||||
# Setting the tax account and amount for the line
|
||||
#
|
||||
if inv.type in ('out_invoice','out_refund'):
|
||||
res[-1]['tax_code_id'] = tax['base_code_id']
|
||||
res[-1]['tax_amount'] = tax['amount'] * tax['base_sign']
|
||||
else:
|
||||
res[-1]['tax_code_id'] = tax['ref_base_code_id']
|
||||
res[-1]['tax_amount'] = tax['amount'] * tax['ref_base_sign']
|
||||
if inv.type in ('out_refund','in_refund'):
|
||||
res[-1]['tax_amount'] = -res[-1]['tax_amount']
|
||||
|
||||
if inv.type in ('out_invoice','out_refund'):
|
||||
tax['account_id'] = tax['account_collected_id'] or line.account_id.id
|
||||
else:
|
||||
tax['account_id'] = tax['account_paid_id'] or line.account_id.id
|
||||
#
|
||||
# Revoir la clé: tax.id ?
|
||||
#
|
||||
key = (res[-1]['tax_code_id'], tax['account_id'])
|
||||
if not key in tax_grouped:
|
||||
tax_grouped[key] = tax
|
||||
tax_grouped[key]['base'] = line['price_unit'] * line['quantity'] * (1.0- (line['discount'] or 0.0)/100.0)
|
||||
else:
|
||||
tax_grouped[key]['amount'] += tax['amount']
|
||||
tax_grouped[key]['base'] += line['price_unit'] * line['quantity'] * (1.0- (line['discount'] or 0.0)/100.0)
|
||||
if inv.type in ('out_invoice','out_refund'):
|
||||
tax['account_id'] = tax['account_collected_id'] or line.account_id.id
|
||||
else:
|
||||
tax['account_id'] = tax['account_paid_id'] or line.account_id.id
|
||||
#
|
||||
# Revoir la clé: tax.id ?
|
||||
#
|
||||
key = (res[-1]['tax_code_id'], tax['account_id'])
|
||||
if not key in tax_grouped:
|
||||
tax_grouped[key] = tax
|
||||
tax_grouped[key]['base'] = tax['price_unit'] * line['quantity']
|
||||
else:
|
||||
tax_grouped[key]['amount'] += tax['amount']
|
||||
tax_grouped[key]['base'] += tax['price_unit'] * line['quantity']
|
||||
# delete automatic tax lines for this invoice
|
||||
cr.execute("DELETE FROM account_invoice_tax WHERE NOT manual AND invoice_id=%d", (invoice_id,))
|
||||
self.move_line_tax_create(cr, uid, inv, tax_grouped, context)
|
||||
|
|
|
@ -36,6 +36,9 @@
|
|||
<blockTableStyle id="Tableau3">
|
||||
<blockAlignment value="LEFT"/>
|
||||
<blockValign value="TOP"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,1" stop="0,1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,1" stop="1,1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="2,1" stop="2,1"/>
|
||||
</blockTableStyle>
|
||||
<blockTableStyle id="Tableau4">
|
||||
<blockAlignment value="LEFT"/>
|
||||
|
@ -105,9 +108,9 @@
|
|||
<para style="Standard">
|
||||
<font color="white"> </font>
|
||||
</para>
|
||||
<para style="Standard">Tél. : [[ o.address_invoice_id.phone or '' ]]</para>
|
||||
<para style="Standard">Tel. : [[ o.address_invoice_id.phone or '' ]]</para>
|
||||
<para style="Standard">Fax : [[ o.address_invoice_id.fax or '' ]]</para>
|
||||
<para style="Standard">TVA : [[ o.partner_id.vat or '' ]]</para>
|
||||
<para style="Standard">VAT : [[ o.partner_id.vat or '' ]]</para>
|
||||
</td>
|
||||
</tr>
|
||||
</blockTable>
|
||||
|
@ -152,10 +155,10 @@
|
|||
<para style="P9">Unit Price</para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="P9">Disc.</para>
|
||||
<para style="P9">Disc. (%)</para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="P9">Net Price</para>
|
||||
<para style="P9">Price</para>
|
||||
</td>
|
||||
</tr>
|
||||
</blockTable>
|
||||
|
@ -176,7 +179,7 @@
|
|||
<para style="P12">[[ '%.2f' % l.price_unit ]]</para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="P12">[[ '%.3f' % (l.discount or 0.0) ]] </para>
|
||||
<para style="P12">[[ '%.2f' % (l.discount or 0.0) ]] </para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="P12">[[ '%.2f' %l.price_subtotal ]] [[o.currency_id.code ]]</para>
|
||||
|
@ -229,7 +232,7 @@
|
|||
<blockTable colWidths="214.0,95.0" style="Tableau5">
|
||||
<tr>
|
||||
<td>
|
||||
<para style="P18">Subtotal :</para>
|
||||
<para style="P18">Total (excl. taxes):</para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="P19">[[ '%.2f' % o.amount_untaxed ]] [[o.currency_id.code ]]</para>
|
||||
|
@ -237,7 +240,7 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<para style="P18">Taxes :</para>
|
||||
<para style="P18">Taxes:</para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="P19">[[ '%.2f' % o.amount_tax ]] [[o.currency_id.code ]]</para>
|
||||
|
@ -245,7 +248,7 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<para style="P20">Total :</para>
|
||||
<para style="P20">Total <font face="Times-Roman">(incl. taxes):</font></para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="P21">[[ '%.2f' % o.amount_total ]] [[o.currency_id.code ]]</para>
|
||||
|
|
|
@ -40,24 +40,22 @@ class account_tax(osv.osv):
|
|||
_defaults = {
|
||||
'python_compute_inv': lambda *a: '''# price_unit\n# address : res.partner.address object or False\n\nresult = price_unit * 0.10''',
|
||||
}
|
||||
def _unit_compute_inv(self, cr, uid, ids, price_unit, address_id=None):
|
||||
taxes = self.browse(cr, uid, ids)
|
||||
return self._unit_compute_inv_br(cr, uid, taxes, price_unit, address_id)
|
||||
|
||||
def _unit_compute_inv_br(self, cr, uid, taxes, price_unit, address_id=None):
|
||||
def _unit_compute_inv(self, cr, uid, taxes, price_unit, address_id=None):
|
||||
taxes = self._applicable(cr, uid, taxes, price_unit, address_id)
|
||||
|
||||
res = []
|
||||
taxes.reverse()
|
||||
cur_price_unit=price_unit
|
||||
for tax in taxes:
|
||||
# we compute the amount for the current tax object and append it to the result
|
||||
if tax.type=='percent':
|
||||
amount = price_unit - (price_unit / (1 + tax.amount))
|
||||
res.append({'id':tax.id, 'name':tax.name, 'amount':amount, 'account_collected_id':tax.account_collected_id.id, 'account_paid_id':tax.account_paid_id.id})
|
||||
amount = cur_price_unit - (cur_price_unit / (1 + tax.amount))
|
||||
res.append({'id':tax.id, 'name':tax.name, 'amount':amount, 'account_collected_id':tax.account_collected_id.id, 'account_paid_id':tax.account_paid_id.id, 'base_code_id': tax.base_code_id.id, 'ref_base_code_id': tax.ref_base_code_id.id, 'sequence': tax.sequence, 'base_sign': tax.base_sign, 'ref_base_sign': tax.ref_base_sign, 'price_unit': cur_price_unit - amount,})
|
||||
elif tax.type=='fixed':
|
||||
res.append({'id':tax.id, 'name':tax.name, 'amount':tax.amount, 'account_collected_id':tax.account_collected_id.id, 'account_paid_id':tax.account_paid_id.id})
|
||||
res.append({'id':tax.id, 'name':tax.name, 'amount':tax.amount, 'account_collected_id':tax.account_collected_id.id, 'account_paid_id':tax.account_paid_id.id, 'base_code_id': tax.base_code_id.id, 'ref_base_code_id': tax.ref_base_code_id.id, 'sequence': tax.sequence, 'base_sign': tax.base_sign, 'ref_base_sign': tax.ref_base_sign, 'price_unit': 1,})
|
||||
elif tax.type=='code':
|
||||
address = address_id and self.pool.get('res.partner.address').browse(cr, uid, address_id) or None
|
||||
localdict = {'price_unit':price_unit, 'address':address}
|
||||
localdict = {'price_unit':cur_price_unit, 'address':address}
|
||||
exec tax.python_compute_inv in localdict
|
||||
amount = localdict['result']
|
||||
res.append({
|
||||
|
@ -65,7 +63,13 @@ class account_tax(osv.osv):
|
|||
'name': tax.name,
|
||||
'amount': amount,
|
||||
'account_collected_id': tax.account_collected_id.id,
|
||||
'account_paid_id': tax.account_paid_id.id
|
||||
'account_paid_id': tax.account_paid_id.id,
|
||||
'base_code_id': tax.base_code_id.id,
|
||||
'ref_base_code_id': tax.ref_base_code_id.id,
|
||||
'sequence': tax.sequence,
|
||||
'base_sign': tax.base_sign,
|
||||
'ref_base_sign': tax.ref_base_sign,
|
||||
'price_unit': cur_price_unit - amount,
|
||||
})
|
||||
amount2 = res[-1]['amount']
|
||||
if len(tax.child_ids):
|
||||
|
@ -75,11 +79,14 @@ class account_tax(osv.osv):
|
|||
else:
|
||||
amount = amount2
|
||||
for t in tax.child_ids:
|
||||
parent_tax = self._unit_compute_inv_br(cr, uid, [t], amount, address_id)
|
||||
parent_tax = self._unit_compute_inv(cr, uid, [t], amount, address_id)
|
||||
res.extend(parent_tax)
|
||||
if tax.include_base_amount:
|
||||
cur_price_unit-=amount
|
||||
taxes.reverse()
|
||||
return res
|
||||
|
||||
def compute_inv(self, cr, uid, ids, price_unit, quantity, address_id=None):
|
||||
def compute_inv(self, cr, uid, taxes, price_unit, quantity, address_id=None):
|
||||
"""
|
||||
Compute tax values for given PRICE_UNIT, QUANTITY and a buyer/seller ADDRESS_ID.
|
||||
Price Unit is a VAT included price
|
||||
|
@ -89,7 +96,7 @@ class account_tax(osv.osv):
|
|||
tax = {'name':'', 'amount':0.0, 'account_collected_id':1, 'account_paid_id':2}
|
||||
one tax for each tax id in IDS and their childs
|
||||
"""
|
||||
res = self._unit_compute_inv(cr, uid, ids, price_unit, address_id)
|
||||
res = self._unit_compute_inv(cr, uid, taxes, price_unit, address_id)
|
||||
for r in res:
|
||||
r['amount'] *= quantity
|
||||
return res
|
||||
|
|
|
@ -90,6 +90,8 @@ class account_invoice_line(osv.osv):
|
|||
res = []
|
||||
tax_grouped = {}
|
||||
tax_obj = self.pool.get('account.tax')
|
||||
cur_obj = self.pool.get('res.currency')
|
||||
cur = inv.currency_id
|
||||
for line in inv.invoice_line:
|
||||
res.append( {
|
||||
'type':'src',
|
||||
|
@ -100,37 +102,41 @@ class account_invoice_line(osv.osv):
|
|||
'account_id':line.account_id.id,
|
||||
'tax_amount': 0.0
|
||||
})
|
||||
for tax2 in line.invoice_line_tax_id:
|
||||
for tax in tax_obj.compute_inv(cr, uid, [tax2.id], line.price_unit, line.quantity, inv.address_invoice_id.id):
|
||||
tax['amount'] = round(tax['amount']*(1.0- (line['discount'] or 0.0)/100.0),2)
|
||||
tax['sequence'] = tax2.sequence
|
||||
for tax in tax_obj.compute_inv(cr, uid, line.invoice_line_tax_id, (line.price_unit *(1.0-(line['discount'] or 0.0)/100.0)), line.quantity, inv.address_invoice_id.id):
|
||||
tax['amount'] = cur_obj.round(cr, uid, cur, tax['amount'])
|
||||
tax['sequence'] = tax['sequence']
|
||||
|
||||
res[-1]['tax_amount'] += (line['price_unit'] * line['quantity'] * (1.0- (line['discount'] or 0.0)/100.0) * tax2.base_sign)
|
||||
#
|
||||
# Setting the tax account and amount for the line
|
||||
#
|
||||
if inv.type in ('out_invoice','in_refund'):
|
||||
res[-1]['tax_code_id'] = tax2.base_code_id.id
|
||||
else:
|
||||
res[-1]['tax_code_id'] = tax2.ref_base_code_id.id
|
||||
#res[-1]['tax_amount'] += (line['price_unit'] * line['quantity'] * (1.0- (line['discount'] or 0.0)/100.0) * tax2.base_sign)
|
||||
#
|
||||
# Setting the tax account and amount for the line
|
||||
#
|
||||
if inv.type in ('out_invoice','out_refund'):
|
||||
res[-1]['tax_code_id'] = tax['base_code_id']
|
||||
res[-1]['tax_amount'] = tax['amount'] * tax['base_sign']
|
||||
else:
|
||||
res[-1]['tax_code_id'] = tax['ref_base_code_id']
|
||||
res[-1]['tax_amount'] = tax['amount'] * tax['ref_base_sign']
|
||||
if inv.type in ('out_refund','in_refund'):
|
||||
res[-1]['tax_amount'] = -res[-1]['tax_amount']
|
||||
|
||||
if inv.type in ('out_invoice','in_refund'):
|
||||
tax['account_id'] = tax['account_collected_id'] or line.account_id.id
|
||||
else:
|
||||
tax['account_id'] = tax['account_paid_id'] or line.account_id.id
|
||||
#
|
||||
# Revoir la clé: tax.id ?
|
||||
#
|
||||
key = (tax['id'], tax['account_id'])
|
||||
|
||||
res[-1]['price'] -= tax['amount']
|
||||
res[-1]['tax_amount'] -= (tax['amount']* tax2.base_sign)
|
||||
if not key in tax_grouped:
|
||||
tax_grouped[key] = tax
|
||||
tax_grouped[key]['base'] = res[-1]['price']
|
||||
else:
|
||||
tax_grouped[key]['amount'] += tax['amount']
|
||||
tax_grouped[key]['base'] += res[-1]['price']
|
||||
if inv.type in ('out_invoice','out_refund'):
|
||||
tax['account_id'] = tax['account_collected_id'] or line.account_id.id
|
||||
else:
|
||||
tax['account_id'] = tax['account_paid_id'] or line.account_id.id
|
||||
#
|
||||
# Revoir la clé: tax.id ?
|
||||
#
|
||||
key = (res[-1]['tax_code_id'], tax['account_id'])
|
||||
#res[-1]['price'] -= tax['amount']
|
||||
#res[-1]['tax_amount'] -= (tax['amount']* tax2.base_sign)
|
||||
if not key in tax_grouped:
|
||||
tax_grouped[key] = tax
|
||||
#tax_grouped[key]['base'] = res[-1]['price']
|
||||
tax_grouped[key]['base'] = tax['price_unit'] * line['quantity']
|
||||
else:
|
||||
tax_grouped[key]['amount'] += tax['amount']
|
||||
#tax_grouped[key]['base'] += res[-1]['price']
|
||||
tax_grouped[key]['base'] += tax['price_unit'] * line['quantity']
|
||||
# delete automatic tax lines for this invoice
|
||||
cr.execute("DELETE FROM account_invoice_tax WHERE NOT manual AND invoice_id=%d", (invoice_id,))
|
||||
self.move_line_tax_create(cr, uid, inv, tax_grouped, context)
|
||||
|
|
|
@ -65,9 +65,8 @@ class purchase_order(osv.osv):
|
|||
val = 0.0
|
||||
cur=order.pricelist_id.currency_id
|
||||
for line in order.order_line:
|
||||
for tax in line.taxes_id:
|
||||
for c in self.pool.get('account.tax').compute(cr, uid, [tax.id], line.price_unit, line.product_qty, order.partner_address_id.id):
|
||||
val+= cur_obj.round(cr, uid, cur, c['amount'])
|
||||
for c in self.pool.get('account.tax').compute(cr, uid, line.taxes_id, line.price_unit, line.product_qty, order.partner_address_id.id):
|
||||
val+= cur_obj.round(cr, uid, cur, c['amount'])
|
||||
res[order.id]=cur_obj.round(cr, uid, cur, val)
|
||||
return res
|
||||
|
||||
|
|
|
@ -50,17 +50,18 @@ class purchase_order(osv.osv):
|
|||
|
||||
def _amount_tax(self, cr, uid, ids, field_name, arg, context):
|
||||
res = {}
|
||||
cur_obj=self.pool.get('res.currency')
|
||||
for order in self.browse(cr, uid, ids):
|
||||
val = 0.0
|
||||
cur=order.pricelist_id.currency_id
|
||||
for line in order.order_line:
|
||||
for tax in line.taxes_id:
|
||||
if order.price_type=='tax_included':
|
||||
ttt = self.pool.get('account.tax').compute_inv(cr, uid, [tax.id], line.price_unit, line.product_qty, order.partner_address_id.id)
|
||||
else:
|
||||
ttt = self.pool.get('account.tax').compute(cr, uid, [tax.id], line.price_unit, line.product_qty, order.partner_address_id.id)
|
||||
for c in ttt:
|
||||
val += round(c['amount'], 2)
|
||||
res[order.id]=round(val,2)
|
||||
if order.price_type=='tax_included':
|
||||
ttt = self.pool.get('account.tax').compute_inv(cr, uid, line.taxes_id, line.price_unit, line.product_qty, order.partner_address_id.id)
|
||||
else:
|
||||
ttt = self.pool.get('account.tax').compute(cr, uid, line.taxes_id, line.price_unit, line.product_qty, order.partner_address_id.id)
|
||||
for c in ttt:
|
||||
val += cur_obj.round(cr, uid, cur, c['amount'])
|
||||
res[order.id]=cur_obj.round(cr, uid, cur, val)
|
||||
return res
|
||||
_inherit = "purchase.order"
|
||||
_columns = {
|
||||
|
|
|
@ -85,9 +85,8 @@ class sale_order(osv.osv):
|
|||
val = 0.0
|
||||
cur=order.pricelist_id.currency_id
|
||||
for line in order.order_line:
|
||||
for tax in line.tax_id:
|
||||
for c in self.pool.get('account.tax').compute(cr, uid, [tax.id], line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, order.partner_invoice_id.id):
|
||||
val+= cur_obj.round(cr, uid, cur, c['amount'])
|
||||
for c in self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, order.partner_invoice_id.id):
|
||||
val+= cur_obj.round(cr, uid, cur, c['amount'])
|
||||
res[order.id]=cur_obj.round(cr, uid, cur, val)
|
||||
return res
|
||||
|
||||
|
|
|
@ -64,13 +64,14 @@ class sale_order_rebate(osv.osv):
|
|||
|
||||
def _amount_tax(self, cr, uid, ids, field_name, arg, context):
|
||||
res = {}
|
||||
cur_obj=self.pool.get('res.currency')
|
||||
for order in self.browse(cr, uid, ids):
|
||||
val = 0.0
|
||||
cur=order.pricelist_id.currency_id
|
||||
for line in order.order_line:
|
||||
for tax in line.tax_id:
|
||||
for c in self.pool.get('account.tax').compute(cr, uid, [tax.id], line.price_unit, line.product_uom_qty, order.partner_invoice_id.id):
|
||||
val += c['amount'] * (100.0 - order.rebate_percent) / 100.0
|
||||
res[order.id] = val
|
||||
for c in self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit, line.product_uom_qty, order.partner_invoice_id.id):
|
||||
val += cur_obj.round(cr, uid, cur, (c['amount'] * (100.0 - order.rebate_percent) / 100.0))
|
||||
res[order.id] = cur_obj.round(cr, uid, cur, val)
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
|
|
|
@ -50,17 +50,18 @@ class sale_order(osv.osv):
|
|||
|
||||
def _amount_tax(self, cr, uid, ids, field_name, arg, context):
|
||||
res = {}
|
||||
cur_obj=self.pool.get('res.currency')
|
||||
for order in self.browse(cr, uid, ids):
|
||||
val = 0.0
|
||||
cur=order.pricelist_id.currency_id
|
||||
for line in order.order_line:
|
||||
for tax in line.tax_id:
|
||||
if order.price_type=='tax_included':
|
||||
ttt = self.pool.get('account.tax').compute_inv(cr, uid, [tax.id], line.price_unit * (1-(line.discount or 0)/100.0), line.product_uom_qty, order.partner_invoice_id.id)
|
||||
else:
|
||||
ttt = self.pool.get('account.tax').compute(cr, uid, [tax.id], line.price_unit * (1-(line.discount or 0)/100.0), line.product_uom_qty, order.partner_invoice_id.id)
|
||||
for c in ttt:
|
||||
val += round(c['amount'], 2)
|
||||
res[order.id]=round(val,2)
|
||||
if order.price_type=='tax_included':
|
||||
ttt = self.pool.get('account.tax').compute_inv(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0)/100.0), line.product_uom_qty, order.partner_invoice_id.id)
|
||||
else:
|
||||
ttt = self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0)/100.0), line.product_uom_qty, order.partner_invoice_id.id)
|
||||
for c in ttt:
|
||||
val += cur_obj.round(cr, uid, cur, c['amount'])
|
||||
res[order.id]=cur_obj.round(cr, uid, cur, val)
|
||||
return res
|
||||
_inherit = "sale.order"
|
||||
_columns = {
|
||||
|
|
Loading…
Reference in New Issue