diff --git a/addons/account/account.py b/addons/account/account.py
index 02cb63ca818..bedff44b7e8 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -289,20 +289,20 @@ class account_account(osv.osv):
sums = {}
while brs:
current = brs[0]
- can_compute = True
- for child in current.child_id:
- if child.id not in sums:
- can_compute = False
- try:
- brs.insert(0, brs.pop(brs.index(child)))
- except ValueError:
- brs.insert(0, child)
- if can_compute:
- brs.pop(0)
- for fn in field_names:
- sums.setdefault(current.id, {})[fn] = accounts.get(current.id, {}).get(fn, 0.0)
- if current.child_id:
- sums[current.id][fn] += sum(sums[child.id][fn] for child in current.child_id)
+# can_compute = True
+# for child in current.child_id:
+# if child.id not in sums:
+# can_compute = False
+# try:
+# brs.insert(0, brs.pop(brs.index(child)))
+# except ValueError:
+# brs.insert(0, child)
+# if can_compute:
+ brs.pop(0)
+ for fn in field_names:
+ sums.setdefault(current.id, {})[fn] = accounts.get(current.id, {}).get(fn, 0.0)
+ 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:
@@ -2678,7 +2678,8 @@ class wizard_multi_charts_accounts(osv.osv_memory):
tax_template_ref[tax.id] = new_tax
#deactivate the parent_store functionnality on account_account for rapidity purpose
- self.pool._init = True
+ ctx = context and context.copy() or {}
+ ctx['defer_parent_store_computation'] = True
children_acc_template = obj_acc_template.search(cr, uid, [('parent_id','child_of',[obj_acc_root.id]),('nocreate','!=',True)])
children_acc_template.sort()
@@ -2706,10 +2707,9 @@ class wizard_multi_charts_accounts(osv.osv_memory):
'tax_ids': [(6,0,tax_ids)],
'company_id': company_id,
}
- new_account = obj_acc.create(cr, uid, vals)
+ new_account = obj_acc.create(cr, uid, vals, context=ctx)
acc_template_ref[account_template.id] = new_account
#reactivate the parent_store functionnality on account_account
- self.pool._init = False
self.pool.get('account.account')._parent_store_compute(cr)
for key,value in todo_dict.items():
@@ -2857,7 +2857,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
'name': tmp,
'currency_id': line.currency_id and line.currency_id.id or False,
'code': new_code,
- 'type': 'other',
+ 'type': 'liquidity',
'user_type': account_template.user_type and account_template.user_type.id or False,
'reconcile': True,
'parent_id': acc_template_ref[ref_acc_bank.id] or False,
@@ -2879,7 +2879,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
vals_journal['name']= vals['name']
vals_journal['code']= _('BNK') + str(current_num)
vals_journal['sequence_id'] = seq_id
- vals_journal['type'] = 'cash'
+ vals_journal['type'] = line.account_type == 'cash' and 'cash' or 'bank'
vals_journal['company_id'] = company_id
vals_journal['analytic_journal_id'] = analitical_journal_bank
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 2d9ac7d6b15..a9bb550429a 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -757,7 +757,7 @@ class account_move_line(osv.osv):
if 'comment' in context and context['comment']:
libelle = context['comment']
else:
- libelle = 'Write-Off'
+ libelle = _('Write-Off')
writeoff_lines = [
(0, 0, {
'name': libelle,
diff --git a/addons/account/installer.py b/addons/account/installer.py
index 0301126a373..1bda9427e75 100644
--- a/addons/account/installer.py
+++ b/addons/account/installer.py
@@ -219,7 +219,8 @@ class account_installer(osv.osv_memory):
tax_template_ref[tax.id] = new_tax
#deactivate the parent_store functionnality on account_account for rapidity purpose
- self.pool._init = True
+ ctx = context and context.copy() or {}
+ ctx['defer_parent_store_computation'] = True
children_acc_template = obj_acc_template.search(cr, uid, [('parent_id', 'child_of', [obj_acc_root.id]), ('nocreate', '!=', True)], context=context)
children_acc_template.sort()
@@ -248,7 +249,7 @@ class account_installer(osv.osv_memory):
'tax_ids': [(6, 0, tax_ids)],
'company_id': company_id.id,
}
- new_account = obj_acc.create(cr, uid, vals, context=context)
+ new_account = obj_acc.create(cr, uid, vals, context=ctx)
acc_template_ref[account_template.id] = new_account
if account_template.name == 'Bank Current Account':
b_vals = {
@@ -262,8 +263,7 @@ class account_installer(osv.osv_memory):
'tax_ids': [(6,0,tax_ids)],
'company_id': company_id.id,
}
- bank_account = obj_acc.create(cr, uid, b_vals, context=context)
-
+ bank_account = obj_acc.create(cr, uid, b_vals, context=ctx)
view_id_cash = obj_acc_journal_view.search(cr, uid, [('name', '=', 'Bank/Cash Journal View')], context=context)[0] #why fixed name here?
view_id_cur = obj_acc_journal_view.search(cr, uid, [('name', '=', 'Bank/Cash Journal (Multi-Currency) View')], context=context)[0] #Why Fixed name here?
@@ -333,7 +333,7 @@ class account_installer(osv.osv_memory):
'parent_id': bank_account,
'company_id': company_id.id
}
- child_bnk_acc = obj_acc.create(cr, uid, vals_bnk, context=context)
+ child_bnk_acc = obj_acc.create(cr, uid, vals_bnk, context=ctx)
vals_seq_child = {
'name': _(vals_bnk['name'] + ' ' + 'Journal'),
'code': 'account.journal',
@@ -367,7 +367,6 @@ class account_installer(osv.osv_memory):
code_cnt += 1
#reactivate the parent_store functionality on account_account
- self.pool._init = False
obj_acc._parent_store_compute(cr)
for key, value in todo_dict.items():
diff --git a/addons/account/invoice.py b/addons/account/invoice.py
index 706b357465f..625a91ad289 100644
--- a/addons/account/invoice.py
+++ b/addons/account/invoice.py
@@ -268,21 +268,21 @@ class account_invoice(osv.osv):
store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
'account.invoice.tax': (_get_invoice_tax, None, 20),
- 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20),
+ 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 20),
},
multi='all'),
'amount_tax': fields.function(_amount_all, method=True, digits_compute=dp.get_precision('Account'), string='Tax',
store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
'account.invoice.tax': (_get_invoice_tax, None, 20),
- 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20),
+ 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 20),
},
multi='all'),
'amount_total': fields.function(_amount_all, method=True, digits_compute=dp.get_precision('Account'), string='Total',
store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
'account.invoice.tax': (_get_invoice_tax, None, 20),
- 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20),
+ 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 20),
},
multi='all'),
'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}),
@@ -302,7 +302,7 @@ class account_invoice(osv.osv):
store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 50),
'account.invoice.tax': (_get_invoice_tax, None, 50),
- 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 50),
+ 'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 50),
'account.move.line': (_get_invoice_from_line, None, 50),
'account.move.reconcile': (_get_invoice_from_reconcile, None, 50),
},
diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml
index b925c115a54..949a4c934db 100644
--- a/addons/account/report/account_invoice_report_view.xml
+++ b/addons/account/report/account_invoice_report_view.xml
@@ -78,7 +78,7 @@
domain="['|', ('type','=','out_invoice'),('type','=','out_refund')]"
help="Customer Invoices And Refunds"/>
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index d47d8fb1f6f..159de686764 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -23,10 +23,11 @@ import time
from lxml import etree
import netsvc
-from osv import fields
-from osv import osv
+from osv import osv, fields
+import decimal_precision as dp
from tools.translate import _
+
class account_move_line(osv.osv):
_inherit = 'account.move.line'
@@ -145,18 +146,29 @@ class account_voucher(osv.osv):
res['arch'] = etree.tostring(doc)
return res
+ def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount):
+ debit = credit = 0.0
+ for l in line_dr_ids:
+ debit += l['amount']
+ for l in line_cr_ids:
+ credit += l['amount']
+ return abs(amount - abs(credit - debit))
+
+ def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount):
+ line_dr_ids = [x[2] for x in line_dr_ids]
+ line_cr_ids = [x[2] for x in line_cr_ids]
+ return {'value': {'writeoff_amount': self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount)}}
+
def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None):
if not ids: return {}
res = {}
+ debit = credit = 0.0
for voucher in self.browse(cr, uid, ids, context=context):
- debit= credit = 0.0
- if voucher.line_dr_ids:
- for line in voucher.line_dr_ids:
- debit += line.amount_unreconciled
- if voucher.line_cr_ids:
- for line in voucher.line_cr_ids:
- credit += line.amount_unreconciled
- res[voucher.id] = abs(voucher.amount - abs(credit - debit))
+ for l in voucher.line_dr_ids:
+ debit += l.amount
+ for l in voucher.line_cr_ids:
+ credit += l.amount
+ res[voucher.id] = abs(voucher.amount - abs(credit - debit))
return res
_name = 'account.voucher'
@@ -194,8 +206,8 @@ class account_voucher(osv.osv):
\n* The \'Pro-forma\' when voucher is in Pro-forma state,voucher does not have an voucher number. \
\n* The \'Posted\' state is used when user create voucher,a voucher number is generated and voucher entries are created in account \
\n* The \'Cancelled\' state is used when user cancel voucher.'),
- 'amount': fields.float('Total', digits=(16, 2), required=True, readonly=True, states={'draft':[('readonly',False)]}),
- 'tax_amount':fields.float('Tax Amount', digits=(14,2), readonly=True, states={'draft':[('readonly',False)]}),
+ 'amount': fields.float('Total', digits_compute=dp.get_precision('Account'), required=True, readonly=True, states={'draft':[('readonly',False)]}),
+ 'tax_amount':fields.float('Tax Amount', digits_compute=dp.get_precision('Account'), readonly=True, states={'draft':[('readonly',False)]}),
'reference': fields.char('Ref #', size=64, readonly=True, states={'draft':[('readonly',False)]}, help="Transaction reference number."),
'number': fields.char('Number', size=32, readonly=True,),
'move_id':fields.many2one('account.move', 'Account Entry'),
@@ -210,14 +222,13 @@ class account_voucher(osv.osv):
'pre_line':fields.boolean('Previous Payments ?', required=False),
'date_due': fields.date('Due Date', readonly=True, states={'draft':[('readonly',False)]}),
'payment_option':fields.selection([
- ('without_writeoff', 'Without Write-off'),
- ('with_writeoff', 'With Write-off'),
- ], 'Payment Option', required=True, readonly=True, states={'draft': [('readonly', False)]}),
+ ('without_writeoff', 'Keep Open'),
+ ('with_writeoff', 'Reconcile with Write-Off'),
+ ], 'Payment Difference', required=True, readonly=True, states={'draft': [('readonly', False)]}),
'writeoff_acc_id': fields.many2one('account.account', 'Write-Off account', readonly=True, states={'draft': [('readonly', False)]}),
- 'writeoff_journal_id': fields.many2one('account.journal', 'Write-Off journal', readonly=True, states={'draft': [('readonly', False)]}),
- 'comment': fields.char('Comment', size=64, readonly=True, states={'draft': [('readonly', False)]}),
- 'analytic_id': fields.many2one('account.analytic.account','Analytic Account', readonly=True, states={'draft': [('readonly', False)]}),
- 'writeoff_amount': fields.function(_get_writeoff_amount, method=True, string='Writeoff Amount', type='float', readonly=True),
+ 'comment': fields.char('Write-Off Comment', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}),
+ 'analytic_id': fields.many2one('account.analytic.account','Write-Off Analytic Account', readonly=True, states={'draft': [('readonly', False)]}),
+ 'writeoff_amount': fields.function(_get_writeoff_amount, method=True, string='Write-Off Amount', type='float', readonly=True),
}
_defaults = {
'period_id': _get_period,
@@ -235,7 +246,7 @@ class account_voucher(osv.osv):
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.voucher',context=c),
'tax_id': _get_tax,
'payment_option': 'without_writeoff',
- 'comment': 'Write-Off',
+ 'comment': _('Write-Off'),
}
def compute_tax(self, cr, uid, ids, context={}):
@@ -390,13 +401,17 @@ class account_voucher(osv.osv):
@return: Returns a dict which contains new values, and context
"""
+ if context is None:
+ context = {}
if not journal_id:
return {}
- if context is None:
- context = {}
- currency_pool = self.pool.get('res.currency')
line_pool = self.pool.get('account.voucher.line')
+ line_ids = ids and line_pool.search(cr, uid, [('voucher_id', '=', ids[0])]) or False
+ if line_ids:
+ line_pool.unlink(cr, uid, line_ids)
+
+ currency_pool = self.pool.get('res.currency')
move_line_pool = self.pool.get('account.move.line')
partner_pool = self.pool.get('res.partner')
journal_pool = self.pool.get('account.journal')
@@ -410,13 +425,6 @@ class account_voucher(osv.osv):
if not partner_id:
return default
-
- if not partner_id and ids:
- line_ids = line_pool.search(cr, uid, [('voucher_id', '=', ids[0])])
- if line_ids:
- line_pool.unlink(cr, uid, line_ids)
- return default
-
journal = journal_pool.browse(cr, uid, journal_id)
partner = partner_pool.browse(cr, uid, partner_id)
account_id = False
@@ -449,16 +457,6 @@ class account_voucher(osv.osv):
ids.reverse()
moves = move_line_pool.browse(cr, uid, ids)
- priority_moves = []
- unpriority_moves = []
- for line in moves:
- original_amount = line.credit or line.debit or 0.0
- if original_amount == price:
- priority_moves.append(line)
- else:
- unpriority_moves.append(line)
- moves = priority_moves + unpriority_moves
-
company_currency = journal.company_id.currency_id.id
if company_currency != currency_id and ttype == 'payment':
total_debit = currency_pool.compute(cr, uid, currency_id, company_currency, total_debit)
@@ -509,6 +507,8 @@ class account_voucher(osv.osv):
default['value']['pre_line'] = 1
elif ttype == 'receipt' and len(default['value']['line_dr_ids']) > 0:
default['value']['pre_line'] = 1
+ default['value']['writeoff_amount'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price)
+
return default
def onchange_date(self, cr, user, ids, date, context={}):
@@ -734,16 +734,20 @@ class account_voucher(osv.osv):
if line.move_line_id.id:
rec_ids = [master_line, line.move_line_id.id]
rec_list_ids.append(rec_ids)
- writeoff_account_id = False
- writeoff_journal_id = False
- writeoff_period_id = inv.period_id.id,
- comment = False
if not currency_pool.is_zero(cr, uid, inv.currency_id, line_total):
diff = line_total
+ account_id = False
+ if inv.payment_option == 'with_writeoff':
+ account_id = inv.writeoff_acc_id.id
+ elif inv.type in ('sale', 'receipt'):
+# if inv.journal_id.type in ('sale','sale_refund', 'cash', 'bank'):
+ account_id = inv.partner_id.property_account_receivable.id
+ else:
+ account_id = inv.partner_id.property_account_payable.id
move_line = {
'name': name,
- 'account_id': False,
+ 'account_id': account_id,
'move_id': move_id,
'partner_id': inv.partner_id.id,
'date': inv.date,
@@ -752,24 +756,8 @@ class account_voucher(osv.osv):
'amount_currency': company_currency <> current_currency and currency_pool.compute(cr, uid, company_currency, current_currency, diff * -1) or 0.0,
'currency_id': company_currency <> current_currency and current_currency or False,
}
- account_id = False
- if inv.type in ('sale', 'receipt'):
-# if inv.journal_id.type in ('sale','sale_refund', 'cash', 'bank'):
- account_id = inv.partner_id.property_account_receivable.id
- else:
- account_id = inv.partner_id.property_account_payable.id
- move_line['account_id'] = account_id
move_line_pool.create(cr, uid, move_line)
- for rec_ids in rec_list_ids:
- if len(rec_ids) >= 2:
- if inv.payment_option == 'with_writeoff':
- writeoff_account_id = inv.writeoff_acc_id.id
- writeoff_journal_id = inv.writeoff_journal_id.id
- comment = inv.comment
- move_line_pool.reconcile(cr, uid, rec_ids, 'manual', writeoff_account_id, writeoff_period_id, writeoff_journal_id, context)
- else:
- move_line_pool.reconcile_partial(cr, uid, rec_ids)
self.write(cr, uid, [inv.id], {
'move_id': move_id,
@@ -777,6 +765,9 @@ class account_voucher(osv.osv):
'number': name,
})
move_pool.post(cr, uid, [move_id], context={})
+ for rec_ids in rec_list_ids:
+ if len(rec_ids) >= 2:
+ move_line_pool.reconcile_partial(cr, uid, rec_ids)
return True
def copy(self, cr, uid, id, default={}, context=None):
@@ -828,7 +819,7 @@ class account_voucher_line(osv.osv):
'account_id':fields.many2one('account.account','Account', required=True),
'partner_id':fields.related('voucher_id', 'partner_id', type='many2one', relation='res.partner', string='Partner'),
'untax_amount':fields.float('Untax Amount'),
- 'amount':fields.float('Amount', digits=(14,2)),
+ 'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')),
'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Cr/Dr'),
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'),
'move_line_id': fields.many2one('account.move.line', 'Journal Item'),
@@ -993,4 +984,4 @@ class account_bank_statement_line(osv.osv):
account_bank_statement_line()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml
index 0511a8325d5..c41356f3973 100644
--- a/addons/account_voucher/account_voucher_view.xml
+++ b/addons/account_voucher/account_voucher_view.xml
@@ -70,8 +70,21 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 3a0dbf40f4d..b47fa46bb7e 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -105,7 +105,7 @@
-
+
-
+
@@ -198,22 +198,18 @@
-
+
-
-
+ domain="[('type','=','other')]"/>
-
@@ -227,8 +223,21 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -295,7 +304,7 @@
-
+
-
+
@@ -330,10 +339,7 @@
attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/>
-
-
+ domain="[('type','=','other')]"/>
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml
index 5bef0c26718..2800511a8e0 100644
--- a/addons/account_voucher/voucher_sales_purchase_view.xml
+++ b/addons/account_voucher/voucher_sales_purchase_view.xml
@@ -144,8 +144,21 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -251,8 +264,21 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/base_report_designer/plugin/openerp_report_designer.zip b/addons/base_report_designer/plugin/openerp_report_designer.zip
index 22c0b7768f2..3ee0260060f 100644
Binary files a/addons/base_report_designer/plugin/openerp_report_designer.zip and b/addons/base_report_designer/plugin/openerp_report_designer.zip differ
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py
index 730ce8efefb..d4359a466ca 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py
@@ -54,11 +54,11 @@ class Change:
def __init__(self, aVal= None, sURL=""):
self.win=DBModalDialog(60, 50, 120, 90, "Connect to Open ERP Server")
- self.win.addFixedText("lblVariable", 38, 12, 60, 15, "Server")
+ self.win.addFixedText("lblVariable", 38, 12, 25, 15, "Server ")
self.win.addEdit("txtHost",-2,9,60,15,sURL[sURL.find("/")+2:sURL.rfind(":")])
- self.win.addFixedText("lblReportName",45 , 31, 60, 15, "Port")
+ self.win.addFixedText("lblReportName",45 , 31, 15, 15, "Port ")
self.win.addEdit("txtPort",-2,28,60,15,sURL[sURL.rfind(":")+1:])
self.win.addFixedText("lblLoginName", 2, 51, 60, 15, "Protocol Connection")
@@ -92,6 +92,8 @@ class Change:
global url
url = self.protocol[self.win.getListBoxSelectedItem("lstProtocol")]+self.win.getEditText("txtHost")+":"+self.win.getEditText("txtPort")
self.sock=RPCSession(url)
+ desktop=getDesktop()
+ doc = desktop.getCurrentComponent()
docinfo=doc.getDocumentInfo()
docinfo.setUserFieldValue(0,url)
res=self.sock.listdb()
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py
index de67ea0abda..123be9b9bc2 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py
@@ -192,6 +192,10 @@ class ServerParameter( unohelper.Base, XJobExecutor ):
Change(aVal,url)
if aVal[1]== -1:
self.win.getEditText("lstDatabase")
+ self.win.removeListBoxItems("lstDatabase", 0, self.win.getListBoxItemCount("lstDatabase"))
+ self.win.setEditText("txtHost",aVal[0])
+ for i in range(len(aVal[1])):
+ self.lstDatabase.addItem(aVal[1][i],i)
elif aVal[1]==0:
ErrorDialog(aVal[0],"")
else:
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index 9798fd09a4e..b40f7131a47 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -22,6 +22,7 @@
import time
import base64
import tools
+
from osv import fields
from osv import osv
from tools.translate import _
@@ -135,6 +136,52 @@ class crm_case(object):
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
return user.context_section_id.id or False
+ def _find_next_stage(self, cr, uid, stage_list, index, current_seq, stage_pool, context=None):
+ if index + 1 == len(stage_list):
+ return False
+ next_stage_id = stage_list[index + 1]
+ next_stage = stage_pool.browse(cr, uid, next_stage_id, context=context)
+ if not next_stage:
+ return False
+
+ next_seq = next_stage.sequence
+ if (abs(next_seq - current_seq)) >= 1:
+ return next_stage
+ else :
+ return self._find_next_stage(cr, uid, stage_list, index + 1, current_seq, stage_pool)
+
+ def stage_change(self, cr, uid, ids, context=None, order='sequence'):
+ if not context:
+ context = {}
+ stage_pool = self.pool.get('crm.case.stage')
+ stage_type = context and context.get('stage_type','')
+ current_seq = False
+ next_stage_id = False
+ for case in self.browse(cr, uid, ids, context):
+ next_stage = False
+ data = {}
+
+ domain = [('type', '=', stage_type),('section_ids', '=', case.section_id.id)]
+ if case.section_id and case.section_id.stage_ids:
+ domain.append(('id', 'in', map(lambda x: x.id, case.section_id.stage_ids)))
+
+ stages = stage_pool.search(cr, uid, domain, order=order)
+ current_seq = case.stage_id.sequence
+ index = -1
+ if case.stage_id and case.stage_id.id in stages:
+ index = stages.index(case.stage_id.id)
+
+ next_stage = self._find_next_stage(cr, uid, stages, index, current_seq, stage_pool, context=context)
+ if next_stage:
+ next_stage_id = next_stage.id
+ data = {'stage_id': next_stage.id}
+ if next_stage.on_change:
+ data.update({'probability': next_stage.probability})
+ self.write(cr, uid, [case.id], data, context=context)
+
+ return next_stage_id
+
+
def stage_next(self, cr, uid, ids, context=None):
"""This function computes next stage for case from its current stage
using available stage for that case type
@@ -143,32 +190,10 @@ class crm_case(object):
@param uid: the current user’s ID for security checks,
@param ids: List of case IDs
@param context: A standard dictionary for contextual values"""
- if not context:
- context = {}
- stage_pool = self.pool.get('crm.case.stage')
- model = self._name
- for case in self.browse(cr, uid, ids, context):
- next_stage = False
- data = {}
- domain = [('object_id.model', '=', model),('section_ids', '=', case.section_id.id)]
- if case.section_id and case.section_id.stage_ids:
- domain.append(('id', 'in', map(lambda x: x.id, case.section_id.stage_ids)))
- stages = stage_pool.search(cr, uid, domain, order='sequence')
- index = -1
- if case.stage_id and case.stage_id.id in stages:
- index = stages.index(case.stage_id.id)
- if index + 1 == len(stages):
- return False
- else:
- next_stage = stages[index + 1]
- if next_stage:
- data = {'stage_id': next_stage}
- stage = stage_pool.browse(cr, uid, next_stage, context=context)
- if stage.on_change:
- data.update({'probability': stage.probability})
- self.write(cr, uid, [case.id], data, context=context)
- return next_stage
-
+
+
+ return self.stage_change(cr, uid, ids, context=context, order='sequence')
+
def stage_previous(self, cr, uid, ids, context=None):
"""This function computes previous stage for case from its current stage
using available stage for that case type
@@ -177,31 +202,7 @@ class crm_case(object):
@param uid: the current user’s ID for security checks,
@param ids: List of case IDs
@param context: A standard dictionary for contextual values"""
- if not context:
- context = {}
- stage_pool = self.pool.get('crm.case.stage')
- model = self._name
- for case in self.browse(cr, uid, ids, context):
- prev_stage = False
- data = {}
- domain = [('object_id.model', '=', model),('section_ids', '=', case.section_id.id)]
- if case.section_id and case.section_id.stage_ids:
- domain.append(('id', 'in', map(lambda x: x.id, case.section_id.stage_ids)))
- stages = stage_pool.search(cr, uid, domain, order='sequence')
- index = 0
- if case.stage_id and case.stage_id.id in stages:
- index = stages.index(case.stage_id.id)
- if index == 0:
- return False
- else:
- prev_stage = stages[index - 1]
- if prev_stage:
- data = {'stage_id': prev_stage}
- stage = stage_pool.browse(cr, uid, prev_stage, context=context)
- if stage.on_change:
- data.update({'probability': stage.probability})
- self.write(cr, uid, [case.id], data, context=context)
- return prev_stage
+ return self.stage_change(cr, uid, ids, context=context, order='sequence desc')
def onchange_partner_id(self, cr, uid, ids, part, email=False):
"""This function returns value of partner address based on partner
@@ -482,27 +483,27 @@ class crm_case_stage(osv.osv):
_columns = {
'name': fields.char('Stage Name', size=64, required=True, translate=True),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of case stages."),
- 'object_id': fields.many2one('ir.model', 'Object Name'),
'probability': fields.float('Probability (%)', required=True, help="This percentage depicts the default/average probability of the Case for this stage to be a success"),
'on_change': fields.boolean('Change Probability Automatically', \
help="Change Probability on next and previous stages."),
- 'requirements': fields.text('Requirements')
+ 'requirements': fields.text('Requirements'),
+ 'type': fields.selection([('lead','Lead'),('opportunity','Opportunity'),('claim','Claim'), ('fundraising','Fundraising')], 'Type'),
}
- def _find_object_id(self, cr, uid, context=None):
- """Finds id for case object
+
+ def _find_stage_type(self, cr, uid, context=None):
+ """Finds type of stage according to object.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param context: A standard dictionary for contextual values
"""
- object_id = context and context.get('object_id', False) or False
- ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', object_id)])
- return ids and ids[0]
+ type = context and context.get('type', '') or ''
+ return type
_defaults = {
'sequence': lambda *args: 1,
'probability': lambda *args: 0.0,
- 'object_id' : _find_object_id
+ 'type': _find_stage_type,
}
crm_case_stage()
@@ -531,7 +532,7 @@ class crm_case_section(osv.osv):
'reply_to': fields.char('Reply-To', size=64, help="The email address put in the 'Reply-To' of all emails sent by OpenERP about cases in this sales team"),
'parent_id': fields.many2one('crm.case.section', 'Parent Team'),
'child_ids': fields.one2many('crm.case.section', 'parent_id', 'Child Teams'),
- 'resource_calendar_id': fields.many2one('resource.calendar', "Resource's Calendar"),
+ 'resource_calendar_id': fields.many2one('resource.calendar', "Working Time"),
'note': fields.text('Description'),
'working_hours': fields.float('Working Hours', digits=(16,2 )),
'stage_ids': fields.many2many('crm.case.stage', 'section_stage_rel', 'section_id', 'stage_id', 'Stages'),
@@ -629,6 +630,7 @@ class crm_case_stage(osv.osv):
_columns = {
'section_ids':fields.many2many('crm.case.section', 'section_stage_rel', 'stage_id', 'section_id', 'Sections'),
}
+
crm_case_stage()
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index e0bed8934f2..8cc45c75e57 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -135,7 +135,7 @@ class crm_lead(crm_case, osv.osv):
],'Type', help="Type is used to separate Leads and Opportunities"),
'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
'date_closed': fields.datetime('Closed', readonly=True),
- 'stage_id': fields.many2one('crm.case.stage', 'Stage'),
+ 'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[('type','=','lead')]"),
'user_id': fields.many2one('res.users', 'Salesman',help='By Default Salesman is Administrator when create New User'),
'referred': fields.char('Referred By', size=64),
'date_open': fields.datetime('Opened', readonly=True),
@@ -150,6 +150,19 @@ class crm_lead(crm_case, osv.osv):
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
}
+
+ def _get_stage_id(self, cr, uid, context=None):
+ """Finds type of stage according to object.
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param context: A standard dictionary for contextual values
+ """
+ if context is None:
+ context = {}
+ type = context and context.get('stage_type', '')
+ stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('type','=',type),('sequence','>=',1)])
+ return stage_ids and stage_ids[0] or False
_defaults = {
'active': lambda *a: 1,
@@ -160,6 +173,7 @@ class crm_lead(crm_case, osv.osv):
'section_id': crm_case._get_section,
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c),
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
+ 'stage_id': _get_stage_id,
}
def onchange_partner_address_id(self, cr, uid, ids, add, email=False):
@@ -297,7 +311,7 @@ class crm_lead(crm_case, osv.osv):
return super(crm_lead,self).write(cr, uid, ids, vals, context)
def stage_next(self, cr, uid, ids, context=None):
- stage = super(crm_lead, self).stage_next(cr, uid, ids, context)
+ stage = super(crm_lead, self).stage_next(cr, uid, ids, context=context)
if stage:
stage_obj = self.pool.get('crm.case.stage').browse(cr, uid, stage, context=context)
if stage_obj.on_change:
diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml
index 2a49e43e683..3cb34c49299 100644
--- a/addons/crm/crm_lead_data.xml
+++ b/addons/crm/crm_lead_data.xml
@@ -2,34 +2,39 @@
-
+
+ Lost
+
+
+ lead
+
New
-
+ lead
Qualification
-
+ lead
Proposition
-
+ lead
Negotiation
-
+ lead
@@ -37,15 +42,10 @@
-
+ lead
-
- Lost
-
-
-
-
+
Sales Department
diff --git a/addons/crm/crm_lead_menu.xml b/addons/crm/crm_lead_menu.xml
index 6c74dccac15..2fff1b57d3c 100644
--- a/addons/crm/crm_lead_menu.xml
+++ b/addons/crm/crm_lead_menu.xml
@@ -9,7 +9,7 @@
['|', ('type','=','lead'), ('type','=',False)]
- {'search_default_current':1, 'default_type': 'lead', 'search_default_section_id': section_id}
+ {'search_default_current':1, 'default_type': 'lead', 'search_default_section_id': section_id, 'stage_type': 'lead'}
'Leads' allows you to manage and keep track of all first potential interests of a partner in one of your products or services. A lead is a first, unqualified, contact with a prospect or customer. After being qualified, a lead can be converted into a business opportunity with the creation of the related partner for further detailed tracking of any linked activities. You can use leads when you import a database of prospects or to integrate your website's contact form with OpenERP.
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index cda3c4fcc1f..979ab26cfd1 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -9,8 +9,8 @@
crm.case.stage
form
- [('object_id.model', '=', 'crm.lead')]
- {'object_id':'crm.lead'}
+ [('type', '=', 'lead')]
+ {'type':'lead'}
Create specific stages that will help your sales better organise their sales pipeline by maintaining them to their leads and sales opportunities. It will allow them to easily track how is positioned a specific lead or opportunity in the sales cycle.
@@ -57,14 +57,14 @@
-
+
+ icon="gtk-go-back" context="{'stage_type': 'lead'}" />
+ icon="gtk-go-forward" context="{'stage_type': 'lead'}" />
@@ -329,7 +329,7 @@
-
+
diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml
index 2f215488c99..2de562a23ce 100644
--- a/addons/crm/crm_meeting_view.xml
+++ b/addons/crm/crm_meeting_view.xml
@@ -47,7 +47,7 @@
diff --git a/addons/crm/crm_opportunity.py b/addons/crm/crm_opportunity.py
index 53f24dc69b0..44f2b1b85a4 100644
--- a/addons/crm/crm_opportunity.py
+++ b/addons/crm/crm_opportunity.py
@@ -50,7 +50,9 @@ class crm_opportunity(osv.osv):
'date_deadline': fields.date('Expected Closing'),
'date_action': fields.date('Next Action Date'),
'title_action': fields.char('Next Action', size=64),
+ 'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[('type','=','opportunity')]"),
}
+
def case_close(self, cr, uid, ids, *args):
"""Overrides close for crm_case for setting probability and close date
@param self: The object pointer
@@ -60,7 +62,13 @@ class crm_opportunity(osv.osv):
@param *args: Tuple Value for additional Params
"""
res = super(crm_opportunity, self).case_close(cr, uid, ids, args)
- value = {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
+ data_obj = self.pool.get('ir.model.data')
+ data_id = data_obj._get_id(cr, uid, 'crm', 'stage_lead5')
+ stage_id = data_obj.browse(cr, uid, data_id).res_id
+ stage_obj = self.pool.get('crm.case.stage').browse(cr, uid, stage_id)
+ value = {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), 'stage_id': stage_id}
+ if stage_obj.on_change:
+ value.update({'probability': stage_obj.probability})
self.write(cr, uid, ids, value)
for (id, name) in self.name_get(cr, uid, ids):
@@ -79,16 +87,22 @@ class crm_opportunity(osv.osv):
@param *args: Tuple Value for additional Params
"""
res = super(crm_opportunity, self).case_close(cr, uid, ids, args)
- value = {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
+ data_obj = self.pool.get('ir.model.data')
+ data_id = data_obj._get_id(cr, uid, 'crm', 'stage_lead6')
+ stage_id = data_obj.browse(cr, uid, data_id).res_id
+ stage_obj = self.pool.get('crm.case.stage').browse(cr, uid, stage_id)
+ value = {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), 'stage_id': stage_id}
+ if stage_obj.on_change:
+ value.update({'probability': stage_obj.probability})
- res = self.write(cr, uid, ids, value)
+ self.write(cr, uid, ids, value)
for (id, name) in self.name_get(cr, uid, ids):
opp = self.browse(cr, uid, id)
if opp.type == 'opportunity':
message = _("The opportunity '%s' has been marked as lost.") % name
self.log(cr, uid, id, message)
return res
-
+
def case_cancel(self, cr, uid, ids, *args):
"""Overrides cancel for crm_case for setting probability
@param self: The object pointer
@@ -110,7 +124,7 @@ class crm_opportunity(osv.osv):
@param *args: Tuple Value for additional Params
"""
res = super(crm_opportunity, self).case_reset(cr, uid, ids, *args)
- self.write(cr, uid, ids, {'stage_id': False})
+ self.write(cr, uid, ids, {'stage_id': False, 'probability': 0.0})
return res
diff --git a/addons/crm/crm_opportunity_data.xml b/addons/crm/crm_opportunity_data.xml
index c2f750c29d1..a20cbc5e344 100644
--- a/addons/crm/crm_opportunity_data.xml
+++ b/addons/crm/crm_opportunity_data.xml
@@ -1,56 +1,109 @@
-
- Interest in Computer
-
-
-
-
- Interest in Accessories
-
-
-
-
- Need Services
-
-
-
-
- Need Information
-
-
-
-
- Need a Website Design
-
-
-
-
- Potential Reseller
-
-
-
-
- Need Consulting
-
-
-
-
- Other
-
-
-
+
+
+
+
+ Lost
+
+
+ opportunity
+
+
+
+ New
+
+
+ opportunity
+
+
+
+ Qualification
+
+
+ opportunity
+
+
+
+ Proposition
+
+
+ opportunity
+
+
+
+ Negotiation
+
+
+ opportunity
+
+
+
+ Won
+
+
+
+ opportunity
+
+
+
+ Sales Department
+ Sales
+
+
+
+
+
+ Interest in Computer
+
+
+
+
+ Interest in Accessories
+
+
+
+
+ Need Services
+
+
+
+
+ Need Information
+
+
+
+
+ Need a Website Design
+
+
+
+
+ Potential Reseller
+
+
+
+
+ Need Consulting
+
+
+
+
+ Other
+
+
+
-
- Campaign 2
-
-
-
- Campaign 1
-
-
+
+ Campaign 2
+
+
+
+ Campaign 1
+
+
diff --git a/addons/crm/crm_opportunity_demo.xml b/addons/crm/crm_opportunity_demo.xml
index 48812b17cf0..8dda7436b64 100644
--- a/addons/crm/crm_opportunity_demo.xml
+++ b/addons/crm/crm_opportunity_demo.xml
@@ -20,7 +20,7 @@
-
+
@@ -36,7 +36,7 @@
-
+
@@ -53,7 +53,7 @@
-
+
@@ -70,7 +70,7 @@
-
+
@@ -86,7 +86,7 @@
-
+
diff --git a/addons/crm/crm_opportunity_menu.xml b/addons/crm/crm_opportunity_menu.xml
index 6b2e2d0fc39..cd57c2026af 100644
--- a/addons/crm/crm_opportunity_menu.xml
+++ b/addons/crm/crm_opportunity_menu.xml
@@ -28,7 +28,7 @@
crm.lead
tree,form,graph,calendar
[('type','=','opportunity')]
- {'search_default_user_id':uid,'search_default_current':1, 'search_default_section_id':section_id,'default_type': 'opportunity'}
+ {'search_default_user_id':uid,'search_default_current':1, 'search_default_section_id':section_id, 'stage_type': 'opportunity'}
Opportunities allows you to manage and keep track of your sales pipeline by creating specific customer or prospect related sales documents in order to follow up potential sales. Information such as the expected revenue, opportunity stage, expected closing date, communication history and so on can be maintained in them. Opportunities can be connected with the email gateway: new emails create opportunities, each of them automatically gets the history of the conversation with the customer.
diff --git a/addons/crm/crm_opportunity_view.xml b/addons/crm/crm_opportunity_view.xml
index 5ca69c22790..c928b120579 100644
--- a/addons/crm/crm_opportunity_view.xml
+++ b/addons/crm/crm_opportunity_view.xml
@@ -1,6 +1,21 @@
+
+
+ Stages
+ crm.case.stage
+ form
+
+ [('type', '=', 'opportunity')]
+ {'type':'opportunity'}
+ Create specific stages that will help your sales better organise their sales pipeline by maintaining them to their sales opportunities. It will allow them to easily track how is positioned a specific opportunity in the sales cycle.
+
+
+
+
Opportunities
@@ -15,12 +30,12 @@
+ domain="[('type','=','opportunity'),('section_ids', '=', section_id)]"/>
+ type="object" icon="gtk-go-forward" string="" context="{'stage_type': 'opportunity'}"/>
@@ -303,7 +318,7 @@
-
+
diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml
index fa576bca24f..f0c2d55a642 100644
--- a/addons/crm/crm_view.xml
+++ b/addons/crm/crm_view.xml
@@ -3,10 +3,13 @@
+ groups="base.group_sale_manager,base.group_sale_salesman,base.group_partner_manager"/>
+
+
@@ -119,7 +122,8 @@
-
diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py
index f90a2d01b56..cc6a1ac6868 100644
--- a/addons/crm_claim/crm_claim.py
+++ b/addons/crm_claim/crm_claim.py
@@ -63,7 +63,7 @@ class crm_claim(crm.crm_case, osv.osv):
'email_cc': fields.text('Watchers Emails', size=252, help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
'email_from': fields.char('Email', size=128, help="These people will receive email."),
'partner_phone': fields.char('Phone', size=32),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="('object_id.model', '=', 'crm.claim')]"),
+ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('type','=','claim')]"),
'cause': fields.text('Root Cause'),
'state': fields.selection(crm.AVAILABLE_STATES, 'State', size=16, readonly=True,
help='The state is set to \'Draft\', when a case is created.\
@@ -72,6 +72,19 @@ class crm_claim(crm.crm_case, osv.osv):
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
}
+
+ def _get_stage_id(self, cr, uid, context=None):
+ """Finds type of stage according to object.
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param context: A standard dictionary for contextual values
+ """
+ if context is None:
+ context = {}
+ type = context and context.get('stage_type', '')
+ stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('type','=',type),('sequence','>=',1)])
+ return stage_ids and stage_ids[0] or False
_defaults = {
'user_id': crm.crm_case._get_default_user,
@@ -82,7 +95,8 @@ class crm_claim(crm.crm_case, osv.osv):
'section_id':crm.crm_case. _get_section,
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
- 'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
+ 'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
+ 'stage_id': _get_stage_id,
}
def onchange_partner_id(self, cr, uid, ids, part, email=False):
@@ -119,7 +133,6 @@ class crm_claim(crm.crm_case, osv.osv):
address = self.pool.get('res.partner.address').browse(cr, uid, add)
return {'value': {'email_from': address.email, 'partner_phone': address.phone, 'partner_mobile': address.mobile}}
-
crm_claim()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_claim/crm_claim_data.xml b/addons/crm_claim/crm_claim_data.xml
index 13292d16c3b..e917ba5bea6 100644
--- a/addons/crm_claim/crm_claim_data.xml
+++ b/addons/crm_claim/crm_claim_data.xml
@@ -45,22 +45,22 @@
Accepted as Claim
1
-
+ claim
Actions Defined
2
-
+ claim
Actions Done
10
-
+ claim
Won't fix
- 11
-
+ 0
+ claim
diff --git a/addons/crm_claim/crm_claim_menu.xml b/addons/crm_claim/crm_claim_menu.xml
index 18642f18282..1989917ba6b 100644
--- a/addons/crm_claim/crm_claim_menu.xml
+++ b/addons/crm_claim/crm_claim_menu.xml
@@ -14,7 +14,7 @@
form
tree,calendar,form,graph
- {'search_default_section_id': section_id, "search_default_current":1,"search_default_user_id":uid}
+ {'search_default_section_id': section_id, "search_default_current":1,"search_default_user_id":uid, "stage_type":'claim'}
Record and track your customers' claims. Claims can be linked to a sales order or a lot. You can send emails with attachments and get the history of everything that happened on a specific claim (emails sent, interventions type and so on..). Claims can be automatically linked to an email address using the mail gateway module.
diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml
index 6e7cc710dc2..a6f81885714 100644
--- a/addons/crm_claim/crm_claim_view.xml
+++ b/addons/crm_claim/crm_claim_view.xml
@@ -29,8 +29,8 @@
crm.case.stage
form
- [('object_id.model', '=', 'crm.claim')]
- {'object_id':'crm.claim'}
+ [('type', '=', 'claim')]
+ {'type':'claim'}
You can create claim stages to categorize the status of every claim entered in the system. The stages define all the steps required for the resolution of a claim.
@@ -78,8 +78,7 @@
-
+
diff --git a/addons/crm_claim/report/crm_claim_report.py b/addons/crm_claim/report/crm_claim_report.py
index f03a5f75d12..ffb56340aac 100644
--- a/addons/crm_claim/report/crm_claim_report.py
+++ b/addons/crm_claim/report/crm_claim_report.py
@@ -62,7 +62,7 @@ class crm_claim_report(osv.osv):
'create_date': fields.datetime('Create Date', readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True),
+ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True, domain="[('type','=','claim')]"),
'categ_id': fields.many2one('crm.case.categ', 'Category',\
domain="[('section_id','=',section_id),\
('object_id.model', '=', 'crm.claim')]", readonly=True),
diff --git a/addons/crm_claim/report/crm_claim_report_view.xml b/addons/crm_claim/report/crm_claim_report_view.xml
index 1fa47c09a9f..ca1c03a58ae 100644
--- a/addons/crm_claim/report/crm_claim_report_view.xml
+++ b/addons/crm_claim/report/crm_claim_report_view.xml
@@ -86,7 +86,7 @@
help="My Sales Team(s)" />
-
+
-
+
diff --git a/addons/crm_fundraising/crm_fundraising.py b/addons/crm_fundraising/crm_fundraising.py
index 21d5e9081bd..f4950842800 100644
--- a/addons/crm_fundraising/crm_fundraising.py
+++ b/addons/crm_fundraising/crm_fundraising.py
@@ -61,7 +61,7 @@ class crm_fundraising(crm.crm_case, osv.osv):
'partner_name2': fields.char('Employee Email', size=64),
'partner_phone': fields.char('Phone', size=32),
'partner_mobile': fields.char('Mobile', size=32),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="('object_id.model', '=', 'crm.fundraising')]"),
+ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('type', '=', 'fundraising')]"),
'type_id': fields.many2one('crm.case.resource.type', 'Campaign', \
domain="[('section_id','=',section_id)]"),
'duration': fields.float('Duration'),
diff --git a/addons/crm_fundraising/crm_fundraising_view.xml b/addons/crm_fundraising/crm_fundraising_view.xml
index eea653a4d48..51a2a2fa6b4 100644
--- a/addons/crm_fundraising/crm_fundraising_view.xml
+++ b/addons/crm_fundraising/crm_fundraising_view.xml
@@ -29,8 +29,8 @@
crm.case.stage
form
- [('object_id.model', '=', 'crm.fundraising')]
- {'object_id':'crm.fundraising'}
+ [('type', '=', 'fundraising')]
+ {'type':'fundraising'}
Create and manage fund raising activity categories you want to be maintained in the system.
diff --git a/addons/crm_fundraising/report/crm_fundraising_report_view.xml b/addons/crm_fundraising/report/crm_fundraising_report_view.xml
index 50ca70c5576..73514b677b2 100644
--- a/addons/crm_fundraising/report/crm_fundraising_report_view.xml
+++ b/addons/crm_fundraising/report/crm_fundraising_report_view.xml
@@ -105,7 +105,7 @@
domain="[('section_id.user_id','=',uid)]"
help="My Sales Team(s)" />
-
+
-
+
diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
index 1fea2a0f2d4..d54b719fe2b 100644
--- a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
+++ b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
@@ -78,7 +78,7 @@
domain="[('section_id.user_id','=',uid)]"
help="My Sales Team(s)" />
-
+
-
+
-
+
diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py
index 77748adf017..7592061ec36 100644
--- a/addons/fetchmail/fetchmail.py
+++ b/addons/fetchmail/fetchmail.py
@@ -57,9 +57,8 @@ class email_server(osv.osv):
'user' : fields.char('User Name', size=256, required=True, readonly=True, states={'draft':[('readonly', False)]}),
'password' : fields.char('Password', size=1024, invisible=True, required=True, readonly=True, states={'draft':[('readonly', False)]}),
'note': fields.text('Description'),
- 'action_id':fields.many2one('ir.actions.server', 'Reply Email', required=False, domain="[('state','=','email')]",
- help="An Email Server Action. It will be run whenever an e-mail is fetched from server."),
- 'object_id': fields.many2one('ir.model', "Model", required=True, help="OpenObject Model. Generates a record of this model."),
+ 'action_id':fields.many2one('ir.actions.server', 'Email Server Action', required=False, domain="[('state','=','email')]", help="An Email Server Action. It will be run whenever an e-mail is fetched from server."),
+ 'object_id': fields.many2one('ir.model', "Model", required=True, help="OpenObject Model. Generates a record of this model.\nSelect Object with message_new attrbutes."),
'priority': fields.integer('Server Priority', readonly=True, states={'draft':[('readonly', False)]}, help="Priority between 0 to 10, select define the order of Processing"),
'user_id':fields.many2one('res.users', 'User', required=False),
'message_ids': fields.one2many('mailgate.message', 'server_id', 'Messages', readonly=True),
@@ -73,7 +72,7 @@ class email_server(osv.osv):
}
def check_duplicate(self, cr, uid, ids):
- # RFC *-* Why this limitation? why not in SQL constraint?
+ # RFC *-* Why this limitation? why not in SQL constraint?
vals = self.read(cr, uid, ids, ['user', 'password'])[0]
cr.execute("select count(id) from email_server where user=%s and password=%s", (vals['user'], vals['password']))
res = cr.fetchone()
@@ -82,8 +81,19 @@ class email_server(osv.osv):
return False
return True
+ def check_model(self, cr, uid, ids, context = None):
+ if context is None:
+ context = {}
+ current_rec = self.read(cr, uid, ids, context)[0]
+ if current_rec:
+ model = self.pool.get(current_rec.get('object_id')[1])
+ if hasattr(model, 'message_new'):
+ return True
+ return False
+
_constraints = [
- (check_duplicate, 'Warning! Can\'t have duplicate server configuration!', ['user', 'password'])
+ (check_duplicate, 'Warning! Can\'t have duplicate server configuration!', ['user', 'password']),
+ (check_model, 'Warning! Record for selected Model can not be created\nPlease choose valid Model', ['object_id'])
]
def onchange_server_type(self, cr, uid, ids, server_type=False, ssl=False):
@@ -103,7 +113,6 @@ class email_server(osv.osv):
for server in self.browse(cr, uid, ids, context):
logger.notifyChannel('imap', netsvc.LOG_INFO, 'fetchmail start checking for new emails on %s' % (server.name))
context.update({'server_id': server.id, 'server_type': server.type})
- count = 0
try:
if server.type == 'imap':
imap_server = None
@@ -150,6 +159,7 @@ class email_server(osv.osv):
context.update({'get_server': True})
for server in self.browse(cr, uid, ids, context):
count = 0
+ user = server.user_id.id or uid
try:
if server.type == 'imap':
imap_server = self.button_confirm_login(cr, uid, [server.id], context=context)
@@ -157,9 +167,9 @@ class email_server(osv.osv):
result, data = imap_server.search(None, '(UNSEEN)')
for num in data[0].split():
result, data = imap_server.fetch(num, '(RFC822)')
- res_id = email_tool.process_email(cr, uid, server.object_id.model, data[0][1], attach=server.attach, context=context)
+ res_id = email_tool.process_email(cr, user, server.object_id.model, data[0][1], attach=server.attach, context=context)
if res_id and server.action_id:
- action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
+ action_pool.run(cr, user, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
imap_server.store(num, '+FLAGS', '\\Seen')
count += 1
@@ -174,9 +184,9 @@ class email_server(osv.osv):
for num in range(1, numMsgs + 1):
(header, msges, octets) = pop_server.retr(num)
msg = '\n'.join(msges)
- res_id = email_tool.process_email(cr, uid, server.object_id.model, msg, attach=server.attach, context=context)
+ res_id = email_tool.process_email(cr, user, server.object_id.model, msg, attach=server.attach, context=context)
if res_id and server.action_id:
- action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
+ action_pool.run(cr, user, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
pop_server.dele(num)
diff --git a/addons/fetchmail/fetchmail_view.xml b/addons/fetchmail/fetchmail_view.xml
index ecdb4acfb3b..7d55f9f5a7a 100644
--- a/addons/fetchmail/fetchmail_view.xml
+++ b/addons/fetchmail/fetchmail_view.xml
@@ -7,7 +7,7 @@
email.server
tree
-
+
@@ -48,6 +48,7 @@
+
diff --git a/addons/hr/hr.py b/addons/hr/hr.py
index 812793354e1..113dc31b7c4 100644
--- a/addons/hr/hr.py
+++ b/addons/hr/hr.py
@@ -160,7 +160,7 @@ class hr_employee(osv.osv):
'coach_id': fields.many2one('hr.employee', 'Coach'),
'job_id': fields.many2one('hr.job', 'Job'),
'photo': fields.binary('Photo'),
- 'passport_id':fields.char('Passport', size=64)
+ 'passport_id':fields.char('Passport No', size=64)
}
def onchange_address_id(self, cr, uid, ids, address, context=None):
diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py
index 32478f515a0..7ffb40e1c8d 100644
--- a/addons/hr_evaluation/hr_evaluation.py
+++ b/addons/hr_evaluation/hr_evaluation.py
@@ -34,8 +34,8 @@ class hr_evaluation_plan(osv.osv):
'name': fields.char("Evaluation Plan", size=64, required=True),
'company_id': fields.many2one('res.company', 'Company', required=True),
'phase_ids': fields.one2many('hr_evaluation.plan.phase', 'plan_id', 'Evaluation Phases'),
- 'month_first': fields.integer('Next Evaluation After'),
- 'month_next': fields.integer('After the Date of Start'),
+ 'month_first': fields.integer('First Evaluation in (months)', help="This number of months will be used to schedule the first evaluation date of the employee when selecting an evaluation plan. "),
+ 'month_next': fields.integer('Periodicity of Evaluations (months)', help="The number of month that depicts the delay between each evaluation of this plan (after the first one)."),
'active': fields.boolean('Active')
}
_defaults = {
@@ -101,7 +101,7 @@ class hr_employee(osv.osv):
_inherit="hr.employee"
_columns = {
'evaluation_plan_id': fields.many2one('hr_evaluation.plan', 'Evaluation Plan'),
- 'evaluation_date': fields.date('Next Evaluation', help="Date of the next evaluation"),
+ 'evaluation_date': fields.date('Next Evaluation Date', help="The date of the next evaluation is computed by the evaluation plan's dates (first evaluation + periodicity)."),
}
def run_employee_evaluation(self, cr, uid, automatic=False, use_new_cursor=False, context=None):
diff --git a/addons/hr_payroll/hr_payroll.py b/addons/hr_payroll/hr_payroll.py
index 851e3994348..b5786141673 100644
--- a/addons/hr_payroll/hr_payroll.py
+++ b/addons/hr_payroll/hr_payroll.py
@@ -312,7 +312,7 @@ class hr_contract(osv.osv):
_description = 'Employee Contract'
_columns = {
'permit_no': fields.char('Work Permit No', size=256, required=False, readonly=False),
- 'passport_id': fields.many2one('hr.passport', 'Passport', required=False),
+ 'passport_id': fields.many2one('hr.passport', 'Passport No', required=False),
'visa_no': fields.char('Visa No', size=64, required=False, readonly=False),
'visa_expire': fields.date('Visa Expire Date'),
'struct_id': fields.many2one('hr.payroll.structure', 'Salary Structure'),
@@ -1472,7 +1472,7 @@ class hr_employee(osv.osv):
return vals
_columns = {
- 'passport_id':fields.many2one('hr.passport', 'Passport', required=False, domain="[('employee_id','=',active_id), ('address_id','=',address_home_id)]", help="Employee Passport Information"),
+ 'passport_id':fields.many2one('hr.passport', 'Passport No', required=False, domain="[('employee_id','=',active_id), ('address_id','=',address_home_id)]", help="Employee Passport Information"),
'line_ids':fields.one2many('hr.payslip.line', 'employee_id', 'Salary Structure', required=False),
'slip_ids':fields.one2many('hr.payslip', 'employee_id', 'Payslips', required=False, readonly=True),
'otherid': fields.char('Other Id', size=64),
diff --git a/addons/hr_timesheet/hr_timesheet_data.xml b/addons/hr_timesheet/hr_timesheet_data.xml
index a19b2c67291..420dcb5a114 100644
--- a/addons/hr_timesheet/hr_timesheet_data.xml
+++ b/addons/hr_timesheet/hr_timesheet_data.xml
@@ -7,21 +7,5 @@
general
-
- 75.0
- 30.0
-
-
- Service on Timesheet
-
- service
-
-
-
-
-
-
-
-
diff --git a/addons/hr_timesheet/hr_timesheet_demo.xml b/addons/hr_timesheet/hr_timesheet_demo.xml
index e7ba5c91342..caaaef12f01 100644
--- a/addons/hr_timesheet/hr_timesheet_demo.xml
+++ b/addons/hr_timesheet/hr_timesheet_demo.xml
@@ -2,6 +2,21 @@
+
+ 75.0
+ 30.0
+
+
+ Service on Timesheet
+
+ service
+
+
+
+
+
+
+
diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml b/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml
index 70b227136e9..cc5f8da627c 100644
--- a/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml
+++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml
@@ -118,6 +118,7 @@
tree,form
[]
{'search_default_to_invoice': 1}
+
This lists show you every task work you can invoice to the customer. Select the lines in order to generate the invoices automatically.
-
-
+
+
diff --git a/addons/l10n_be/account_pcmn_belgium.xml b/addons/l10n_be/account_pcmn_belgium.xml
index 3f494ae443c..18b974632d4 100644
--- a/addons/l10n_be/account_pcmn_belgium.xml
+++ b/addons/l10n_be/account_pcmn_belgium.xml
@@ -2913,17 +2913,25 @@
+
+ Clients
+ 4000
+ receivable
+
+
+
+
Rabais, remises, ristournes à accorder et autres notes de crédit à établir
4007
- receivable
+ other
Créances résultant de livraisons de biens
4008
- receivable
+ other
@@ -2934,26 +2942,24 @@
-
+
Effets à recevoir
4010
- receivable
+ other
-
-
Effets à l'encaissement
4013
- receivable
+ other
Effets à l'escompte
4015
- receivable
+ other
@@ -2967,21 +2973,21 @@
Entreprises liées
4020
- receivable
+ other
Autres entreprises avec lesquelles il existe un lien de participation
4021
- receivable
+ other
Administrateurs et gérants d'entreprise
4022
- receivable
+ other
@@ -2995,63 +3001,63 @@
Entreprises liées
4030
- receivable
+ other
Autres entreprises avec lesquelles il existe un lien de participation
4031
- receivable
+ other
Administrateurs et gérants de l'entreprise
4032
- receivable
+ other
Produits à recevoir
404
- receivable
+ other
Clients : retenues sur garanties
405
- receivable
+ other
Acomptes versés
406
- receivable
+ other
Créances douteuses
407
- receivable
+ other
Compensation clients
408
- receivable
+ other
Réductions de valeur actées
409
- receivable
+ other
@@ -3072,14 +3078,14 @@
Appels de fonds
4100
- receivable
+ other
Actionnaires défaillants
4101
- receivable
+ other
@@ -3128,21 +3134,21 @@
T.V.A. déductible
4111
- receivable
+ other
Compte courant administration T.V.A.
4112
- receivable
+ other
Taxe d'égalisation due
4118
- receivable
+ other
@@ -3156,28 +3162,28 @@
à 4124 Impôts belges sur le résultat
4120
- receivable
+ other
à 4127 Autres impôts belges
4125
- receivable
+ other
Impôts étrangers
4128
- receivable
+ other
Produits à recevoir
414
- receivable
+ other
@@ -3191,42 +3197,42 @@
Associés
4160
- receivable
+ other
Avances et prêts au personnel
4161
- receivable
+ other
Compte courant des associés en S.P.R.L.
4162
- receivable
+ other
Compte courant des administrateurs et gérants
4163
- receivable
+ other
Créances sur sociétés apparentées
4164
- receivable
+ other
Emballages et matériel à rendre
4166
- receivable
+ other
@@ -3240,42 +3246,42 @@
Subsides à recevoir
41670
- receivable
+ other
Autres créances
41671
- receivable
+ other
Rabais, ristournes, remises à obtenir et autres avoirs non encore reçus
4168
- receivable
+ other
Créances douteuses
417
- receivable
+ other
Cautionnements versés en numéraires
418
- receivable
+ other
Réductions de valeur actées
419
- receivable
+ other
@@ -3296,14 +3302,14 @@
Convertibles
4200
- payable
+ other
Non convertibles
4201
- payable
+ other
@@ -3317,14 +3323,14 @@
Convertibles
4210
- payable
+ other
Non convertibles
4211
- payable
+ other
@@ -3338,14 +3344,14 @@
Financement de biens immobiliers
4220
- payable
+ other
Financement de biens mobiliers
4221
- payable
+ other
@@ -3359,28 +3365,28 @@
Dettes en compte
4230
- payable
+ other
Promesses
4231
- payable
+ other
Crédits d'acceptation
4232
- payable
+ other
Autres emprunts
424
- payable
+ other
@@ -3394,21 +3400,21 @@
Fournisseurs
4250
- payable
+ other
Effets à payer
4251
- payable
+ other
Cautionnements reçus en numéraires
426
- payable
+ other
@@ -3422,28 +3428,28 @@
Entreprises liées
4290
- payable
+ other
Entreprises avec lesquelles il existe un lien de participation
4291
- payable
+ other
Administrateurs, gérants, associés
4292
- payable
+ other
Autres dettes
4299
- payable
+ other
@@ -3457,35 +3463,35 @@
Etablissements de crédit. Emprunts en compte à terme fixe
430
- payable
+ other
Etablissements de crédit. Promesses
431
- payable
+ other
Etablissements de crédit. Crédits d'acceptation
432
- payable
+ other
Etablissements de crédit. Dettes en compte courant
433
- payable
+ other
Autres emprunts
439
- payable
+ other
@@ -3521,7 +3527,7 @@
Entreprises avec lesquelles il existe un lien de participation
44001
- payable
+ other
@@ -3535,35 +3541,35 @@
Fournisseurs belges
44010
- payable
+ other
Fournisseurs CEE
44011
- payable
+ other
Fournisseurs importation
44012
- payable
+ other
Dettes envers les coparticipants
4402
- payable
+ other
Fournisseurs - retenues de garanties
4403
- payable
+ other
@@ -3584,14 +3590,14 @@
Entreprises liées
44100
- payable
+ other
Entreprises avec lesquelles il existe un lien de participation
44101
- payable
+ other
@@ -3605,42 +3611,42 @@
Fournisseurs belges
44110
- payable
+ other
Fournisseurs CEE
44111
- payable
+ other
Fournisseurs importation
44112
- payable
+ other
Factures à recevoir
444
- payable
+ other
Acomptes reçus
446
- payable
+ other
Compensations fournisseurs
448
- payable
+ other
@@ -3661,21 +3667,21 @@
à 4504 Impôts sur le résultat
4501
- payable
+ other
à 4507 Autres impôts en Belgique
4505
- payable
+ other
Impôts à l'étranger
4508
- payable
+ other
@@ -3724,21 +3730,21 @@
T.V.A. déductible
4511
- payable
+ other
Compte courant administration T.V.A.
4512
- payable
+ other
Taxe d'égalisation due
4518
- payable
+ other
@@ -3752,7 +3758,7 @@
Autres impôts sur le résultat
4520
- payable
+ other
@@ -3766,35 +3772,35 @@
Précompte immobilier
45250
- payable
+ other
Impôts communaux à payer
45251
- payable
+ other
Impôts provinciaux à payer
45252
- payable
+ other
Autres impôts et taxes à payer
45253
- payable
+ other
Impôts et taxes à l'étranger
4528
- payable
+ other
@@ -3808,35 +3814,35 @@
Précompte professionnel retenu sur rémunérations
4530
- payable
+ other
Précompte professionnel retenu sur tantièmes
4531
- payable
+ other
Précompte mobilier retenu sur dividendes attribués
4532
- payable
+ other
Précompte mobilier retenu sur intérêts payés
4533
- payable
+ other
Autres précomptes retenus
4538
- payable
+ other
@@ -3850,35 +3856,35 @@
Arriérés
4540
- payable
+ other
1er trimestre
4541
- payable
+ other
2ème trimestre
4542
- payable
+ other
3ème trimestre
4543
- payable
+ other
4ème trimestre
4544
- payable
+ other
@@ -3892,28 +3898,28 @@
Administrateurs, gérants et commissaires
4550
- payable
+ other
Direction
4551
- payable
+ other
Employés
4552
- payable
+ other
Ouvriers
4553
- payable
+ other
@@ -3927,21 +3933,21 @@
Direction
4560
- payable
+ other
Employés
4561
- payable
+ other
Ouvriers
4562
- payable
+ other
@@ -3955,21 +3961,21 @@
Provision pour gratifications de fin d'année
4590
- payable
+ other
Départs de personnel
4591
- payable
+ other
Oppositions sur rémunérations
4592
- payable
+ other
@@ -3983,49 +3989,49 @@
Assurance loi
45930
- payable
+ other
Assurance salaire garanti
45931
- payable
+ other
Assurance groupe
45932
- payable
+ other
Assurances individuelles
45933
- payable
+ other
Caisse d'assurances sociales pour travailleurs indépendants
4594
- payable
+ other
Dettes et provisions sociales diverses
4597
- payable
+ other
ACOMPTES RECUS SUR COMMANDES
46
- payable
+ other
@@ -4039,28 +4045,28 @@
Dividendes et tantièmes d'exercices antérieurs
470
- payable
+ other
Dividendes de l'exercice
471
- payable
+ other
Tantièmes de l'exercice
472
- payable
+ other
Autres allocataires
473
- payable
+ other
@@ -4074,49 +4080,49 @@
Obligations et coupons échus
480
- payable
+ other
Actionnaires - capital à rembourser
481
- payable
+ other
Participation du personnel à payer
482
- payable
+ other
Acomptes reçus d'autres tiers à moins d'un an
483
- payable
+ other
Emballages et matériel consignés
486
- payable
+ other
Cautionnements reçus en numéraires
488
- payable
+ other
Autres dettes diverses
489
- payable
+ other
@@ -4130,7 +4136,7 @@
Charges à reporter
490
- payable
+ other
@@ -4151,21 +4157,21 @@
Ristournes, rabais à obtenir
49100
- payable
+ other
Commissions à obtenir
49101
- payable
+ other
Autres produits d'exploitation
49102
- payable
+ other
@@ -4179,21 +4185,21 @@
Intérêts courus et non échus sur prêts et débits
49110
- payable
+ other
Autres produits financiers
49111
- payable
+ other
Charges à imputer
492
- payable
+ other
@@ -4207,14 +4213,14 @@
Produits d'exploitation à reporter
4930
- payable
+ other
Produits financiers à reporter
4931
- payable
+ other
@@ -4228,21 +4234,21 @@
Compte d'attente
4990
- payable
+ other
Compte de répartition périodique des charges
4991
- payable
+ other
Transferts d'exercice
4999
- payable
+ other
diff --git a/addons/mail_gateway/security/ir.model.access.csv b/addons/mail_gateway/security/ir.model.access.csv
index 25aca3518c3..09f13d57b31 100644
--- a/addons/mail_gateway/security/ir.model.access.csv
+++ b/addons/mail_gateway/security/ir.model.access.csv
@@ -2,3 +2,4 @@
"mail_gateway_mailgate_message","mail_gateway.mailgate.message","model_mailgate_message","base.group_system",1,1,1,1
"mail_gateway_mailgate_thread","mail_gateway.mailgate.thread","model_mailgate_thread","base.group_system",1,1,1,1
"mail_gateway_message_internal_user","mail_gateway.mailgate.message.internal","model_mailgate_message","base.group_user",1,0,0,0
+"mail_gateway_mailgate_message_partner_manager","mail_gateway.mailgate.message.partner.manager","model_mailgate_message","base.group_partner_manager",1,1,1,1
diff --git a/addons/outlook/README b/addons/outlook/README
index d8d7c5d8187..703aeca2475 100644
--- a/addons/outlook/README
+++ b/addons/outlook/README
@@ -8,6 +8,7 @@ Pre requirements :
http://starship.python.net/crew/mhammond/win32/
3.If you are using MS Outlook 2007 than you are required to install "Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 (CDO 1.21)". It can be downloaded from
http://www.microsoft.com/downloads/en/details.aspx?familyid=2714320d-c997-4de1-986f-24f081725d36&displaylang=en
+ and With MS Outlook2003 Install inbuilt Collaboration Data Objects(CDO) while installing Outlook.
How to install openerp-outlook plug-in?
======================================================================================
diff --git a/addons/outlook/installer.py b/addons/outlook/installer.py
index 3718b3687a0..40f15e06c53 100755
--- a/addons/outlook/installer.py
+++ b/addons/outlook/installer.py
@@ -55,7 +55,8 @@ class outlook_installer(osv.osv_memory):
Pre-requirements :
1. Python 2.6+ .
2. Python for Windows extensions - PyWin32 this module for python must be installed for appropriate version of the Python.
- 3. If you are using MS Outlook 2007 than you are required to install "Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 (CDO 1.21)".
+ 3. If With MS Outlook 2007 it is required to install externally "Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 (CDO 1.21)".
+ and With MS Outlook2003 Install inbuilt Collaboration Data Objects(CDO) while installing Outlook.
How to install openerp-outlook plug-in?
1. Save the executable plug-in file.
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/addin.py b/addons/outlook/plugin/openerp-outlook-plugin/addin.py
index eec4e5ed6f2..2cd8bf565b1 100644
--- a/addons/outlook/plugin/openerp-outlook-plugin/addin.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/addin.py
@@ -151,47 +151,50 @@ class OutlookAddin:
activeExplorer = application.ActiveExplorer()
if activeExplorer is not None:
bars = activeExplorer.CommandBars
+ new_bar = bars.Add('Open ERP',0,0,0)
menu_bar = bars.Item("Menu Bar")
+
tools_menu = menu_bar.Controls(5)
tools_menu = CastTo(tools_menu, "CommandBarPopup")
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
# Hook events for the item
item = self.menu_bar_Button = DispatchWithEvents(item, Configuration)
- item.Caption="OpenERP Configuration"
+ item.Caption="Configuration"
item.TooltipText = "Click to configure OpenERP"
item.Enabled = True
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
# Hook events for the item
item = self.menu_bar_arch_Button = DispatchWithEvents(item, ArchiveEvent)
- item.Caption="Push to OpenERP"
+ item.Caption="Push"
item.TooltipText = "Click to push to OpenERP"
item.Enabled = True
toolbar = bars.Item("Standard")
+ openerp_bar = bars.Item('Open ERP')
- item = toolbar.Controls.Add(Type=constants.msoControlButton, Temporary=True)
+ item = openerp_bar.Controls.Add(Type=constants.msoControlButton, Temporary=True)
# Hook events for the item
item = self.toolbarButton = DispatchWithEvents(item, ArchiveEvent)
- item.Caption="Push to OpenERP"
+ item.Caption="Push"
item.TooltipText = "Click to push to OpenERP"
item.Enabled = True
# Adding Menu in Menu Bar to the Web Menu of the Outlook
toolbarweb = bars.Item("Web")
- item = toolbarweb.Controls.Add(Type = constants.msoControlButton, Temporary = True)
+ item = openerp_bar.Controls.Add(Type = constants.msoControlButton, Temporary = True)
item = self.toolbarButtonOpenPartner = DispatchWithEvents(item, OpenPartner)
- item.Caption = "Open Partners"
+ item.Caption = "Partner"
item.TooltipText = "Click to Open OpenERP Partner Contact Information."
item.Enabled = True
- item = toolbarweb.Controls.Add(Type = constants.msoControlButton, Temporary = True)
+ item = openerp_bar.Controls.Add(Type = constants.msoControlButton, Temporary = True)
item = self.toolbarButtonOpenDocument = DispatchWithEvents(item, OpenDocument)
- item.Caption = "Open Document"
+ item.Caption = "Document"
item.TooltipText = "Click to Open Document that has been pushed to server."
item.Enabled = True
@@ -213,22 +216,22 @@ class OutlookAddin:
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
# Hook events for the item
item = self.menu_bar_openpartner_Button = DispatchWithEvents(item, OpenPartner)
- item.Caption = "Open Partner"
+ item.Caption = "Partner"
item.TooltipText = "Click to Open Partner detail"
item.Enabled = True
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
# Hook events for the item
item = self.menu_bar_opendocument_Button = DispatchWithEvents(item, OpenDocument)
- item.Caption = "Open Document"
+ item.Caption = "Document"
item.TooltipText = "Click to Open Document that has been pushed to server."
item.Enabled = True
def OnDisconnection(self, mode, custom):
- self.item.close()
mngr = manager.GetManager()
mngr.config['login'] = False
mngr.SaveConfig()
+ self.item.close()
pass
def OnAddInsUpdate(self, custom):
pass
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dialog_map.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dialog_map.py
index a645270eb49..747915f7181 100644
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dialog_map.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dialog_map.py
@@ -205,6 +205,8 @@ def resetConnAttribs(window):
NewConn.setitem('_uname', config['uname'])
NewConn.setitem('_pwd', config['pwd'])
NewConn.setitem('_login', str(config['login']))
+ NewConn.setitem('_webserver',manager.config['webserver'])
+ NewConn.setitem('_webport',manager.config['webport'])
return
def setConnAttribs(server, port, manager):
@@ -224,6 +226,8 @@ def setConnAttribs(server, port, manager):
NewConn.setitem('_pwd', manager.config['pwd'])
NewConn.setitem('_login', str(manager.config['login']))
NewConn.setitem('_obj_list', manager.config['objects'])
+ NewConn.setitem('_webserver',manager.config['webserver'])
+ NewConn.setitem('_webport',manager.config['webport'])
return
def getConnAttributes(manager):
@@ -235,6 +239,13 @@ def getConnAttributes(manager):
manager.config['uname'] = NewConn.getitem('_uname')
manager.config['pwd'] = NewConn.getitem('_pwd')
manager.config['login'] = NewConn.getitem('_login')
+ manager.config['webserver'] = NewConn.getitem('_webserver')
+ manager.config['webport'] = NewConn.getitem('_webport')
+ return
+def setWebConnAttribs(server, port, manager):
+ manager.config = manager.LoadConfig()
+ NewConn.setitem('_webserver',server)
+ NewConn.setitem('_webport',port)
return
def getMessage(e):
@@ -306,6 +317,7 @@ class WEBOKButtonProcessor(ButtonProcessor):
if server.strip() == "" or server.strip() == "http:\\\\":
win32ui.MessageBox("Invalid web Server address.", "OpenERP Connection", flag_excl)
return
+ setWebConnAttribs(server, port, self.mngr)
web_server = server
web_server_port = port
win32gui.EndDialog(self.window.hwnd, id)
@@ -831,6 +843,7 @@ def CreateContact(btnProcessor,*args):
win32ui.MessageBox("Contact name or Email id is Missing\nPlease fill those information", "Create Contact", flag_error)
return
try:
+ NewConn.CreateContact(str(res))
if not partner:
msg="New contact created."
else:
@@ -848,15 +861,23 @@ def SetAllText(txtProcessor,*args):
# Set values for url, uname, pwd from config file
global web_server
global web_server_port
- serverBox = txtProcessor.GetControl(txtProcessor.other_ids[2])
- win32gui.SendMessage(serverBox, win32con.WM_SETTEXT, 0, "http:\\\\"+str(web_server)+":"+str(web_server_port))
url = NewConn.getitem('_uri')
tbox = txtProcessor.GetControl()
win32gui.SendMessage(tbox, win32con.WM_SETTEXT, 0, str(url))
+
uname = NewConn.getitem('_uname')
tbox = txtProcessor.GetControl(txtProcessor.other_ids[0])
win32gui.SendMessage(tbox, win32con.WM_SETTEXT, 0, str(uname))
+ passbox = txtProcessor.GetControl(txtProcessor.other_ids[1])
+ pwd = NewConn.getitem('_pwd')
+ win32gui.SendMessage(passbox, win32con.WM_SETTEXT, 0, str(pwd))
+ serverBox = txtProcessor.GetControl(txtProcessor.other_ids[2])
+ web_server = NewConn.getitem('_webserver')
+ web_server_port = NewConn.getitem('_webport')
+ webstr = "http:\\\\"+str(web_server)+":"+str(web_server_port)
+ win32gui.SendMessage(serverBox, win32con.WM_SETTEXT, 0, str(webstr))
+
def SetDefaultList(listProcessor,*args):
import win32api
hwndList = listProcessor.GetControl()
@@ -956,6 +977,9 @@ def SetDefaultContact(txtProcessor,*args):
txtProcessor.init_done = True
def setCheckList(groupProcessor,*args):
+ b = check()
+ if not b:
+ return
try:
hinst = win32gui.dllhandle
objs = groupProcessor.window.manager.config['objects']
@@ -1382,8 +1406,14 @@ def OpenPartnerForm(txtProcessor,*args):
txtProcessor.init_done=True
return
try:
- linktopartner = "http:\\\\"+web_server+":"+str(web_server_port)+"\\openerp\\form\\view?model=res.partner&id="+str(vals)
- win32gui.SendMessage(partner_link, win32con.WM_SETTEXT, 0, linktopartner)
+ linktopartner = "http://"+web_server+":"+str(web_server_port)+"/openerp/form/view?model=res.partner&id="+str(vals)
+
+ win32gui.SendMessage(partner_link, win32con.WM_SETTEXT, 0, str(linktopartner))
+# import urllib
+# encode = urllib.urlencode('/openerp/form/view?model=res.partner&id='+str(vals))
+# weburl = 'http://'+web_server+':'+str(web_server_port)
+# linktopartner = weburl + "?next=" + encode
+# win32gui.SendMessage(partner_link, win32con.WM_SETTEXT, 0, linktopartner)
except Exception,e:
win32ui.MessageBox("Error While Opening Partner.\n"+str(e),"Open Partner", flag_error)
webbrowser.open_new(linktopartner)
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/openerp_logo.png b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/openerp_logo.png
index 85c15fe1e7c..1b7461953a1 100644
Binary files a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/openerp_logo.png and b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/openerp_logo.png differ
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/manager.py b/addons/outlook/plugin/openerp-outlook-plugin/manager.py
index faab23a1446..31afaf3c732 100644
--- a/addons/outlook/plugin/openerp-outlook-plugin/manager.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/manager.py
@@ -140,7 +140,7 @@ class OpenERPManager:
def LoadConfig(self):
import win32ui
path = os.path.join(self.data_directory, 'tiny.ini')
- data = {'server' : 'localhost', 'port' : '8069', 'protocol' : 'http://', 'database' : '', 'objects' : self.default_objects, 'uname':'admin', 'pwd':'a', 'login':False}
+ data = {'server' : 'localhost', 'port' : '8069', 'protocol' : 'http://', 'database' : '', 'objects' : self.default_objects, 'uname':'admin', 'pwd':'a', 'login':False,'webserver':'localhost','webport':'8080'}
if os.path.exists(path):
fp = open(path, 'r')
data = fp.readlines()
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py b/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py
index 85abe755bd7..653ad229e1d 100644
--- a/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py
@@ -64,10 +64,12 @@ class XMLRpcConn(object):
_reg_clsid_ = "{C6399AFD-763A-400F-8191-7F9D0503CAE2}"
_reg_progid_ = "Python.OpenERP.XMLRpcConn"
_reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy"
- def __init__(self,server='localhost',port=8069,uri='http://localhost:8069'):
+ def __init__(self,server='localhost',port=8069,uri='http://localhost:8069',webserver='localhost', webport=8080):
self._server=server
self._port=port
self._uri=uri
+ self._webserver=webserver
+ self._webport=webport
self._obj_list=[]
self._dbname=''
self._uname='admin'
@@ -79,6 +81,7 @@ class XMLRpcConn(object):
self.partner_id_list=None
self.protocol=None
+
def getitem(self, attrib):
v=self.__getattribute__(attrib)
return str(v)
diff --git a/addons/point_of_sale/i18n/ar.po b/addons/point_of_sale/i18n/ar.po
index 10de45a5849..cc1ce1358d7 100644
--- a/addons/point_of_sale/i18n/ar.po
+++ b/addons/point_of_sale/i18n/ar.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/bg.po b/addons/point_of_sale/i18n/bg.po
index 5100ff8ff08..3a897bd3cd7 100644
--- a/addons/point_of_sale/i18n/bg.po
+++ b/addons/point_of_sale/i18n/bg.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/bs.po b/addons/point_of_sale/i18n/bs.po
index 970efe2da21..5faf2444924 100644
--- a/addons/point_of_sale/i18n/bs.po
+++ b/addons/point_of_sale/i18n/bs.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/ca.po b/addons/point_of_sale/i18n/ca.po
index 72ec17dcb8e..9ea49bb6593 100644
--- a/addons/point_of_sale/i18n/ca.po
+++ b/addons/point_of_sale/i18n/ca.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/cs.po b/addons/point_of_sale/i18n/cs.po
index f2842d9afe0..b60e7f54f3b 100644
--- a/addons/point_of_sale/i18n/cs.po
+++ b/addons/point_of_sale/i18n/cs.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/da.po b/addons/point_of_sale/i18n/da.po
index 886a89f1492..bd4bb7e5290 100644
--- a/addons/point_of_sale/i18n/da.po
+++ b/addons/point_of_sale/i18n/da.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/de.po b/addons/point_of_sale/i18n/de.po
index eb7f0bde29c..c4c061c9502 100644
--- a/addons/point_of_sale/i18n/de.po
+++ b/addons/point_of_sale/i18n/de.po
@@ -1309,7 +1309,7 @@ msgstr "Point Of Sale Zahlung"
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr "Hauptkasse"
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/el.po b/addons/point_of_sale/i18n/el.po
index ae49ed1289c..8b9e5025217 100644
--- a/addons/point_of_sale/i18n/el.po
+++ b/addons/point_of_sale/i18n/el.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/es.po b/addons/point_of_sale/i18n/es.po
index 1f3a5bcde34..eafdc812ce0 100644
--- a/addons/point_of_sale/i18n/es.po
+++ b/addons/point_of_sale/i18n/es.po
@@ -1267,7 +1267,7 @@ msgstr "Pago punto de venta"
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr "Salidas de caja"
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/es_AR.po b/addons/point_of_sale/i18n/es_AR.po
index 6e45edd1ddc..91b4316a17c 100644
--- a/addons/point_of_sale/i18n/es_AR.po
+++ b/addons/point_of_sale/i18n/es_AR.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/es_EC.po b/addons/point_of_sale/i18n/es_EC.po
index 54ec4cf2b5b..da3ed35a9c2 100644
--- a/addons/point_of_sale/i18n/es_EC.po
+++ b/addons/point_of_sale/i18n/es_EC.po
@@ -302,7 +302,7 @@ msgstr "Max Discount(%)"
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr "Sortie de caisse"
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/et.po b/addons/point_of_sale/i18n/et.po
index 1b7c522671d..b0c451e949c 100644
--- a/addons/point_of_sale/i18n/et.po
+++ b/addons/point_of_sale/i18n/et.po
@@ -318,7 +318,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/fi.po b/addons/point_of_sale/i18n/fi.po
index 25bfb0d5207..c3237407ec1 100644
--- a/addons/point_of_sale/i18n/fi.po
+++ b/addons/point_of_sale/i18n/fi.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/fr.po b/addons/point_of_sale/i18n/fr.po
index 844299db1b1..2a0325592b4 100644
--- a/addons/point_of_sale/i18n/fr.po
+++ b/addons/point_of_sale/i18n/fr.po
@@ -1301,7 +1301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/hi.po b/addons/point_of_sale/i18n/hi.po
index 7b7ac98493a..7b755e6fb6e 100644
--- a/addons/point_of_sale/i18n/hi.po
+++ b/addons/point_of_sale/i18n/hi.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/hr.po b/addons/point_of_sale/i18n/hr.po
index 9aadf56865b..f0a250a54ac 100644
--- a/addons/point_of_sale/i18n/hr.po
+++ b/addons/point_of_sale/i18n/hr.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/hu.po b/addons/point_of_sale/i18n/hu.po
index 10de45a5849..cc1ce1358d7 100644
--- a/addons/point_of_sale/i18n/hu.po
+++ b/addons/point_of_sale/i18n/hu.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/id.po b/addons/point_of_sale/i18n/id.po
index 4432c9a0e49..c38c06d140c 100644
--- a/addons/point_of_sale/i18n/id.po
+++ b/addons/point_of_sale/i18n/id.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/it.po b/addons/point_of_sale/i18n/it.po
index 1c88a75a0e4..868e9b6cee3 100644
--- a/addons/point_of_sale/i18n/it.po
+++ b/addons/point_of_sale/i18n/it.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/ko.po b/addons/point_of_sale/i18n/ko.po
index 8b82ae36462..7b3f7a2b0e6 100644
--- a/addons/point_of_sale/i18n/ko.po
+++ b/addons/point_of_sale/i18n/ko.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/lt.po b/addons/point_of_sale/i18n/lt.po
index 38341f07a70..7581da897b6 100644
--- a/addons/point_of_sale/i18n/lt.po
+++ b/addons/point_of_sale/i18n/lt.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/mn.po b/addons/point_of_sale/i18n/mn.po
index 4d0837e13c9..af6cc7d3106 100644
--- a/addons/point_of_sale/i18n/mn.po
+++ b/addons/point_of_sale/i18n/mn.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/nl.po b/addons/point_of_sale/i18n/nl.po
index 74ceb12d863..369f5fc5f50 100644
--- a/addons/point_of_sale/i18n/nl.po
+++ b/addons/point_of_sale/i18n/nl.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/nl_BE.po b/addons/point_of_sale/i18n/nl_BE.po
index b9c44a3afa1..a65e2c7969b 100644
--- a/addons/point_of_sale/i18n/nl_BE.po
+++ b/addons/point_of_sale/i18n/nl_BE.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/pl.po b/addons/point_of_sale/i18n/pl.po
index ecc8c8d3807..fe7eec383cb 100644
--- a/addons/point_of_sale/i18n/pl.po
+++ b/addons/point_of_sale/i18n/pl.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/point_of_sale.pot b/addons/point_of_sale/i18n/point_of_sale.pot
index 03bdd45ede8..ce02b324fb0 100644
--- a/addons/point_of_sale/i18n/point_of_sale.pot
+++ b/addons/point_of_sale/i18n/point_of_sale.pot
@@ -1258,7 +1258,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/pt.po b/addons/point_of_sale/i18n/pt.po
index ece3d172ab2..fdc2388d866 100644
--- a/addons/point_of_sale/i18n/pt.po
+++ b/addons/point_of_sale/i18n/pt.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/pt_BR.po b/addons/point_of_sale/i18n/pt_BR.po
index 4b6c9b742b2..91bf9abfa24 100644
--- a/addons/point_of_sale/i18n/pt_BR.po
+++ b/addons/point_of_sale/i18n/pt_BR.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/ro.po b/addons/point_of_sale/i18n/ro.po
index b4a29233245..ec2d6885193 100644
--- a/addons/point_of_sale/i18n/ro.po
+++ b/addons/point_of_sale/i18n/ro.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/ru.po b/addons/point_of_sale/i18n/ru.po
index 65d956b209f..41a51e62fe6 100644
--- a/addons/point_of_sale/i18n/ru.po
+++ b/addons/point_of_sale/i18n/ru.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/sl.po b/addons/point_of_sale/i18n/sl.po
index e7f03a6fb30..ab22472ca92 100644
--- a/addons/point_of_sale/i18n/sl.po
+++ b/addons/point_of_sale/i18n/sl.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/sq.po b/addons/point_of_sale/i18n/sq.po
index 8cfca0c1806..8332d73079f 100644
--- a/addons/point_of_sale/i18n/sq.po
+++ b/addons/point_of_sale/i18n/sq.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/sr.po b/addons/point_of_sale/i18n/sr.po
index ffd5a700224..fb969590f3c 100644
--- a/addons/point_of_sale/i18n/sr.po
+++ b/addons/point_of_sale/i18n/sr.po
@@ -303,7 +303,7 @@ msgstr "Max Popust(%)"
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr "Gotovina Van"
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/sr@latin.po b/addons/point_of_sale/i18n/sr@latin.po
index ad97c7826aa..c7343aa5e0d 100644
--- a/addons/point_of_sale/i18n/sr@latin.po
+++ b/addons/point_of_sale/i18n/sr@latin.po
@@ -1265,7 +1265,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/sv.po b/addons/point_of_sale/i18n/sv.po
index 77e17780b74..b129f503b77 100644
--- a/addons/point_of_sale/i18n/sv.po
+++ b/addons/point_of_sale/i18n/sv.po
@@ -1264,7 +1264,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/tlh.po b/addons/point_of_sale/i18n/tlh.po
index 76c19bdbb07..80f86fe079f 100644
--- a/addons/point_of_sale/i18n/tlh.po
+++ b/addons/point_of_sale/i18n/tlh.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/tr.po b/addons/point_of_sale/i18n/tr.po
index 3fc84791db4..e849b9d68fe 100644
--- a/addons/point_of_sale/i18n/tr.po
+++ b/addons/point_of_sale/i18n/tr.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/uk.po b/addons/point_of_sale/i18n/uk.po
index 242aad503b9..10af65f5f78 100644
--- a/addons/point_of_sale/i18n/uk.po
+++ b/addons/point_of_sale/i18n/uk.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/vi.po b/addons/point_of_sale/i18n/vi.po
index 7fa8e594be7..2ca18a1629f 100644
--- a/addons/point_of_sale/i18n/vi.po
+++ b/addons/point_of_sale/i18n/vi.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/zh_CN.po b/addons/point_of_sale/i18n/zh_CN.po
index 8b40a13f8a0..c0d727dc3bc 100644
--- a/addons/point_of_sale/i18n/zh_CN.po
+++ b/addons/point_of_sale/i18n/zh_CN.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/zh_HK.po b/addons/point_of_sale/i18n/zh_HK.po
index 99ac3b274ae..3d82b84d72f 100644
--- a/addons/point_of_sale/i18n/zh_HK.po
+++ b/addons/point_of_sale/i18n/zh_HK.po
@@ -301,7 +301,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/i18n/zh_TW.po b/addons/point_of_sale/i18n/zh_TW.po
index a35d70c4fdf..f043c3e53fa 100644
--- a/addons/point_of_sale/i18n/zh_TW.po
+++ b/addons/point_of_sale/i18n/zh_TW.po
@@ -300,7 +300,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.box.out:0
-msgid "Sortie de caisse"
+msgid "Output Operation"
msgstr ""
#. module: point_of_sale
diff --git a/addons/point_of_sale/wizard/pos_box_out.xml b/addons/point_of_sale/wizard/pos_box_out.xml
index 3bd817b1797..5c5b1135a8f 100644
--- a/addons/point_of_sale/wizard/pos_box_out.xml
+++ b/addons/point_of_sale/wizard/pos_box_out.xml
@@ -8,7 +8,7 @@
pos.box.out
form
-
diff --git a/addons/project/board_project_manager_view.xml b/addons/project/board_project_manager_view.xml
index f9db634d51d..03dae91ee6d 100644
--- a/addons/project/board_project_manager_view.xml
+++ b/addons/project/board_project_manager_view.xml
@@ -14,8 +14,12 @@
id="act_my_project" name="My projects"
res_model="project.project" view_mode="tree,form"
view_type="form"/>
-
-
-
+
diff --git a/addons/project/i18n/project.pot b/addons/project/i18n/project.pot
index ffc28ddf2db..42cae0e9680 100644
--- a/addons/project/i18n/project.pot
+++ b/addons/project/i18n/project.pot
@@ -1430,7 +1430,7 @@ msgstr ""
#. module: project
#: model:ir.actions.act_window,help:project.open_view_project_all
-msgid "A project contains a set of tasks or issues that will be performed by your resources assigned on it. A project can be put into a hierarchy, as a child of a Parent Project. This allows you to design large project structure with different phases spread over the project duration cycle. Each user can set his default project in his own preferences, in order to filter automatically the tasks or issues he usually works on."
+msgid "A project contains a set of tasks or issues that will be performed by your assigned personnel. A project can be put into a hierarchy, as a child of a Parent Project. This allows you to design large project structure with different phases spread over the project's duration cycle. Each user can set his default project in his own preferences, in order to filter automatically the tasks or issues he usually works on. If you have personalized your Project application in order to invoice the time spent on a task, you can choose to invoice or not one project in the billing section."
msgstr ""
#. module: project
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index a06397341bb..7a65129af2c 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -160,7 +160,7 @@
{'search_default_Current':1}
- A project contains a set of tasks or issues that will be performed by your resources assigned on it. A project can be put into a hierarchy, as a child of a Parent Project. This allows you to design large project structure with different phases spread over the project duration cycle. Each user can set his default project in his own preferences, in order to filter automatically the tasks or issues he usually works on.
+ A project contains a set of tasks or issues that will be performed by your assigned personnel. A project can be put into a hierarchy, as a child of a Parent Project. This allows you to design large project structure with different phases spread over the project's duration cycle. Each user can set his default project in his own preferences, in order to filter automatically the tasks or issues he usually works on. If you have personalized your Project application in order to invoice the time spent on a task, you can choose to invoice or not one project in the billing section.
@@ -225,6 +225,9 @@
widget="float_time"
attrs="{'readonly':[('state','!=','draft')]}"
on_change="onchange_planned(planned_hours, effective_hours)"/>
+
diff --git a/addons/project_gtd/project_gtd.py b/addons/project_gtd/project_gtd.py
index 90bef42b452..a3c9d48476b 100644
--- a/addons/project_gtd/project_gtd.py
+++ b/addons/project_gtd/project_gtd.py
@@ -106,7 +106,7 @@ class project_task(osv.osv):
timebox_obj = self.pool.get('project.gtd.timebox')
access_pool = self.pool.get('ir.model.access')
if (res['type'] == 'search') and access_pool.check_groups(cr, uid, "project_gtd.group_project_getting"):
- tt = timebox_obj.browse(cr, uid, timebox_obj.search(cr,uid,[]))
+ tt = timebox_obj.browse(cr, uid, timebox_obj.search(cr,uid,[]), context=context)
search_extended ='''''' % (len(tt)+7,1,_('Getting Things Done'))
search_extended += '''''' % (_('Inbox'),)
search_extended += '''''' % (_('GTD'),)
@@ -125,7 +125,7 @@ class project_task(osv.osv):
if search_extended:
res['arch'] = unicode(res['arch'], 'utf8').replace('', search_extended)
attrs_sel = self.pool.get('project.gtd.context').name_search(cr, uid, '', [], context=context)
- context_id_info = self.pool.get('project.task').fields_get(cr, uid, ['context_id'])
+ context_id_info = self.pool.get('project.task').fields_get(cr, uid, ['context_id'], context=context)
context_id_info['context_id']['selection'] = attrs_sel
res['fields'].update(context_id_info)
return res
diff --git a/addons/project_long_term/i18n/project_long_term.pot b/addons/project_long_term/i18n/project_long_term.pot
index b3a2358809d..2e28070c646 100644
--- a/addons/project_long_term/i18n/project_long_term.pot
+++ b/addons/project_long_term/i18n/project_long_term.pot
@@ -500,7 +500,7 @@ msgstr ""
#. module: project_long_term
#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar
-msgid "Working Period"
+msgid "Working Time"
msgstr ""
#. module: project_long_term
diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml
index 39d9d1cfa8b..0cdb7af5ad7 100644
--- a/addons/project_long_term/project_long_term_view.xml
+++ b/addons/project_long_term/project_long_term_view.xml
@@ -377,7 +377,7 @@
src_model="project.phase"
view_mode="tree,form"
context="{'search_default_phase_id': [active_id]}"
- domain="[('phase_id', '=', active_id)]"
+ domain="[('phase_id', '=', active_id),('project_id','=',project_id)]"
/>
+ view_type="form"
+ />
+
+
# ------------------------------------------------------
# Menu Items
diff --git a/addons/project_long_term/security/ir.model.access.csv b/addons/project_long_term/security/ir.model.access.csv
index 3aaebb64294..6d4961f2cfe 100644
--- a/addons/project_long_term/security/ir.model.access.csv
+++ b/addons/project_long_term/security/ir.model.access.csv
@@ -1,8 +1,8 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_project_phase","project.phase","model_project_phase","project.group_project_user",1,1,1,0
"access_project_resource_allocation","project.resource.allocation","model_project_resource_allocation","project.group_project_user",1,0,0,0
-"access_project_phase_manager","project.phase manager","model_project_phase","project.group_project_manager",1,0,0,0
-"access_project_resource_allocation_manager","project.resource.allocation manager","model_project_resource_allocation","project.group_project_manager",1,0,0,0
+"access_project_phase_manager","project.phase manager","model_project_phase","project.group_project_manager",1,1,1,1
+"access_project_resource_allocation_manager","project.resource.allocation manager","model_project_resource_allocation","project.group_project_manager",1,1,1,1
"access_resource_resource_user","resource.resource user","resource.model_resource_resource","project.group_project_user",1,0,0,0
"access_resource_calendar_leaves_user","resource.calendar.leaves user","resource.model_resource_calendar_leaves","project.group_project_user",1,1,1,1
"access_resource_resource_manager","resource.resource manager","resource.model_resource_resource","project.group_project_manager",1,1,1,1
diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml
index dd9967cb0e0..d349292b997 100644
--- a/addons/project_timesheet/project_timesheet_view.xml
+++ b/addons/project_timesheet/project_timesheet_view.xml
@@ -19,6 +19,18 @@
+
+ Inherit project form : Customer
+ project.project
+ form
+
+
+
+
+
+
+
+
Inherit project search view : Invoicing Data
project.project
@@ -64,10 +76,58 @@
+
+ account.analytic.line.inherit.select
+ account.analytic.line
+ search
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bill Tasks Works
+ account.analytic.line
+ form
+ tree,form
+ []
+ {'search_default_to_invoice': 1}
+
+
+ This lists show you every task work you can invoice to the customer. Select the lines in order to generate the invoices automatically.
+
+
+ parent="menu_project_billing" action="action_project_timesheet_bill_task"/>
diff --git a/addons/resource/i18n/resource.pot b/addons/resource/i18n/resource.pot
index 8e704e446f0..8e2da3bcf83 100644
--- a/addons/resource/i18n/resource.pot
+++ b/addons/resource/i18n/resource.pot
@@ -88,7 +88,7 @@ msgstr ""
#. module: resource
#: view:resource.calendar:0
-msgid "Search Working Period"
+msgid "Search Working Time"
msgstr ""
#. module: resource
@@ -187,7 +187,7 @@ msgstr ""
#. module: resource
#: model:ir.actions.act_window,name:resource.action_resource_calendar_form
#: view:resource.calendar:0
-msgid "Working Period"
+msgid "Working Time"
msgstr ""
#. module: resource
diff --git a/addons/resource/resource.py b/addons/resource/resource.py
index 9012dfa7e38..5c3ec8bacb8 100644
--- a/addons/resource/resource.py
+++ b/addons/resource/resource.py
@@ -203,8 +203,8 @@ class resource_calendar_attendance(osv.osv):
'name' : fields.char("Name", size=64, required=True),
'dayofweek': fields.selection([('0','Monday'),('1','Tuesday'),('2','Wednesday'),('3','Thursday'),('4','Friday'),('5','Saturday'),('6','Sunday')], 'Day of week'),
'date_from' : fields.date('Starting date'),
- 'hour_from' : fields.float('Work from', size=8, required=True),
- 'hour_to' : fields.float("Work to", size=8, required=True),
+ 'hour_from' : fields.float('Work from', size=8, required=True, help="Working time will start from"),
+ 'hour_to' : fields.float("Work to", size=8, required=True, help="Working time will end at"),
'calendar_id' : fields.many2one("resource.calendar", "Resource's Calendar", required=True),
}
_order = 'dayofweek, hour_from'
diff --git a/addons/resource/resource_view.xml b/addons/resource/resource_view.xml
index 2a20f101b0f..1840c2a5f27 100644
--- a/addons/resource/resource_view.xml
+++ b/addons/resource/resource_view.xml
@@ -37,7 +37,7 @@
resource.calendar
search
-
+
@@ -76,7 +76,7 @@
resource.calendar
form
-