34
34
class account_invoice_line(osv.osv):
35
35
_inherit = 'account.invoice.line'
37
#Copy of account.invoice.py.Renamig varables tax=>base, it was confusing. New accounts for nondeductable part of base
38
'name': fields.char('Description', size=256, required=True),
39
'account2_id': fields.many2one('account.account', 'Account 2', required=False, domain=[('type','<>','view'), ('type', '<>', 'closed')], help="Second account related to the selected product."),
42
def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None):
43
res_prod = super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition_id, price_unit, address_invoice_id, currency_id=currency_id, context=context)
44
if product: # get second account related to product
45
res = self.pool.get('product.product').browse(cr, uid, product, context=context)
46
if type in ('out_invoice','out_refund'):
47
a2 = res.product_tmpl_id.account_income2_id.id
49
a2 = res.categ_id.account_income2_categ_id.id
51
a2 = res.product_tmpl_id.account_expense2_id.id
53
a2 = res.categ_id.account_expense2_categ_id.id
54
a2 = self.pool.get('account.fiscal.position').map_account(cr, uid, fposition_id, a2)
56
result['account2_id'] = a2
60
#Copy of account.invoice.py. New accounts for nondeductable part of base
38
61
def move_line_get(self, cr, uid, invoice_id, context=None):
40
63
tax_obj = self.pool.get('account.tax')
81
104
base_account_id = tax_base.base_account_collected_id.id
82
105
if tax_base.base_account_paid_id and inv.type in ('in_invoice', 'in_refund'):
83
106
base_account_id = tax_base.base_account_paid_id.id
84
#TODO use get_product_accounts2
85
product_accounts = self.pool.get('product.template').get_product_accounts2(cr, uid, line.product_id.id, context=None)
86
if tax_base.base_account == 'product2':
87
if inv.type in ('in_invoice', 'in_refund'):
88
base_account_id = product_accounts.get('account_expense2_id', False)
89
if inv.type in ('out_invoice', 'out_refund'):
90
base_account_id = product_accounts.get('account_income2_id', False)
107
if tax_base.base_account == 'product_2' and line.account2_id:
108
base_account_id = line.account2_id.id
109
if tax_base.base_account == 'product_2' and not line.account2_id:
110
#TODO use get_product_accounts2
111
product_accounts = self.pool.get('product.template').get_product_accounts2(cr, uid, line.product_id.id, context=None)
112
base_account_id = res[-1]['account2_id'] #account2 for base when tax_base.base_account == 'product_2')
113
if not base_account_id:
114
if inv.type in ('in_invoice', 'in_refund'):
115
base_account_id = product_accounts.get('account_expense2_id', False)
116
if inv.type in ('out_invoice', 'out_refund'):
117
base_account_id = product_accounts.get('account_income2_id', False)
92
119
res[-1]['account_id'] = base_account_id
93
120
res[-1]['price'] = tax['price_unit'] * line.quantity
100
127
res[-1]['price'] = rest
101
128
res[-1]['tax_code_id'] = False
102
129
res[-1]['tax_amount'] = 0.0
132
def move_line_get_item(self, cr, uid, line, context=None):
133
res = super(account_invoice_line, self).move_line_get_item(cr, uid, line, context=context)
134
res['account2_id'] = line.account2_id.id
138
# Set the tax field according to the account and the fiscal position
140
def onchange_account2_id(self, cr, uid, ids, fposition_id, account_id, account2_id):
143
res1 = super(account_invoice_line, self).onchange_account_id(cr, uid, ids, fposition_id, account_id)
145
taxes = self.pool.get('account.account').browse(cr, uid, account2_id).tax_ids
146
fpos = fposition_id and self.pool.get('account.fiscal.position').browse(cr, uid, fposition_id) or False
147
res2 = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, taxes)
149
return {'value':{'invoice_line_tax_id': res2}}
150
return {'value':{'invoice_line_tax_id': res2 + res1['value']['invoice_line_tax_id'] }}
152
account_invoice_line()
155
class account_invoice_tax(osv.osv):
156
_inherit = "account.invoice.tax"
158
def compute(self, cr, uid, invoice_id, context=None):
160
tax_obj = self.pool.get('account.tax')
161
cur_obj = self.pool.get('res.currency')
162
inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id, context=context)
163
cur = inv.currency_id
164
company_currency = inv.company_id.currency_id.id
166
for line in inv.invoice_line:
167
for tax in tax_obj.compute_all(cr, uid, line.invoice_line_tax_id, (line.price_unit* (1-(line.discount or 0.0)/100.0)), line.quantity, inv.address_invoice_id.id, line.product_id, inv.partner_id)['taxes']:
169
val['invoice_id'] = inv.id
170
val['name'] = tax['name']
171
val['amount'] = tax['amount']
172
val['manual'] = False
173
val['sequence'] = tax['sequence']
174
val['base'] = tax['price_unit'] * line['quantity']
176
if inv.type in ('out_invoice','in_invoice'):
177
val['base_code_id'] = tax['base_code_id']
178
val['tax_code_id'] = tax['tax_code_id']
179
val['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['base'] * tax['base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False)
180
val['tax_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['amount'] * tax['tax_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False)
181
val['account_id'] = tax['account_collected_id'] or line.account_id.id
183
if not tax['account_collected_id']:
184
if tax['base_account']=='product_2' and line.account2_id:
185
val['account_id'] = line.account2_id.id
186
if tax['base_account']=='tax_base' and tax['base_account_collected_id']:
187
val['account_id'] = tax['base_account_collected_id']
190
val['base_code_id'] = tax['ref_base_code_id']
191
val['tax_code_id'] = tax['ref_tax_code_id']
192
val['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['base'] * tax['ref_base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False)
193
val['tax_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['amount'] * tax['ref_tax_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False)
194
val['account_id'] = tax['account_paid_id'] or line.account_id.id
196
if not tax['account_collected_id']:
197
if tax['base_account']=='product_2' and line.account2_id:
198
val['account_id'] = line.account2_id.id
199
if tax['base_account']=='tax_base' and tax['base_account_paid_id']:
200
val['account_id'] = tax['base_account_paid_id']
203
key = (val['tax_code_id'], val['base_code_id'], val['account_id'])
204
if not key in tax_grouped:
205
tax_grouped[key] = val
207
tax_grouped[key]['amount'] += val['amount']
208
tax_grouped[key]['base'] += val['base']
209
tax_grouped[key]['base_amount'] += val['base_amount']
210
tax_grouped[key]['tax_amount'] += val['tax_amount']
212
for t in tax_grouped.values():
213
t['base'] = cur_obj.round(cr, uid, cur, t['base'])
214
t['amount'] = cur_obj.round(cr, uid, cur, t['amount'])
215
t['base_amount'] = cur_obj.round(cr, uid, cur, t['base_amount'])
216
t['tax_amount'] = cur_obj.round(cr, uid, cur, t['tax_amount'])
219
account_invoice_tax()