commit
463643c9f7
|
@ -1095,7 +1095,7 @@ class account_tax(osv.osv):
|
|||
'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"),
|
||||
'company_id': fields.many2one('res.company', 'Company', required=True),
|
||||
'description': fields.char('Internal Name', 32),
|
||||
'description': fields.char('Internal Name',size=32),
|
||||
}
|
||||
|
||||
def name_get(self, cr, uid, ids, context={}):
|
||||
|
|
|
@ -71,6 +71,7 @@ class account_move_line(osv.osv):
|
|||
return data
|
||||
|
||||
period_obj = self.pool.get('account.period')
|
||||
tax_obj=self.pool.get('account.tax')
|
||||
|
||||
# Compute the current move
|
||||
move_id = False
|
||||
|
@ -86,6 +87,7 @@ class account_move_line(osv.osv):
|
|||
(context['journal_id'], context['period_id'], uid, 'draft'))
|
||||
res = cr.fetchone()
|
||||
move_id = (res and res[0]) or False
|
||||
|
||||
if not move_id:
|
||||
return data
|
||||
else:
|
||||
|
@ -111,103 +113,40 @@ class account_move_line(osv.osv):
|
|||
|
||||
total = 0
|
||||
ref_id = False
|
||||
taxes = {}
|
||||
move = self.pool.get('account.move').browse(cr, uid, move_id, context)
|
||||
|
||||
for l in move.line_id:
|
||||
partner_id = partner_id or l.partner_id.id
|
||||
ref_id = ref_id or l.ref
|
||||
total += (l.debit - l.credit)
|
||||
for tax in l.account_id.tax_ids:
|
||||
if move.journal_id.type == 'sale':
|
||||
if l.debit:
|
||||
code = tax.ref_tax_code_id.id
|
||||
acc = tax.account_paid_id.id
|
||||
else:
|
||||
code = tax.tax_code_id.id
|
||||
acc = tax.account_collected_id.id
|
||||
else:
|
||||
if l.debit:
|
||||
code = tax.tax_code_id.id
|
||||
acc = tax.account_collected_id.id
|
||||
else:
|
||||
code = tax.ref_tax_code_id.id
|
||||
acc = tax.account_paid_id.id
|
||||
taxes.setdefault((acc, code), False)
|
||||
taxes[(l.account_id.id, l.tax_code_id.id)] = True
|
||||
total += (l.debit or 0.0) - (l.credit or 0.0)
|
||||
if 'name' in fields:
|
||||
data.setdefault('name', l.name)
|
||||
|
||||
if 'ref' in fields:
|
||||
data['ref'] = ref_id
|
||||
if 'partner_id' in fields:
|
||||
data['partner_id'] = partner_id
|
||||
|
||||
if move.journal_id.type in ('purchase', 'sale'):
|
||||
for t in taxes:
|
||||
if not taxes[t] and t[0]:
|
||||
s = 0
|
||||
tax_amount = 0
|
||||
for l in move.line_id:
|
||||
if move.journal_id.type == 'sale':
|
||||
if l.debit:
|
||||
field_base = 'ref_'
|
||||
key = 'account_paid_id'
|
||||
if move.journal_id.type == 'purchase':
|
||||
if total>0:
|
||||
account = move.journal_id.default_credit_account_id
|
||||
else:
|
||||
field_base = ''
|
||||
key = 'account_collected_id'
|
||||
account = move.journal_id.default_debit_account_id
|
||||
else:
|
||||
if l.debit:
|
||||
field_base = ''
|
||||
key = 'account_collected_id'
|
||||
if total>0:
|
||||
account = move.journal_id.default_credit_account_id
|
||||
else:
|
||||
field_base = 'ref_'
|
||||
key = 'account_paid_id'
|
||||
for tax in self.pool.get('account.tax').compute(cr, uid,
|
||||
l.account_id.tax_ids, l.debit or l.credit, 1, False):
|
||||
if (tax[key] == t[0]) \
|
||||
and (tax[field_base + 'tax_code_id'] == t[1]):
|
||||
if l.debit:
|
||||
s += tax['amount']
|
||||
else:
|
||||
s -= tax['amount']
|
||||
tax_amount += tax['amount'] * \
|
||||
tax[field_base + 'tax_sign']
|
||||
if ('debit' in fields) or ('credit' in fields):
|
||||
account = move.journal_id.default_debit_account_id
|
||||
|
||||
data['account_id'] = account.id
|
||||
if account and account.tax_ids:
|
||||
for tax in self.pool.get('account.tax').compute_inv(cr,uid,[account.tax_ids[0]],total,1.00):
|
||||
total -= tax['amount']
|
||||
data['account_tax_id'] = account.tax_ids[0].id
|
||||
s = -total
|
||||
data['debit'] = s>0 and s or 0.0
|
||||
data['credit'] = s<0 and -s or 0.0
|
||||
|
||||
if 'tax_code_id' in fields:
|
||||
data['tax_code_id'] = t[1]
|
||||
if 'account_id' in fields:
|
||||
data['account_id'] = t[0]
|
||||
if 'tax_amount' in fields:
|
||||
data['tax_amount'] = tax_amount
|
||||
#
|
||||
# Compute line for tax T
|
||||
#
|
||||
return data
|
||||
|
||||
#
|
||||
# Compute latest line
|
||||
#
|
||||
if ('debit' in fields) or ('credit' in fields):
|
||||
data['credit'] = total>0 and total
|
||||
data['debit'] = total<0 and -total
|
||||
if 'account_id' in fields:
|
||||
if total >= 0:
|
||||
data['account_id'] = move.journal_id.default_credit_account_id.id or False
|
||||
else:
|
||||
data['account_id'] = move.journal_id.default_debit_account_id.id or False
|
||||
if 'account_id' in fields and data['account_id']:
|
||||
account = self.pool.get('account.account').browse(cr, uid, data['account_id'])
|
||||
data['tax_code_id'] = self._default_get_tax(cr, uid, account )
|
||||
return data
|
||||
|
||||
def _default_get_tax(self, cr, uid, account, debit=0, credit=0, context={}):
|
||||
if account.tax_ids:
|
||||
return account.tax_ids[0].base_code_id.id
|
||||
return False
|
||||
|
||||
def _on_create_write(self, cr, uid, id, context={}):
|
||||
ml = self.browse(cr, uid, id, context)
|
||||
return map(lambda x: x.id, ml.move_id.line_id)
|
||||
|
@ -307,7 +246,6 @@ class account_move_line(osv.osv):
|
|||
'debit': fields.float('Debit', digits=(16,2)),
|
||||
'credit': fields.float('Credit', digits=(16,2)),
|
||||
'account_id': fields.many2one('account.account', 'Account', required=True, ondelete="cascade", domain=[('type','<>','view'), ('type', '<>', 'closed')], select=2),
|
||||
|
||||
'move_id': fields.many2one('account.move', 'Move', ondelete="cascade", states={'valid':[('readonly',True)]}, help="The move of this entry line.", select=2),
|
||||
|
||||
'ref': fields.char('Ref.', size=32),
|
||||
|
@ -334,6 +272,10 @@ class account_move_line(osv.osv):
|
|||
'tax_amount': fields.float('Tax/Base Amount', digits=(16,2), select=True),
|
||||
'invoice': fields.function(_invoice, method=True, string='Invoice',
|
||||
type='many2one', relation='account.invoice', fnct_search=_invoice_search),
|
||||
'account_tax_id':fields.many2one('account.tax', 'Tax'),
|
||||
'analytic_account_id' : fields.many2one('account.analytic.account', 'Analytic Account'),
|
||||
#TODO: remove this
|
||||
'amount_taxed':fields.float("Taxed Amount",digits=(16,2)),
|
||||
}
|
||||
|
||||
def _get_date(self, cr, uid, context):
|
||||
|
@ -394,34 +336,22 @@ class account_move_line(osv.osv):
|
|||
(_check_no_closed, 'You can not create move line on closed account.', ['account_id']),
|
||||
]
|
||||
|
||||
#TODO: ONCHANGE_ACCOUNT_ID: set account_tax_id
|
||||
|
||||
def onchange_partner_id(self, cr, uid, ids, move_id, partner_id, account_id=None, debit=0, credit=0, journal=False):
|
||||
if (not partner_id) or account_id:
|
||||
return {}
|
||||
part = self.pool.get('res.partner').browse(cr, uid, partner_id)
|
||||
id1 = part.property_account_payable.id
|
||||
id2 = part.property_account_receivable.id
|
||||
cr.execute('select sum(debit-credit) from account_move_line where (reconcile_id is null) and partner_id=%d and account_id=%d', (partner_id, id2))
|
||||
balance = cr.fetchone()[0] or 0.0
|
||||
val = {}
|
||||
if (not debit) and (not credit):
|
||||
if abs(balance)>0.01:
|
||||
val['credit'] = ((balance>0) and balance) or 0
|
||||
val['debit'] = ((balance<0) and -balance) or 0
|
||||
val['account_id'] = id2
|
||||
else:
|
||||
cr.execute('select sum(debit-credit) from account_move_line where (reconcile_id is null) and partner_id=%d and account_id=%d', (partner_id, id1))
|
||||
balance = cr.fetchone()[0] or 0.0
|
||||
val['credit'] = ((balance>0) and balance) or 0
|
||||
val['debit'] = ((balance<0) and -balance) or 0
|
||||
val['account_id'] = id1
|
||||
else:
|
||||
val['account_id'] = (debit>0) and id2 or id1
|
||||
if journal:
|
||||
jt = self.pool.get('account.journal').browse(cr, uid, journal).type
|
||||
if jt=='sale':
|
||||
val['account_id'] = id2
|
||||
elif jt=='purchase':
|
||||
val['account_id'] = id1
|
||||
# Compute Maturity Date in val !
|
||||
return {'value':val}
|
||||
|
||||
#
|
||||
|
@ -632,7 +562,19 @@ class account_move_line(osv.osv):
|
|||
def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True):
|
||||
if not context:
|
||||
context={}
|
||||
raise_ex=False
|
||||
account_obj = self.pool.get('account.account')
|
||||
acc=account_obj.browse(cr,uid,ids)[0]
|
||||
|
||||
if ('debit' in vals and 'credit' in vals) and not vals['debit'] and not vals['credit']:
|
||||
raise_ex=True
|
||||
if ('debit' in vals and 'credit' not in vals) and not vals['debit'] and not acc.credit:
|
||||
raise_ex=True
|
||||
if ('credit' in vals and 'debit' not in vals) and not vals['credit'] and not acc.debit:
|
||||
raise_ex=True
|
||||
|
||||
if raise_ex:
|
||||
raise osv.except_osv(_('Wrong Accounting Entry!'), _('Both Credit and Debit cannot be zero!'))
|
||||
|
||||
if ('account_id' in vals) and not account_obj.read(cr, uid, vals['account_id'], ['active'])['active']:
|
||||
raise osv.except_osv(_('Bad account!'), _('You can not use an inactive account!'))
|
||||
|
@ -680,7 +622,9 @@ class account_move_line(osv.osv):
|
|||
def create(self, cr, uid, vals, context=None, check=True):
|
||||
if not context:
|
||||
context={}
|
||||
|
||||
account_obj = self.pool.get('account.account')
|
||||
tax_obj=self.pool.get('account.tax')
|
||||
|
||||
if ('account_id' in vals) and not account_obj.read(cr, uid, vals['account_id'], ['active'])['active']:
|
||||
raise osv.except_osv(_('Bad account!'), _('You can not use an inactive account!'))
|
||||
|
@ -692,7 +636,9 @@ class account_move_line(osv.osv):
|
|||
m = self.pool.get('account.move').browse(cr, uid, vals['move_id'])
|
||||
context['journal_id'] = m.journal_id.id
|
||||
context['period_id'] = m.period_id.id
|
||||
|
||||
self._update_journal_check(cr, uid, context['journal_id'], context['period_id'], context)
|
||||
|
||||
move_id = vals.get('move_id', False)
|
||||
journal = self.pool.get('account.journal').browse(cr, uid, context['journal_id'])
|
||||
if not move_id:
|
||||
|
@ -743,7 +689,48 @@ class account_move_line(osv.osv):
|
|||
vals['amount_currency'] = cur_obj.compute(cr, uid, account.company_id.currency_id.id, account.currency_id.id, vals.get('debit', 0.0)-vals.get('credit', 0.0), context=ctx)
|
||||
if not ok:
|
||||
raise osv.except_osv(_('Bad account !'), _('You can not use this general account in this journal !'))
|
||||
|
||||
result = super(osv.osv, self).create(cr, uid, vals, context)
|
||||
if 'analytic_account_id' in vals and vals['analytic_account_id']:
|
||||
if journal.analytic_journal_id:
|
||||
vals['analytic_lines'] = [(0,0, {
|
||||
'name': vals['name'],
|
||||
'date': vals['date'],
|
||||
'account_id': vals['analytic_account_id'],
|
||||
'unit_amount': vals['quantity'],
|
||||
'amount': vals['debit'] or vals['credit'],
|
||||
'general_account_id': vals['account_id'],
|
||||
'journal_id': journal.analytic_journal_id.id,
|
||||
'ref': vals['ref'],
|
||||
})]
|
||||
|
||||
# CREATE Taxes
|
||||
if 'account_tax_id' in vals and vals['account_tax_id']:
|
||||
tax_id=tax_obj.browse(cr,uid,vals['account_tax_id'])
|
||||
total = vals['credit'] or (-vals['debit'])
|
||||
for tax in tax_obj.compute(cr,uid,[tax_id],total,1.00):
|
||||
print 'Processing Tax', tax
|
||||
self.write(cr, uid,[result], {
|
||||
'tax_code_id': tax['base_code_id'],
|
||||
'tax_amount': tax['base_sign'] * total
|
||||
})
|
||||
data = {
|
||||
'move_id': vals['move_id'],
|
||||
'journal_id': vals['journal_id'],
|
||||
'period_id': vals['period_id'],
|
||||
'name': vals['name']+' '+tax['name'],
|
||||
'date': vals['date'],
|
||||
'partner_id': vals.get('partner_id',False),
|
||||
'ref': vals.get('ref',False),
|
||||
'account_tax_id': False,
|
||||
'tax_code_id': tax['tax_code_id'],
|
||||
'tax_amount': tax['tax_sign'] * tax['amount'],
|
||||
'account_id': tax['account_paid_id'], # or collected ?
|
||||
'credit': tax['amount']>0 and tax['amount'] or 0.0,
|
||||
'debit': tax['amount']<0 and -tax['amount'] or 0.0,
|
||||
}
|
||||
print data
|
||||
self.create(cr, uid, data, context)
|
||||
if check:
|
||||
self.pool.get('account.move').validate(cr, uid, [vals['move_id']], context)
|
||||
return result
|
||||
|
@ -757,7 +744,5 @@ class account_bank_statement_reconcile(osv.osv):
|
|||
}
|
||||
account_bank_statement_reconcile()
|
||||
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
|
@ -653,6 +653,8 @@
|
|||
<field name="journal_id"/>
|
||||
<field name="debit" sum="Total debit"/>
|
||||
<field name="credit" sum="Total credit"/>
|
||||
<field name="account_tax_id"/>
|
||||
<field name="analytic_account_id"/>
|
||||
<field name="amount_currency"/>
|
||||
<field name="currency_id"/>
|
||||
<field name="state"/>
|
||||
|
@ -695,6 +697,9 @@
|
|||
<newline/>
|
||||
<field name="tax_code_id"/>
|
||||
<field name="tax_amount"/>
|
||||
<newline/>
|
||||
<field name="account_tax_id"/>
|
||||
<field name="analytic_account_id"/>
|
||||
|
||||
<separator colspan="4" string="State"/>
|
||||
<field name="journal_id" select="2"/>
|
||||
|
@ -743,6 +748,9 @@
|
|||
<field name="date_created"/>
|
||||
<field name="date_created"/>
|
||||
<field name="blocked" select="3"/>
|
||||
<newline/>
|
||||
<field name="account_tax_id"/>
|
||||
<field name="analytic_account_id"/>
|
||||
|
||||
<separator colspan="4" string="State"/>
|
||||
<newline/>
|
||||
|
@ -1343,6 +1351,8 @@
|
|||
<field name="tax_amount"/>
|
||||
<field name="debit" sum="Total debit"/>
|
||||
<field name="credit" sum="Total credit"/>
|
||||
<field name="account_tax_id"/>
|
||||
<field name="analytic_account_id"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
|
|
@ -74,6 +74,18 @@
|
|||
<field name="field">credit</field>
|
||||
<field eval="11" name="sequence"/>
|
||||
</record>
|
||||
<record id="bank_col11" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_bank_view"/>
|
||||
<field name="name">Tax</field>
|
||||
<field name="field">account_tax_id</field>
|
||||
<field eval="12" name="sequence"/>
|
||||
</record>
|
||||
<record id="bank_col12" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_bank_view"/>
|
||||
<field name="name">Analytic Account</field>
|
||||
<field name="field">analytic_account_id</field>
|
||||
<field eval="13" name="sequence"/>
|
||||
</record>
|
||||
<record id="bank_col3" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_bank_view"/>
|
||||
<field name="name">Ref</field>
|
||||
|
@ -84,7 +96,7 @@
|
|||
<field name="view_id" ref="account_journal_bank_view"/>
|
||||
<field name="name">State</field>
|
||||
<field name="field">state</field>
|
||||
<field eval="12" name="sequence"/>
|
||||
<field eval="14" name="sequence"/>
|
||||
</record>
|
||||
|
||||
<record id="account_journal_bank_view_multi" model="account.journal.view">
|
||||
|
@ -142,17 +154,29 @@
|
|||
<field name="field">credit</field>
|
||||
<field eval="11" name="sequence"/>
|
||||
</record>
|
||||
<record id="bank_col11_multi" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_bank_view_multi"/>
|
||||
<field name="name">Tax</field>
|
||||
<field name="field">account_tax_id</field>
|
||||
<field eval="12" name="sequence"/>
|
||||
</record>
|
||||
<record id="bank_col12_multi" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_bank_view_multi"/>
|
||||
<field name="name">Analytic Account</field>
|
||||
<field name="field">analytic_account_id</field>
|
||||
<field eval="13" name="sequence"/>
|
||||
</record>
|
||||
<record id="bank_col17_multi" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_bank_view_multi"/>
|
||||
<field name="name">Currency Amt.</field>
|
||||
<field name="field">amount_currency</field>
|
||||
<field eval="12" name="sequence"/>
|
||||
<field eval="14" name="sequence"/>
|
||||
</record>
|
||||
<record id="bank_col18_multi" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_bank_view_multi"/>
|
||||
<field name="name">Currency</field>
|
||||
<field name="field">currency_id</field>
|
||||
<field eval="13" name="sequence"/>
|
||||
<field eval="15" name="sequence"/>
|
||||
</record>
|
||||
<record id="bank_col3_multi" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_bank_view_multi"/>
|
||||
|
@ -164,7 +188,7 @@
|
|||
<field name="view_id" ref="account_journal_bank_view_multi"/>
|
||||
<field name="name">State</field>
|
||||
<field name="field">state</field>
|
||||
<field eval="14" name="sequence"/>
|
||||
<field eval="16" name="sequence"/>
|
||||
</record>
|
||||
|
||||
|
||||
|
@ -229,23 +253,35 @@
|
|||
<field name="field">credit</field>
|
||||
<field eval="9" name="sequence"/>
|
||||
</record>
|
||||
<record id="journal_col10" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_view"/>
|
||||
<field name="name">Tax</field>
|
||||
<field name="field">account_tax_id</field>
|
||||
<field eval="10" name="sequence"/>
|
||||
</record>
|
||||
<record id="journal_col11" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_view"/>
|
||||
<field name="name">Analytic Account</field>
|
||||
<field name="field">analytic_account_id</field>
|
||||
<field eval="11" name="sequence"/>
|
||||
</record>
|
||||
<record id="journal_col25" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_view"/>
|
||||
<field name="name">Tax Acc.</field>
|
||||
<field name="field">tax_code_id</field>
|
||||
<field eval="10" name="sequence"/>
|
||||
<field eval="12" name="sequence"/>
|
||||
</record>
|
||||
<record id="journal_col26" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_view"/>
|
||||
<field name="name">Tax</field>
|
||||
<field name="field">tax_amount</field>
|
||||
<field eval="11" name="sequence"/>
|
||||
<field eval="13" name="sequence"/>
|
||||
</record>
|
||||
<record id="journal_col24" model="account.journal.column">
|
||||
<field name="view_id" ref="account_journal_view"/>
|
||||
<field name="name">State</field>
|
||||
<field name="field">state</field>
|
||||
<field eval="12" name="sequence"/>
|
||||
<field eval="14" name="sequence"/>
|
||||
</record>
|
||||
|
||||
|
||||
|
|
|
@ -237,6 +237,14 @@ class account_analytic_journal(osv.osv):
|
|||
}
|
||||
account_analytic_journal()
|
||||
|
||||
class account_journal(osv.osv):
|
||||
_inherit="account.journal"
|
||||
|
||||
_columns = {
|
||||
'analytic_journal_id':fields.many2one('account.analytic.journal','Analytic Journal'),
|
||||
}
|
||||
account_journal()
|
||||
|
||||
|
||||
# ---------------------------------------------------------
|
||||
# Budgets
|
||||
|
|
|
@ -331,5 +331,17 @@
|
|||
|
||||
<act_window domain="[('account_id', '=', active_id)]" id="act_acc_analytic_acc_2_report_hr_timesheet_invoice_journal" name="Costs & Revenues" res_model="report.hr.timesheet.invoice.journal" src_model="account.analytic.account" view_mode="graph,tree,form" view_type="form"/>
|
||||
|
||||
<record id="view_account_journal_1" model="ir.ui.view">
|
||||
<field name="name">account.journal.form.1</field>
|
||||
<field name="model">account.journal</field>
|
||||
<field name="inherit_id" ref="account.view_account_journal_form"/>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<field name="currency" position="after">
|
||||
<field name="analytic_journal_id"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</terp>
|
||||
|
|
Loading…
Reference in New Issue