diff --git a/addons/account/account.py b/addons/account/account.py
index 6095c2aa113..5181028c17b 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -231,9 +231,9 @@ class account_account(osv.osv):
aml_query = self.pool.get('account.move.line')._query_get(cr, uid, context=context)
wheres = [""]
- if query:
+ if query.strip():
wheres.append(query.strip())
- if aml_query:
+ if aml_query.strip():
wheres.append(aml_query.strip())
query = " AND ".join(wheres)
@@ -251,6 +251,7 @@ class account_account(osv.osv):
# consolidate accounts with direct children
+ ids2.reverse()
brs = list(self.browse(cr, uid, ids2, context=context))
sums = {}
while brs:
@@ -270,8 +271,9 @@ class account_account(osv.osv):
if current.child_id:
sums[current.id][fn] += sum(sums[child.id][fn] for child in current.child_id)
res = {}
+ null_result = dict((fn, 0.0) for fn in field_names)
for id in ids:
- res[id] = sums[id]
+ res[id] = sums.get(id, null_result)
return res
def _get_company_currency(self, cr, uid, ids, field_name, arg, context={}):
@@ -313,7 +315,7 @@ class account_account(osv.osv):
'user_type': fields.many2one('account.account.type', 'Account Type', required=True,
help="These types are defined according to your country. The type contains more information "\
"about the account and its specificities."),
- 'parent_id': fields.many2one('account.account', 'Parent', ondelete='cascade'),
+ 'parent_id': fields.many2one('account.account', 'Parent', ondelete='cascade', domain=[('type','=','view')]),
'child_parent_ids': fields.one2many('account.account','parent_id','Children'),
'child_consol_ids': fields.many2many('account.account', 'account_account_consol_rel', 'child_id', 'parent_id', 'Consolidated Children'),
'child_id': fields.function(_get_child_ids, method=True, type='many2many', relation="account.account", string="Child Accounts"),
@@ -450,18 +452,42 @@ class account_account(osv.osv):
def _check_moves(self, cr, uid, ids, method, context):
line_obj = self.pool.get('account.move.line')
account_ids = self.search(cr, uid, [('id', 'child_of', ids)])
+
if line_obj.search(cr, uid, [('account_id', 'in', account_ids)]):
if method == 'write':
raise osv.except_osv(_('Error !'), _('You cannot deactivate an account that contains account moves.'))
elif method == 'unlink':
raise osv.except_osv(_('Error !'), _('You cannot remove an account which has account entries!. '))
+ #Checking whether the account is set as a property to any Partner or not
+ value = 'account.account,' + str(ids[0])
+ partner_prop_acc = self.pool.get('ir.property').search(cr, uid, [('value_reference','=',value)], context=context)
+ if partner_prop_acc:
+ raise osv.except_osv(_('Warning !'), _('You cannot remove/deactivate an account which is set as a property to any Partner.'))
+ return True
+
+ def _check_allow_type_change(self, cr, uid, ids, new_type, context):
+ group1 = ['payable', 'receivable', 'other']
+ group2 = ['consolidation','view']
+ line_obj = self.pool.get('account.move.line')
+ for account in self.browse(cr, uid, ids, context=context):
+ old_type = account.type
+ account_ids = self.search(cr, uid, [('id', 'child_of', [account.id])])
+ if line_obj.search(cr, uid, [('account_id', 'in', account_ids)]):
+ #Check for 'Closed' type
+ if old_type == 'closed' and new_type !='closed':
+ raise osv.except_osv(_('Warning !'), _("You cannot change the type of account from 'Closed' to any other type which contains account entries!"))
+ #Check for change From group1 to group2 and vice versa
+ if (old_type in group1 and new_type in group2) or (old_type in group2 and new_type in group1):
+ raise osv.except_osv(_('Warning !'), _("You cannot change the type of account from '%s' to '%s' type as it contains account entries!") % (old_type,new_type,))
return True
def write(self, cr, uid, ids, vals, context=None):
- if not context:
+ if context is None:
context = {}
if 'active' in vals and not vals['active']:
self._check_moves(cr, uid, ids, "write", context)
+ if 'type' in vals.keys():
+ self._check_allow_type_change(cr, uid, ids, vals['type'], context=context)
return super(account_account, self).write(cr, uid, ids, vals, context=context)
def unlink(self, cr, uid, ids, context={}):
@@ -557,15 +583,16 @@ class account_journal(osv.osv):
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100):
if not args:
- args=[]
- if not context:
- context={}
+ args = []
+ if context is None:
+ context = {}
ids = []
if name:
- ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit)
+ ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit, context=context)
if not ids:
- ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit)
+ ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit, context=context)
return self.name_get(cr, user, ids, context=context)
+
account_journal()
class account_fiscalyear(osv.osv):
@@ -631,6 +658,19 @@ class account_fiscalyear(osv.osv):
else:
return False
return ids[0]
+
+ def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
+ if args is None:
+ args = []
+ if context is None:
+ context = {}
+ ids = []
+ if name:
+ ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit)
+ if not ids:
+ ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit)
+ return self.name_get(cr, user, ids, context=context)
+
account_fiscalyear()
class account_period(osv.osv):
@@ -706,12 +746,24 @@ class account_period(osv.osv):
cr.execute('update account_journal_period set state=%s where period_id=%s', (mode, id))
cr.execute('update account_period set state=%s where id=%s', (mode, id))
return True
+
+ def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
+ if args is None:
+ args = []
+ if context is None:
+ context = {}
+ ids = []
+ if name:
+ ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit)
+ if not ids:
+ ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit)
+ return self.name_get(cr, user, ids, context=context)
account_period()
class account_journal_period(osv.osv):
_name = "account.journal.period"
- _description = "Journal - Period"
+ _description = "Journal Period"
def _icon_get(self, cr, uid, ids, field_name, arg=None, context={}):
result = {}.fromkeys(ids, 'STOCK_NEW')
@@ -950,7 +1002,6 @@ class account_move(osv.osv):
l[2]['period_id'] = default_period
context['period_id'] = default_period
- accnt_journal = self.pool.get('account.journal').browse(cr, uid, vals['journal_id'])
if 'line_id' in vals:
c = context.copy()
c['novalidate'] = True
@@ -1248,7 +1299,7 @@ class account_tax_code(osv.osv):
_description = 'Tax Code'
_rec_name = 'code'
_columns = {
- 'name': fields.char('Tax Case Name', size=64, required=True),
+ 'name': fields.char('Tax Case Name', size=64, required=True, translate=True),
'code': fields.char('Case Code', size=64),
'info': fields.text('Description'),
'sum': fields.function(_sum_year, method=True, string="Year Sum"),
@@ -1262,6 +1313,15 @@ class account_tax_code(osv.osv):
}
+ def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
+ if not args:
+ args = []
+ if context is None:
+ context = {}
+ ids = self.search(cr, user, ['|',('name',operator,name),('code',operator,name)] + args, limit=limit, context=context)
+ return self.name_get(cr, user, ids, context)
+
+
def name_get(self, cr, uid, ids, context=None):
if not len(ids):
return []
@@ -1290,7 +1350,15 @@ class account_tax_code(osv.osv):
return False
level -= 1
return True
+
+ def copy(self, cr, uid, id, default=None, context=None):
+ if default is None:
+ default = {}
+ default = default.copy()
+ default.update({'line_ids': []})
+ return super(account_tax_code, self).copy(cr, uid, id, default, context)
+
_constraints = [
(_check_recursion, 'Error ! You can not create recursive accounts.', ['parent_id'])
]
diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py
index ce6341cc9b2..1fa0a5c6cfa 100644
--- a/addons/account/account_analytic_line.py
+++ b/addons/account/account_analytic_line.py
@@ -30,7 +30,7 @@ from tools import config
class account_analytic_line(osv.osv):
_inherit = 'account.analytic.line'
- _description = 'Analytic lines'
+ _description = 'Analytic Line'
_columns = {
'product_uom_id' : fields.many2one('product.uom', 'UoM'),
'product_id' : fields.many2one('product.product', 'Product'),
@@ -42,7 +42,7 @@ class account_analytic_line(osv.osv):
}
_defaults = {
'date': lambda *a: time.strftime('%Y-%m-%d'),
- 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.analytic.line', c),
+ 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.analytic.line', context=c),
}
_order = 'date'
@@ -118,7 +118,7 @@ account_analytic_line()
class timesheet_invoice(osv.osv):
_name = "report.hr.timesheet.invoice.journal"
- _description = "Analytic account costs and revenues"
+ _description = "Analytic Account Costs and Revenues"
_auto = False
_columns = {
'name': fields.char('Year',size=64,required=False, readonly=True),
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index deb010c7cd0..9b1497b563f 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -387,7 +387,7 @@ account_bank_statement()
class account_bank_statement_reconcile(osv.osv):
_name = "account.bank.statement.reconcile"
- _description = "Statement reconcile"
+ _description = "Statement Reconcile"
def _total_entry(self, cursor, user, ids, name, attr, context=None):
result = {}
@@ -558,35 +558,40 @@ class account_bank_statement_line(osv.osv):
def onchange_partner_id(self, cursor, user, line_id, partner_id, type, currency_id,
context={}):
+ res = {'value': {}}
if not partner_id:
- return {}
- res_currency_obj = self.pool.get('res.currency')
- res_users_obj = self.pool.get('res.users')
-
- company_currency_id = res_users_obj.browse(cursor, user, user,
- context=context).company_id.currency_id.id
-
- if not currency_id:
- currency_id = company_currency_id
-
- part = self.pool.get('res.partner').browse(cursor, user, partner_id,
+ return res
+ line = self.browse(cursor, user, line_id)
+
+ if not line or (line and not line[0].account_id):
+ part = self.pool.get('res.partner').browse(cursor, user, partner_id,
context=context)
- if type == 'supplier':
- account_id = part.property_account_payable.id
- else:
- account_id = part.property_account_receivable.id
+ if type == 'supplier':
+ account_id = part.property_account_payable.id
+ else:
+ account_id = part.property_account_receivable.id
+ res['value']['account_id'] = account_id
- cursor.execute('SELECT sum(debit-credit) \
+ if not line or (line and not line[0].amount):
+ res_users_obj = self.pool.get('res.users')
+ res_currency_obj = self.pool.get('res.currency')
+ company_currency_id = res_users_obj.browse(cursor, user, user,
+ context=context).company_id.currency_id.id
+ if not currency_id:
+ currency_id = company_currency_id
+
+ cursor.execute('SELECT sum(debit-credit) \
FROM account_move_line \
WHERE (reconcile_id is null) \
AND partner_id = %s \
AND account_id=%s', (partner_id, account_id))
- res = cursor.fetchone()
- balance = res and res[0] or 0.0
+ pgres = cursor.fetchone()
+ balance = pgres and pgres[0] or 0.0
- balance = res_currency_obj.compute(cursor, user, company_currency_id,
+ balance = res_currency_obj.compute(cursor, user, company_currency_id,
currency_id, balance, context=context)
- return {'value': {'amount': balance, 'account_id': account_id}}
+ res['value']['amount'] = balance
+ return res
def _reconcile_amount(self, cursor, user, ids, name, args, context=None):
if not ids:
@@ -633,7 +638,7 @@ class account_bank_statement_line(osv.osv):
'note': fields.text('Notes'),
'reconcile_amount': fields.function(_reconcile_amount,
string='Amount reconciled', method=True, type='float'),
- 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of bank statement line."),
+ 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of bank statement lines."),
}
_defaults = {
'name': lambda self,cr,uid,context={}: self.pool.get('ir.sequence').get(cr, uid, 'account.bank.statement.line'),
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml
index 2ce4324f7c6..2da7c71021c 100644
--- a/addons/account/account_invoice_view.xml
+++ b/addons/account/account_invoice_view.xml
@@ -478,9 +478,11 @@
-
-
+
+
+
+
res.partner.invoice.info.inheritres.partner
diff --git a/addons/account/account_invoice_workflow.xml b/addons/account/account_invoice_workflow.xml
index 374a436e9ac..4c919765596 100644
--- a/addons/account/account_invoice_workflow.xml
+++ b/addons/account/account_invoice_workflow.xml
@@ -50,7 +50,7 @@ write({'state':'open'})
paid
- write({'state':'paid'})
+ confirm_paid()functionsubflow.paid
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index a86fce20772..36b65d20dca 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -30,7 +30,7 @@ import tools
class account_move_line(osv.osv):
_name = "account.move.line"
- _description = "Entry lines"
+ _description = "Entry Lines"
def _query_get(self, cr, uid, obj='l', context={}):
fiscalyear_obj = self.pool.get('account.fiscalyear')
@@ -577,11 +577,12 @@ class account_move_line(osv.osv):
merges_rec = []
for line in self.browse(cr, uid, ids, context):
if line.reconcile_id:
- raise osv.except_osv(_('Already Reconciled'), _('Already Reconciled'))
+ raise osv.except_osv(_('Warning'), _('Already Reconciled!'))
if line.reconcile_partial_id:
for line2 in line.reconcile_partial_id.line_partial_ids:
if not line2.reconcile_id:
- merges.append(line2.id)
+ if line2.id not in merges:
+ merges.append(line2.id)
total += (line2.debit or 0.0) - (line2.credit or 0.0)
merges_rec.append(line.reconcile_partial_id.id)
else:
@@ -774,6 +775,17 @@ class account_move_line(osv.osv):
result['fields'] = self.fields_get(cr, uid, fields, context)
return result
+ def _check_moves(self, cr, uid, context):
+ # use the first move ever created for this journal and period
+ cr.execute('select id, state, name from account_move where journal_id=%s and period_id=%s order by id limit 1', (context['journal_id'],context['period_id']))
+ res = cr.fetchone()
+ if res:
+ if res[1] != 'draft':
+ raise osv.except_osv(_('UserError'),
+ _('The account move (%s) for centralisation ' \
+ 'has been confirmed!') % res[2])
+ return res
+
def unlink(self, cr, uid, ids, context={}, check=True):
self._update_check(cr, uid, ids, context)
result = False
@@ -809,7 +821,7 @@ class account_move_line(osv.osv):
return True
def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True):
- if not context:
+ if context is None:
context={}
if vals.get('account_tax_id', False):
raise osv.except_osv(_('Unable to change tax !'), _('You can not change the tax, you should remove and recreate lines !'))
@@ -825,6 +837,24 @@ class account_move_line(osv.osv):
if vals.get('date', False):
todo_date = vals['date']
del vals['date']
+
+ for line in self.browse(cr, uid, ids,context=context):
+ ctx = context.copy()
+ if ('journal_id' not in ctx):
+ if line.move_id:
+ ctx['journal_id'] = line.move_id.journal_id.id
+ else:
+ ctx['journal_id'] = line.journal_id.id
+ if ('period_id' not in ctx):
+ if line.move_id:
+ ctx['period_id'] = line.move_id.period_id.id
+ else:
+ ctx['period_id'] = line.period_id.id
+ #Check for centralisation
+ journal = self.pool.get('account.journal').browse(cr, uid, ctx['journal_id'], context=ctx)
+ if journal.centralisation:
+ self._check_moves(cr, uid, context=ctx)
+
result = super(account_move_line, self).write(cr, uid, ids, vals, context)
if check:
@@ -891,14 +921,9 @@ class account_move_line(osv.osv):
is_new_move = False
if not move_id:
if journal.centralisation:
- # use the first move ever created for this journal and period
- cr.execute('select id, state, name from account_move where journal_id=%s and period_id=%s order by id limit 1', (context['journal_id'],context['period_id']))
- res = cr.fetchone()
+ #Check for centralisation
+ res = self._check_moves(cr, uid, context)
if res:
- if res[1] != 'draft':
- raise osv.except_osv(_('UserError'),
- _('The Ledger Posting (%s) for centralisation ' \
- 'has been confirmed!') % res[2])
vals['move_id'] = res[0]
if not vals.get('move_id', False):
@@ -926,7 +951,7 @@ class account_move_line(osv.osv):
break
if journal.account_control_ids and not ok:
for a in journal.account_control_ids:
- if a.id==vals['account_id']:
+ if a.id == vals['account_id']:
ok = True
break
if (account.currency_id) and 'amount_currency' not in vals and account.currency_id.id <> company_currency:
@@ -941,7 +966,7 @@ class account_move_line(osv.osv):
if not ok:
raise osv.except_osv(_('Bad account !'), _('You can not use this general account in this journal !'))
- if 'analytic_account_id' in vals and vals['analytic_account_id']:
+ if vals.get('analytic_account_id',False):
if journal.analytic_journal_id:
vals['analytic_lines'] = [(0,0, {
'name': vals['name'],
@@ -961,8 +986,8 @@ class account_move_line(osv.osv):
result = super(osv.osv, self).create(cr, uid, vals, context)
# CREATE Taxes
- if 'account_tax_id' in vals and vals['account_tax_id']:
- tax_id=tax_obj.browse(cr,uid,vals['account_tax_id'])
+ if vals.get('account_tax_id',False):
+ tax_id = tax_obj.browse(cr, uid, vals['account_tax_id'])
total = vals['debit'] - vals['credit']
if journal.refund_journal:
base_code = 'ref_base_code_id'
@@ -978,7 +1003,7 @@ class account_move_line(osv.osv):
tax_sign = 'tax_sign'
tmp_cnt = 0
- for tax in tax_obj.compute(cr,uid,[tax_id],total,1.00):
+ for tax in tax_obj.compute(cr, uid, [tax_id], total, 1.00):
#create the base movement
if tmp_cnt == 0:
if tax[base_code]:
@@ -1031,7 +1056,7 @@ class account_move_line(osv.osv):
# if context and ('__last_update' in context):
# del context['__last_update']
# self.pool.get('account.move').write(cr, uid, [move_id], {'date':vals['date']}, context=context)
- if check and not context.get('no_store_function'):
+ if check and ((not context.get('no_store_function')) or journal.entry_posted):
tmp = self.pool.get('account.move').validate(cr, uid, [vals['move_id']], context)
if journal.entry_posted and tmp:
self.pool.get('account.move').button_validate(cr,uid, [vals['move_id']],context)
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 5e514041d1d..6c5be231657 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -531,7 +531,10 @@
+
+
+
@@ -551,6 +554,7 @@
+
@@ -562,7 +566,7 @@
@@ -1453,9 +1457,11 @@
-
+
-
+
+
+ Account Add wizard
diff --git a/addons/account/i18n/eu.po b/addons/account/i18n/eu.po
index 68a84f413de..68344247171 100644
--- a/addons/account/i18n/eu.po
+++ b/addons/account/i18n/eu.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-05-18 05:15+0000\n"
+"X-Launchpad-Export-Date: 2010-05-19 05:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account
diff --git a/addons/account/i18n/oc.po b/addons/account/i18n/oc.po
index 53532fba0ac..180ce8da31a 100644
--- a/addons/account/i18n/oc.po
+++ b/addons/account/i18n/oc.po
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2010-03-13 10:33+0000\n"
-"Last-Translator: Cédric VALMARY (Per Tot en òc) \n"
+"PO-Revision-Date: 2010-05-18 08:45+0000\n"
+"Last-Translator: Cédric VALMARY (Tot en òc) \n"
"Language-Team: Occitan (post 1500) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 04:07+0000\n"
+"X-Launchpad-Export-Date: 2010-05-19 05:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account
@@ -175,7 +175,7 @@ msgstr ""
#. module: account
#: view:account.move:0
msgid "Total Credit"
-msgstr "Total crrdit"
+msgstr "Credit Total"
#. module: account
#: field:account.config.wizard,charts:0
@@ -255,7 +255,7 @@ msgstr "Taxas provesidors"
#. module: account
#: view:account.move:0
msgid "Total Debit"
-msgstr "Total debit"
+msgstr "Debit Total"
#. module: account
#: rml:account.tax.code.entries:0
@@ -808,7 +808,6 @@ msgstr ""
msgid "Move Lines"
msgstr ""
-
#. module: account
#: model:ir.actions.act_window,name:account.report_account_analytic_journal_tree
#: model:ir.ui.menu,name:account.report_account_analytic_journal_print
@@ -2136,7 +2135,8 @@ msgid "Analytic Entry"
msgstr ""
#. module: account
-#: view:res.company:0 field:res.company,overdue_msg:0
+#: view:res.company:0
+#: field:res.company,overdue_msg:0
msgid "Overdue Payments Message"
msgstr ""
diff --git a/addons/account/invoice.py b/addons/account/invoice.py
index 34c7aa3e6ba..dbaa321f329 100644
--- a/addons/account/invoice.py
+++ b/addons/account/invoice.py
@@ -23,8 +23,8 @@ import time
import decimal_precision as dp
import netsvc
+
from osv import fields, osv, orm
-import ir
import pooler
from tools import config
from tools.translate import _
@@ -217,6 +217,7 @@ class account_invoice(osv.osv):
_name = "account.invoice"
_description = 'Invoice'
_order = "number"
+ _log_create = True
_columns = {
'name': fields.char('Description', size=64, select=True,readonly=True, states={'draft':[('readonly',False)]}),
'origin': fields.char('Source Document', size=64, help="Reference of the document that produced this invoice."),
@@ -333,7 +334,14 @@ class account_invoice(osv.osv):
raise orm.except_orm(_('Configuration Error!'),
_('There is no Accounting Journal of type Sale/Purchase defined!'))
else:
- raise
+ raise orm.except_orm(_('UnknownError'), str(e))
+
+ def confirm_paid(self, cr, uid, ids, context=None):
+ self.write(cr, uid, ids, {'state':'paid'}, context=context)
+ for (id,name) in self.name_get(cr, uid, ids):
+ message = _('Document ') + " '" + name + "' "+ _("has been paid.")
+ self.log(cr, uid, id, message)
+ return True
def unlink(self, cr, uid, ids, context=None):
invoices = self.read(cr, uid, ids, ['state'])
@@ -350,7 +358,7 @@ class account_invoice(osv.osv):
# res = self.pool.get('res.partner').address_get(cr, uid, [part], ['invoice'])
# return [{}]
def onchange_partner_id(self, cr, uid, ids, type, partner_id,
- date_invoice=False, payment_term=False, partner_bank_id=False, company_id=False):
+ date_invoice=False, payment_term=False, partner_bank=False, company_id=False):
invoice_addr_id = False
contact_addr_id = False
partner_payment_term = False
@@ -415,7 +423,7 @@ class account_invoice(osv.osv):
else:
result['value']['date_due'] = False
- if partner_bank_id != bank_id:
+ if partner_bank != bank_id:
to_update = self.onchange_partner_bank(cr, uid, ids, bank_id)
result['value'].update(to_update['value'])
return result
@@ -450,7 +458,7 @@ class account_invoice(osv.osv):
def onchange_invoice_line(self, cr, uid, ids, lines):
return {}
- def onchange_partner_bank(self, cursor, user, ids, partner_bank_id):
+ def onchange_partner_bank(self, cursor, user, ids, partner_bank):
return {'value': {}}
def onchange_company_id(self, cr, uid, ids, company_id, part_id, type, invoice_line, currency_id):
@@ -650,6 +658,16 @@ class account_invoice(osv.osv):
self.write(cr, uid, [inv.id], res['value'])
return True
+ def finalize_invoice_move_lines(self, cr, uid, invoice_browse, move_lines):
+ """finalize_invoice_move_lines(cr, uid, invoice, move_lines) -> move_lines
+ Hook method to be overridden in additional modules to verify and possibly alter the
+ move lines to be created by an invoice, for special cases.
+ :param invoice_browse: browsable record of the invoice that is generating the move lines
+ :param move_lines: list of dictionaries with the account.move.lines (as for create())
+ :return: the (possibly updated) final move_lines to create for this invoice
+ """
+ return move_lines
+
def check_tax_lines(self, cr, uid, inv, compute_taxes, ait_obj):
if not inv.tax_line:
for tax in compute_taxes.values():
@@ -912,7 +930,12 @@ class account_invoice(osv.osv):
# will be automatically deleted too
account_move_obj.unlink(cr, uid, [i['move_id'][0]])
if i['payment_ids']:
- self.pool.get('account.move.line').write(cr, uid, i['payment_ids'], {'reconcile_partial_id': False})
+ account_move_line_obj = self.pool.get('account.move.line')
+ pay_ids = account_move_line_obj.browse(cr, uid , i['payment_ids'])
+ for move_line in pay_ids:
+ if move_line.reconcile_partial_id and move_line.reconcile_partial_id.line_partial_ids:
+ raise osv.except_osv(_('Error !'), _('You cannot cancel the Invoice which is Partially Paid! You need to unreconcile concerned payment entries!'))
+
self.write(cr, uid, ids, {'state':'cancel', 'move_id':False})
self._log_event(cr, uid, ids,-1.0, 'Cancel Invoice')
return True
@@ -1147,14 +1170,14 @@ class account_invoice_line(osv.osv):
t = t - (p * l[2].get('quantity'))
taxes = l[2].get('invoice_line_tax_id')
if len(taxes[0]) >= 3 and taxes[0][2]:
- taxes=tax_obj.browse(cr, uid, taxes[0][2])
+ taxes = tax_obj.browse(cr, uid, taxes[0][2])
for tax in tax_obj.compute(cr, uid, taxes, p,l[2].get('quantity'), context.get('address_invoice_id', False), l[2].get('product_id', False), context.get('partner_id', False)):
t = t - tax['amount']
return t
return 0
_name = "account.invoice.line"
- _description = "Invoice line"
+ _description = "Invoice Line"
_columns = {
'name': fields.char('Description', size=256, required=True),
'origin': fields.char('Origin', size=256, help="Reference of the document that produced this invoice."),
@@ -1200,8 +1223,8 @@ class account_invoice_line(osv.osv):
part = self.pool.get('res.partner').browse(cr, uid, partner_id)
fpos = fposition_id and self.pool.get('account.fiscal.position').browse(cr, uid, fposition_id) or False
- lang=part.lang
- context.update({'lang': lang})
+ if part.lang:
+ context.update({'lang': part.lang})
result = {}
res = self.pool.get('product.product').browse(cr, uid, product, context=context)
diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml
index 494c0f71a48..edbe704d4db 100644
--- a/addons/account/partner_view.xml
+++ b/addons/account/partner_view.xml
@@ -113,6 +113,7 @@
+
diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml
index 71e57cb82e2..e57629d2618 100644
--- a/addons/account/project/project_view.xml
+++ b/addons/account/project/project_view.xml
@@ -25,13 +25,13 @@
-
+
@@ -97,6 +97,7 @@
formtree,graph,form
+ {"search_default_user_id":uid}
@@ -188,11 +189,11 @@
-
+
@@ -202,6 +203,7 @@
ir.actions.act_windowaccount.analytic.lineform
+ {"search_default_user_id":uid}
diff --git a/addons/account/project/report/analytic_check.py b/addons/account/project/report/analytic_check.py
index 54fbaddc4d9..458827d8bf3 100644
--- a/addons/account/project/report/analytic_check.py
+++ b/addons/account/project/report/analytic_check.py
@@ -54,12 +54,12 @@ class account_analytic_analytic_check(report_sxw.rml_parse):
self.cr.execute("SELECT abs(sum(amount)) AS balance \
FROM account_analytic_line \
- WHERE date>=%s AND date<=%s AND amount>0 AND general_account_id = %s", (date1, date2, a['id']))
+ WHERE date>=%s AND date<=%s AND amount<0 AND general_account_id = %s", (date1, date2, a['id']))
(ad,) = self.cr.fetchone()
ad = ad or 0.0
self.cr.execute("SELECT abs(sum(amount)) AS balance \
FROM account_analytic_line \
- WHERE date>=%s AND date<=%s AND amount<0 AND general_account_id = %s", (date1, date2, a['id']))
+ WHERE date>=%s AND date<=%s AND amount>0 AND general_account_id = %s", (date1, date2, a['id']))
(ac,) = self.cr.fetchone()
ac = ac or 0.0
diff --git a/addons/account/report/account_analytic_report_view.xml b/addons/account/report/account_analytic_report_view.xml
index de97bfcb798..e9336cd1393 100644
--- a/addons/account/report/account_analytic_report_view.xml
+++ b/addons/account/report/account_analytic_report_view.xml
@@ -44,12 +44,7 @@
-
-
-
+
diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml
index 5a833e454fb..33d3442ddbb 100644
--- a/addons/account/report/account_invoice_report_view.xml
+++ b/addons/account/report/account_invoice_report_view.xml
@@ -79,10 +79,6 @@
- account.invoice.reportformtree,graph
- {'search_default_month':1,'search_default_User':1,'group_by_no_leaf':1,'group_by':[]}
+ {'search_default_month':1,'search_default_User':1,'group_by_no_leaf':1,'group_by':[],'search_default_user_id':uid}
diff --git a/addons/account/report/overdue.rml b/addons/account/report/overdue.rml
index 2713b665d06..e8e1a7dc84c 100644
--- a/addons/account/report/overdue.rml
+++ b/addons/account/report/overdue.rml
@@ -84,8 +84,8 @@
+
- [[ repeatIn(objects,'o') ]][[ setLang(o.lang) ]]
@@ -177,16 +177,16 @@
[[ line['ref'] ]]
- [[ line['date_maturity'] ]]
+ [[ line['date_maturity'] and formatLang(line['date_maturity'],date=True) or '' ]]
- [[ formatLang(line['debit']) and formatLang(line['debit'] * (line['account_id']['type'] == 'payable' and -1 or 1)) ]]
+ [[ (line['account_id']['type'] == 'receivable' and formatLang(line['debit']) or 0) or (line['account_id']['type'] == 'payable' and formatLang(line['credit'] * -1) or ' ') ]]
- [[ formatLang(line['credit']) and formatLang(line['credit'] * (line['account_id']['type'] == 'payable' and -1 or 1)) ]]
+ [[ (line['account_id']['type'] == 'receivable' and formatLang(line['credit']) or 0) or (line['account_id']['type'] == 'payable' and formatLang(line['debit'] * -1) or 0) ]]
- [[ formatLang((line['date_maturity'] < time.strftime('%Y-%m-%d')) and ((line['debit'] - line['credit']) * (line['account_id']['type'] == 'payable' and -1 or 1))) ]]
+ [[ formatLang((line['date_maturity'] < time.strftime('%Y-%m-%d'))) and (line['debit'] - line['credit']) ]]
[[ line['blocked'] and 'X' or '' ]]
@@ -205,13 +205,13 @@
Sub-Total :
- [[ formatLang((reduce(lambda x, y: x + (y['debit'] * (y['account_id']['type'] == 'payable' and -1 or 1)), getLines(o), 0))) ]]
+ [[ formatLang((reduce(lambda x, y: x + ((y['account_id']['type'] == 'receivable' and y['debit'] or 0) or (y['account_id']['type'] == 'payable' and y['credit'] * -1 or 0)), getLines(o), 0))) ]]
- [[ formatLang((reduce(lambda x ,y: x + (y['credit'] * (y['account_id']['type'] == 'payable' and -1 or 1)), getLines(o), 0))) ]]
+ [[ formatLang((reduce(lambda x, y: x + ((y['account_id']['type'] == 'receivable' and y['credit'] or 0) or (y['account_id']['type'] == 'payable' and y['debit'] * -1 or 0)), getLines(o), 0))) ]]