diff --git a/addons/account/__init__.py b/addons/account/__init__.py
index 52c65f0c3da..36cc1c85b5a 100644
--- a/addons/account/__init__.py
+++ b/addons/account/__init__.py
@@ -23,7 +23,7 @@ import account
import installer
import project
import partner
-import invoice
+import account_invoice
import account_bank_statement
import account_bank
import account_cash_statement
@@ -32,7 +32,7 @@ import account_analytic_line
import wizard
import report
import product
-import sequence
+import ir_sequence
import company
import res_currency
diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index e37a39b4351..9445688ec6d 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -103,8 +103,7 @@ module named account_voucher.
'account_end_fy.xml',
'account_invoice_view.xml',
'partner_view.xml',
- 'data/account_invoice.xml',
- 'data/account_data2.xml',
+ 'data/account_data.xml',
'account_invoice_workflow.xml',
'project/project_view.xml',
'project/project_report.xml',
@@ -119,7 +118,7 @@ module named account_voucher.
'process/statement_process.xml',
'process/customer_invoice_process.xml',
'process/supplier_invoice_process.xml',
- 'sequence_view.xml',
+ 'ir_sequence_view.xml',
'company_view.xml',
'board_account_view.xml',
"wizard/account_report_profit_loss_view.xml",
diff --git a/addons/account/account.py b/addons/account/account.py
index 34306b703aa..68af88754f5 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -346,6 +346,52 @@ class account_account(osv.osv):
res[account.id] = level
return res
+ def _set_credit_debit(self, cr, uid, account_id, name, value, arg, context=None):
+ if context.get('config_invisible', True):
+ return True
+
+ account = self.browse(cr, uid, account_id, context=context)
+ diff = value - getattr(account,name)
+ if not diff:
+ return True
+
+ journal_obj = self.pool.get('account.journal')
+ jids = journal_obj.search(cr, uid, [('type','=','situation'),('centralisation','=',1),('company_id','=',account.company_id.id)], context=context)
+ if not jids:
+ raise osv.except_osv(_('Error!'),_("You need an Opening journal with centralisation checked to set the initial balance!"))
+
+ period_obj = self.pool.get('account.period')
+ pids = period_obj.search(cr, uid, [('special','=',True),('company_id','=',account.company_id.id)], context=context)
+ if not pids:
+ raise osv.except_osv(_('Error!'),_("No opening/closing period defined, please create one to set the initial balance!"))
+
+ move_obj = self.pool.get('account.move.line')
+ move_id = move_obj.search(cr, uid, [
+ ('journal_id','=',jids[0]),
+ ('period_id','=',pids[0]),
+ ('account_id','=', account_id),
+ (name,'>', 0.0),
+ ('name','=', _('Opening Balance'))
+ ], context=context)
+ if move_id:
+ move = move_obj.browse(cr, uid, move_id[0], context=context)
+ move_obj.write(cr, uid, move_id[0], {
+ name: diff+getattr(move,name)
+ }, context=context)
+ else:
+ if diff<0.0:
+ raise osv.except_osv(_('Error!'),_("Unable to adapt the initial balance (negative value)!"))
+ nameinv = (name=='credit' and 'debit') or 'credit'
+ move_id = move_obj.create(cr, uid, {
+ 'name': _('Opening Balance'),
+ 'account_id': account_id,
+ 'journal_id': jids[0],
+ 'period_id': pids[0],
+ name: diff,
+ nameinv: 0.0
+ }, context=context)
+ return True
+
_columns = {
'name': fields.char('Name', size=128, required=True, select=True),
'currency_id': fields.many2one('res.currency', 'Secondary Currency', help="Forces all moves for this account to have this secondary currency."),
@@ -370,9 +416,9 @@ class account_account(osv.osv):
'child_consol_ids': fields.many2many('account.account', 'account_account_consol_rel', 'child_id', 'parent_id', 'Consolidated Children'),
'child_id': fields.function(_get_child_ids, type='many2many', relation="account.account", string="Child Accounts"),
'balance': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Balance', multi='balance'),
- 'credit': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Credit', multi='balance'),
- 'debit': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Debit', multi='balance'),
- 'reconcile': fields.boolean('Reconcile', help="Check this if the user is allowed to reconcile entries in this account."),
+ 'credit': fields.function(__compute, fnct_inv=_set_credit_debit, digits_compute=dp.get_precision('Account'), string='Credit', multi='balance'),
+ 'debit': fields.function(__compute, fnct_inv=_set_credit_debit, digits_compute=dp.get_precision('Account'), string='Debit', multi='balance'),
+ 'reconcile': fields.boolean('Allow Reconciliation', help="Check this box if this account allows reconciliation of journal items."),
'shortcut': fields.char('Shortcut', size=12),
'tax_ids': fields.many2many('account.tax', 'account_account_tax_default_rel',
'account_id', 'tax_id', 'Default Taxes'),
@@ -672,32 +718,22 @@ class account_journal(osv.osv):
return super(account_journal, self).write(cr, uid, ids, vals, context=context)
def create_sequence(self, cr, uid, vals, context=None):
+ """ Create new no_gap entry sequence for every new Joural
"""
- Create new entry sequence for every new Joural
- """
- seq_pool = self.pool.get('ir.sequence')
- seq_typ_pool = self.pool.get('ir.sequence.type')
-
- name = vals['name']
- code = vals['code'].lower()
-
- types = {
- 'name': name,
- 'code': code
- }
- seq_typ_pool.create(cr, uid, types)
+ # in account.journal code is actually the prefix of the sequence
+ # whereas ir.sequence code is a key to lookup global sequences.
+ prefix = vals['code'].upper()
seq = {
- 'name': name,
- 'code': code,
- 'active': True,
- 'prefix': code + "/%(year)s/",
+ 'name': vals['name'],
+ 'implementation':'no_gap',
+ 'prefix': prefix + "/%(year)s/",
'padding': 4,
'number_increment': 1
}
if 'company_id' in vals:
seq['company_id'] = vals['company_id']
- return seq_pool.create(cr, uid, seq)
+ return self.pool.get('ir.sequence').create(cr, uid, seq)
def create(self, cr, uid, vals, context=None):
if not 'sequence_id' in vals or not vals['sequence_id']:
@@ -1214,7 +1250,7 @@ class account_move(osv.osv):
else:
if journal.sequence_id:
c = {'fiscalyear_id': move.period_id.fiscalyear_id.id}
- new_name = obj_sequence.get_id(cr, uid, journal.sequence_id.id, context=c)
+ new_name = obj_sequence.next_by_id(cr, uid, journal.sequence_id.id, c)
else:
raise osv.except_osv(_('Error'), _('No sequence defined on the journal !'))
@@ -2730,7 +2766,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
_columns = {
'company_id':fields.many2one('res.company', 'Company', required=True),
'chart_template_id': fields.many2one('account.chart.template', 'Chart Template', required=True),
- 'bank_accounts_id': fields.one2many('account.bank.accounts.wizard', 'bank_account_id', 'Bank Accounts', required=True),
+ 'bank_accounts_id': fields.one2many('account.bank.accounts.wizard', 'bank_account_id', 'Cash and Banks', required=True),
'code_digits':fields.integer('# of Digits', required=True, help="No. of Digits to use for account code"),
'seq_journal':fields.boolean('Separated Journal Sequences', help="Check this box if you want to use a different sequence for each created journal. Otherwise, all will use the same sequence."),
"sale_tax": fields.many2one("account.tax.template", "Default Sale Tax"),
@@ -2778,7 +2814,6 @@ class wizard_multi_charts_accounts(osv.osv_memory):
def _get_default_accounts(self, cr, uid, context=None):
return [
- {'acc_name': _('Bank Account'),'account_type':'bank'},
{'acc_name': _('Cash'),'account_type':'cash'}
]
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index 4cc2ed89786..98051a319fd 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -340,9 +340,9 @@ class account_bank_statement(osv.osv):
else:
if st.journal_id.sequence_id:
c = {'fiscalyear_id': st.period_id.fiscalyear_id.id}
- st_number = obj_seq.get_id(cr, uid, st.journal_id.sequence_id.id, context=c)
+ st_number = obj_seq.next_by_id(cr, uid, st.journal_id.sequence_id.id, context=c)
else:
- st_number = obj_seq.get(cr, uid, 'account.bank.statement')
+ st_number = obj_seq.next_by_code(cr, uid, 'account.bank.statement')
for line in st.move_line_ids:
if line.state <> 'valid':
diff --git a/addons/account/account_bank_view.xml b/addons/account/account_bank_view.xml
index d91739817ac..1a0e26e7c1f 100644
--- a/addons/account/account_bank_view.xml
+++ b/addons/account/account_bank_view.xml
@@ -13,7 +13,7 @@
-
+
@@ -23,16 +23,16 @@
- Bank Accounts
+ Setup your Bank Accountsres.partner.bankformtree,form
- Configure your company's bank account and select those that must appear on the report footer. You can drag & drop bank in the list view to reorder bank accounts. If you use the accounting application of OpenERP, journals and accounts will be created automatically based on these data.
+ Configure your company's bank account and select those that must appear on the report footer. You can reorder banks in the list view. If you use the accounting application of OpenERP, journals and accounts will be created automatically based on these data.
diff --git a/addons/account/account_cash_statement.py b/addons/account/account_cash_statement.py
index dc78d19bab4..ebc97fe8a84 100644
--- a/addons/account/account_cash_statement.py
+++ b/addons/account/account_cash_statement.py
@@ -294,9 +294,9 @@ class account_cash_statement(osv.osv):
if statement.name and statement.name == '/':
if statement.journal_id.sequence_id:
c = {'fiscalyear_id': statement.period_id.fiscalyear_id.id}
- st_number = obj_seq.get_id(cr, uid, statement.journal_id.sequence_id.id, context=c)
+ st_number = obj_seq.next_by_id(cr, uid, statement.journal_id.sequence_id.id, context=c)
else:
- st_number = obj_seq.get(cr, uid, 'account.cash.statement')
+ st_number = obj_seq.next_by_code(cr, uid, 'account.cash.statement')
vals.update({
'name': st_number
})
diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml
index 2ef7e982846..b35b37aa972 100644
--- a/addons/account/account_installer.xml
+++ b/addons/account/account_installer.xml
@@ -11,7 +11,7 @@
Accounting Application Configuration
- Configure Your Accounting Chart
+ Configure Your Chart of AccountsThe default Chart of Accounts is matching your country selection. If no certified Chart of Accounts exists for your specified country, a generic one can be installed and will be selected by default.
@@ -26,7 +26,7 @@
-
+
@@ -44,7 +44,7 @@
- Accounting Chart Configuration
+ Install your Chart of Accountsir.actions.act_windowaccount.installer
@@ -65,25 +65,13 @@
automatic
-
- Define your Bank Account
- ir.actions.act_window
- res.partner.bank
- form
- form
-
-
-
-
-
-
-
Review your Financial Accountsir.actions.act_windowaccount.accountformtree,form
+ {'config_invisible': False}
@@ -93,11 +81,12 @@
- Review your Financial Journal
+ Review your Financial Journalsir.actions.act_windowaccount.journalformtree,form
+ Setup your accounting journals. For bank accounts, it's better to use the 'Setup Your Bank Accounts' tool that will automatically create the accounts and journals for you.
@@ -111,6 +100,7 @@
account.payment.termformtree,form
+ Payment terms define the conditions to pay a customer or supplier invoice in one or several payments. Customers periodic reminders will use the payment terms for each letter. Each customer or supplier can be assigned to one of these payment terms.
diff --git a/addons/account/invoice.py b/addons/account/account_invoice.py
similarity index 100%
rename from addons/account/invoice.py
rename to addons/account/account_invoice.py
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 1322226bfb6..ce349fc4f4e 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -1221,7 +1221,7 @@ class account_move_line(osv.osv):
vals['move_id'] = res[0]
if not vals.get('move_id', False):
if journal.sequence_id:
- #name = self.pool.get('ir.sequence').get_id(cr, uid, journal.sequence_id.id)
+ #name = self.pool.get('ir.sequence').next_by_id(cr, uid, journal.sequence_id.id)
v = {
'date': vals.get('date', time.strftime('%Y-%m-%d')),
'period_id': context['period_id'],
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index e5dbbedb9de..888c2cd7f2b 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -162,17 +162,21 @@
- Generate Your Accounting Chart from a Chart Template
+ Generate Your Chart of Accounts from a Chart TemplateThis will automatically configure your chart of accounts, bank accounts, taxes and journals according to the selected template
@@ -2388,13 +2390,13 @@
-
+
-
+
-
+
-
- Income View
- view
- income
-
-
- Expense View
- expense
- expense
-
-
- Asset View
- asset
- asset
-
-
- Liability View
- liability
- liability
-
+
+ Income View
+ view
+ income
+
+
+ Expense View
+ expense
+ expense
+
+
+ Asset View
+ asset
+ asset
+
+
+ Liability View
+ liability
+ liability
+ Income
@@ -106,16 +106,16 @@
-
-
- 0
- Configurable Account Chart
-
- view
-
-
+
+
+ 0
+ Configurable Account Chart
+
+ view
+
+
-
+
1
@@ -125,120 +125,120 @@
-
- 10
- Fixed Assets
-
- view
-
-
+
+ 10
+ Fixed Assets
+
+ view
+
+
-
- 100
- Fixed Asset Account
-
- other
-
-
+
+ 100
+ Fixed Asset Account
+
+ other
+
+
-
- 11
- Net Current Assets
-
- view
-
-
+
+ 11
+ Net Current Assets
+
+ view
+
+
-
- 110
- Current Assets
-
- view
-
-
+
+ 110
+ Current Assets
+
+ view
+
+
-
- 1101
- Purchased Stocks
-
- other
-
-
+
+ 1101
+ Purchased Stocks
+
+ other
+
+
-
- 1102
- Debtors
-
- receivable
-
-
-
+
+ 1102
+ Debtors
+
+ receivable
+
+
+
-
- 1103
- Tax Paid
-
- other
-
-
+
+ 1103
+ Tax Paid
+
+ other
+
+
-
- 1104
- Bank Current Account
-
- view
-
-
+
+ 1104
+ Bank Current Account
+
+ view
+
+
-
- 1106
- Opening Income Account
-
- other
-
-
+
+ 1106
+ Opening Income Account
+
+ other
+
+
-
- 111
- Current Liabilities
-
- view
-
-
+
+ 111
+ Current Liabilities
+
+ view
+
+
-
- 1111
- Creditors
-
- payable
-
-
-
+
+ 1111
+ Creditors
+
+ payable
+
+
+
-
- 1112
- Tax Received
-
- other
-
-
+
+ 1112
+ Tax Received
+
+ other
+
+
-
- 1113
- Reserve and Profit/Loss Account
-
- other
-
-
-
+
+ 1113
+ Reserve and Profit/Loss Account
+
+ other
+
+
+
-
- 1114
- Opening Expense Account
-
- other
-
-
+
+ 1114
+ Opening Expense Account
+
+ other
+
+
@@ -250,53 +250,53 @@
-
- 20
- Revenue
-
- view
-
-
+
+ 20
+ Revenue
+
+ view
+
+
-
- 200
- Product Sales
-
- other
-
-
+
+ 200
+ Product Sales
+
+ other
+
+
-
- 21
- Cost of Sales
-
- view
-
-
+
+ 21
+ Cost of Sales
+
+ view
+
+
-
- 210
- Cost of Goods Sold
-
- other
-
-
+
+ 210
+ Cost of Goods Sold
+
+ other
+
+
-
- 22
- Overheads
-
- view
-
-
+
+ 22
+ Overheads
+
+ view
+
+
-
- 220
- Expenses
-
- other
-
-
+
+ 220
+ Expenses
+
+ other
+
+ 221
@@ -315,126 +315,126 @@
Plan Fees
-
- Tax Balance to Pay
-
-
+
+ Tax Balance to Pay
+
+
-
-
- Tax Received
-
-
-
+
+
+ Tax Received
+
+
+
-
- Tax Received Rate S (15%)
-
-
+
+ Tax Received Rate S (15%)
+
+
-
- Tax Received Rate R (5%)
-
-
+
+ Tax Received Rate R (5%)
+
+
-
- Tax Received Rate X (Exempt)
-
-
+
+ Tax Received Rate X (Exempt)
+
+
-
- Tax Received Rate O (Out of scope)
-
-
+
+ Tax Received Rate O (Out of scope)
+
+
-
+
-
- Tax Paid
-
-
+
+ Tax Paid
+
+
-
- Tax Paid Rate S (15%)
-
-
+
+ Tax Paid Rate S (15%)
+
+
-
- Tax Paid Rate R (5%)
-
-
+
+ Tax Paid Rate R (5%)
+
+
-
- Tax Paid Rate X (Exempt)
-
-
+
+ Tax Paid Rate X (Exempt)
+
+
-
- Tax Paid Rate O (Out of scope)
-
-
+
+ Tax Paid Rate O (Out of scope)
+
+
-
+
-
+
-
- Tax Bases
-
-
+
+ Tax Bases
+
+
-
- Taxable Purchases Base
-
-
+
+ Taxable Purchases Base
+
+
-
- Taxable Purchases Rated S (15%)
-
-
+
+ Taxable Purchases Rated S (15%)
+
+
-
- Taxable Purchases Rated R (5%)
-
-
+
+ Taxable Purchases Rated R (5%)
+
+
-
- Taxable Purchases Type X (Exempt)
-
-
+
+ Taxable Purchases Type X (Exempt)
+
+
-
- Taxable Purchases Type O (Out of scope)
-
-
+
+ Taxable Purchases Type O (Out of scope)
+
+
-
+
-
- Base of Taxable Sales
-
-
+
+ Base of Taxable Sales
+
+
-
- Taxable Sales Rated S (15%)
-
-
+
+ Taxable Sales Rated S (15%)
+
+
-
- Taxable Sales Rated R (5%)
-
-
+
+ Taxable Sales Rated R (5%)
+
+
-
- Taxable Sales Type X (Exempt)
-
-
+
+ Taxable Sales Type X (Exempt)
+
+
-
- Taxable Sales Type O (Out of scope)
-
-
+
+ Taxable Sales Type O (Out of scope)
+
+ Configurable Account Chart Template
@@ -450,7 +450,7 @@
-
+
@@ -569,9 +569,9 @@
-
-
-
+
+
+
@@ -584,40 +584,40 @@
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
- Generate Chart of Accounts from a Chart Template
-
-
- automatic
-
+
+ Generate Chart of Accounts from a Chart Template
+
+
+ automatic
+
diff --git a/addons/account/data/account_data2.xml b/addons/account/data/account_data.xml
similarity index 94%
rename from addons/account/data/account_data2.xml
rename to addons/account/data/account_data.xml
index 48630c9899d..e111c453325 100644
--- a/addons/account/data/account_data2.xml
+++ b/addons/account/data/account_data.xml
@@ -469,66 +469,48 @@
Account Journal Sequences
-->
-
- Account Journal
- account.journal
-
-
- Account Journal
- account.journal
-
-
- Sale Journal
- account.journal
+ Account Default Sales JournalSAJ/%(year)s/
- Sales Credit Note Journal
- account.journal
+ Account Default Sales Credit Note JournalSCNJ/%(year)s/
- Purchase Journal
- account.journal
+ Account Default Expenses JournalEXJ/%(year)s/
- Expenses Credit Notes Journal
- account.journal
+ Account Default Expenses Credit Notes JournalECNJ/%(year)s/
- Bank Journal
- account.journal
+ Account Default Bank JournalBNK/%(year)s/
- Checks Journal
- account.journal
+ Account Default Checks JournalCHK/%(year)s/
- Cash Journal
- account.journal
+ Account Default Cash JournalCSH/%(year)s/
- Opening Entries Journal
- account.journal
+ Account Default Opening Entries JournalOPEJ/%(year)s/
- Miscellaneous Journal
- account.journal
+ Account Default Miscellaneous JournalMISJ/%(year)s/
@@ -538,7 +520,7 @@
-->
- Account reconcile sequence
+ Account Reconcileaccount.reconcile
@@ -550,7 +532,7 @@
- Bank Statement
+ Account Bank Statementaccount.bank.statement
@@ -562,7 +544,7 @@
- Cash Statement
+ Account Cash Statementaccount.cash.statement
@@ -572,5 +554,30 @@
+
+
+
+ Analytic account
+ account.analytic.account
+
+
+ Analytic account sequence
+ account.analytic.account
+
+
+
+
+
+
+ Invoice
+ account.invoice
+
+
+
+
diff --git a/addons/account/data/account_invoice.xml b/addons/account/data/account_invoice.xml
deleted file mode 100644
index 54f5ed6de91..00000000000
--- a/addons/account/data/account_invoice.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
- Invoice
- account.invoice
-
-
-
-
- Account Invoice Out
- account.invoice.out_invoice
-
-
- Account Invoice In
- account.invoice.in_invoice
-
-
- Account Refund Out
- account.invoice.out_refund
-
-
- Account Refund In
- account.invoice.in_refund
-
-
-
-
- Account Invoice Out
- account.invoice.out_invoice
-
- %(year)s/
-
-
- Account Invoice In
- account.invoice.in_invoice
-
- %(year)s/
-
-
- Account Refund Out
- account.invoice.out_refund
-
- %(year)s/
-
-
- Account Refund In
- account.invoice.in_refund
-
- %(year)s/
-
-
-
-
- Analytic account
- account.analytic.account
-
-
-
-
- Analytic account sequence
- account.analytic.account
-
-
-
-
-
diff --git a/addons/account/i18n/ar.po b/addons/account/i18n/ar.po
index 170ac722c7a..74fcc0ee06d 100644
--- a/addons/account/i18n/ar.po
+++ b/addons/account/i18n/ar.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2011-09-22 02:55+0000\n"
+"PO-Revision-Date: 2011-09-30 23:12+0000\n"
"Last-Translator: Majed Majbour \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-23 04:38+0000\n"
-"X-Generator: Launchpad (build 14012)\n"
+"X-Launchpad-Export-Date: 2011-10-02 04:51+0000\n"
+"X-Generator: Launchpad (build 14071)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
msgid "System payment"
-msgstr "الدفع عن طريق النظام"
+msgstr "نظام الدفع"
#. module: account
#: view:account.journal:0
@@ -124,6 +124,8 @@ msgid ""
"If you unreconciliate transactions, you must also verify all the actions "
"that are linked to those transactions because they will not be disabled"
msgstr ""
+"إذا كنت توافق على المعاملات ، يجب عليك أيضا التحقق من كافة الإجراءات التي "
+"ترتبط بتلك المعاملات لأنه لن يكونوا غير مفعّلين"
#. module: account
#: report:account.tax.code.entries:0
diff --git a/addons/account/i18n/et.po b/addons/account/i18n/et.po
index 6c6a6385ec9..ff6ae9bfc3a 100644
--- a/addons/account/i18n/et.po
+++ b/addons/account/i18n/et.po
@@ -7,24 +7,24 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2010-12-12 00:12+0000\n"
-"Last-Translator: qdp (OpenERP) \n"
+"PO-Revision-Date: 2011-09-30 07:02+0000\n"
+"Last-Translator: Raiko Pajur \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-17 04:56+0000\n"
-"X-Generator: Launchpad (build 13955)\n"
+"X-Launchpad-Export-Date: 2011-10-01 05:08+0000\n"
+"X-Generator: Launchpad (build 14071)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
msgid "System payment"
-msgstr ""
+msgstr "Süsteemi maksed"
#. module: account
#: view:account.journal:0
msgid "Other Configuration"
-msgstr ""
+msgstr "Muud konfiguratsioonid"
#. module: account
#: code:addons/account/wizard/account_open_closed_fiscalyear.py:40
@@ -39,6 +39,8 @@ msgid ""
"You cannot remove/deactivate an account which is set as a property to any "
"Partner."
msgstr ""
+"Sa ei saa kustutada / desaktiveerida kontot, mis on määratud mis tahes "
+"\"Partner\" varaks."
#. module: account
#: view:account.move.reconcile:0
@@ -48,7 +50,7 @@ msgstr ""
#. module: account
#: field:account.installer.modules,account_voucher:0
msgid "Voucher Management"
-msgstr ""
+msgstr "Voucheri juhtimine"
#. module: account
#: view:account.account:0
@@ -133,13 +135,13 @@ msgstr "Raamatupidamise kirjed-"
#: code:addons/account/account.py:1291
#, python-format
msgid "You can not delete posted movement: \"%s\"!"
-msgstr ""
+msgstr "Sa ei saa kustutada postitatud liikumist: \"%s\"!"
#. module: account
#: report:account.invoice:0
#: field:account.invoice.line,origin:0
msgid "Origin"
-msgstr "Päritolu"
+msgstr "Allikas"
#. module: account
#: view:account.account:0
@@ -164,7 +166,7 @@ msgstr "Viide"
#. module: account
#: view:account.open.closed.fiscalyear:0
msgid "Choose Fiscal Year "
-msgstr ""
+msgstr "Vali eelarveaasta "
#. module: account
#: help:account.payment.term,active:0
@@ -172,12 +174,14 @@ msgid ""
"If the active field is set to False, it will allow you to hide the payment "
"term without removing it."
msgstr ""
+"Kui aktiivne ala on väärne ( False ), siis see võimaldab teil peita/varjata "
+"maksetähtaeg seda kustutamata."
#. module: account
#: code:addons/account/invoice.py:1421
#, python-format
msgid "Warning!"
-msgstr ""
+msgstr "Hoiatus!"
#. module: account
#: field:account.fiscal.position.account,account_src_id:0
@@ -204,7 +208,7 @@ msgstr "Negatiivne"
#: code:addons/account/wizard/account_move_journal.py:95
#, python-format
msgid "Journal: %s"
-msgstr ""
+msgstr "Päevik: %s"
#. module: account
#: help:account.analytic.journal,type:0
@@ -231,7 +235,7 @@ msgstr "konto.maks"
msgid ""
"No period defined for this date: %s !\n"
"Please create a fiscal year."
-msgstr ""
+msgstr "Periood ei ole defineeritud sellele kuupäevale: %s"
#. module: account
#: model:ir.model,name:account.model_account_move_line_reconcile_select
@@ -259,7 +263,7 @@ msgstr ""
#: code:addons/account/invoice.py:1210
#, python-format
msgid "Invoice '%s' is paid partially: %s%s of %s%s (%s%s remaining)"
-msgstr ""
+msgstr "Arve '%s' on makstud osaliselt: %s%s on tasutud %s%s (%s%s maksmata)"
#. module: account
#: model:process.transition,note:account.process_transition_supplierentriesreconcile0
@@ -280,7 +284,7 @@ msgstr "Teie ei saa lisada/muuta suletud päeviku kirjeid."
#. module: account
#: view:account.bank.statement:0
msgid "Calculated Balance"
-msgstr ""
+msgstr "Välja arvutatud tasakaal (Calculated Balance)"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_use_model_create_entry
@@ -352,7 +356,7 @@ msgstr "Ostu omadused"
#: view:account.installer:0
#: view:account.installer.modules:0
msgid "Configure"
-msgstr ""
+msgstr "Seadista"
#. module: account
#: selection:account.entries.report,month:0
@@ -361,7 +365,7 @@ msgstr ""
#: selection:report.account.sales,month:0
#: selection:report.account_type.sales,month:0
msgid "June"
-msgstr ""
+msgstr "Juuni"
#. module: account
#: model:ir.actions.act_window,help:account.action_account_moves_bank
@@ -395,12 +399,12 @@ msgstr ""
#. module: account
#: selection:account.journal,type:0
msgid "Opening/Closing Situation"
-msgstr ""
+msgstr "Avamise/Sulgemise situatsioon"
#. module: account
#: help:account.journal,currency:0
msgid "The currency used to enter statement"
-msgstr ""
+msgstr "Valuuta väite sisestamiseks"
#. module: account
#: field:account.open.closed.fiscalyear,fyear_id:0
@@ -498,17 +502,17 @@ msgstr "Päevik"
#. module: account
#: model:ir.model,name:account.model_account_invoice_confirm
msgid "Confirm the selected invoices"
-msgstr ""
+msgstr "Kinnita valitud arved"
#. module: account
#: field:account.addtmpl.wizard,cparent_id:0
msgid "Parent target"
-msgstr ""
+msgstr "Lapsevanema sihtmärk"
#. module: account
#: field:account.bank.statement,account_id:0
msgid "Account used in this journal"
-msgstr ""
+msgstr "Konto kasutatud selles arveraamatus"
#. module: account
#: help:account.aged.trial.balance,chart_account_id:0
@@ -527,7 +531,7 @@ msgstr ""
#: help:account.report.general.ledger,chart_account_id:0
#: help:account.vat.declaration,chart_account_id:0
msgid "Select Charts of Accounts"
-msgstr ""
+msgstr "Vali Kontode graafikud"
#. module: account
#: view:product.product:0
@@ -537,7 +541,7 @@ msgstr "Ostumaksud"
#. module: account
#: model:ir.model,name:account.model_account_invoice_refund
msgid "Invoice Refund"
-msgstr ""
+msgstr "Arveraamatu tagasimakse"
#. module: account
#: report:account.overdue:0
@@ -560,7 +564,7 @@ msgstr ""
#: field:account.fiscal.position,tax_ids:0
#: field:account.fiscal.position.template,tax_ids:0
msgid "Tax Mapping"
-msgstr ""
+msgstr "Maksude kaardistamine"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_fiscalyear_close_state
@@ -571,7 +575,7 @@ msgstr "Sule majandusaasta"
#. module: account
#: model:process.transition,note:account.process_transition_confirmstatementfromdraft0
msgid "The accountant confirms the statement."
-msgstr ""
+msgstr "Raamatupidaja kinnitab selle avalduse"
#. module: account
#: selection:account.balance.report,display_account:0
@@ -587,12 +591,12 @@ msgstr "Kõik"
#. module: account
#: field:account.invoice.report,address_invoice_id:0
msgid "Invoice Address Name"
-msgstr ""
+msgstr "Arveraamatu Aadressi Nimi"
#. module: account
#: selection:account.installer,period:0
msgid "3 Monthly"
-msgstr ""
+msgstr "Iga 3 kuu tagant"
#. module: account
#: view:account.unreconcile.reconcile:0
@@ -604,7 +608,7 @@ msgstr ""
#. module: account
#: view:analytic.entries.report:0
msgid " 30 Days "
-msgstr ""
+msgstr " 30 päeva "
#. module: account
#: field:ir.sequence,fiscal_ids:0
@@ -624,7 +628,7 @@ msgstr ""
#. module: account
#: sql_constraint:account.sequence.fiscalyear:0
msgid "Main Sequence must be different from current !"
-msgstr ""
+msgstr "Pea"
#. module: account
#: field:account.invoice.tax,tax_amount:0
@@ -652,12 +656,12 @@ msgstr "Sulge periood"
#. module: account
#: model:ir.model,name:account.model_account_common_partner_report
msgid "Account Common Partner Report"
-msgstr ""
+msgstr "Konto tava \"Partner\" aruanne"
#. module: account
#: field:account.fiscalyear.close,period_id:0
msgid "Opening Entries Period"
-msgstr ""
+msgstr "Avatud sissekanete periood"
#. module: account
#: model:ir.model,name:account.model_account_journal_period
@@ -791,7 +795,7 @@ msgstr "J.C./liiguta nime"
#: selection:report.account.sales,month:0
#: selection:report.account_type.sales,month:0
msgid "September"
-msgstr ""
+msgstr "September"
#. module: account
#: selection:account.subscription,period_type:0
@@ -802,7 +806,7 @@ msgstr "päevad"
#: help:account.account.template,nocreate:0
msgid ""
"If checked, the new chart of accounts will not contain this by default."
-msgstr ""
+msgstr "Kui märgitud, siis uus kontode graafik ei sisalda seda puudujääki."
#. module: account
#: code:addons/account/wizard/account_invoice_refund.py:102
@@ -825,7 +829,7 @@ msgstr "Arvutus"
#. module: account
#: view:account.move.line:0
msgid "Next Partner to reconcile"
-msgstr ""
+msgstr "Kooskõlastama järgmise \"Partner\"-iga"
#. module: account
#: code:addons/account/account_move_line.py:1191
@@ -834,12 +838,14 @@ msgid ""
"You can not do this modification on a confirmed entry ! Please note that you "
"can just change some non important fields !"
msgstr ""
+"Teie ei saa teha see muudatus kinnitatud kirjel ! Teie saate muuta ainult "
+"mõned vähetähtsad väljad !"
#. module: account
#: view:account.invoice.report:0
#: field:account.invoice.report,delay_to_pay:0
msgid "Avg. Delay To Pay"
-msgstr ""
+msgstr "Keskmine viivitus maksete tegemisel"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_tax_chart
@@ -862,7 +868,7 @@ msgstr "Tähtaeg"
#: view:account.invoice.report:0
#: field:account.invoice.report,price_total_tax:0
msgid "Total With Tax"
-msgstr ""
+msgstr "Kokku koos maksudega"
#. module: account
#: view:account.invoice:0
@@ -870,7 +876,7 @@ msgstr ""
#: view:validate.account.move:0
#: view:validate.account.move.lines:0
msgid "Approve"
-msgstr ""
+msgstr "Nõustu"
#. module: account
#: view:account.invoice:0
@@ -925,7 +931,7 @@ msgstr ""
#. module: account
#: view:account.analytic.line:0
msgid "Purchases"
-msgstr ""
+msgstr "Ostud"
#. module: account
#: field:account.model,lines_id:0
@@ -972,7 +978,7 @@ msgstr "Partneri bilanss"
#. module: account
#: field:account.bank.accounts.wizard,acc_name:0
msgid "Account Name."
-msgstr ""
+msgstr "Konto nimi."
#. module: account
#: field:account.chart.template,property_reserve_and_surplus_account:0
@@ -983,7 +989,7 @@ msgstr ""
#. module: account
#: field:report.account.receivable,name:0
msgid "Week of Year"
-msgstr ""
+msgstr "Nädal"
#. module: account
#: field:account.bs.report,display_type:0
@@ -995,12 +1001,12 @@ msgstr "Rõhtpaigutus"
#. module: account
#: view:board.board:0
msgid "Customer Invoices to Approve"
-msgstr ""
+msgstr "Kliendi arved kinnitamiseks"
#. module: account
#: help:account.fiscalyear.close,fy_id:0
msgid "Select a Fiscal year to close"
-msgstr ""
+msgstr "Vali eelarve aasta mida sulgeda"
#. module: account
#: help:account.account,user_type:0
@@ -1018,13 +1024,13 @@ msgstr ""
#. module: account
#: report:account.partner.balance:0
msgid "In dispute"
-msgstr ""
+msgstr "Vaidlustatav"
#. module: account
#: model:ir.actions.act_window,name:account.action_view_bank_statement_tree
#: model:ir.ui.menu,name:account.journal_cash_move_lines
msgid "Cash Registers"
-msgstr ""
+msgstr "Raha register"
#. module: account
#: selection:account.account.type,report_type:0
@@ -1042,7 +1048,7 @@ msgstr "-"
#. module: account
#: view:account.analytic.account:0
msgid "Manager"
-msgstr ""
+msgstr "Juhataja"
#. module: account
#: view:account.subscription.generate:0
@@ -1052,7 +1058,7 @@ msgstr ""
#. module: account
#: selection:account.bank.accounts.wizard,account_type:0
msgid "Bank"
-msgstr ""
+msgstr "Pank"
#. module: account
#: field:account.period,date_start:0
@@ -1062,13 +1068,13 @@ msgstr "Perioodi algus"
#. module: account
#: model:process.transition,name:account.process_transition_confirmstatementfromdraft0
msgid "Confirm statement"
-msgstr ""
+msgstr "Kinnita avaldus"
#. module: account
#: field:account.fiscal.position.tax,tax_dest_id:0
#: field:account.fiscal.position.tax.template,tax_dest_id:0
msgid "Replacement Tax"
-msgstr ""
+msgstr "Vahetus maks"
#. module: account
#: selection:account.move.line,centralisation:0
@@ -1087,12 +1093,12 @@ msgstr ""
#. module: account
#: view:account.invoice.cancel:0
msgid "Cancel Invoices"
-msgstr ""
+msgstr "Peata arved"
#. module: account
#: view:account.unreconcile.reconcile:0
msgid "Unreconciliation transactions"
-msgstr ""
+msgstr "Mittesobivad tehingud"
#. module: account
#: field:account.invoice.tax,tax_code_id:0
@@ -1110,7 +1116,7 @@ msgstr ""
#. module: account
#: help:account.move.line,move_id:0
msgid "The move of this entry line."
-msgstr ""
+msgstr "Selle rea liigutus."
#. module: account
#: field:account.move.line.reconcile,trans_nbr:0
@@ -1174,7 +1180,7 @@ msgstr "Konto"
#. module: account
#: field:account.tax,include_base_amount:0
msgid "Included in base amount"
-msgstr ""
+msgstr "Lisa baas osa"
#. module: account
#: view:account.entries.report:0
@@ -1186,7 +1192,7 @@ msgstr ""
#. module: account
#: field:account.account,level:0
msgid "Level"
-msgstr ""
+msgstr "Tase"
#. module: account
#: report:account.invoice:0
@@ -1207,7 +1213,7 @@ msgstr "Maksud"
#: code:addons/account/wizard/account_report_common.py:120
#, python-format
msgid "Select a starting and an ending period"
-msgstr ""
+msgstr "Vali algus ja lõpp periood"
#. module: account
#: model:ir.model,name:account.model_account_account_template
@@ -1217,12 +1223,12 @@ msgstr "Mallid kontodele"
#. module: account
#: view:account.tax.code.template:0
msgid "Search tax template"
-msgstr ""
+msgstr "Otsi maksu templati"
#. module: account
#: report:account.invoice:0
msgid "Your Reference"
-msgstr ""
+msgstr "Teie viide"
#. module: account
#: view:account.move.reconcile:0
@@ -1246,7 +1252,7 @@ msgstr ""
#. module: account
#: view:account.invoice:0
msgid "Reset to Draft"
-msgstr ""
+msgstr "Lähtesta mustandiks"
#. module: account
#: view:wizard.multi.charts.accounts:0
@@ -1268,7 +1274,7 @@ msgstr ""
#: model:ir.actions.act_window,name:account.action_partner_all
#: model:ir.ui.menu,name:account.next_id_22
msgid "Partners"
-msgstr ""
+msgstr "Partnerid"
#. module: account
#: view:account.bank.statement:0
@@ -1323,7 +1329,7 @@ msgstr "Bilanss pole 0"
#. module: account
#: view:account.tax:0
msgid "Search Taxes"
-msgstr ""
+msgstr "Otsi maksu"
#. module: account
#: model:ir.model,name:account.model_account_analytic_cost_ledger
@@ -1338,7 +1344,7 @@ msgstr "Loo sissekanded"
#. module: account
#: field:account.entries.report,nbr:0
msgid "# of Items"
-msgstr ""
+msgstr "# detaile"
#. module: account
#: field:account.automatic.reconcile,max_amount:0
@@ -1353,7 +1359,7 @@ msgstr "Arvuta maksud"
#. module: account
#: field:wizard.multi.charts.accounts,code_digits:0
msgid "# of Digits"
-msgstr ""
+msgstr "# numbrit"
#. module: account
#: field:account.journal,entry_posted:0
@@ -1364,7 +1370,7 @@ msgstr ""
#: view:account.invoice.report:0
#: field:account.invoice.report,price_total:0
msgid "Total Without Tax"
-msgstr ""
+msgstr "Kokku ilma maksudeta"
#. module: account
#: model:ir.actions.act_window,help:account.action_move_journal_line
@@ -1378,7 +1384,7 @@ msgstr ""
#. module: account
#: view:account.entries.report:0
msgid "# of Entries "
-msgstr ""
+msgstr "# sisestusi "
#. module: account
#: model:ir.model,name:account.model_temp_range
@@ -1435,7 +1441,7 @@ msgstr "Mall finantspositsioonile"
#. module: account
#: model:account.tax.code,name:account.account_tax_code_0
msgid "Tax Code Test"
-msgstr ""
+msgstr "Maksu koodi test"
#. module: account
#: field:account.automatic.reconcile,reconciled:0
@@ -1445,22 +1451,22 @@ msgstr ""
#. module: account
#: field:account.journal.view,columns_id:0
msgid "Columns"
-msgstr ""
+msgstr "Veerud"
#. module: account
#: report:account.overdue:0
msgid "."
-msgstr ""
+msgstr "."
#. module: account
#: view:account.analytic.cost.ledger.journal.report:0
msgid "and Journals"
-msgstr ""
+msgstr "ja arveraamatud"
#. module: account
#: field:account.journal,groups_id:0
msgid "Groups"
-msgstr ""
+msgstr "Grupid"
#. module: account
#: field:account.invoice,amount_untaxed:0
@@ -1471,18 +1477,20 @@ msgstr "Maksuvaba"
#. module: account
#: view:account.partner.reconcile.process:0
msgid "Go to next partner"
-msgstr ""
+msgstr "Mine järgmise \"Partner\"-ile"
#. module: account
#: view:account.bank.statement:0
msgid "Search Bank Statements"
-msgstr ""
+msgstr "Otsi panga avaldust"
#. module: account
#: sql_constraint:account.model.line:0
msgid ""
"Wrong credit or debit value in model (Credit + Debit Must Be greater \"0\")!"
msgstr ""
+"Vale krediidi või deebeti arv mudelis ( Krediit + Deebet Peab olema suurem "
+"kui \"0\" ) !"
#. module: account
#: view:account.chart.template:0
@@ -1516,14 +1524,14 @@ msgstr ""
#. module: account
#: report:account.analytic.account.cost_ledger:0
msgid "Date/Code"
-msgstr ""
+msgstr "Kuupäev/Kood"
#. module: account
#: field:account.analytic.line,general_account_id:0
#: view:analytic.entries.report:0
#: field:analytic.entries.report,general_account_id:0
msgid "General Account"
-msgstr ""
+msgstr "Üldine konto"
#. module: account
#: field:res.partner,debit_limit:0
@@ -1554,13 +1562,13 @@ msgstr ""
#. module: account
#: field:wizard.multi.charts.accounts,seq_journal:0
msgid "Separated Journal Sequences"
-msgstr ""
+msgstr "Eraldatud päeviku järjekorrad"
#. module: account
#: field:account.bank.statement,user_id:0
#: view:account.invoice:0
msgid "Responsible"
-msgstr ""
+msgstr "Vastutav"
#. module: account
#: report:account.overdue:0
@@ -1570,7 +1578,7 @@ msgstr "Vahesumma:"
#. module: account
#: model:ir.actions.act_window,name:account.action_report_account_type_sales_tree_all
msgid "Sales by Account Type"
-msgstr ""
+msgstr "Müügid konto järgi"
#. module: account
#: view:account.invoice.refund:0
@@ -1582,7 +1590,7 @@ msgstr ""
#. module: account
#: model:ir.ui.menu,name:account.periodical_processing_invoicing
msgid "Invoicing"
-msgstr ""
+msgstr "Arveldamine"
#. module: account
#: field:account.chart.template,tax_code_root_id:0
@@ -1598,17 +1606,17 @@ msgstr "Kaasa algsed"
#. module: account
#: field:account.tax.code,sum:0
msgid "Year Sum"
-msgstr ""
+msgstr "Aasta kokkuvõtte"
#. module: account
#: model:ir.actions.report.xml,name:account.report_account_voucher_new
msgid "Print Voucher"
-msgstr ""
+msgstr "Prindi voucher"
#. module: account
#: view:account.change.currency:0
msgid "This wizard will change the currency of the invoice"
-msgstr ""
+msgstr "See wizard muudab valuuta arvelduses"
#. module: account
#: model:ir.actions.act_window,help:account.action_account_chart
@@ -1632,7 +1640,7 @@ msgstr ""
#. module: account
#: field:account.cashbox.line,pieces:0
msgid "Values"
-msgstr ""
+msgstr "Väärtused"
#. module: account
#: help:account.journal.period,active:0
@@ -1675,7 +1683,7 @@ msgstr ""
#. module: account
#: report:account.move.voucher:0
msgid "Ref. :"
-msgstr ""
+msgstr "Viide:"
#. module: account
#: view:account.analytic.chart:0
@@ -1685,7 +1693,7 @@ msgstr "Analüütilised kontoplaanid"
#. module: account
#: view:account.analytic.line:0
msgid "My Entries"
-msgstr ""
+msgstr "Minu sisestused"
#. module: account
#: report:account.overdue:0
@@ -1696,7 +1704,7 @@ msgstr "Kliendi viide:"
#: code:addons/account/account_cash_statement.py:328
#, python-format
msgid "User %s does not have rights to access %s journal !"
-msgstr ""
+msgstr "Kasutajal %s ei ole õigusi et siseneda %s arveraamatusse !"
#. module: account
#: help:account.period,special:0
@@ -1717,12 +1725,12 @@ msgstr ""
#: code:addons/account/account.py:499
#, python-format
msgid "You cannot deactivate an account that contains account moves."
-msgstr ""
+msgstr "Sa ei saa deaktiveerida kontot mis sisaldab konto liikumisi."
#. module: account
#: field:account.move.line.reconcile,credit:0
msgid "Credit amount"
-msgstr ""
+msgstr "Kreedidi kogus"
#. module: account
#: constraint:account.move.line:0
@@ -1745,7 +1753,7 @@ msgstr ""
#. module: account
#: sql_constraint:account.move.line:0
msgid "Wrong credit or debit value in accounting entry !"
-msgstr ""
+msgstr "Vale kreedit või deebeti raamatupidamise sisend !"
#. module: account
#: view:account.invoice.report:0
@@ -1757,7 +1765,7 @@ msgstr ""
#. module: account
#: model:ir.model,name:account.model_account_period_close
msgid "period close"
-msgstr ""
+msgstr "Periood suletud"
#. module: account
#: view:account.installer:0
@@ -1767,18 +1775,18 @@ msgstr ""
#. module: account
#: model:ir.actions.act_window,name:account.action_project_account_analytic_line_form
msgid "Entries By Line"
-msgstr ""
+msgstr "SIsestused ridade kaupa"
#. module: account
#: report:account.tax.code.entries:0
msgid "A/c Code"
-msgstr ""
+msgstr "A/c kood"
#. module: account
#: field:account.invoice,move_id:0
#: field:account.invoice,move_name:0
msgid "Journal Entry"
-msgstr ""
+msgstr "Päevaraamatu kanne"
#. module: account
#: view:account.tax:0
@@ -1788,7 +1796,7 @@ msgstr ""
#. module: account
#: field:account.cashbox.line,subtotal:0
msgid "Sub Total"
-msgstr ""
+msgstr "Vahesumma"
#. module: account
#: view:account.account:0
@@ -1798,7 +1806,7 @@ msgstr ""
#. module: account
#: constraint:res.company:0
msgid "Error! You can not create recursive companies."
-msgstr ""
+msgstr "Viga! Sa ei saa luua rekursiivseid ettevõtteid."
#. module: account
#: view:account.analytic.account:0
@@ -1821,12 +1829,12 @@ msgstr "Kehtiv"
#: model:ir.actions.act_window,name:account.action_account_print_journal
#: model:ir.model,name:account.model_account_print_journal
msgid "Account Print Journal"
-msgstr ""
+msgstr "Prindi konto arveraamat"
#. module: account
#: model:ir.model,name:account.model_product_category
msgid "Product Category"
-msgstr ""
+msgstr "Toote kategooria"
#. module: account
#: selection:account.account.type,report_type:0
@@ -1836,7 +1844,7 @@ msgstr "/"
#. module: account
#: field:account.bs.report,reserve_account_id:0
msgid "Reserve & Profit/Loss Account"
-msgstr ""
+msgstr "Reservi & kasumi/kahjumi konto"
#. module: account
#: help:account.bank.statement,balance_end:0
@@ -1887,12 +1895,12 @@ msgstr ""
#: field:account.installer.modules,config_logo:0
#: field:wizard.multi.charts.accounts,config_logo:0
msgid "Image"
-msgstr ""
+msgstr "Pilt"
#. module: account
#: report:account.move.voucher:0
msgid "Canceled"
-msgstr ""
+msgstr "Tühistatud"
#. module: account
#: view:account.invoice:0
diff --git a/addons/account/sequence.py b/addons/account/ir_sequence.py
similarity index 70%
rename from addons/account/sequence.py
rename to addons/account/ir_sequence.py
index 1683e5feb06..5c9039e43c3 100644
--- a/addons/account/sequence.py
+++ b/addons/account/ir_sequence.py
@@ -46,23 +46,14 @@ class ir_sequence(osv.osv):
'fiscal_ids': fields.one2many('account.sequence.fiscalyear',
'sequence_main_id', 'Sequences')
}
- def get_id(self, cr, uid, sequence_id, test='id', context=None):
- if context is None:
- context = {}
- cr.execute('select id from ir_sequence where '
- + test + '=%s and active=%s', (sequence_id, True,))
- res = cr.dictfetchone()
- if res:
- for line in self.browse(cr, uid, res['id'],
- context=context).fiscal_ids:
- if line.fiscalyear_id.id == context.get('fiscalyear_id', False):
- return super(ir_sequence, self).get_id(cr, uid,
- line.sequence_id.id,
- test="id",
- context=context)
- return super(ir_sequence, self).get_id(cr, uid, sequence_id, test,
- context=context)
+
+ def _next(self, cr, uid, seq_ids, context=None):
+ for seq in self.browse(cr, uid, seq_ids, context):
+ for line in seq.fiscal_ids:
+ if line.fiscalyear_id.id == context.get('fiscalyear_id'):
+ return super(ir_sequence, self)._next(cr, uid, [line.sequence_id.id], context)
+ return super(ir_sequence, self)._next(cr, uid, seq_ids, context)
ir_sequence()
-# 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/sequence_view.xml b/addons/account/ir_sequence_view.xml
similarity index 100%
rename from addons/account/sequence_view.xml
rename to addons/account/ir_sequence_view.xml
diff --git a/addons/account/test/account_fiscalyear_close.yml b/addons/account/test/account_fiscalyear_close.yml
index 109b098d6a7..1e24d2ca0e7 100644
--- a/addons/account/test/account_fiscalyear_close.yml
+++ b/addons/account/test/account_fiscalyear_close.yml
@@ -26,7 +26,6 @@
code: NEW
type: situation
analytic_journal_id: sit
- sequence_id: sequence_journal
default_debit_account_id: cash
default_credit_account_id: cash
company_id: base.main_company
diff --git a/addons/account_analytic_plans/account_analytic_plans_installer_view.xml b/addons/account_analytic_plans/account_analytic_plans_installer_view.xml
index c9d21147458..c6879774078 100644
--- a/addons/account_analytic_plans/account_analytic_plans_installer_view.xml
+++ b/addons/account_analytic_plans/account_analytic_plans_installer_view.xml
@@ -7,14 +7,15 @@
account.analytic.planformtree,form
-
+
+ To setup a multiple analytic plans environment, you must define the root analytic accounts for each plan set. Then, you must attach a plan set to your account journals.
+
+
+
+
+
+ 15
-
-
-
-
- 15
-
diff --git a/addons/account_asset/i18n/pt_BR.po b/addons/account_asset/i18n/pt_BR.po
new file mode 100644
index 00000000000..fbfd6d7feb4
--- /dev/null
+++ b/addons/account_asset/i18n/pt_BR.po
@@ -0,0 +1,529 @@
+# Brazilian Portuguese translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2009-11-24 12:54+0000\n"
+"PO-Revision-Date: 2011-09-30 14:07+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Brazilian Portuguese \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-10-01 05:08+0000\n"
+"X-Generator: Launchpad (build 14071)\n"
+
+#. module: account_asset
+#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_normal
+#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_normal
+msgid "Open Assets"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,method_end:0
+#: field:account.asset.property.history,method_end:0
+msgid "Ending date"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Depreciation board"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+#: field:account.asset.asset,name:0
+#: field:account.asset.board,asset_id:0
+#: field:account.asset.property,asset_id:0
+#: field:account.invoice.line,asset_id:0
+#: field:account.move.line,asset_id:0
+#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_form
+#: model:ir.model,name:account_asset.model_account_asset_asset
+#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_form
+msgid "Asset"
+msgstr ""
+
+#. module: account_asset
+#: constraint:ir.actions.act_window:0
+msgid "Invalid model name in the action definition."
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.property,method:0
+msgid "Linear"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Change duration"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,child_ids:0
+msgid "Child assets"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.board,value_asset:0
+msgid "Asset Value"
+msgstr ""
+
+#. module: account_asset
+#: wizard_field:account.asset.modify,init,name:0
+msgid "Reason"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+#: field:account.asset.asset,entry_ids:0
+#: wizard_field:account.asset.compute,asset_compute,move_ids:0
+msgid "Entries"
+msgstr ""
+
+#. module: account_asset
+#: wizard_view:account.asset.compute,asset_compute:0
+msgid "Generated entries"
+msgstr ""
+
+#. module: account_asset
+#: wizard_field:account.asset.modify,init,method_delay:0
+#: field:account.asset.property,method_delay:0
+#: field:account.asset.property.history,method_delay:0
+msgid "Number of interval"
+msgstr ""
+
+#. module: account_asset
+#: wizard_button:account.asset.compute,asset_compute,asset_open:0
+msgid "Open entries"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list
+#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list
+#: model:ir.ui.menu,name:account_asset.menu_finance_Assets
+#: model:ir.ui.menu,name:account_asset.menu_finance_config_Assets
+msgid "Assets"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.property,method:0
+msgid "Progressive"
+msgstr ""
+
+#. module: account_asset
+#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_draft
+#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_draft
+msgid "Draft Assets"
+msgstr ""
+
+#. module: account_asset
+#: wizard_view:account.asset.modify,init:0
+#: wizard_field:account.asset.modify,init,note:0
+#: view:account.asset.property.history:0
+msgid "Notes"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Change history"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Depreciation entries"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Methods"
+msgstr ""
+
+#. module: account_asset
+#: wizard_view:account.asset.modify,init:0
+msgid "Asset properties to modify"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: account_asset
+#: wizard_field:account.asset.modify,init,method_period:0
+#: field:account.asset.property,method_period:0
+#: field:account.asset.property.history,method_period:0
+msgid "Period per interval"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Depreciation duration"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,account_analytic_id:0
+msgid "Analytic account"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,state:0
+msgid "State"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Depreciation methods"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Other information"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.board,value_asset_cumul:0
+msgid "Cumul. value"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.property:0
+msgid "Assets methods"
+msgstr ""
+
+#. module: account_asset
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: account_asset
+#: model:ir.model,name:account_asset.model_account_asset_property
+msgid "Asset property"
+msgstr ""
+
+#. module: account_asset
+#: wizard_view:account.asset.compute,asset_compute:0
+#: wizard_view:account.asset.compute,init:0
+#: wizard_button:account.asset.compute,init,asset_compute:0
+#: model:ir.actions.wizard,name:account_asset.wizard_asset_compute
+#: model:ir.ui.menu,name:account_asset.menu_wizard_asset_compute
+msgid "Compute assets"
+msgstr ""
+
+#. module: account_asset
+#: wizard_view:account.asset.modify,init:0
+#: wizard_button:account.asset.modify,init,asset_modify:0
+#: model:ir.actions.wizard,name:account_asset.wizard_asset_modify
+msgid "Modify asset"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Confirm asset"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.property.history:0
+#: model:ir.model,name:account_asset.model_account_asset_property_history
+msgid "Asset history"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,date:0
+msgid "Date created"
+msgstr ""
+
+#. module: account_asset
+#: model:ir.module.module,description:account_asset.module_meta_information
+msgid ""
+"Financial and accounting asset management.\n"
+" Allows to define\n"
+" * Asset category. \n"
+" * Assets.\n"
+" *Asset usage period and property.\n"
+" "
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.board,value_gross:0
+#: field:account.asset.property,value_total:0
+msgid "Gross value"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.property,method_time:0
+msgid "Ending period"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.board,name:0
+msgid "Asset name"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Accounts information"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,note:0
+#: field:account.asset.category,note:0
+#: field:account.asset.property.history,note:0
+msgid "Note"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.asset,state:0
+#: selection:account.asset.property,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,type:0
+msgid "Depr. method type"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,account_asset_id:0
+msgid "Asset account"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property.history,asset_property_id:0
+msgid "Method"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.asset,state:0
+msgid "Normal"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,method_progress_factor:0
+msgid "Progressif factor"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,localisation:0
+msgid "Localisation"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,method:0
+msgid "Computation method"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,method_time:0
+msgid "Time method"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,active:0
+msgid "Active"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property.history,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,property_ids:0
+msgid "Asset method name"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,date:0
+#: field:account.asset.property.history,date:0
+msgid "Date"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.board,value_net:0
+msgid "Net value"
+msgstr ""
+
+#. module: account_asset
+#: wizard_view:account.asset.close,init:0
+#: model:ir.actions.wizard,name:account_asset.wizard_asset_close
+msgid "Close asset"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,history_ids:0
+msgid "History"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,account_actif_id:0
+msgid "Depreciation account"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,period_id:0
+#: wizard_field:account.asset.compute,init,period_id:0
+msgid "Period"
+msgstr ""
+
+#. module: account_asset
+#: model:ir.actions.act_window,name:account_asset.action_account_asset_category_form
+#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_category_form
+msgid "Asset Category"
+msgstr ""
+
+#. module: account_asset
+#: wizard_button:account.asset.close,init,end:0
+#: wizard_button:account.asset.compute,init,end:0
+#: wizard_button:account.asset.modify,init,end:0
+msgid "Cancel"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.asset,state:0
+#: wizard_button:account.asset.compute,asset_compute,end:0
+#: selection:account.asset.property,state:0
+msgid "Close"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.property,state:0
+msgid "Open"
+msgstr ""
+
+#. module: account_asset
+#: constraint:ir.model:0
+msgid ""
+"The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: account_asset
+#: model:ir.module.module,shortdesc:account_asset.module_meta_information
+msgid "Asset management"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.board:0
+#: field:account.asset.property,board_ids:0
+#: model:ir.model,name:account_asset.model_account_asset_board
+msgid "Asset board"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,state:0
+msgid "Global state"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.property,method_time:0
+msgid "Delay"
+msgstr ""
+
+#. module: account_asset
+#: wizard_view:account.asset.close,init:0
+msgid "General information"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,journal_analytic_id:0
+msgid "Analytic journal"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,name:0
+msgid "Method name"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,journal_id:0
+msgid "Journal"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property.history,name:0
+msgid "History name"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Close method"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,entry_asset_ids:0
+msgid "Asset Entries"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,category_id:0
+#: view:account.asset.category:0
+#: field:account.asset.category,name:0
+#: model:ir.model,name:account_asset.model_account_asset_category
+msgid "Asset category"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "Depreciation"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,code:0
+#: field:account.asset.category,code:0
+msgid "Asset code"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,value_total:0
+msgid "Total value"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.asset,state:0
+msgid "View"
+msgstr ""
+
+#. module: account_asset
+#: view:account.asset.asset:0
+msgid "General info"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.property,value_residual:0
+msgid "Residual value"
+msgstr ""
+
+#. module: account_asset
+#: wizard_button:account.asset.close,init,asset_close:0
+msgid "End of asset"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.property,type:0
+msgid "Direct"
+msgstr ""
+
+#. module: account_asset
+#: selection:account.asset.property,type:0
+msgid "Indirect"
+msgstr ""
+
+#. module: account_asset
+#: field:account.asset.asset,parent_id:0
+msgid "Parent asset"
+msgstr ""
+
+#. module: account_asset
+#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_tree
+#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_tree
+msgid "Asset Hierarchy"
+msgstr ""
diff --git a/addons/account_followup/__openerp__.py b/addons/account_followup/__openerp__.py
index e69434b2a3c..90c89dc89b2 100644
--- a/addons/account_followup/__openerp__.py
+++ b/addons/account_followup/__openerp__.py
@@ -52,10 +52,11 @@ Note that if you want to check the followup level for a given partner/account en
'security/ir.model.access.csv',
'wizard/account_followup_print_view.xml',
'report/account_followup_report.xml',
+ 'account_followup_demo.xml', # Defined by default
'account_followup_view.xml',
- 'account_followup_data.xml'
+ 'account_followup_data.xml',
],
- 'demo_xml': ['account_followup_demo.xml'],
+ 'demo_xml': [],
'test': ['test/account_followup.yml'],
'installable': True,
'active': False,
diff --git a/addons/account_followup/account_followup_demo.xml b/addons/account_followup/account_followup_demo.xml
index 01b275de306..3799033b24a 100644
--- a/addons/account_followup/account_followup_demo.xml
+++ b/addons/account_followup/account_followup_demo.xml
@@ -3,7 +3,7 @@
- Default follow-up
+ Default Follow-UpFirst letter after 15 net days, 30 net days and 45 days end of month levels.
diff --git a/addons/account_followup/account_followup_view.xml b/addons/account_followup/account_followup_view.xml
index f99a8b2c060..e6aee02ffdc 100644
--- a/addons/account_followup/account_followup_view.xml
+++ b/addons/account_followup/account_followup_view.xml
@@ -6,7 +6,7 @@
account_followup.followup.linetree
-
+
@@ -19,7 +19,7 @@
account_followup.followup.lineform
-
@@ -73,10 +73,6 @@
-
-
-
-
@@ -169,6 +165,7 @@
account_followup.followupformform,tree
+
diff --git a/addons/account_sequence/account_sequence.py b/addons/account_sequence/account_sequence.py
index 1649a8890fa..8b87b3f40ae 100644
--- a/addons/account_sequence/account_sequence.py
+++ b/addons/account_sequence/account_sequence.py
@@ -35,7 +35,7 @@ class account_move(osv.osv):
seq_no = False
for move in self.browse(cr, uid, ids, context=context):
if move.journal_id.internal_sequence_id:
- seq_no = obj_sequence.get_id(cr, uid, move.journal_id.internal_sequence_id.id, context=context)
+ seq_no = obj_sequence.next_by_id(cr, uid, move.journal_id.internal_sequence_id.id, context=context)
if seq_no:
self.write(cr, uid, [move.id], {'internal_sequence_number': seq_no})
return res
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index da9dbe87893..005e5d9ab46 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -674,7 +674,7 @@ class account_voucher(osv.osv):
if inv.number:
name = inv.number
elif inv.journal_id.sequence_id:
- name = seq_obj.get_id(cr, uid, inv.journal_id.sequence_id.id)
+ name = seq_obj.next_by_id(cr, uid, inv.journal_id.sequence_id.id)
else:
raise osv.except_osv(_('Error !'), _('Please define a sequence on the journal !'))
if not inv.reference:
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 6a9e69ab27e..9c8bdffb35d 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -280,6 +280,7 @@
+ ).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import res_users
+import controllers
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/auth_openid/__openerp__.py b/addons/auth_openid/__openerp__.py
new file mode 100644
index 00000000000..733008ac6e5
--- /dev/null
+++ b/addons/auth_openid/__openerp__.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2010-2011 OpenERP s.a. ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+
+{
+ 'name': 'OpenID',
+ 'version': '2.0',
+ 'category': 'Authentification',
+ 'description': """Allow users to login through OpenID.""",
+ 'author': 'OpenERP s.a.',
+ 'maintainer': 'OpenERP s.a.',
+ 'website': 'http://www.openerp.com',
+ 'depends': ['base'],
+ 'data': [
+ 'res_users.xml',
+ ],
+ 'js': [
+ 'static/src/js/auth_openid.js',
+ ],
+ 'css': [
+ 'static/src/css/openid.css',
+ ],
+ 'external_dependencies': {
+ 'python' : ['openid'],
+ },
+ 'installable': True,
+ 'active': False,
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_openid/controllers/__init__.py b/addons/auth_openid/controllers/__init__.py
new file mode 100644
index 00000000000..2d3be24431f
--- /dev/null
+++ b/addons/auth_openid/controllers/__init__.py
@@ -0,0 +1,20 @@
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 OpenERP SA ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+import main
diff --git a/addons/auth_openid/controllers/main.py b/addons/auth_openid/controllers/main.py
new file mode 100644
index 00000000000..056fc2b6832
--- /dev/null
+++ b/addons/auth_openid/controllers/main.py
@@ -0,0 +1,225 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2010-2011 OpenERP s.a. ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import logging
+import os
+import sys
+import urllib
+
+import werkzeug.urls
+import werkzeug.exceptions
+
+from openerp.modules.registry import RegistryManager
+import web.common.dispatch as openerpweb
+
+from openid import oidutil
+from openid.store import memstore
+#from openid.store import filestore
+from openid.consumer import consumer
+from openid.cryptutil import randomString
+from openid.extensions import ax, sreg
+
+from .. import utils
+
+
+
+_logger = logging.getLogger('web.auth_openid')
+oidutil.log = logging.getLogger('openid').debug
+
+
+class GoogleAppsAwareConsumer(consumer.GenericConsumer):
+ def complete(self, message, endpoint, return_to):
+ if message.getOpenIDNamespace() == consumer.OPENID2_NS:
+ server_url = message.getArg(consumer.OPENID2_NS, 'op_endpoint', consumer.no_default)
+ if server_url.startswith('https://www.google.com/a/'):
+ # update fields
+ for attr in ['claimed_id', 'identity']:
+ value = message.getArg(consumer.OPENID2_NS, attr)
+ value = 'https://www.google.com/accounts/o8/user-xrds?uri=%s' % urllib.quote_plus(value)
+ message.setArg(consumer.OPENID2_NS, attr, value)
+
+ # now, resign the message
+ assoc_handle = message.getArg(consumer.OPENID_NS, 'assoc_handle')
+ assoc = self.store.getAssociation(server_url, assoc_handle)
+ message.delArg(consumer.OPENID2_NS, 'sig')
+ message.delArg(consumer.OPENID2_NS, 'signed')
+ message = assoc.signMessage(message)
+
+ return super(GoogleAppsAwareConsumer, self).complete(message, endpoint, return_to)
+
+
+class OpenIDController(openerpweb.Controller):
+ _cp_path = '/auth_openid/login'
+
+ _store = memstore.MemoryStore() # TODO use a filestore
+
+ _REQUIRED_ATTRIBUTES = ['email']
+ _OPTIONAL_ATTRIBUTES = 'nickname fullname postcode country language timezone'.split()
+
+
+ def _add_extensions(self, request):
+ """Add extensions to the request"""
+
+ sreg_request = sreg.SRegRequest(required=self._REQUIRED_ATTRIBUTES,
+ optional=self._OPTIONAL_ATTRIBUTES)
+ request.addExtension(sreg_request)
+
+ ax_request = ax.FetchRequest()
+ for alias in self._REQUIRED_ATTRIBUTES:
+ uri = utils.SREG2AX[alias]
+ ax_request.add(ax.AttrInfo(uri, required=True, alias=alias))
+ for alias in self._OPTIONAL_ATTRIBUTES:
+ uri = utils.SREG2AX[alias]
+ ax_request.add(ax.AttrInfo(uri, required=False, alias=alias))
+
+ request.addExtension(ax_request)
+
+ def _get_attributes_from_success_response(self, success_response):
+ attrs = {}
+
+ all_attrs = self._REQUIRED_ATTRIBUTES + self._OPTIONAL_ATTRIBUTES
+
+ sreg_resp = sreg.SRegResponse.fromSuccessResponse(success_response)
+ if sreg_resp:
+ for attr in all_attrs:
+ value = sreg_resp.get(attr)
+ if value is not None:
+ attrs[attr] = value
+
+ ax_resp = ax.FetchResponse.fromSuccessResponse(success_response)
+ if ax_resp:
+ for attr in all_attrs:
+ value = ax_resp.getSingle(utils.SREG2AX[attr])
+ if value is not None:
+ attrs[attr] = value
+ return attrs
+
+ def _get_realm(self, req):
+ return req.httprequest.host_url
+
+ @openerpweb.jsonrequest
+ def verify(self, req, db, url):
+ redirect_to = werkzeug.urls.Href(req.httprequest.host_url + 'auth_openid/login/process')(session_id=req.session_id)
+ realm = self._get_realm(req)
+
+ session = dict(dbname=db, openid_url=url) # TODO add origin page ?
+ oidconsumer = consumer.Consumer(session, self._store)
+
+ try:
+ request = oidconsumer.begin(url)
+ except consumer.DiscoveryFailure, exc:
+ fetch_error_string = 'Error in discovery: %s' % (str(exc[0]),)
+ return {'error': fetch_error_string, 'title': 'OpenID Error'}
+
+ if request is None:
+ return {'error': 'No OpenID services found', 'title': 'OpenID Error'}
+
+ req.session.openid_session = session
+ self._add_extensions(request)
+
+ if request.shouldSendRedirect():
+ redirect_url = request.redirectURL(realm, redirect_to)
+ return {'action': 'redirect', 'value': redirect_url, 'session_id': req.session_id}
+ else:
+ form_html = request.htmlMarkup(realm, redirect_to)
+ return {'action': 'post', 'value': form_html, 'session_id': req.session_id}
+
+
+ @openerpweb.httprequest
+ def process(self, req, **kw):
+ session = getattr(req.session, 'openid_session', None)
+ if not session:
+ return werkzeug.utils.redirect('/')
+
+ oidconsumer = consumer.Consumer(session, self._store, consumer_class=GoogleAppsAwareConsumer)
+
+ query = req.httprequest.args
+ info = oidconsumer.complete(query, req.httprequest.base_url)
+ display_identifier = info.getDisplayIdentifier()
+
+ session['status'] = info.status
+ user_id = None
+
+ if info.status == consumer.SUCCESS:
+ dbname = session['dbname']
+ with utils.cursor(dbname) as cr:
+ registry = RegistryManager.get(dbname)
+ Modules = registry.get('ir.module.module')
+
+ installed = Modules.search_count(cr, 1, ['&', ('name', '=', 'auth_openid'), ('state', '=', 'installed')]) == 1
+ if installed:
+
+ Users = registry.get('res.users')
+
+ #openid_url = info.endpoint.canonicalID or display_identifier
+ openid_url = session['openid_url']
+
+ attrs = self._get_attributes_from_success_response(info)
+ attrs['openid_url'] = openid_url
+ session['attributes'] = attrs
+ openid_email = attrs.get('email', False)
+
+ domain = []
+ if openid_email:
+ domain += ['|', ('openid_email', '=', False)]
+ domain += [('openid_email', '=', openid_email)]
+
+ domain += [
+ ('openid_url', '=', openid_url),
+ ('active', '=', True),
+ ]
+ ids = Users.search(cr, 1, domain)
+ assert len(ids) < 2
+ if ids:
+ user_id = ids[0]
+ login = Users.browse(cr, 1, user_id).login
+ key = randomString(utils.KEY_LENGTH, '0123456789abcdef')
+ Users.write(cr, 1, [user_id], {'openid_key': key})
+ # TODO fill empty fields with the ones from sreg/ax
+ cr.commit()
+
+ u = req.session.login(dbname, login, key)
+
+ if not user_id:
+ session['message'] = 'This OpenID identifier is not associated to any active users'
+
+
+ elif info.status == consumer.SETUP_NEEDED:
+ session['message'] = info.setup_url
+ elif info.status == consumer.FAILURE and display_identifier:
+ fmt = "Verification of %s failed: %s"
+ session['message'] = fmt % (display_identifier, info.message)
+ else: # FAILURE
+ # Either we don't understand the code or there is no
+ # openid_url included with the error. Give a generic
+ # failure message. The library should supply debug
+ # information in a log.
+ session['message'] = 'Verification failed.'
+
+
+ fragment = '#loginerror' if not user_id else ''
+ return werkzeug.utils.redirect('/web/webclient/home?debug=1'+fragment)
+
+ @openerpweb.jsonrequest
+ def status(self, req):
+ session = getattr(req.session, 'openid_session', {})
+ return {'status': session.get('status'), 'message': session.get('message')}
+
diff --git a/addons/auth_openid/res_users.py b/addons/auth_openid/res_users.py
new file mode 100644
index 00000000000..3278184474c
--- /dev/null
+++ b/addons/auth_openid/res_users.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2010-2011 OpenERP s.a. ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+from openerp.osv import osv, fields
+import openerp.exceptions
+import tools
+
+import utils
+
+class res_users(osv.osv):
+ _inherit = 'res.users'
+
+ # TODO create helper fields for autofill openid_url and openid_email -> http://pad.openerp.com/web-openid
+
+ _columns = {
+ 'openid_url': fields.char('OpenID URL', size=1024),
+ 'openid_email': fields.char('OpenID Email', size=256,
+ help="Used for disambiguation in case of a shared OpenID URL"),
+ 'openid_key': fields.char('OpenID Key', size=utils.KEY_LENGTH,
+ readonly=True),
+ }
+
+ def _check_openid_url_email(self, cr, uid, ids, context=None):
+ return all(self.search_count(cr, uid, [('active', '=', True), ('openid_url', '=', u.openid_url), ('openid_email', '=', u.openid_email)]) == 1 \
+ for u in self.browse(cr, uid, ids, context) if u.active and u.openid_url)
+
+ def _check_openid_url_email_msg(self, cr, uid, ids, context):
+ return "There is already an active user with this OpenID Email for this OpenID URL"
+
+ _constraints = [
+ (_check_openid_url_email, lambda self, *a, **kw: self._check_openid_url_email_msg(*a, **kw), ['active', 'openid_url', 'openid_email']),
+ ]
+
+ def copy(self, cr, uid, rid, defaults=None, context=None):
+ reset_fields = 'openid_url openid_email'.split()
+ reset_values = dict.fromkeys(reset_fields, False)
+ if defaults is None:
+ defaults = reset_values
+ else:
+ defaults = dict(reset_values, **defaults)
+
+ defaults['openid_key'] = False
+ return super(res_users, self).copy(cr, uid, rid, defaults, context)
+
+ def login(self, db, login, password):
+ result = super(res_users, self).login(db, login, password)
+ if result:
+ return result
+ else:
+ with utils.cursor(db) as cr:
+ cr.execute('UPDATE res_users SET date=now() WHERE login=%s AND openid_key=%s AND active=%s RETURNING id',
+ (tools.ustr(login), tools.ustr(password), True))
+ res = cr.fetchone()
+ cr.commit()
+ return res[0] if res else False
+
+
+ def check(self, db, uid, passwd):
+ try:
+ return super(res_users, self).check(db, uid, passwd)
+ except openerp.exceptions.AccessDenied:
+ if not passwd:
+ raise
+ with utils.cursor(db) as cr:
+ cr.execute('''SELECT COUNT(1)
+ FROM res_users
+ WHERE id=%s
+ AND openid_key=%s
+ AND active=%s''',
+ (int(uid), passwd, True))
+ if not cr.fetchone()[0]:
+ raise
+ self._uid_cache.setdefault(db, {})[uid] = passwd
+
+res_users()
+
+
diff --git a/addons/auth_openid/res_users.xml b/addons/auth_openid/res_users.xml
new file mode 100644
index 00000000000..e32c2df26c8
--- /dev/null
+++ b/addons/auth_openid/res_users.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ res.users.form
+ res.users
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/auth_openid/static/src/css/openid.css b/addons/auth_openid/static/src/css/openid.css
new file mode 100644
index 00000000000..8763ec31685
--- /dev/null
+++ b/addons/auth_openid/static/src/css/openid.css
@@ -0,0 +1,64 @@
+input[name='openid_url'] {
+ background: #fff url(../img/login-bg.gif) no-repeat 1px;
+ padding-left: 20px;
+}
+
+.auth_choice {
+ position: static;
+ display: none;
+}
+
+.openerp .login .oe_forms .oe_box2 td input[name="db"], .oe_forms .oe_box2 td select[name="db"] {
+ width: 50%;
+ float: left;
+ margin-top: 15px;
+}
+
+.openerp .login .oe_login_right_pane {
+ margin-left: 525px;
+}
+.openerp .login form {
+ width: 475px;
+}
+
+.openid_providers {
+ padding: 0;
+ list-style: none;
+ float: right;
+}
+
+.openid_providers li {
+ display: block;
+ float: left;
+ margin: 0 1px 3px 2px;
+}
+
+.openid_providers a {
+ display: block;
+ width: 24px;
+ height: 24px;
+ border: 1px solid #ddd;
+ background: #fff url(../img/openid_16.png) no-repeat 50%;
+ text-indent: -9999px;
+ overflow: hidden;
+ text-align: left;
+}
+
+.openid_providers a.selected {
+ border-color: #9A0404;
+}
+
+.openid_providers a[title="Password"] { background-image: url(../img/textfield_key.png); }
+.openid_providers a[title="AOL"] { background-image: url(../img/aol.png); }
+.openid_providers a[title="ClaimID"] { background-image: url(../img/claimid.png); }
+.openid_providers a[title="Google"] { background-image: url(../img/googlefav.png); }
+.openid_providers a[title="Google Apps"] { background-image: url(../img/marketplace.gif); }
+.openid_providers a[title="MyOpenID"] { background-image: url(../img/myopenid.png); }
+.openid_providers a[title="VeriSign"] { background-image: url(../img/verisign.png); }
+.openid_providers a[title="Yahoo!"] { background-image: url(../img/yahoo.png); }
+.openid_providers a[title="Launchpad"] { background-image: url(../img/launchpad.png); }
+
+
+tr.auth_choice.selected {
+ display: table-row;
+}
diff --git a/addons/auth_openid/static/src/img/aol.png b/addons/auth_openid/static/src/img/aol.png
new file mode 100644
index 00000000000..93584e56749
Binary files /dev/null and b/addons/auth_openid/static/src/img/aol.png differ
diff --git a/addons/auth_openid/static/src/img/claimid.png b/addons/auth_openid/static/src/img/claimid.png
new file mode 100644
index 00000000000..41be7fc8f9e
Binary files /dev/null and b/addons/auth_openid/static/src/img/claimid.png differ
diff --git a/addons/auth_openid/static/src/img/google.png b/addons/auth_openid/static/src/img/google.png
new file mode 100644
index 00000000000..d8b8b2a7abb
Binary files /dev/null and b/addons/auth_openid/static/src/img/google.png differ
diff --git a/addons/auth_openid/static/src/img/googleapps.gif b/addons/auth_openid/static/src/img/googleapps.gif
new file mode 100644
index 00000000000..f86bc8956d2
Binary files /dev/null and b/addons/auth_openid/static/src/img/googleapps.gif differ
diff --git a/addons/auth_openid/static/src/img/googlefav.png b/addons/auth_openid/static/src/img/googlefav.png
new file mode 100644
index 00000000000..1604ac0baa5
Binary files /dev/null and b/addons/auth_openid/static/src/img/googlefav.png differ
diff --git a/addons/auth_openid/static/src/img/launchpad.gif b/addons/auth_openid/static/src/img/launchpad.gif
new file mode 100644
index 00000000000..48e7ba4f5b0
Binary files /dev/null and b/addons/auth_openid/static/src/img/launchpad.gif differ
diff --git a/addons/auth_openid/static/src/img/launchpad.png b/addons/auth_openid/static/src/img/launchpad.png
new file mode 100644
index 00000000000..7db6e67f8b5
Binary files /dev/null and b/addons/auth_openid/static/src/img/launchpad.png differ
diff --git a/addons/auth_openid/static/src/img/login-bg.gif b/addons/auth_openid/static/src/img/login-bg.gif
new file mode 100644
index 00000000000..e2d8377db02
Binary files /dev/null and b/addons/auth_openid/static/src/img/login-bg.gif differ
diff --git a/addons/auth_openid/static/src/img/marketplace.gif b/addons/auth_openid/static/src/img/marketplace.gif
new file mode 100644
index 00000000000..a3e4d2cd606
Binary files /dev/null and b/addons/auth_openid/static/src/img/marketplace.gif differ
diff --git a/addons/auth_openid/static/src/img/myopenid.png b/addons/auth_openid/static/src/img/myopenid.png
new file mode 100644
index 00000000000..d00ca76543b
Binary files /dev/null and b/addons/auth_openid/static/src/img/myopenid.png differ
diff --git a/addons/auth_openid/static/src/img/openid.png b/addons/auth_openid/static/src/img/openid.png
new file mode 100644
index 00000000000..280ee6ce3b7
Binary files /dev/null and b/addons/auth_openid/static/src/img/openid.png differ
diff --git a/addons/auth_openid/static/src/img/openid_16.png b/addons/auth_openid/static/src/img/openid_16.png
new file mode 100644
index 00000000000..eadf8e8577f
Binary files /dev/null and b/addons/auth_openid/static/src/img/openid_16.png differ
diff --git a/addons/auth_openid/static/src/img/textfield_key.png b/addons/auth_openid/static/src/img/textfield_key.png
new file mode 100644
index 00000000000..a9d5e4f8cc7
Binary files /dev/null and b/addons/auth_openid/static/src/img/textfield_key.png differ
diff --git a/addons/auth_openid/static/src/img/verisign.png b/addons/auth_openid/static/src/img/verisign.png
new file mode 100644
index 00000000000..fe890ca7aeb
Binary files /dev/null and b/addons/auth_openid/static/src/img/verisign.png differ
diff --git a/addons/auth_openid/static/src/img/yahoo.png b/addons/auth_openid/static/src/img/yahoo.png
new file mode 100644
index 00000000000..5fbf752d9b5
Binary files /dev/null and b/addons/auth_openid/static/src/img/yahoo.png differ
diff --git a/addons/auth_openid/static/src/js/auth_openid.js b/addons/auth_openid/static/src/js/auth_openid.js
new file mode 100644
index 00000000000..7399e1fb371
--- /dev/null
+++ b/addons/auth_openid/static/src/js/auth_openid.js
@@ -0,0 +1,135 @@
+
+openerp.auth_openid = function(instance) {
+
+var QWeb = instance.web.qweb;
+QWeb.add_template('/auth_openid/static/src/xml/auth_openid.xml');
+
+instance.web.Login = instance.web.Login.extend({
+ start: function() {
+ this._super.apply(this, arguments);
+ var self = this;
+
+ this.$openid_selected_button = $();
+ this.$openid_selected_input = $();
+ this.$openid_selected_provider = null;
+
+
+ var openIdProvider = null;
+ if (this.has_local_storage && this.remember_creditentials) {
+ openIdProvider = localStorage.getItem('openid-provider');
+ }
+
+ if (openIdProvider) {
+ $openid_selected_provider = openIdProvider;
+ this.do_openid_select('a[href="#' + openIdProvider + '"]', openIdProvider, true);
+
+ if (this.has_local_storage && this.remember_creditentials) {
+ this.$openid_selected_input.find('input').val(localStorage.getItem('openid-login'));
+ }
+ }
+ else {
+ this.do_openid_select('a[data-url=""]', 'login,password', true);
+ }
+
+ this.$element.find('a[data-url]').click(function (event) {
+ event.preventDefault();
+ var selected_oidh = $(this).attr('href').substr(1);
+ if (selected_oidh != self.$openid_selected_provider) {
+ self.do_openid_select(this, selected_oidh);
+ }
+ });
+
+ },
+
+
+ do_openid_select: function (button, provider, noautosubmit) {
+ var self = this;
+
+ self.$openid_selected_button.add(self.$openid_selected_input).removeClass('selected');
+ self.$openid_selected_button = self.$element.find(button).addClass('selected');
+
+ var input = _(provider.split(',')).map(function(p) { return 'tr[data-provider="'+p+'"]'; }).join(',');
+ self.$openid_selected_input = self.$element.find(input).addClass('selected');
+
+ self.$openid_selected_input.find('input:first').focus();
+ self.$openid_selected_provider = (self.$openid_selected_button.attr('href') || '').substr(1);
+
+ if (self.has_local_storage && self.remember_creditentials) {
+ localStorage.setItem('openid-provider', self.$openid_selected_provider);
+ }
+
+ if (!noautosubmit && self.$openid_selected_input.length == 0) {
+ self.$element.find('form').submit();
+ }
+
+ },
+
+ on_login_invalid: function() {
+ var self = this;
+ var fragment = jQuery.deparam.fragment();
+ if (fragment.loginerror != undefined) {
+ this.rpc('/auth_openid/login/status', {}, function(result) {
+ if (_.contains(['success', 'failure'], result.status) && result.message) {
+ self.notification.warn('Invalid OpenID Login', result.message);
+ }
+ if (result.status === 'setup_needed' && result.message) {
+ window.location.replace(result.message);
+ }
+ });
+ }
+ return this._super();
+ },
+
+ on_submit: function(ev) {
+
+ var dataurl = this.$openid_selected_button.attr('data-url');
+
+ if(!dataurl) {
+ // login-password submitted
+ this._super(ev);
+ } else {
+ ev.preventDefault();
+
+ var id = this.$openid_selected_input.find('input').val();
+ if (this.has_local_storage && this.remember_creditentials) {
+ localStorage.setItem('openid-login', id);
+ }
+
+ var db = this.$element.find("form [name=db]").val();
+ var openid_url = dataurl.replace('{id}', id);
+
+ this.do_openid_login(db, openid_url);
+
+ }
+ },
+
+ do_openid_login: function(db, openid_url) {
+ var self = this;
+ this.rpc('/auth_openid/login/verify', {'db': db, 'url': openid_url}, function(result) {
+ if (result.error) {
+ self.notification.warn(result.title, result.error);
+ self.on_login_invalid();
+ return;
+ }
+ if (result.session_id) {
+ self.session.session_id = result.session_id;
+ self.session.session_save();
+ }
+ if (result.action === 'post') {
+ document.open();
+ document.write(result.value);
+ document.close();
+ } else if (result.action === 'redirect') {
+ window.location.replace(result.value);
+ } else {
+ // XXX display error ?
+ }
+
+ });
+ },
+
+
+});
+
+
+};
diff --git a/addons/auth_openid/static/src/xml/auth_openid.xml b/addons/auth_openid/static/src/xml/auth_openid.xml
new file mode 100644
index 00000000000..6fbab72e831
--- /dev/null
+++ b/addons/auth_openid/static/src/xml/auth_openid.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ //this.addClass('auth_choice'); // XXX for some reason, not all tr tags are HTMLElement's and thus, jQuery decide to not change the class...
+ this.attr('class', 'auth_choice');
+ this.each(function() {
+ var $i = $(this);
+ $i.attr('data-provider', $i.find('input').attr('name'));
+ });
+
+
+
+
diff --git a/addons/auth_openid/utils.py b/addons/auth_openid/utils.py
new file mode 100644
index 00000000000..2761f3d0e1d
--- /dev/null
+++ b/addons/auth_openid/utils.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2010-2011 OpenERP s.a. ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+from contextlib import contextmanager
+from openerp.modules.registry import RegistryManager
+
+KEY_LENGTH = 16
+
+SREG2AX = { # from http://www.axschema.org/types/#sreg
+ 'nickname': 'http://axschema.org/namePerson/friendly',
+ 'email': 'http://axschema.org/contact/email',
+ 'fullname': 'http://axschema.org/namePerson',
+ 'dob': 'http://axschema.org/birthDate',
+ 'gender': 'http://axschema.org/person/gender',
+ 'postcode': 'http://axschema.org/contact/postalCode/home',
+ 'country': 'http://axschema.org/contact/country/home',
+ 'language': 'http://axschema.org/pref/language',
+ 'timezone': 'http://axschema.org/pref/timezone',
+}
+
+
+@contextmanager
+def cursor(db):
+ cr = RegistryManager.get(db).db.cursor()
+ try:
+ yield cr
+ finally:
+ cr.close()
+
diff --git a/addons/base_report_designer/base_report_designer_installer.xml b/addons/base_report_designer/base_report_designer_installer.xml
index b943c35c2ef..2774767af26 100644
--- a/addons/base_report_designer/base_report_designer_installer.xml
+++ b/addons/base_report_designer/base_report_designer_installer.xml
@@ -22,8 +22,8 @@
-
-
+
+
diff --git a/addons/base_setup/base_setup.py b/addons/base_setup/base_setup.py
index 8d149b522b6..fa251719509 100644
--- a/addons/base_setup/base_setup.py
+++ b/addons/base_setup/base_setup.py
@@ -442,19 +442,19 @@ class specify_partner_terminology(osv.osv_memory):
_name = 'base.setup.terminology'
_inherit = 'res.config'
_columns = {
- 'partner': fields.selection([('Customer','Customer'),
- ('Client','Client'),
- ('Member','Member'),
- ('Patient','Patient'),
- ('Partner','Partner'),
- ('Donor','Donor'),
- ('Guest','Guest'),
- ('Tenant','Tenant')
- ],
- 'Choose how to call a Customer', required=True ),
+ 'partner': fields.selection([
+ ('Customer','Customer'),
+ ('Client','Client'),
+ ('Member','Member'),
+ ('Patient','Patient'),
+ ('Partner','Partner'),
+ ('Donor','Donor'),
+ ('Guest','Guest'),
+ ('Tenant','Tenant')
+ ], 'How do you call a Customer', required=True ),
}
_defaults={
- 'partner' :'Partner',
+ 'partner' :'Customer',
}
def make_translations(self, cr, uid, ids, name, type, src, value, res_id=0, context=None):
diff --git a/addons/base_setup/base_setup_views.xml b/addons/base_setup/base_setup_views.xml
index f35ca95e529..2fc041c63a3 100644
--- a/addons/base_setup/base_setup_views.xml
+++ b/addons/base_setup/base_setup_views.xml
@@ -23,12 +23,6 @@
-
- Add More Features
- ir.ui.menu
-
-
-
@@ -54,13 +48,13 @@
- Define default users preferences
+ Define Users's Preferences
- Specify default values. This will set the default values for each new user, each user is free to change his own preferences.
+ This will set the default preferences for all users. After this, each user will be able to update his own preferences.
@@ -89,6 +83,7 @@
+ once
@@ -97,14 +92,13 @@
ir.actions.act_windowres.usersform
- form
-
+ tree,form
+ 1000
- done
@@ -123,7 +117,7 @@
Specify Your Terminology
- Based on the industry needs you can use this wizard to change the terminologies for Partners.
+ You can use this wizard to change the terminologies for customers in the whole application.
@@ -149,6 +143,7 @@
+ once
@@ -166,21 +161,6 @@
1
-
-
- Upload Your Company Logo
- ir.actions.act_window
- res.company
-
- form
- form
- {'res_id': user.company_id.id}
-
-
-
-
- done
-
diff --git a/addons/board/board_administration_view.xml b/addons/board/board_administration_view.xml
index 29146ad53ad..9e22dbd3fb6 100644
--- a/addons/board/board_administration_view.xml
+++ b/addons/board/board_administration_view.xml
@@ -139,13 +139,11 @@
-
-
+
+
-
-
-
+
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index 4031f3d9868..bf30cac58fb 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -71,6 +71,7 @@ class crm_case_stage(osv.osv):
'on_change': fields.boolean('Change Probability Automatically', help="Setting this stage will change the probability automatically on the opportunity."),
'requirements': fields.text('Requirements'),
'section_ids':fields.many2many('crm.case.section', 'section_stage_rel', 'stage_id', 'section_id', 'Sections'),
+ 'case_default': fields.boolean('Common to All Teams', help="If you check this field, this stage will be proposed by default on each sales team. It will not assign this stage to existing teams."),
}
_defaults = {
@@ -106,10 +107,14 @@ class crm_case_section(osv.osv):
'working_hours': fields.float('Working Hours', digits=(16,2 )),
'stage_ids': fields.many2many('crm.case.stage', 'section_stage_rel', 'section_id', 'stage_id', 'Stages'),
}
+ def _get_stage_common(self, cr, uid, context):
+ ids = self.pool.get('crm.case.stage').search(cr, uid, [('case_default','=',1)], context=context)
+ return ids
_defaults = {
'active': lambda *a: 1,
'allow_unlink': lambda *a: 1,
+ 'stage_ids': _get_stage_common
}
_sql_constraints = [
diff --git a/addons/crm/crm_installer_view.xml b/addons/crm/crm_installer_view.xml
index 0eab523e947..ecaec91cef6 100644
--- a/addons/crm/crm_installer_view.xml
+++ b/addons/crm/crm_installer_view.xml
@@ -24,6 +24,7 @@
crm.case.stageformtree,form
+ {'default_case_default': 1}Stages will allow salesmen to easily track how a specific opportunity is positioned in the sales cycle. In order to efficiently manage your sales pipeline, it's important to define conditions to go to the next step. Example: to set an opportunity as 'Qualified', you must set the "Expected Revenue" and the "Expected Closing Date." You should also have a look at the tooltip of the field "Change Probability Automatically".
@@ -32,7 +33,7 @@
- 10
+ 9
diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml
index 0c7215c09eb..aaa00307bfe 100644
--- a/addons/crm/crm_lead_data.xml
+++ b/addons/crm/crm_lead_data.xml
@@ -5,31 +5,37 @@
Lost
+ New
+ Qualification
+ Proposition
+ Negotiation
+ Won
+
diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml
index c7038958126..fc01cfd5a05 100644
--- a/addons/crm/crm_view.xml
+++ b/addons/crm/crm_view.xml
@@ -64,11 +64,11 @@
-
+
-
+
@@ -154,12 +154,12 @@
-
-
-
-
-
+
+
+
+
+
@@ -230,7 +230,7 @@
-
+
@@ -382,7 +382,6 @@
@@ -396,7 +395,7 @@
-
+
diff --git a/addons/delivery/delivery.py b/addons/delivery/delivery.py
index 94a21289925..cac4c20c288 100644
--- a/addons/delivery/delivery.py
+++ b/addons/delivery/delivery.py
@@ -61,16 +61,16 @@ class delivery_carrier(osv.osv):
return res
_columns = {
- 'name': fields.char('Carrier', size=64, required=True),
- 'partner_id': fields.many2one('res.partner', 'Carrier Partner', required=True),
+ 'name': fields.char('Delivery Method', size=64, required=True),
+ 'partner_id': fields.many2one('res.partner', 'Transport Company', required=True, help="The partner that is doing the delivery service."),
'product_id': fields.many2one('product.product', 'Delivery Product', required=True),
'grids_id': fields.one2many('delivery.grid', 'carrier_id', 'Delivery Grids'),
'price' : fields.function(get_price, string='Price'),
'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the delivery carrier without removing it."),
- 'normal_price': fields.float('Normal Price'),
- 'free_if_more_than': fields.boolean('Free If More Than'),
- 'amount': fields.float('Amount'),
- 'use_detailed_pricelist': fields.boolean('Use Detailed Pricelist'),
+ 'normal_price': fields.float('Normal Price', help="Keep empty if the pricing depends on the advanced pricing per destination"),
+ 'free_if_more_than': fields.boolean('Free If More Than', help="If the order is more expensive than a certain amount, the customer can benefit from a free shipping"),
+ 'amount': fields.float('Amount', help="Amount of the order to benefit from a free shipping, expressed in the company currency"),
+ 'use_detailed_pricelist': fields.boolean('Advanced Pricing per Destination', help="Check this box if you want to manage delivery prices that depends on the destination, the weight, the total of the order, etc."),
'pricelist_ids': fields.one2many('delivery.grid', 'carrier_id', 'Advanced Pricing'),
}
@@ -103,25 +103,32 @@ class delivery_carrier(osv.osv):
grid_line_pool = self.pool.get('delivery.grid.line')
grid_pool = self.pool.get('delivery.grid')
for record in self.browse(cr, uid, ids, context=context):
- grid_id = grid_pool.search(cr, uid, [('carrier_id', '=', record.id)], context=context)
+ grid_id = grid_pool.search(cr, uid, [('carrier_id', '=', record.id),('sequence','=',9999)], context=context)
+
+ if grid_id and not (record.normal_price or record.free_if_more_than):
+ grid_pool.unlink(cr, uid, grid_id, context=context)
+
+ if not (record.normal_price or record.free_if_more_than):
+ continue
+
if not grid_id:
record_data = {
- 'name': vals.get('name', False),
+ 'name': record.name,
'carrier_id': record.id,
- 'seqeunce': 10,
+ 'sequence': 9999,
}
new_grid_id = grid_pool.create(cr, uid, record_data, context=context)
grid_id = [new_grid_id]
- #delete all existing grid lines
- grid_lines = [line.id for line in grid_pool.browse(cr, uid, grid_id[0]).line_ids if line.type == 'price']
- grid_line_pool.unlink(cr, uid, grid_lines, context=context)
+ lines = grid_line_pool.search(cr, uid, [('grid_id','in',grid_id)], context=context)
+ if lines:
+ grid_line_pool.unlink(cr, uid, lines, context=context)
#create the grid lines
if record.free_if_more_than:
data = {
'grid_id': grid_id and grid_id[0],
- 'name': _('Free if more than %d') % record.amount,
+ 'name': _('Free if more than %.2f') % record.amount,
'type': 'price',
'operator': '>=',
'max_value': record.amount,
@@ -217,7 +224,7 @@ class delivery_grid_line(osv.osv):
_description = "Delivery Grid Line"
_columns = {
'name': fields.char('Name', size=32, required=True),
- 'grid_id': fields.many2one('delivery.grid', 'Grid',required=True),
+ 'grid_id': fields.many2one('delivery.grid', 'Grid',required=True, ondelete='cascade'),
'type': fields.selection([('weight','Weight'),('volume','Volume'),\
('wv','Weight * Volume'), ('price','Price')],\
'Variable', required=True),
@@ -242,21 +249,19 @@ class define_delivery_steps(osv.osv_memory):
_name = 'delivery.define.delivery.steps.wizard'
_columns = {
- 'picking_policy' : fields.selection([('direct', 'Partial Delivery'), ('one', 'Complete Delivery'),],
- 'Picking Policy', required=True),
+ 'picking_policy' : fields.selection([('direct', 'Deliver each product when available'), ('one', 'Deliver all products at once')], 'Picking Policy'),
+ }
+ _defaults = {
+ 'picking_policy': lambda s,c,u,ctx: s.pool.get('sale.order').default_get(c,u,['picking_policy'],context=ctx)['picking_policy']
}
def apply_cb(self, cr, uid, ids, context=None):
ir_values_obj = self.pool.get('ir.values')
-
wizard = self.browse(cr, uid, ids, context=context)[0]
-
ir_values_obj.set(cr, uid, 'default', False, 'picking_policy', ['sale.order'], wizard.picking_policy)
-
return {'type' : 'ir.actions.act_window_close'}
define_delivery_steps()
-
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/delivery/delivery_view.xml b/addons/delivery/delivery_view.xml
index 23147a2716f..deb13679355 100644
--- a/addons/delivery/delivery_view.xml
+++ b/addons/delivery/delivery_view.xml
@@ -9,6 +9,7 @@
tree
+
@@ -21,15 +22,16 @@
+
-
-
-
+
+
+
-
+
@@ -37,7 +39,6 @@
-
@@ -76,8 +77,8 @@
ir.actions.act_windowdelivery.carrierform
- form,tree
- Define the delivery methods you are using and their pricing in order to reinvoice the delivery costs when you are doing invoicing based on delivery orders
+ tree,form
+ Define your delivery methods and their pricing. The delivery costs can be added on the sale order form or in the invoice, based on the delivery orders.
@@ -325,7 +326,7 @@
-
+
@@ -341,9 +342,10 @@
delivery.define.delivery.steps.wizardform
-
-
+
+
+
@@ -353,7 +355,7 @@
- Setup Your Delivery Steps
+ Setup Your Picking Policydelivery.define.delivery.steps.wizardformform
@@ -362,6 +364,8 @@
+
+ once
diff --git a/addons/document/wizard/document_configuration.py b/addons/document/wizard/document_configuration.py
index 3485e7412c7..97eda4e2d62 100644
--- a/addons/document/wizard/document_configuration.py
+++ b/addons/document/wizard/document_configuration.py
@@ -22,26 +22,16 @@
from osv import osv, fields
class document_configuration(osv.osv_memory):
-
_name='document.configuration'
- _description = 'Auto Directory Configuration'
+ _description = 'Directory Configuration'
_inherit = 'res.config'
- _columns = {
- 'sale_order' : fields.boolean('Sale Orders', help="Create virtual folders for Sale Orders and Quotations. One virtual folder will appear for each, in which the latest printed PDF document can be downloaded at any time, and where you can manage (view, add, delete) other attachments."),
- 'product' : fields.boolean('Products', help="Create virtual folders for Products. One virtual folder will appear for each product, where you can manage (view, add, delete) the files attached to the product"),
- 'project': fields.boolean('Projects', help="Create virtual folders for Projects. One virtual folder will appear for each project, where you can manage (view, add, delete) the files attached to the project"),
- }
-
-
def execute(self, cr, uid, ids, context=None):
- conf_id = ids and ids[0] or False
- conf = self.browse(cr, uid, conf_id, context=context)
dir_pool = self.pool.get('document.directory')
data_pool = self.pool.get('ir.model.data')
model_pool = self.pool.get('ir.model')
content_pool = self.pool.get('document.directory.content')
- if conf.sale_order and self.pool.get('sale.order'):
+ if self.pool.get('sale.order'):
# Sale order
dir_data_id = data_pool._get_id(cr, uid, 'document', 'dir_sale_order_all')
if dir_data_id:
@@ -90,7 +80,7 @@ class document_configuration(osv.osv_memory):
})
- if conf.product and self.pool.get('product.product'):
+ if self.pool.get('product.product'):
# Product
dir_data_id = data_pool._get_id(cr, uid, 'document', 'dir_product')
if dir_data_id:
@@ -104,7 +94,7 @@ class document_configuration(osv.osv_memory):
'ressource_type_id': mid[0],
})
- if conf.project and self.pool.get('account.analytic.account'):
+ if self.pool.get('account.analytic.account'):
# Project
dir_data_id = data_pool._get_id(cr, uid, 'document', 'dir_project')
if dir_data_id:
diff --git a/addons/document/wizard/document_configuration_view.xml b/addons/document/wizard/document_configuration_view.xml
index eaba3b7115e..a51a7877e60 100644
--- a/addons/document/wizard/document_configuration_view.xml
+++ b/addons/document/wizard/document_configuration_view.xml
@@ -1,31 +1,27 @@
- Auto Configure Directory
+ Auto Configure Directoriesdocument.configurationform
-
- Virtual Document Folders
-
-
- OpenERP's Document Management System supports mapping virtual folders with documents. The virtual folder of a document can be used to manage the files attached to the document, or to print and download any document report. A few common virtual folders can be created for you automatically from this screen.
-
-
- 12
-
-
+
+ Configure Direcories
+
+
+ OpenERP's Document Management System supports mapping virtual folders with documents. The virtual folder of a document can be used to manage the files attached to the document, or to print and download any report. This tool will create directories automatically according to modules installed.
+
+
+ 12
+
+
-
-
-
-
-
+
@@ -33,7 +29,7 @@
- Document Management System: Configure Virtual Folders
+ Configure Directoriesir.actions.act_windowdocument.configuration
@@ -50,7 +46,6 @@
- automatic
diff --git a/addons/document_ics/document_ics_config_wizard.xml b/addons/document_ics/document_ics_config_wizard.xml
index a751fb2ca6f..0b31eb85d73 100644
--- a/addons/document_ics/document_ics_config_wizard.xml
+++ b/addons/document_ics/document_ics_config_wizard.xml
@@ -21,9 +21,6 @@
15
-
- Configure
-
diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py
index f45b5e955a0..e7f7250458b 100644
--- a/addons/fetchmail/fetchmail.py
+++ b/addons/fetchmail/fetchmail.py
@@ -60,10 +60,9 @@ class fetchmail_server(osv.osv):
'date': fields.datetime('Last Fetch Date', readonly=True),
'user' : fields.char('Username', size=256, required=True, readonly=True, states={'draft':[('readonly', False)]}),
'password' : fields.char('Password', size=1024, required=True, readonly=True, states={'draft':[('readonly', False)]}),
- 'note': fields.text('Description'),
'action_id':fields.many2one('ir.actions.server', 'Server Action', help="Optional custom server action to trigger for each incoming mail, "
"on the record that was created or updated by this mail"),
- 'object_id': fields.many2one('ir.model', "Target document type", required=True, help="Process each incoming mail as part of a conversation "
+ 'object_id': fields.many2one('ir.model', "Create a New Record", required=True, help="Process each incoming mail as part of a conversation "
"corresponding to this document type. This will create "
"new documents for new conversations, or attach follow-up "
"emails to the existing conversations (documents)."),
@@ -73,6 +72,7 @@ class fetchmail_server(osv.osv):
}
_defaults = {
'state': "draft",
+ 'type': "pop",
'active': True,
'priority': 5,
'attach': True,
diff --git a/addons/fetchmail/fetchmail_installer_view.xml b/addons/fetchmail/fetchmail_installer_view.xml
index 911ad8101da..b5bd7df80ca 100644
--- a/addons/fetchmail/fetchmail_installer_view.xml
+++ b/addons/fetchmail/fetchmail_installer_view.xml
@@ -1,18 +1,19 @@
-
- Setup Incoming Mail Server (fetchmail)
- ir.actions.act_window
- fetchmail.server
- form
- tree,form
-
-
+
+ Setup Incoming Mail Servers
+ ir.actions.act_window
+ fetchmail.server
+ form
+ tree,form
+
+ You can connect OpenERP to your incoming mail server so that documents (leads, tasks, issues, etc) are synchronized automatically with your incoming emails.
+
-
-
-
- 4
+
+
+
+ 4
diff --git a/addons/fetchmail/fetchmail_view.xml b/addons/fetchmail/fetchmail_view.xml
index 05f62f4b9fb..61992629b2a 100644
--- a/addons/fetchmail/fetchmail_view.xml
+++ b/addons/fetchmail/fetchmail_view.xml
@@ -26,7 +26,7 @@
-
+
@@ -44,17 +44,15 @@
-
+
-
+
-
-
-
+
-
+
@@ -62,7 +60,7 @@
-
+
@@ -83,13 +81,6 @@
-
-
-
-
-
-
-
diff --git a/addons/hr/__openerp__.py b/addons/hr/__openerp__.py
index 598b49a725e..bca65c54cb2 100644
--- a/addons/hr/__openerp__.py
+++ b/addons/hr/__openerp__.py
@@ -38,7 +38,7 @@ You can manage:
'author': 'OpenERP SA',
'website': 'http://www.openerp.com',
'images': ['images/hr_department.jpeg', 'images/hr_employee.jpeg','images/hr_job_position.jpeg'],
- 'depends': ['base_setup', 'resource', 'board'],
+ 'depends': ['base_setup','mail', 'resource', 'board'],
'init_xml': [],
'update_xml': [
'security/hr_security.xml',
diff --git a/addons/hr/hr.py b/addons/hr/hr.py
index e5551060362..7a704de78d0 100644
--- a/addons/hr/hr.py
+++ b/addons/hr/hr.py
@@ -154,7 +154,9 @@ 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 No', size=64)
+ 'passport_id':fields.char('Passport No', size=64),
+ 'color': fields.integer('Color Index'),
+ 'city': fields.related('address_id', 'city', type='char', string='City'),
}
def unlink(self, cr, uid, ids, context=None):
@@ -203,6 +205,7 @@ class hr_employee(osv.osv):
'active': 1,
'photo': _get_photo,
'marital': 'single',
+ 'color': 0,
}
def _check_recursion(self, cr, uid, ids, context=None):
diff --git a/addons/hr/hr_installer.xml b/addons/hr/hr_installer.xml
index 0b7880a032e..263f842b5b4 100644
--- a/addons/hr/hr_installer.xml
+++ b/addons/hr/hr_installer.xml
@@ -9,28 +9,27 @@
- Create your employees
+ Create your Employeesir.actions.act_windowhr.employeeform
- form
-
+ tree,form
+
-
-
+
- Define Your Department Structure
+ Create Your Departmentsir.actions.act_windowhr.departmentformtree,form
- Your Company's Department Structure is used to manage all documents related to employees by departments: expenses and timesheet validation, leaves management, recruitments, etc.
+ Your departments structure is used to manage all documents related to employees by departments: expenses and timesheet validation, leaves management, recruitments, etc.
diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml
index 87a9da2cc6e..f0399a4f5a3 100644
--- a/addons/hr/hr_view.xml
+++ b/addons/hr/hr_view.xml
@@ -33,7 +33,7 @@
-
+
@@ -125,7 +125,70 @@
-
+
+
+ HR - Employess Kanban
+ hr.employee
+ kanban
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+
+
+
+
+ ,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Employees Structurehr.employee
@@ -149,13 +212,27 @@
Employeeshr.employeeform
- tree,form
+ tree,form,kanban[]{"search_default_department_id": department_id,"search_default_active":eval('True')}Here you can manage your work force by creating employees and assigning them specific properties in the system. Maintain all employee related information and keep track of anything that needs to be recorded for them. The personal information tab will help you maintain their identity data. The Categories tab gives you the opportunity to assign them related employee categories depending on their position and activities within the company. A category can be a seniority level within the company or a department. The Timesheets tab allows to assign them a specific timesheet and analytic journal where they will be able to enter time through the system. In the note tab, you can enter text data that should be recorded for a specific employee.
+
+
+
+ tree
+
+
+
+
+
+
+ form
+
+
+
diff --git a/addons/hr_evaluation/__openerp__.py b/addons/hr_evaluation/__openerp__.py
index 95ef4512d5c..6deba41c05f 100644
--- a/addons/hr_evaluation/__openerp__.py
+++ b/addons/hr_evaluation/__openerp__.py
@@ -39,7 +39,7 @@ level of employee hierarchy fills what and final review and evaluation
is done by the manager.Every evaluation filled by the employees can be viewed
in the form of pdf file. Implements a dashboard for My Current Evaluations
""",
- "demo": ["hr_evaluation_demo.xml", ],
+ "demo": [],
"data": [
"security/ir.model.access.csv",
"security/hr_evaluation_security.xml",
diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py
index d79cf90b915..03ff1692009 100644
--- a/addons/hr_evaluation/hr_evaluation.py
+++ b/addons/hr_evaluation/hr_evaluation.py
@@ -39,6 +39,8 @@ class hr_evaluation_plan(osv.osv):
}
_defaults = {
'active': True,
+ 'month_first': 6,
+ 'month_next': 12,
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'account.account', context=c),
}
hr_evaluation_plan()
diff --git a/addons/hr_evaluation/hr_evaluation_data.xml b/addons/hr_evaluation/hr_evaluation_data.xml
index a83caa71173..b69671f2343 100644
--- a/addons/hr_evaluation/hr_evaluation_data.xml
+++ b/addons/hr_evaluation/hr_evaluation_data.xml
@@ -593,5 +593,636 @@ Once the form had been filled, the employee send it to his supervisor.
+
+
+ Employee Opinion
+ 20
+
+
+
+ 5
+
+
+ Process
+
+
+
+
+ Survey
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Employee Details
+
+ multiple_textboxes_diff_type
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Engagement
+
+ matrix_of_choices_only_one_ans
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Leadership
+
+ matrix_of_choices_only_one_ans
+
+
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Effectiveness
+
+ matrix_of_choices_only_one_ans
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Continuous Improvement
+
+ matrix_of_choices_only_one_ans
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Openness
+
+ matrix_of_choices_only_one_ans
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Miscellaneous
+
+ matrix_of_choices_only_one_ans
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Additional comments :
+
+ comment
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+ 1
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ At the supervisor's appraisal date
+
+ descriptive_text
+ The comment you entered is in an invalid format.
+ * His direct reports will be invited through OpenERP to express a feedback on their supervisor's leadership and to give their opinion about their own engagement and effectiveness, the continuous improvement and openness in action in the company, ...
+
+* The employees will send back their anonymous answers to OpenERP. The data will be handled by the HR manager and a brief summary of the data will be sent to the concerned supervisor, to his team and to the supervisor's supervisor.
+* The appraiser should rate the employee’s major work accomplishments and performance according to the metric provided below :
+
+ 1 - Significantly exceeds standards and expectations required of the position
+ 2 - Exceeds standards and expectations
+ 3 - Meet standards and expectations
+ 4 - Did not meet standards and expectations
+ 5 - Significantly below standards and expectations
+
+
+
+ Other
+
+
+
+
+ 1
+ 1
+ 1
+
+
+
+ 1
+ 1
+ 2
+
+
+
+ 1
+ 1
+ 3
+
+
+
+ 1
+ 1
+ 4
+
+
+
+ 1
+ 1
+ 5
+
+
+
+ 1
+ 1
+ 1
+
+
+
+ 1
+ 1
+ 2
+
+
+
+ 1
+ 1
+ 3
+
+
+
+ 1
+ 1
+ 4
+
+
+
+ 1
+ 1
+ 5
+
+
+
+ 1
+ 1
+ 1
+
+
+
+ 1
+ 1
+ 2
+
+
+
+ 1
+ 1
+ 3
+
+
+
+ 1
+ 1
+ 4
+
+
+
+ 1
+ 1
+ 5
+
+
+
+ 1
+ 1
+ 1
+
+
+
+ 1
+ 1
+ 2
+
+
+
+ 1
+ 1
+ 3
+
+
+
+ 1
+ 1
+ 4
+
+
+
+ 1
+ 1
+ 5
+
+
+
+ 1
+ 1
+ 1
+
+
+
+ 1
+ 1
+ 2
+
+
+
+ 1
+ 1
+ 3
+
+
+
+ 1
+ 1
+ 4
+
+
+
+ 1
+ 1
+ 5
+
+
+
+ 1
+ 1
+ 1
+
+
+
+ 1
+ 1
+ 2
+
+
+
+ 1
+ 1
+ 3
+
+
+
+ 1
+ 1
+ 4
+
+
+
+ 1
+ 1
+ 5
+
+
+
+ 1
+ Demonstrates genuine concern for me as a person.
+
+
+
+
+ 1
+ I'm efficient at work and my achievements are successful.
+
+
+
+
+ 1
+ I am proud to tell others I work here.
+
+
+
+
+ 0
+ Name of your direct supervisor
+
+ char
+
+
+
+ 1
+ Actions by Executive management show genuine interest in the well-being of employees.
+
+
+
+
+ 1
+ I know the company's values and live them.
+
+
+
+
+ 1
+ My work contributes towards the continuous improvement of the company, our services or products.
+
+
+
+
+ 1
+ I have enough work.
+
+
+
+
+ 0
+ Date
+
+ datetime
+
+
+
+ 1
+ I consistently acquire new knowledge, skills or understanding through contact with my supervisor. He helps me growing my compete
+
+
+
+
+ 1
+ My job provides me with a sense of personal accomplishment.
+
+
+
+
+ 1
+ What I did several months ago is still of use to the company, the services or the products today.
+
+
+
+
+ 1
+ My best achievements have been communicated to the community, internally or to customers.
+
+
+
+
+ 1
+ I have the same opportunity to succeed as others with similar experiences, performance and educational background.
+
+
+
+
+ 1
+ Compared to similar jobs in other companies where I could work, my total compensation is:
+(Scale: Well below others, Below othe
+
+
+
+
+ 1
+ Overall, I believe the quality of products and/or services my workgroup delivers is improving.
+
+
+
+
+ 1
+ I would prefer to remain with this company even if a comparable job were available in another company.
+
+
+
+
+ 1
+ Listens and takes into account all ideas and do his best to put in place the best of these.
+
+
+
+
+ 1
+ I mostly work on value-added tasks for the company, the products or the services. (Value-added task : significant improvement pe
+
+
+
+
+ 1
+ Our workgroup identifies and reduces waste of time in our activities and processes.
+
+
+
+
+ 1
+ Taking everything into account, how satisfied are you with your current job?
+
+
+
+
+ 1
+ I understand the company strategy and how my workgroup supports it.
+
+
+
+
+ 1
+ I am willing to put in a great deal of effort beyond what is expected to help my workgroup succeed.
+
+
+
+
+ 1
+ I believe the information that I get from the person I report to.
+
+
+
+
+
+
+
+
+ Manager's Evaluation Plan
+
+
+
+
+
+
+
+
+ Send to Subordinates
+
+
+
+ bottom-up
+
+
+
+
+
+
+
+
+ Send to Managers
+
+
+
+ top-down
+
+
+
+
+
+
+
+
+ Send to Employee
+
+
+
+ self
+
+
+
+
+
+
+
+
+ Final Interview With Manager
+
+
+
+ final
+
+
+
+
+
+
+
+
+
+
+ Run Employee Evaluation
+
+
+ 1
+ days
+ -1
+
+
+
+
+
+
diff --git a/addons/hr_evaluation/hr_evaluation_demo.xml b/addons/hr_evaluation/hr_evaluation_demo.xml
deleted file mode 100644
index a7be585272f..00000000000
--- a/addons/hr_evaluation/hr_evaluation_demo.xml
+++ /dev/null
@@ -1,857 +0,0 @@
-
-
-
-
-
- Employee Opinion
- 20
-
-
-
- 5
-
-
-
-
-
- Process
-
-
-
-
-
-
-
- Survey
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- Employee Details
-
- multiple_textboxes_diff_type
- The comment you entered is in an invalid format.
-
-
-
- Other
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- Engagement
-
- matrix_of_choices_only_one_ans
- The comment you entered is in an invalid format.
-
-
-
- Other
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- Leadership
-
- matrix_of_choices_only_one_ans
-
-
-
-
-
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- Effectiveness
-
- matrix_of_choices_only_one_ans
- The comment you entered is in an invalid format.
-
-
-
- Other
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- Continuous Improvement
-
- matrix_of_choices_only_one_ans
- The comment you entered is in an invalid format.
-
-
-
- Other
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- Openness
-
- matrix_of_choices_only_one_ans
- The comment you entered is in an invalid format.
-
-
-
- Other
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- Miscellaneous
-
- matrix_of_choices_only_one_ans
- The comment you entered is in an invalid format.
-
-
-
- Other
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- Additional comments :
-
- comment
- The comment you entered is in an invalid format.
-
-
-
- Other
-
-
-
-
-
-
-
- 1
- do_not_validate
- do_not_validate
- Please enter a comment.
- The choices need to add up to [enter sum here].
-
- The comment you entered is in an invalid format.
-
- This question requires an answer.
-
- At the supervisor's appraisal date
-
- descriptive_text
- The comment you entered is in an invalid format.
- * His direct reports will be invited through OpenERP to express a feedback on their supervisor's leadership and to give their opinion about their own engagement and effectiveness, the continuous improvement and openness in action in the company, ...
-
-* The employees will send back their anonymous answers to OpenERP. The data will be handled by the HR manager and a brief summary of the data will be sent to the concerned supervisor, to his team and to the supervisor's supervisor.
-* The appraiser should rate the employee’s major work accomplishments and performance according to the metric provided below :
-
- 1 - Significantly exceeds standards and expectations required of the position
- 2 - Exceeds standards and expectations
- 3 - Meet standards and expectations
- 4 - Did not meet standards and expectations
- 5 - Significantly below standards and expectations
-
-
-
- Other
-
-
-
-
-
-
-
- 1
- 1
- 1
-
-
-
-
-
-
- 1
- 1
- 2
-
-
-
-
-
-
- 1
- 1
- 3
-
-
-
-
-
-
- 1
- 1
- 4
-
-
-
-
-
-
- 1
- 1
- 5
-
-
-
-
-
-
- 1
- 1
- 1
-
-
-
-
-
-
- 1
- 1
- 2
-
-
-
-
-
-
- 1
- 1
- 3
-
-
-
-
-
-
- 1
- 1
- 4
-
-
-
-
-
-
- 1
- 1
- 5
-
-
-
-
-
-
- 1
- 1
- 1
-
-
-
-
-
-
- 1
- 1
- 2
-
-
-
-
-
-
- 1
- 1
- 3
-
-
-
-
-
-
- 1
- 1
- 4
-
-
-
-
-
-
- 1
- 1
- 5
-
-
-
-
-
-
- 1
- 1
- 1
-
-
-
-
-
-
- 1
- 1
- 2
-
-
-
-
-
-
- 1
- 1
- 3
-
-
-
-
-
-
- 1
- 1
- 4
-
-
-
-
-
-
- 1
- 1
- 5
-
-
-
-
-
-
- 1
- 1
- 1
-
-
-
-
-
-
- 1
- 1
- 2
-
-
-
-
-
-
- 1
- 1
- 3
-
-
-
-
-
-
- 1
- 1
- 4
-
-
-
-
-
-
- 1
- 1
- 5
-
-
-
-
-
-
- 1
- 1
- 1
-
-
-
-
-
-
- 1
- 1
- 2
-
-
-
-
-
-
- 1
- 1
- 3
-
-
-
-
-
-
- 1
- 1
- 4
-
-
-
-
-
-
- 1
- 1
- 5
-
-
-
-
-
-
- 1
- Demonstrates genuine concern for me as a person.
-
-
-
-
-
-
-
- 1
- I'm efficient at work and my achievements are successful.
-
-
-
-
-
-
-
- 1
- I am proud to tell others I work here.
-
-
-
-
-
-
-
- 0
- Name of your direct supervisor
-
- char
-
-
-
-
-
-
- 1
- Actions by Executive management show genuine interest in the well-being of employees.
-
-
-
-
-
-
-
- 1
- I know the company's values and live them.
-
-
-
-
-
-
-
- 1
- My work contributes towards the continuous improvement of the company, our services or products.
-
-
-
-
-
-
-
- 1
- I have enough work.
-
-
-
-
-
-
-
- 0
- Date
-
- datetime
-
-
-
-
-
-
- 1
- I consistently acquire new knowledge, skills or understanding through contact with my supervisor. He helps me growing my compete
-
-
-
-
-
-
-
- 1
- My job provides me with a sense of personal accomplishment.
-
-
-
-
-
-
-
- 1
- What I did several months ago is still of use to the company, the services or the products today.
-
-
-
-
-
-
-
- 1
- My best achievements have been communicated to the community, internally or to customers.
-
-
-
-
-
-
-
- 1
- I have the same opportunity to succeed as others with similar experiences, performance and educational background.
-
-
-
-
-
-
-
- 1
- Compared to similar jobs in other companies where I could work, my total compensation is:
-(Scale: Well below others, Below othe
-
-
-
-
-
-
-
- 1
- Overall, I believe the quality of products and/or services my workgroup delivers is improving.
-
-
-
-
-
-
-
- 1
- I would prefer to remain with this company even if a comparable job were available in another company.
-
-
-
-
-
-
-
- 1
- Listens and takes into account all ideas and do his best to put in place the best of these.
-
-
-
-
-
-
-
- 1
- I mostly work on value-added tasks for the company, the products or the services. (Value-added task : significant improvement pe
-
-
-
-
-
-
-
- 1
- Our workgroup identifies and reduces waste of time in our activities and processes.
-
-
-
-
-
-
-
- 1
- Taking everything into account, how satisfied are you with your current job?
-
-
-
-
-
-
-
- 1
- I understand the company strategy and how my workgroup supports it.
-
-
-
-
-
-
-
-
- 1
- I am willing to put in a great deal of effort beyond what is expected to help my workgroup succeed.
-
-
-
-
-
-
-
- 1
- I believe the information that I get from the person I report to.
-
-
-
-
-
-
-
-
-
- Manager's Evaluation Plan
-
-
-
-
-
-
-
-
- Send to Subordinates
-
-
-
- bottom-up
-
-
-
-
-
-
-
-
-
-
-
- Send to Managers
-
-
-
- top-down
-
-
-
-
-
-
-
-
-
-
-
- Send to Employee
-
-
-
- self
-
-
-
-
-
-
-
-
-
-
-
- Final Interview With Manager
-
-
-
- final
-
-
-
-
-
-
-
-
-
-
- Run Employee Evaluation
-
-
- 1
- minutes
- -1
-
-
-
-
-
-
- Employee Evaluation
-
- [('employee_id.user_id','=',user.id)]
-
-
-
- Manager Evaluation
-
- ['|',('employee_id.user_id','=',user.id),('employee_id.parent_id.user_id','=',user.id )]
-
-
-
-
-
diff --git a/addons/hr_evaluation/hr_evaluation_installer.xml b/addons/hr_evaluation/hr_evaluation_installer.xml
index 4ef0013a4c2..842363559a9 100644
--- a/addons/hr_evaluation/hr_evaluation_installer.xml
+++ b/addons/hr_evaluation/hr_evaluation_installer.xml
@@ -6,7 +6,7 @@
ir.actions.act_windowhr_evaluation.planform
- form,tree
+ tree,form
diff --git a/addons/hr_expense/hr_expense_installer_view.xml b/addons/hr_expense/hr_expense_installer_view.xml
index a5c378238a6..bdb5fdedcb4 100644
--- a/addons/hr_expense/hr_expense_installer_view.xml
+++ b/addons/hr_expense/hr_expense_installer_view.xml
@@ -24,6 +24,7 @@
[('hr_expense_ok','=',True)]
+ Define one product for each expense type allowed for an employee (travel by car, hostel, restaurant, etc). If you reimburse the employees at a fixed rate, set a cost and a unit of measure on the product. If you reimburse based on real costs, set the cost at 0.00. The user will set the real price when recording his expense sheet.
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index 2dcb448d3cf..77cd53551b8 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -358,12 +358,24 @@ class hr_employee(osv.osv):
leave_id = holiday_obj.create(cr, uid, {'name': _('Leave Request for %s') % employee.name, 'employee_id': employee.id, 'holiday_status_id': status_id, 'type': 'remove', 'holiday_type': 'employee', 'number_of_days_temp': abs(diff)}, context=context)
else:
return False
- holiday_obj.holidays_confirm(cr, uid, [leave_id])
- holiday_obj.holidays_validate2(cr, uid, [leave_id])
+ wf_service = netsvc.LocalService("workflow")
+ wf_service.trg_validate(uid, 'hr.holidays', leave_id, 'confirm', cr)
+ wf_service.trg_validate(uid, 'hr.holidays', leave_id, 'validate', cr)
+ wf_service.trg_validate(uid, 'hr.holidays', leave_id, 'second_validate', cr)
return True
def _get_remaining_days(self, cr, uid, ids, name, args, context=None):
- cr.execute("SELECT sum(h.number_of_days_temp) as days, h.employee_id from hr_holidays h join hr_holidays_status s on (s.id=h.holiday_status_id) where h.type='add' and h.state='validate' and s.limit=False group by h.employee_id")
+ cr.execute("""SELECT
+ sum(h.number_of_days) as days,
+ h.employee_id
+ from
+ hr_holidays h
+ join hr_holidays_status s on (s.id=h.holiday_status_id)
+ where
+ h.state='validate' and
+ s.limit=False and
+ h.employee_id in (%s)
+ group by h.employee_id"""% (','.join(map(str,ids)),) )
res = cr.dictfetchall()
remaining = {}
for r in res:
@@ -373,11 +385,10 @@ class hr_employee(osv.osv):
remaining[employee_id] = 0.0
return remaining
-
_columns = {
- 'remaining_leaves': fields.function(_get_remaining_days, string='Remaining Legal Leaves', fnct_inv=_set_remaining_days, type="float", help='Total number of legal leaves allocated to this employee, change this value to create allocation/leave requests.', store=True),
+ 'remaining_leaves': fields.function(_get_remaining_days, string='Remaining Legal Leaves', fnct_inv=_set_remaining_days, type="float", help='Total number of legal leaves allocated to this employee, change this value to create allocation/leave requests.'),
}
hr_employee()
-# 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/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml
index 80a33b0b72c..b6d6a64ed26 100644
--- a/addons/hr_holidays/hr_holidays_view.xml
+++ b/addons/hr_holidays/hr_holidays_view.xml
@@ -10,7 +10,7 @@
-
+
@@ -21,8 +21,6 @@
-
-
@@ -145,7 +143,7 @@
hr.holidaystree
-
+
@@ -225,7 +223,7 @@
hr.holidaystree
-
+
@@ -314,7 +312,7 @@
formtree,form
- {'search_default_my_leaves': 1, 'search_default_group_type': 1}
+ {'search_default_my_leaves': 1, 'search_default_group_type': 1, 'search_default_validated': 1}[('holiday_type','=','employee')]
@@ -437,7 +435,7 @@
hr.employeetree
-
+
@@ -451,13 +449,14 @@
formtree,form
+ You can assign remaining Legal Leaves for each employee, OpenERP will automatically create and validate allocation requests.
-
-
+
+
@@ -467,7 +466,7 @@
-
+
diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py
index 77a1bcb7b8f..e2ecf522cae 100644
--- a/addons/hr_recruitment/hr_recruitment.py
+++ b/addons/hr_recruitment/hr_recruitment.py
@@ -180,6 +180,7 @@ class hr_applicant(crm.crm_case, osv.osv):
multi='day_open', type="float", store=True),
'day_close': fields.function(_compute_day, string='Days to Close', \
multi='day_close', type="float", store=True),
+ 'color': fields.integer('Color Index'),
}
def _get_stage(self, cr, uid, context=None):
@@ -194,6 +195,7 @@ class hr_applicant(crm.crm_case, osv.osv):
'priority': lambda *a: '',
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c),
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
+ 'color': 0,
}
def onchange_job(self,cr, uid, ids, job, context=None):
@@ -442,6 +444,21 @@ class hr_applicant(crm.crm_case, osv.osv):
res = super(hr_applicant, self).case_reset(cr, uid, ids, *args)
self.write(cr, uid, ids, {'date_open': False, 'date_closed': False})
return res
+
+ def set_priority(self, cr, uid, ids, priority):
+ """Set lead priority
+ """
+ return self.write(cr, uid, ids, {'priority' : priority})
+
+ def set_high_priority(self, cr, uid, ids, *args):
+ """Set lead priority to high
+ """
+ return self.set_priority(cr, uid, ids, '1')
+
+ def set_normal_priority(self, cr, uid, ids, *args):
+ """Set lead priority to normal
+ """
+ return self.set_priority(cr, uid, ids, '3')
def write(self, cr, uid, ids, vals, context=None):
if 'stage_id' in vals and vals['stage_id']:
diff --git a/addons/hr_recruitment/hr_recruitment_menu.xml b/addons/hr_recruitment/hr_recruitment_menu.xml
index 9883e311fba..0bac3f8615a 100644
--- a/addons/hr_recruitment/hr_recruitment_menu.xml
+++ b/addons/hr_recruitment/hr_recruitment_menu.xml
@@ -6,7 +6,7 @@
Applicantshr.applicant
- tree,form,graph,calendar
+ tree,form,graph,calendar,kanban{"search_default_user_id":uid, 'search_default_current': 1,"search_default_department_id": department_id}
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index 8dd5e171206..e5905b16a77 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -277,7 +277,81 @@
+
+
+ Hr Applicants kanban
+ hr.applicant
+ kanban
+
+
+
+
+
+
+
+
+
+
+
# ------------------------------------------------------
# HR Job
# ------------------------------------------------------
diff --git a/addons/hr_timesheet/hr_timesheet_data.xml b/addons/hr_timesheet/hr_timesheet_data.xml
index 74403343a03..e6130806b2e 100644
--- a/addons/hr_timesheet/hr_timesheet_data.xml
+++ b/addons/hr_timesheet/hr_timesheet_data.xml
@@ -16,7 +16,7 @@
-
+
TSTimesheet Journal
diff --git a/addons/hr_timesheet/hr_timesheet_installer.xml b/addons/hr_timesheet/hr_timesheet_installer.xml
index 66289ed0c0c..cfd2cc8ab88 100644
--- a/addons/hr_timesheet/hr_timesheet_installer.xml
+++ b/addons/hr_timesheet/hr_timesheet_installer.xml
@@ -7,6 +7,7 @@
account.analytic.accountformtree,form
+ You should create an analytic account structure depending on your needs to analyse costs and revenues. In OpenERP, analytic accounts are also used to track customer contracts.
diff --git a/addons/hr_timesheet/hr_timesheet_view.xml b/addons/hr_timesheet/hr_timesheet_view.xml
index 710291c8f32..f2b8a6beb0f 100644
--- a/addons/hr_timesheet/hr_timesheet_view.xml
+++ b/addons/hr_timesheet/hr_timesheet_view.xml
@@ -104,8 +104,8 @@
-
+
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index 1983b75d3f6..5e0fc9a5b36 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -774,7 +774,8 @@ class res_company(osv.osv):
_inherit = 'res.company'
_columns = {
'timesheet_range': fields.selection(
- [('day','Day'),('week','Week'),('month','Month'),('year','Year')], 'Timesheet range'),
+ [('day','Day'),('week','Week'),('month','Month')], 'Timesheet range',
+ help="Periodicity on which you validate your timesheets."),
'timesheet_max_difference': fields.float('Timesheet allowed difference(Hours)',
help="Allowed difference in hours between the sign in/out and the timesheet " \
"computation for one sheet. Set this to 0 if you do not want any control."),
diff --git a/addons/l10n_ch/journal_data.xml b/addons/l10n_ch/journal_data.xml
index ac8c714fbca..c755660d950 100644
--- a/addons/l10n_ch/journal_data.xml
+++ b/addons/l10n_ch/journal_data.xml
@@ -6,7 +6,6 @@
EXPFpurchase
-
@@ -17,7 +16,6 @@
BCHFcash
-
@@ -28,7 +26,6 @@
BEURcash
-
@@ -40,7 +37,6 @@
CAIcash
-
@@ -51,7 +47,6 @@
ODgeneral
-
@@ -63,7 +58,6 @@
situationTrue
-
diff --git a/addons/lunch/lunch_installer_view.xml b/addons/lunch/lunch_installer_view.xml
index 693ac9aa27f..716ba36a49c 100644
--- a/addons/lunch/lunch_installer_view.xml
+++ b/addons/lunch/lunch_installer_view.xml
@@ -6,7 +6,8 @@
lunch.productformtree,form
-
+
+ Define all products that the employees can order for the lunch time. If you order lunch at several places, you can use the product categories to split by supplier. It will be easier for the lunch manager to filter lunch orders by categories.
@@ -16,11 +17,12 @@
- Create CashBox
+ Create Lunch Cash Boxesir.actions.act_windowlunch.cashboxform
- form
+ tree,form
+ You can create on cashbox by employee if you want to keep track of the amount due by employee according to what have been ordered.
diff --git a/addons/lunch/lunch_view.xml b/addons/lunch/lunch_view.xml
index 0b2cdf04e89..50932a03437 100644
--- a/addons/lunch/lunch_view.xml
+++ b/addons/lunch/lunch_view.xml
@@ -262,7 +262,7 @@
- Load Outlook Plug-In
+ Install Outlook Plug-InThis plug-in allows you to link your e-mail to OpenERP's documents. You can attach it to any existing one in OpenERP or create a new one.
-
-
+
-
@@ -46,7 +44,7 @@
-
+
project.task.tree
@@ -502,6 +511,21 @@
A task represents a work that has to be done. Each user works in his own list of tasks where he can record his task work in hours. He can work and close the task itself or delegate it to another user. If you delegate a task to another user, you get a new task in pending state, which will be reopened when you have to review the work achieved. If you install the project_timesheet module, task work can be invoiced based on the project configuration. With the project_mrp module, sales orders can create tasks automatically when they are confirmed.
+
+
+
+ tree
+
+
+
+
+
+
+ form
+
+
+
+
@@ -533,6 +557,21 @@
+
+ project.task.type.search
+ project.task.type
+ search
+
+
+
+
+
+
+
+
+
+
+
project.task.type.formproject.task.type
@@ -540,7 +579,7 @@
+
+
+
+
+
+
+
+
+
+
+
# ------------------------------------------------------
# Feature Requests
# ------------------------------------------------------
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index dcf29bfaceb..db494add04b 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -188,11 +188,11 @@ class purchase_order(osv.osv):
'shipped_rate': fields.function(_shipped_rate, string='Received', type='float'),
'invoiced': fields.function(_invoiced, string='Invoiced & Paid', type='boolean', help="It indicates that an invoice has been paid"),
'invoiced_rate': fields.function(_invoiced_rate, string='Invoiced', type='float'),
- 'invoice_method': fields.selection([('manual','From PO/PO lines'),('order','Draft invoices pre-generated'),('picking','From receptions')], 'Invoicing Control', required=True,
- help="From Order: a draft invoice will be generated based on the purchase order. The accountant " \
+ 'invoice_method': fields.selection([('manual','Based on purchase order lines'),('order','Draft invoices pre-generated'),('picking','Based on receptions')], 'Invoicing Control', required=True,
+ help="Based on orders: a draft invoice will be generated based on the purchase order. The accountant " \
"will just have to validate this invoice for control.\n" \
- "From Reception: a draft invoice will be generated based on validated receptions.\n" \
- "Manual: allows you to generate suppliers invoices by chosing in the uninvoiced lines of all manual purchase orders."
+ "Based on receptions: a draft invoice will be generated based on validated receptions.\n" \
+ "Pre-generate Invoice: allows you to generate draft suppliers invoices on validation of the PO."
),
'minimum_planned_date':fields.function(_minimum_planned_date, fnct_inv=_set_minimum_planned_date, string='Expected Date', type='date', select=True, help="This is computed as the minimum scheduled date of all purchase order lines' products.",
store = {
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index cb7224faaf0..60c6c39bf05 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -497,14 +497,14 @@
- On Purchase Order Line
+ On Purchase Order Linesir.actions.act_windowpurchase.order.line[('order_id.invoice_method','<>','picking'), ('state','in',('confirmed','done')), ('invoiced', '=', False)]formtree,form
- If you set the invoicing control on a purchase order as "Manual", you can track here all the purchase order lines for which you have not received the supplier invoice yet. Once you are ready to receive a supplier invoice, you can generate a draft supplier invoice based on the lines from this menu.
+ If you set the invoicing control on a purchase order as "Based on Purchase Order Lines", you can track here all the purchase order lines for which you have not received the supplier invoice yet. Once you are ready to receive a supplier invoice, you can generate a draft supplier invoice based on the lines from this menu.
diff --git a/addons/purchase/wizard/purchase_installer.py b/addons/purchase/wizard/purchase_installer.py
index 1fe462ce191..a96d07f6caf 100644
--- a/addons/purchase/wizard/purchase_installer.py
+++ b/addons/purchase/wizard/purchase_installer.py
@@ -22,24 +22,24 @@ from osv import fields, osv
class purchase_config_wizard(osv.osv_memory):
_name = 'purchase.config.wizard'
+ _inherit = 'res.config'
_columns = {
'default_method' : fields.selection(
- [('manual', 'Based on Purchase Orders'),
+ [('manual', 'Based on Purchase Order Lines'),
('picking', 'Based on Receptions'),
- ('order', 'Pre-Generate Draft Invoices on Purchase Orders'),
- ],
- 'Default Invoicing Control Method',
- required=True,
- ),
+ ('order', 'Pre-Generate Draft Invoices on Based Purchase Orders'),
+ ], 'Default Invoicing Control Method', required=True,
+ )
+ }
+ _defaults = {
+ 'default_method': lambda s,c,u,ctx: s.pool.get('purchase.order').default_get(c,u,['invoice_method'],context=ctx)['invoice_method']
}
- def validate_cb(self, cr, uid, ids, context=None):
+ def execute(self, cr, uid, ids, context=None):
wizard = self.browse(cr, uid, ids, context=context)[0]
-
proxy = self.pool.get('ir.values')
proxy.set(cr, uid, 'default', False, 'invoice_method', ['purchase.order'], wizard.default_method),
-
return {'type' : 'ir.actions.act_window_close'}
purchase_config_wizard()
diff --git a/addons/purchase/wizard/purchase_installer.xml b/addons/purchase/wizard/purchase_installer.xml
index 31c6a7ad6bc..37ae97e9eca 100644
--- a/addons/purchase/wizard/purchase_installer.xml
+++ b/addons/purchase/wizard/purchase_installer.xml
@@ -24,32 +24,49 @@
- purchase.view_purchase_config
- form
+ Invoicing Control on Purchasespurchase.config.wizard
+ form
+
-
-
-
-
-
-
-
-
+
+
+ Invoicing Control on Purchases
+
+
+ Invoicing Control on Purchases
+
+
+ This tool will help you to select the method you want to use to control supplier invoices.
+
+
+
+ 12
+
+
+
+
+
+
+
+
Set the Default Invoicing Control Methodpurchase.config.wizardformformnew
+
+
+ once
diff --git a/addons/purchase_double_validation/purchase_double_validation_installer.xml b/addons/purchase_double_validation/purchase_double_validation_installer.xml
index 9a06f66164a..490581e472b 100644
--- a/addons/purchase_double_validation/purchase_double_validation_installer.xml
+++ b/addons/purchase_double_validation/purchase_double_validation_installer.xml
@@ -44,6 +44,7 @@
+ once
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 16cb5faf065..d9b8cfb88f9 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -216,7 +216,7 @@ class sale_order(osv.osv):
'partner_shipping_id': fields.many2one('res.partner.address', 'Shipping Address', readonly=True, required=True, states={'draft': [('readonly', False)]}, help="Shipping address for current sales order."),
'incoterm': fields.many2one('stock.incoterms', 'Incoterm', help="Incoterm which stands for 'International Commercial terms' implies its a series of sales terms which are used in the commercial transaction."),
- 'picking_policy': fields.selection([('direct', 'Partial Delivery'), ('one', 'Complete Delivery')],
+ 'picking_policy': fields.selection([('direct', 'Deliver each products when available'), ('one', 'Deliver all products at once')],
'Picking Policy', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="""If you don't have enough stock available to deliver all at once, do you accept partial shipments or not?"""),
'order_policy': fields.selection([
('prepaid', 'Pay before delivery'),
@@ -1216,7 +1216,7 @@ class sale_config_picking_policy(osv.osv_memory):
('manual', 'Invoice Based on Sales Orders'),
('picking', 'Invoice Based on Deliveries'),
], 'Main Method Based On', required=True, help="You can generate invoices based on sales orders or based on shippings."),
- 'charge_delivery': fields.boolean('Do you charge the delivery'),
+ 'charge_delivery': fields.boolean('Do you charge the delivery?'),
'time_unit': fields.many2one('product.uom','Main Working Time Unit')
}
_defaults = {
@@ -1225,12 +1225,10 @@ class sale_config_picking_policy(osv.osv_memory):
def onchange_order(self, cr, uid, ids, sale, deli, context=None):
res = {}
- if sale or deli:
+ if sale:
res.update({'order_policy': 'manual'})
- elif not sale and not deli:
- res.update({'order_policy': 'manual'})
- else:
- return {}
+ elif deli:
+ res.update({'order_policy': 'picking'})
return {'value':res}
def execute(self, cr, uid, ids, context=None):
@@ -1240,26 +1238,18 @@ class sale_config_picking_policy(osv.osv_memory):
module_obj = self.pool.get('ir.module.module')
module_upgrade_obj = self.pool.get('base.module.upgrade')
module_name = []
- group_ids=[]
- group_name = ['group_sale_salesman','group_sale_manager']
- for name in group_name:
- data_id = data_obj.name_search(cr, uid, name)
- group_ids.append(data_obj.browse(cr,uid,data_id[0][0]).res_id)
+ group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
wizard = self.browse(cr, uid, ids)[0]
if wizard.sale_orders:
- menu_name = 'menu_invoicing_sales_order_lines'
- data_id = data_obj.name_search(cr, uid, menu_name)
- menu_id = data_obj.browse(cr,uid,data_id[0][0]).res_id
- menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_ids[0]),(4,group_ids[1])]})
+ menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_invoicing_sales_order_lines').id
+ menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
if wizard.deli_orders:
- menu_name = 'menu_action_picking_list_to_invoice'
- data_id = data_obj.name_search(cr, uid, menu_name)
- menu_id = data_obj.browse(cr,uid,data_id[0][0]).res_id
- menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_ids[0]),(4,group_ids[1])]})
+ menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_action_picking_list_to_invoice').id
+ menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
if wizard.task_work:
module_name.append('project_timesheet')
@@ -1269,12 +1259,7 @@ class sale_config_picking_policy(osv.osv_memory):
module_name.append('account_analytic_analysis')
if wizard.charge_delivery:
- module_name.append('delivery')
-
- if wizard.time_unit:
- product_obj = self.pool.get('product.product')
- product_id = product_obj.name_search(cr, uid, 'Employee')
- product_obj.write(cr, uid, product_id[0][0], {'uom_id':wizard.time_unit.id})
+ module_name.append('delivery')
if len(module_name):
module_ids = []
@@ -1292,7 +1277,17 @@ class sale_config_picking_policy(osv.osv_memory):
if need_install:
pooler.restart_pool(cr.dbname, update_module=True)[1]
+ if wizard.time_unit:
+ prod_id = data_obj.get_object(cr, uid, 'hr_timesheet', 'product_consultant').id
+ product_obj = self.pool.get('product.product')
+ product_obj.write(cr, uid, prod_id, {'uom_id':wizard.time_unit.id, 'uom_po_id': wizard.time_unit.id})
+
ir_values_obj.set(cr, uid, 'default', False, 'order_policy', ['sale.order'], wizard.order_policy)
+ if wizard.task_work and wizard.time_unit:
+ company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
+ self.pool.get('res.company').write(cr, uid, [company_id], {
+ 'project_time_mode_id': wizard.time_unit.id
+ }, context=context)
sale_config_picking_policy()
diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml
index 41f7534c8e2..4622577ac3d 100644
--- a/addons/sale/sale_data.xml
+++ b/addons/sale/sale_data.xml
@@ -13,11 +13,15 @@
Resource: sale.shop
-->
-
-
-
-
+
+
+
+
+
+
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index b7f5d11e15f..4669a9d7d9c 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -481,54 +481,50 @@
- Set Up Your Invoicing Method
+ Setup Your Invoicing Methodsale.config.picking_policyform
- Sales Application Configuration
+ Setup your Invoicing Method
-
-
-
+
+
+ Setup your Invoicing Method
+
+
+ This tool will help you to install the right module and configure the system according to the method you use to invoice your customers.
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
- Set up your Invoicing Method
+ Setup your Invoicing Methodir.actions.act_windowsale.config.picking_policy
@@ -541,6 +537,7 @@
+ once
diff --git a/addons/sale/test/data_test.yml b/addons/sale/test/data_test.yml
index 7064a549335..0be8474754c 100644
--- a/addons/sale/test/data_test.yml
+++ b/addons/sale/test/data_test.yml
@@ -122,7 +122,6 @@
default_credit_account_id: account_account_purchases0
default_debit_account_id: account_account_purchases0
name: Purchase Journal - (test)
- sequence_id: account.sequence_purchase_journal
type: purchase
view_id: account.account_journal_view
-
@@ -134,7 +133,6 @@
default_credit_account_id: account_account_sales0
default_debit_account_id: account_account_sales0
name: Sale Journal
- sequence_id: account.sequence_sale_journal
type: sale
view_id: account.account_journal_view
-
@@ -146,7 +144,6 @@
default_credit_account_id: account_account_cash0
default_debit_account_id: account_account_cash0
name: Bank Journal
- sequence_id: account.sequence_journal
type: cash
view_id: account.account_journal_bank_view
-
diff --git a/addons/share/res_users.py b/addons/share/res_users.py
index 81683066220..07031ab3845 100644
--- a/addons/share/res_users.py
+++ b/addons/share/res_users.py
@@ -24,7 +24,7 @@ class res_groups(osv.osv):
_name = "res.groups"
_inherit = 'res.groups'
_columns = {
- 'share': fields.boolean('Share Group', groups='share.group_share', readonly=True,
+ 'share': fields.boolean('Share Group', readonly=True,
help="Group created to set access rights for sharing data with some users.")
}
res_groups()
@@ -33,7 +33,7 @@ class res_users(osv.osv):
_name = 'res.users'
_inherit = 'res.users'
_columns = {
- 'share': fields.boolean('Share User', groups='share.group_share', readonly=True,
+ 'share': fields.boolean('Share User', readonly=True,
help="External user with limited access, created only for the purpose of sharing data.")
}
res_users()
diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml
index 80d7ed6efa0..a0059ce60d3 100644
--- a/addons/stock/product_view.xml
+++ b/addons/stock/product_view.xml
@@ -120,6 +120,67 @@
+
+
+ Product Kanban
+ product.product
+ kanban
+
+
+
+
+
+