summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajesh Prajapati (OpenERP) <rpr@tinyerp.com>2013-03-26 09:55:22 +0530
committerRajesh Prajapati (OpenERP) <rpr@tinyerp.com>2013-03-26 09:55:22 +0530
commitcd825a78b0cbf73bda793ec766c49c4c55cdf6c8 (patch)
treeb834deede3199310204525cf566573319c11ea2e
parentf449ab66d9224a7f6aa9e11ded9959191e0bd218 (diff)
parent6f72fe32353e8bab50e70a2b28d1b43add871f75 (diff)
[MERGE] merge with lp:openobject-addons
bzr revid: rpr@tinyerp.com-20130326042522-rmfuc68vebkglu6a
-rw-r--r--addons/account/account_invoice.py2
-rw-r--r--addons/account/account_move_line.py9
-rw-r--r--addons/account/partner.py2
-rw-r--r--addons/account/static/src/xml/account_move_reconciliation.xml4
-rw-r--r--addons/account/test/account_bank_statement.yml2
-rw-r--r--addons/account/test/account_use_model.yml6
-rw-r--r--addons/account_test/i18n/zh_CN.po241
-rw-r--r--addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py13
-rw-r--r--addons/analytic_contract_hr_expense/i18n/hu.po72
-rw-r--r--addons/analytic_user_function/i18n/hu.po36
-rw-r--r--addons/anonymization/i18n/hu.po350
-rw-r--r--addons/association/i18n/hu.po10
-rw-r--r--addons/audittrail/i18n/hu.po103
-rw-r--r--addons/auth_oauth/controllers/main.py9
-rw-r--r--addons/auth_oauth/i18n/tr.po135
-rw-r--r--addons/auth_openid/i18n/ru.po97
-rw-r--r--addons/auth_signup/i18n/es_CO.po298
-rw-r--r--addons/auth_signup/i18n/hu.po49
-rw-r--r--addons/base_action_rule/base_action_rule_view.xml4
-rw-r--r--addons/contacts/i18n/es_CO.po46
-rw-r--r--addons/hr_payroll/test/payslip.yml3
-rw-r--r--addons/hr_payroll_account/test/hr_payroll_account.yml6
-rw-r--r--addons/hr_timesheet/hr_timesheet.py3
-rw-r--r--addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml21
-rw-r--r--addons/l10n_be_coda/l10n_be_coda_view.xml1
-rw-r--r--addons/mail/mail_alias.py9
-rw-r--r--addons/mail/mail_followers.py14
-rw-r--r--addons/mail/mail_mail.py26
-rw-r--r--addons/mail/mail_thread.py31
-rw-r--r--addons/mail/static/src/js/mail.js20
-rw-r--r--addons/mail/tests/__init__.py3
-rw-r--r--addons/mail/tests/test_mail_base.py4
-rw-r--r--addons/mail/tests/test_mail_features.py680
-rw-r--r--addons/mail/tests/test_mail_gateway.py330
-rw-r--r--addons/mail/wizard/mail_compose_message.py30
-rw-r--r--addons/membership/test/test_membership.yml6
-rw-r--r--addons/mrp/i18n/es_MX.po3028
-rw-r--r--addons/mrp/mrp_view.xml9
-rw-r--r--addons/mrp_repair/i18n/lv.po819
-rw-r--r--addons/mrp_repair/test/test_mrp_repair_afterinv.yml2
-rw-r--r--addons/mrp_repair/test/test_mrp_repair_b4inv.yml2
-rw-r--r--addons/mrp_repair/test/test_mrp_repair_noneinv.yml2
-rw-r--r--addons/point_of_sale/point_of_sale.py2
-rw-r--r--addons/point_of_sale/wizard/pos_box.py4
-rw-r--r--addons/portal_anonymous/static/src/js/portal_anonymous.js6
-rw-r--r--addons/portal_project_long_term/__init__.py20
-rw-r--r--addons/portal_project_long_term/__openerp__.py42
-rw-r--r--addons/portal_project_long_term/security/ir.model.access.csv2
-rw-r--r--addons/portal_project_long_term/security/portal_security.xml17
-rw-r--r--addons/portal_sale/i18n/es_MX.po548
-rw-r--r--addons/project_issue/project_issue.py29
-rw-r--r--addons/report_webkit/__openerp__.py3
-rw-r--r--addons/report_webkit/test/print.yml10
-rw-r--r--addons/sale/report/sale_order.py11
-rw-r--r--addons/sale/report/sale_order.rml4
-rw-r--r--addons/sale/report/sale_report.py3
-rw-r--r--addons/sale_mrp/test/sale_mrp.yml7
-rw-r--r--addons/sale_stock/report/sale_report.py4
-rw-r--r--addons/stock/stock.py35
-rw-r--r--addons/stock/stock_view.xml2
-rw-r--r--addons/stock_location/test/stock_location_push_flow.yml6
-rw-r--r--addons/subscription/subscription.py11
62 files changed, 4732 insertions, 2571 deletions
diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py
index d771bc59506..af762611ec2 100644
--- a/addons/account/account_invoice.py
+++ b/addons/account/account_invoice.py
@@ -97,6 +97,8 @@ class account_invoice(osv.osv):
for m in invoice.move_id.line_id:
if m.account_id.type in ('receivable','payable'):
result[invoice.id] += m.amount_residual_currency
+ #prevent the residual amount on the invoice to be less than 0
+ result[invoice.id] = max(result[invoice.id], 0.0)
return result
# Give Journal Items related to the payment reconciled to this invoice
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index a96ed889aae..36d211c11d2 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -741,20 +741,17 @@ class account_move_line(osv.osv):
def list_partners_to_reconcile(self, cr, uid, context=None):
cr.execute(
- """
- SELECT partner_id
- FROM (
- SELECT l.partner_id, p.last_reconciliation_date, SUM(l.debit) AS debit, SUM(l.credit) AS credit
+ """SELECT partner_id FROM (
+ SELECT l.partner_id, p.last_reconciliation_date, SUM(l.debit) AS debit, SUM(l.credit) AS credit, MAX(l.date) AS max_date
FROM account_move_line l
RIGHT JOIN account_account a ON (a.id = l.account_id)
RIGHT JOIN res_partner p ON (l.partner_id = p.id)
WHERE a.reconcile IS TRUE
AND l.reconcile_id IS NULL
- AND (p.last_reconciliation_date IS NULL OR l.date > p.last_reconciliation_date)
AND l.state <> 'draft'
GROUP BY l.partner_id, p.last_reconciliation_date
) AS s
- WHERE debit > 0 AND credit > 0
+ WHERE debit > 0 AND credit > 0 AND (last_reconciliation_date IS NULL OR max_date > last_reconciliation_date)
ORDER BY last_reconciliation_date""")
ids = cr.fetchall()
ids = len(ids) and [x[0] for x in ids] or []
diff --git a/addons/account/partner.py b/addons/account/partner.py
index 346cc38f5df..ae8d2fc1871 100644
--- a/addons/account/partner.py
+++ b/addons/account/partner.py
@@ -233,7 +233,7 @@ class res_partner(osv.osv):
help="This payment term will be used instead of the default one for purchase orders and supplier invoices"),
'ref_companies': fields.one2many('res.company', 'partner_id',
'Companies that refers to partner'),
- 'last_reconciliation_date': fields.datetime('Latest Reconciliation Date', help='Date on which the partner accounting entries were fully reconciled last time. It differs from the date of the last reconciliation made for this partner, as here we depict the fact that nothing more was to be reconciled at this date. This can be achieved in 2 ways: either the last debit/credit entry was reconciled, either the user pressed the button "Fully Reconciled" in the manual reconciliation process')
+ 'last_reconciliation_date': fields.datetime('Latest Full Reconciliation Date', help='Date on which the partner accounting entries were fully reconciled last time. It differs from the last date where a reconciliation has been made for this partner, as here we depict the fact that nothing more was to be reconciled at this date. This can be achieved in 2 different ways: either the last unreconciled debit/credit entry of this partner was reconciled, either the user pressed the button "Nothing more to reconcile" during the manual reconciliation process.')
}
res_partner()
diff --git a/addons/account/static/src/xml/account_move_reconciliation.xml b/addons/account/static/src/xml/account_move_reconciliation.xml
index d7b5301238d..3074fdb49b1 100644
--- a/addons/account/static/src/xml/account_move_reconciliation.xml
+++ b/addons/account/static/src/xml/account_move_reconciliation.xml
@@ -22,13 +22,13 @@
<button class="oe_account_recon_next oe_button" href="javascript:void(0)">&gt;</button>
</div>
<div>
- Last Reconciliation: <t t-esc="widget.last_reconciliation_date" />
+ Latest Manual Reconciliation Processed: <t t-esc="widget.last_reconciliation_date" />
</div>
</div>
<div>
<button class="oe_account_recon_reconcile oe_button oe_highlight" href="javascript:void(0)"
disabled="">Reconcile</button>
- <button class="oe_account_recom_mark_as_reconciled oe_button" href="javascript:void(0)">Nothing to reconcile</button>
+ <button class="oe_account_recom_mark_as_reconciled oe_button" href="javascript:void(0)">Nothing more to reconcile</button>
</div>
</t>
</div>
diff --git a/addons/account/test/account_bank_statement.yml b/addons/account/test/account_bank_statement.yml
index cbd35be438a..3711cff4d56 100644
--- a/addons/account/test/account_bank_statement.yml
+++ b/addons/account/test/account_bank_statement.yml
@@ -7,7 +7,7 @@
import time
journal = self._default_journal_id(cr, uid, {'lang': u'en_US', 'tz': False, 'active_model': 'ir.ui.menu',
'journal_type': 'bank', 'period_id': time.strftime('%m'), 'active_ids': [ref('menu_bank_statement_tree')], 'active_id': ref('menu_bank_statement_tree')})
- assert journal, _('Journal has not been selected')
+ assert journal, 'Journal has not been selected'
-
I create a bank statement with Opening and Closing balance 0.
-
diff --git a/addons/account/test/account_use_model.yml b/addons/account/test/account_use_model.yml
index ab69b251919..16153cd6f8c 100644
--- a/addons/account/test/account_use_model.yml
+++ b/addons/account/test/account_use_model.yml
@@ -41,7 +41,7 @@
ids = self.search(cr, uid, [('ref', '=', 'My Test Model')])
self.button_validate(cr, uid, ids, {})
moves = self.browse(cr, uid, ids)[0]
- assert(moves.state == 'posted'), _('Journal Entries are not in posted state')
+ assert(moves.state == 'posted'), 'Journal Entries are not in posted state'
-
Then I create Recurring Lines
-
@@ -57,7 +57,7 @@
self.compute(cr, uid, [ref('test_recurring_lines')], {'lang': u'en_US', 'active_model': 'ir.ui.menu',
'active_ids': [ref('menu_action_subscription_form')], 'tz': False, 'active_id': ref('menu_action_subscription_form')})
subscription_lines = subscription_line_obj.search(cr, uid, [('subscription_id', '=', ref('test_recurring_lines'))])
- assert subscription_lines, _('Subscription lines has not been created')
+ assert subscription_lines, 'Subscription lines has not been created'
-
I provide date in 'Generate Entries' wizard
-
@@ -69,5 +69,5 @@
!python {model: account.subscription.generate}: |
res = self.action_generate(cr, uid, [ref('account_subscription_generate')], {'lang': u'en_US', 'active_model': 'ir.ui.menu',
'active_ids': [ref('menu_generate_subscription')], 'tz': False, 'active_id': ref('menu_generate_subscription')})
- assert res, _('Move for subscription lines has not been created')
+ assert res, 'Move for subscription lines has not been created'
diff --git a/addons/account_test/i18n/zh_CN.po b/addons/account_test/i18n/zh_CN.po
new file mode 100644
index 00000000000..081320aa24a
--- /dev/null
+++ b/addons/account_test/i18n/zh_CN.po
@@ -0,0 +1,241 @@
+# Chinese (Simplified) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-21 19:22+0000\n"
+"Last-Translator: Liuming <gumdam20@me.com>\n"
+"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-22 04:57+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid ""
+"Code should always set a variable named `result` with the result of your "
+"test, that can be a list or\n"
+"a dictionary. If `result` is an empty list, it means that the test was "
+"succesful. Otherwise it will\n"
+"try to translate and print what is inside `result`.\n"
+"\n"
+"If the result of your test is a dictionary, you can set a variable named "
+"`column_order` to choose in\n"
+"what order you want to print `result`'s content.\n"
+"\n"
+"Should you need them, you can also use the following variables into your "
+"code:\n"
+" * cr: cursor to the database\n"
+" * uid: ID of the current user\n"
+"\n"
+"In any ways, the code must be legal python statements with correct "
+"indentation (if needed).\n"
+"\n"
+"Example: \n"
+" sql = '''SELECT id, name, ref, date\n"
+" FROM account_move_line \n"
+" WHERE account_id IN (SELECT id FROM account_account WHERE type "
+"= 'view')\n"
+" '''\n"
+" cr.execute(sql)\n"
+" result = cr.dictfetchall()"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_02
+msgid "Test 2: Opening a fiscal year"
+msgstr "测试2: 打开一个会计年度"
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_05
+msgid ""
+"Check that reconciled invoice for Sales/Purchases has reconciled entries for "
+"Payable and Receivable Accounts"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_03
+msgid ""
+"Check if movement lines are balanced and have the same date and period"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,name:0
+msgid "Test Name"
+msgstr ""
+
+#. module: account_test
+#: report:account.test.assert.print:0
+msgid "Accouting tests on"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_01
+msgid "Test 1: General balance"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_06
+msgid "Check that paid/reconciled invoices are not in 'Open' state"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_05_2
+msgid ""
+"Check that reconciled account moves, that define Payable and Receivable "
+"accounts, are belonging to reconciled invoices"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Tests"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,desc:0
+msgid "Test Description"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Description"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_06_1
+msgid "Check that there's no move for any account with « View » account type"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_08
+msgid "Test 9 : Accounts and partners on account moves"
+msgstr ""
+
+#. module: account_test
+#: model:ir.actions.act_window,name:account_test.action_accounting_assert
+#: model:ir.actions.report.xml,name:account_test.account_assert_test_report
+#: model:ir.ui.menu,name:account_test.menu_action_license
+msgid "Accounting Tests"
+msgstr ""
+
+#. module: account_test
+#: code:addons/account_test/report/account_test_report.py:74
+#, python-format
+msgid "The test was passed successfully"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,active:0
+msgid "Active"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_06
+msgid "Test 6 : Invoices status"
+msgstr ""
+
+#. module: account_test
+#: model:ir.model,name:account_test.model_accounting_assert_test
+msgid "accounting.assert.test"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_05
+msgid ""
+"Test 5.1 : Payable and Receivable accountant lines of reconciled invoices"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,code_exec:0
+msgid "Python code"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_07
+msgid ""
+"Check on bank statement that the Closing Balance = Starting Balance + sum of "
+"statement lines"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_07
+msgid "Test 8 : Closing balance on bank statements"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_03
+msgid "Test 3: Movement lines"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_05_2
+msgid "Test 5.2 : Reconcilied invoices and Payable/Receivable accounts"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Expression"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_04
+msgid "Test 4: Totally reconciled mouvements"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_04
+msgid "Check if the totally reconciled movements are balanced"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_02
+msgid ""
+"Check if the balance of the new opened fiscal year matches with last year's "
+"balance"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Python Code"
+msgstr ""
+
+#. module: account_test
+#: model:ir.actions.act_window,help:account_test.action_accounting_assert
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create Accounting Test.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_01
+msgid "Check the balance: Debit sum = Credit sum"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_08
+msgid "Check that general accounts and partners on account moves are active"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_06_1
+msgid "Test 7: « View  » account type"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Code Help"
+msgstr ""
diff --git a/addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py b/addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py
index 254dad95c7d..8b10381434d 100644
--- a/addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py
+++ b/addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py
@@ -76,11 +76,11 @@ class account_analytic_account(osv.osv):
GROUP BY product_id, user_id, to_invoice, product_uom_id, line.name""", (account.id,))
res[account.id] = 0.0
- for product_id, price, user_id, factor_id, qty, uom, line_name in cr.fetchall():
+ for product_id, total_amount, user_id, factor_id, qty, uom, line_name in cr.fetchall():
#the amount to reinvoice is the real cost. We don't use the pricelist
- price = -price
+ total_amount = -total_amount
factor = self.pool.get('hr_timesheet_invoice.factor').browse(cr, uid, factor_id, context=context)
- res[account.id] += price * qty * (100 - factor.factor or 0.0) / 100.0
+ res[account.id] += total_amount * (100 - factor.factor or 0.0) / 100.0
return res
def _expense_invoiced_calc(self, cr, uid, ids, name, arg, context=None):
@@ -89,8 +89,13 @@ class account_analytic_account(osv.osv):
for account in self.browse(cr, uid, ids, context=context):
res[account.id] = 0.0
line_ids = lines_obj.search(cr, uid, [('account_id','=', account.id), ('invoice_id','!=',False), ('to_invoice','!=', False), ('journal_id.type', '=', 'purchase')], context=context)
+ #Put invoices in separate array in order not to calculate them double
+ invoices = []
for line in lines_obj.browse(cr, uid, line_ids, context=context):
- res[account.id] += line.invoice_id.amount_untaxed
+ if line.invoice_id not in invoices:
+ invoices.append(line.invoice_id)
+ for invoice in invoices:
+ res[account.id] += invoice.amount_untaxed
return res
def _ca_invoiced_calc(self, cr, uid, ids, name, arg, context=None):
diff --git a/addons/analytic_contract_hr_expense/i18n/hu.po b/addons/analytic_contract_hr_expense/i18n/hu.po
new file mode 100644
index 00000000000..f89f0239698
--- /dev/null
+++ b/addons/analytic_contract_hr_expense/i18n/hu.po
@@ -0,0 +1,72 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-20 14:54+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-21 04:38+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "or view"
+msgstr "vagy nézet"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "Nothing to invoice, create"
+msgstr "Nincs mit számlázni, hozzon létre"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "expenses"
+msgstr "költségek"
+
+#. module: analytic_contract_hr_expense
+#: model:ir.model,name:analytic_contract_hr_expense.model_account_analytic_account
+msgid "Analytic Account"
+msgstr "Gyűjtő/elemző könyvelés"
+
+#. module: analytic_contract_hr_expense
+#: code:addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py:129
+#, python-format
+msgid "Expenses to Invoice of %s"
+msgstr "Ennek számlázandó költségei %s"
+
+#. module: analytic_contract_hr_expense
+#: code:addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py:121
+#, python-format
+msgid "Expenses of %s"
+msgstr "Ennek költségei %s"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,expense_invoiced:0
+#: field:account.analytic.account,expense_to_invoice:0
+#: field:account.analytic.account,remaining_expense:0
+msgid "unknown"
+msgstr "ismeretlen"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,est_expenses:0
+msgid "Estimation of Expenses to Invoice"
+msgstr "Költségek költségek számlázára"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,charge_expenses:0
+msgid "Charge Expenses"
+msgstr "Költségek felszámolása"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "⇒ Invoice"
+msgstr "⇒ Számla"
diff --git a/addons/analytic_user_function/i18n/hu.po b/addons/analytic_user_function/i18n/hu.po
index 1fd3d635c10..64b7d6b3367 100644
--- a/addons/analytic_user_function/i18n/hu.po
+++ b/addons/analytic_user_function/i18n/hu.po
@@ -7,44 +7,44 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2011-02-09 13:28+0000\n"
-"Last-Translator: Krisztian Eyssen <krisz@eyssen.hu>\n"
+"PO-Revision-Date: 2013-03-20 14:30+0000\n"
+"Last-Translator: krnkris <Unknown>\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: 2013-03-16 05:34+0000\n"
+"X-Launchpad-Export-Date: 2013-03-21 04:38+0000\n"
"X-Generator: Launchpad (build 16532)\n"
#. module: analytic_user_function
#: model:ir.model,name:analytic_user_function.model_account_analytic_line
msgid "Analytic Line"
-msgstr ""
+msgstr "Gyűjtőkód tételsor"
#. module: analytic_user_function
#: view:account.analytic.account:0
msgid "Invoice Price Rate per User"
-msgstr ""
+msgstr "Számlázási ár mértéke felhasználónként"
#. module: analytic_user_function
#: field:analytic.user.funct.grid,product_id:0
msgid "Service"
-msgstr ""
+msgstr "Szolgáltatás"
#. module: analytic_user_function
#: model:ir.model,name:analytic_user_function.model_analytic_user_funct_grid
msgid "Price per User"
-msgstr ""
+msgstr "Felhasználónkénti ár"
#. module: analytic_user_function
#: field:analytic.user.funct.grid,price:0
msgid "Price"
-msgstr ""
+msgstr "Ár"
#. module: analytic_user_function
#: help:analytic.user.funct.grid,price:0
msgid "Price per hour for this user."
-msgstr ""
+msgstr "Ennek a felhasználónak a óránkénti ára."
#. module: analytic_user_function
#: field:analytic.user.funct.grid,account_id:0
@@ -57,12 +57,12 @@ msgstr "Gyűjtőkód"
#: code:addons/analytic_user_function/analytic_user_function.py:135
#, python-format
msgid "Error!"
-msgstr ""
+msgstr "Hiba!"
#. module: analytic_user_function
#: view:analytic.user.funct.grid:0
msgid "Invoicing Data"
-msgstr ""
+msgstr "Számlázási adatok"
#. module: analytic_user_function
#: field:account.analytic.account,user_product_ids:0
@@ -78,11 +78,16 @@ msgid ""
" of the default values when invoicing the "
"customer."
msgstr ""
+"Határozzon meg egy sajátos szolgáltatást (pl. Rangelső tanácsadó)\n"
+" és árat egy pár felhasználóhoz ezeknek az "
+"adatoknak az alap\n"
+" adatok helyetti használatához a vevő "
+"számlázására."
#. module: analytic_user_function
#: field:analytic.user.funct.grid,uom_id:0
msgid "Unit of Measure"
-msgstr ""
+msgstr "Mértékegység"
#. module: analytic_user_function
#: code:addons/analytic_user_function/analytic_user_function.py:107
@@ -105,6 +110,13 @@ msgid ""
" specific user. This allows to set invoicing\n"
" conditions for a group of contracts."
msgstr ""
+"OpenERP visszamenőlegesen keresi a szülő fiókokban annak\n"
+" ellenőrzésére, hogy sajátos körülmények vannak-"
+"e\n"
+" meghatározva a felhasználóhoz. Ez lehetővé "
+"teszi\n"
+" sajátos számlázási körülmény beállítását egy "
+"vevő csoporthoz."
#. module: analytic_user_function
#: field:analytic.user.funct.grid,user_id:0
diff --git a/addons/anonymization/i18n/hu.po b/addons/anonymization/i18n/hu.po
new file mode 100644
index 00000000000..bcaca33f351
--- /dev/null
+++ b/addons/anonymization/i18n/hu.po
@@ -0,0 +1,350 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-20 14:51+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-21 04:38+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: anonymization
+#: model:ir.model,name:anonymization.model_ir_model_fields_anonymize_wizard
+msgid "ir.model.fields.anonymize.wizard"
+msgstr "ir.model.fields.anonymize.wizard"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,model_id:0
+msgid "Object"
+msgstr "Objektum"
+
+#. module: anonymization
+#: model:ir.model,name:anonymization.model_ir_model_fields_anonymization_migration_fix
+msgid "ir.model.fields.anonymization.migration.fix"
+msgstr "ir.model.fields.anonymization.migration.fix"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.migration.fix,target_version:0
+msgid "Target Version"
+msgstr "Cél verziója"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.migration.fix,query_type:0
+msgid "sql"
+msgstr "sql"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:91
+#, python-format
+msgid ""
+"The database anonymization is currently in an unstable state. Some fields "
+"are anonymized, while some fields are not anonymized. You should try to "
+"solve this problem before trying to create, write or delete fields."
+msgstr ""
+"Az adatbázis névtelenítő/titkosító bizonytalan állapotban van. Egyes mezők "
+"névtelenítettek/titkosítottak lesznek, de egyesek nem. Ezt a problémát meg "
+"kell oldania, mielőtt mezőket hozna létre, írna vagy törölne."
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,field_name:0
+msgid "Field Name"
+msgstr "Mezőnév"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,field_id:0
+#: field:ir.model.fields.anonymization.migration.fix,field_name:0
+msgid "Field"
+msgstr "Mező"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization,state:0
+msgid "New"
+msgstr "Új"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymize.wizard,file_import:0
+msgid "Import"
+msgstr "Importálás"
+
+#. module: anonymization
+#: model:ir.model,name:anonymization.model_ir_model_fields_anonymization
+msgid "ir.model.fields.anonymization"
+msgstr "ir.model.fields.anonymization"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:300
+#, python-format
+msgid ""
+"Before executing the anonymization process, you should make a backup of your "
+"database."
+msgstr ""
+"Mielőtt kiadna egy névtelenítő/titkosító folyamatot, készítsen mentést az "
+"adatbázisról."
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.history,state:0
+#: field:ir.model.fields.anonymize.wizard,state:0
+msgid "Status"
+msgstr "Állapot"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.history,direction:0
+msgid "Direction"
+msgstr "Irány"
+
+#. module: anonymization
+#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymization_tree
+#: view:ir.model.fields.anonymization:0
+#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_fields
+msgid "Anonymized Fields"
+msgstr "névtelenített/titkosított mezők"
+
+#. module: anonymization
+#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization
+msgid "Database anonymization"
+msgstr "Adatbázis névtelenítés/titkosítás"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,direction:0
+msgid "clear -> anonymized"
+msgstr "törlés -> titkosított"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization,state:0
+#: selection:ir.model.fields.anonymize.wizard,state:0
+msgid "Anonymized"
+msgstr "Névtelenített/titkosított"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,state:0
+msgid "unknown"
+msgstr "ismeretlen"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:448
+#, python-format
+msgid "Anonymized value is None. This cannot happens."
+msgstr "Nincs névtelenítés/titkosítás. Ilyen nincs."
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.history,filepath:0
+msgid "File path"
+msgstr "Fájl elérési útvonal"
+
+#. module: anonymization
+#: help:ir.model.fields.anonymize.wizard,file_import:0
+msgid ""
+"This is the file created by the anonymization process. It should have the "
+"'.pickle' extention."
+msgstr ""
+"Ez a névtelenítési/titkosítási folyamat által létrehozott fájl. Ennek "
+"'.pickle' kiterjesztésűnek kell lennie."
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.history,date:0
+msgid "Date"
+msgstr "Dátum"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymize.wizard,file_export:0
+msgid "Export"
+msgstr "Exportálás"
+
+#. module: anonymization
+#: view:ir.model.fields.anonymize.wizard:0
+msgid "Reverse the Database Anonymization"
+msgstr "Állítsa vissza az adatbázis névtelenítését/titkosítását"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:444
+#, python-format
+msgid ""
+"Cannot anonymize fields of these types: binary, many2many, many2one, "
+"one2many, reference."
+msgstr ""
+"ilyen típusú mezőket nem tud névteleníteni/titkosítani: bináris, many2many, "
+"many2one, one2many, referencia, hivatkozás."
+
+#. module: anonymization
+#: view:ir.model.fields.anonymize.wizard:0
+msgid "Database Anonymization"
+msgstr "Adatbázis névtelenítése/titkosítása"
+
+#. module: anonymization
+#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_wizard
+msgid "Anonymize database"
+msgstr "Adatbázis névtelenítés/titkosítás"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.migration.fix,query_type:0
+msgid "python"
+msgstr "python"
+
+#. module: anonymization
+#: view:ir.model.fields.anonymization.history:0
+#: field:ir.model.fields.anonymization.history,field_ids:0
+msgid "Fields"
+msgstr "Mezők"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization,state:0
+#: selection:ir.model.fields.anonymize.wizard,state:0
+msgid "Clear"
+msgstr "Tiszta"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:533
+#, python-format
+msgid ""
+"It is not possible to reverse the anonymization process without supplying "
+"the anonymization export file."
+msgstr ""
+"Nem lehetséges a névtelenítés/titkosítás visszaállítási folyamat az "
+"névtelenítési/titkosítási export fájl megléte nélkül."
+
+#. module: anonymization
+#: field:ir.model.fields.anonymize.wizard,summary:0
+msgid "Summary"
+msgstr "Összegzés"
+
+#. module: anonymization
+#: view:ir.model.fields.anonymization:0
+msgid "Anonymized Field"
+msgstr "Névtelenített/titkosított mező"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:391
+#: code:addons/anonymization/anonymization.py:526
+#, python-format
+msgid ""
+"The database anonymization is currently in an unstable state. Some fields "
+"are anonymized, while some fields are not anonymized. You should try to "
+"solve this problem before trying to do anything."
+msgstr ""
+"Az adatbázis névtelenítő/titkosító bizonytalan állapotban van. Egyes mezők "
+"névtelenítettek/titkosítottak lesznek, de egyesek nem. Ezt a problémát meg "
+"kell oldania, mielőtt tenne valamit."
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymize.wizard,state:0
+msgid "Unstable"
+msgstr "Bizonytalan"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,state:0
+msgid "Exception occured"
+msgstr "Kivétel keletkezett"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization,state:0
+msgid "Not Existing"
+msgstr "Nem létező"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,model_name:0
+msgid "Object Name"
+msgstr "Tárgy neve"
+
+#. module: anonymization
+#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymization_history_tree
+#: view:ir.model.fields.anonymization.history:0
+#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_history
+msgid "Anonymization History"
+msgstr "Névtelenítési/titkosítási történet"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.migration.fix,model_name:0
+msgid "Model"
+msgstr "Modell"
+
+#. module: anonymization
+#: model:ir.model,name:anonymization.model_ir_model_fields_anonymization_history
+msgid "ir.model.fields.anonymization.history"
+msgstr "ir.model.fields.anonymization.history"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:358
+#, python-format
+msgid ""
+"The database anonymization is currently in an unstable state. Some fields "
+"are anonymized, while some fields are not anonymized. You should try to "
+"solve this problem before trying to do anything else."
+msgstr ""
+"Az adatbázis névtelenítő/titkosító bizonytalan állapotban van. Egyes mezők "
+"névtelenítettek/titkosítottak lesznek, de egyesek nem. Ezt a problémát meg "
+"kell oldania, mielőtt tenne valami mást."
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:389
+#: code:addons/anonymization/anonymization.py:448
+#, python-format
+msgid "Error !"
+msgstr "Hiba!"
+
+#. module: anonymization
+#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymize_wizard
+#: view:ir.model.fields.anonymize.wizard:0
+msgid "Anonymize Database"
+msgstr "Adatbázis névtelenítés/titkosítás"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymize.wizard,name:0
+msgid "File Name"
+msgstr "Fájl neve"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.migration.fix,sequence:0
+msgid "Sequence"
+msgstr "Sorrend/szekvencia"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,direction:0
+msgid "anonymized -> clear"
+msgstr "névtelenített/titkosított -> üres"
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,state:0
+msgid "Started"
+msgstr "Elkezdve"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:389
+#, python-format
+msgid "The database is currently anonymized, you cannot anonymize it again."
+msgstr ""
+"Az adatbázis jelenleg névtelenítettek/titkosítot, nem tudja még egyszer "
+"névteleníteteni/titkosítani."
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,state:0
+msgid "Done"
+msgstr "Elvégezve"
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.migration.fix,query:0
+#: field:ir.model.fields.anonymization.migration.fix,query_type:0
+msgid "Query"
+msgstr "Kérdés"
+
+#. module: anonymization
+#: view:ir.model.fields.anonymization.history:0
+#: field:ir.model.fields.anonymization.history,msg:0
+#: field:ir.model.fields.anonymize.wizard,msg:0
+msgid "Message"
+msgstr "Üzenet"
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:65
+#: sql_constraint:ir.model.fields.anonymization:0
+#, python-format
+msgid "You cannot have two fields with the same name on the same object!"
+msgstr "Nem lehet ugyanazon a tárgyon lévő két mezőnek ugyanaz a neve!"
diff --git a/addons/association/i18n/hu.po b/addons/association/i18n/hu.po
index ee3d0d9963b..e35eb0d4f7b 100644
--- a/addons/association/i18n/hu.po
+++ b/addons/association/i18n/hu.po
@@ -7,13 +7,13 @@ 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-02-02 16:47+0000\n"
-"Last-Translator: Krisztian Eyssen <krisz@eyssen.hu>\n"
+"PO-Revision-Date: 2013-03-20 13:52+0000\n"
+"Last-Translator: krnkris <Unknown>\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: 2013-03-16 05:47+0000\n"
+"X-Launchpad-Export-Date: 2013-03-21 04:38+0000\n"
"X-Generator: Launchpad (build 16532)\n"
#. module: association
@@ -29,7 +29,7 @@ msgstr "Események kezelése"
#. module: association
#: field:profile.association.config.install_modules_wizard,project_gtd:0
msgid "Getting Things Done"
-msgstr ""
+msgstr "Getting Things Done - GTD módszer, végezzük el a feladatokat"
#. module: association
#: model:ir.module.module,description:association.module_meta_information
@@ -81,6 +81,8 @@ msgid ""
"GTD is a methodology to efficiently organise yourself and your tasks. This "
"module fully integrates GTD principle with OpenERP's project management."
msgstr ""
+"A GTD a feladatok hatékony rendszerezésére szolgáló módszertan. Ez a modul "
+"teljesen integrálja a GTD alapelvet az OpenERP projektmenedzsmentjébe."
#. module: association
#: view:profile.association.config.install_modules_wizard:0
diff --git a/addons/audittrail/i18n/hu.po b/addons/audittrail/i18n/hu.po
index 4fb375181cd..e5bee742c5c 100644
--- a/addons/audittrail/i18n/hu.po
+++ b/addons/audittrail/i18n/hu.po
@@ -7,25 +7,25 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2011-01-31 12:50+0000\n"
-"Last-Translator: Krisztian Eyssen <krisz@eyssen.hu>\n"
+"PO-Revision-Date: 2013-03-20 14:23+0000\n"
+"Last-Translator: krnkris <Unknown>\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: 2013-03-16 05:32+0000\n"
+"X-Launchpad-Export-Date: 2013-03-21 04:38+0000\n"
"X-Generator: Launchpad (build 16532)\n"
#. module: audittrail
#: view:audittrail.log:0
msgid "Old Value Text : "
-msgstr ""
+msgstr "Szöveg régi értéke: "
#. module: audittrail
#: code:addons/audittrail/audittrail.py:76
#, python-format
msgid "WARNING: audittrail is not part of the pool"
-msgstr ""
+msgstr "VIGYÁZAT: sávvizsgálat nem képezi részét az összegyűjtött edatnak"
#. module: audittrail
#: field:audittrail.log.line,log_id:0
@@ -36,7 +36,7 @@ msgstr "Napló"
#: view:audittrail.rule:0
#: selection:audittrail.rule,state:0
msgid "Subscribed"
-msgstr ""
+msgstr "Feliratkozva"
#. module: audittrail
#: code:addons/audittrail/audittrail.py:260
@@ -44,31 +44,31 @@ msgstr ""
#: code:addons/audittrail/audittrail.py:408
#, python-format
msgid "'%s' Model does not exist..."
-msgstr ""
+msgstr "'%s' Modell nem létezik..."
#. module: audittrail
#: view:audittrail.rule:0
msgid "Subscribed Rule"
-msgstr ""
+msgstr "Szabály a feliratkozáshoz"
#. module: audittrail
#: view:audittrail.rule:0
#: model:ir.model,name:audittrail.model_audittrail_rule
msgid "Audittrail Rule"
-msgstr ""
+msgstr "Szabály a sávvizsgálatra"
#. module: audittrail
#: view:audittrail.rule:0
#: field:audittrail.rule,state:0
msgid "Status"
-msgstr ""
+msgstr "Állapot"
#. module: audittrail
#: view:audittrail.view.log:0
#: model:ir.actions.act_window,name:audittrail.action_audittrail_log_tree
#: model:ir.ui.menu,name:audittrail.menu_audit_logs
msgid "Audit Logs"
-msgstr ""
+msgstr "Vizsgálati naplózások"
#. module: audittrail
#: view:audittrail.log:0
@@ -79,7 +79,7 @@ msgstr "Csoportosítás..."
#. module: audittrail
#: view:audittrail.rule:0
msgid "_Subscribe"
-msgstr ""
+msgstr "_Feliratkozás"
#. module: audittrail
#: view:audittrail.rule:0
@@ -103,6 +103,8 @@ msgid ""
"Select this if you want to keep track of read/open on any record of the "
"object of this rule"
msgstr ""
+"Válassza ezt, ha nyomon akarja követni ehhez a szabályhoz tartozó bármely "
+"objektum rekord írását/olvasását"
#. module: audittrail
#: field:audittrail.log,method:0
@@ -112,7 +114,7 @@ msgstr "Módszer"
#. module: audittrail
#: field:audittrail.view.log,from:0
msgid "Log From"
-msgstr ""
+msgstr "Naplózási forma"
#. module: audittrail
#: field:audittrail.log.line,log:0
@@ -127,7 +129,7 @@ msgstr "Forrás ID"
#. module: audittrail
#: help:audittrail.rule,user_id:0
msgid "if User is not added then it will applicable for all users"
-msgstr ""
+msgstr "Ha nincs felhasználó hozzáadva akkor minden felhasználó hozzáférhet"
#. module: audittrail
#: help:audittrail.rule,log_workflow:0
@@ -135,6 +137,8 @@ msgid ""
"Select this if you want to keep track of workflow on any record of the "
"object of this rule"
msgstr ""
+"Válassza ezt, ha nyomon akarja követni ehhez a szabályhoz tartozó bármely "
+"objektum rekord munkafolyamatát"
#. module: audittrail
#: field:audittrail.rule,user_id:0
@@ -144,7 +148,7 @@ msgstr "Felhasználók"
#. module: audittrail
#: view:audittrail.log:0
msgid "Log Lines"
-msgstr ""
+msgstr "Naplózási sorok"
#. module: audittrail
#: view:audittrail.log:0
@@ -156,28 +160,28 @@ msgstr "Tárgy"
#. module: audittrail
#: view:audittrail.rule:0
msgid "AuditTrail Rule"
-msgstr ""
+msgstr "Sávvizsgálati szabály"
#. module: audittrail
#: field:audittrail.view.log,to:0
msgid "Log To"
-msgstr ""
+msgstr "Napló erre"
#. module: audittrail
#: view:audittrail.log:0
msgid "New Value Text: "
-msgstr ""
+msgstr "Új érték a szövegre: "
#. module: audittrail
#: view:audittrail.rule:0
msgid "Search Audittrail Rule"
-msgstr ""
+msgstr "Sávvizsgálati szabály keresése"
#. module: audittrail
#: model:ir.actions.act_window,name:audittrail.action_audittrail_rule_tree
#: model:ir.ui.menu,name:audittrail.menu_action_audittrail_rule_tree
msgid "Audit Rules"
-msgstr ""
+msgstr "Vizsgálati szabályok"
#. module: audittrail
#: view:audittrail.log:0
@@ -201,42 +205,45 @@ msgid ""
"Select this if you want to keep track of modification on any record of the "
"object of this rule"
msgstr ""
+"Válassza ezt, ha nyomon akarja követni ehhez a szabályhoz tartozó bármely "
+"objektum rekord módosítását"
#. module: audittrail
#: view:audittrail.rule:0
msgid "AuditTrail Rules"
-msgstr ""
+msgstr "Sávvizsgálati szabályok"
#. module: audittrail
#: help:audittrail.rule,object_id:0
msgid "Select object for which you want to generate log."
-msgstr ""
+msgstr "Válassza ki az objektumot amire a naplózást szeretné végezni."
#. module: audittrail
#: model:ir.ui.menu,name:audittrail.menu_audit
msgid "Audit"
-msgstr ""
+msgstr "Vizsgálat"
#. module: audittrail
#: field:audittrail.rule,log_workflow:0
msgid "Log Workflow"
-msgstr ""
+msgstr "Naplózza a munkafolyamatot"
#. module: audittrail
#: field:audittrail.rule,log_read:0
msgid "Log Reads"
-msgstr ""
+msgstr "Naplózza az olvasásokat"
#. module: audittrail
#: code:addons/audittrail/audittrail.py:77
#, python-format
msgid "Change audittrail depends -- Setting rule as DRAFT"
msgstr ""
+"Sávvizsgálat függőség megváltoztatása -- A szabály TERVEZET -re állítja"
#. module: audittrail
#: field:audittrail.log,line_ids:0
msgid "Log lines"
-msgstr ""
+msgstr "Naplózza a sorokat"
#. module: audittrail
#: field:audittrail.log.line,field_id:0
@@ -246,7 +253,7 @@ msgstr "Mezők"
#. module: audittrail
#: field:audittrail.rule,log_create:0
msgid "Log Creates"
-msgstr ""
+msgstr "Naplózza a létrehozásokat"
#. module: audittrail
#: help:audittrail.rule,log_unlink:0
@@ -254,6 +261,8 @@ msgid ""
"Select this if you want to keep track of deletion on any record of the "
"object of this rule"
msgstr ""
+"Válassza ezt, ha nyomon akarja követni ehhez a szabályhoz tartozó bármely "
+"objektum rekord törlését"
#. module: audittrail
#: view:audittrail.log:0
@@ -270,6 +279,8 @@ msgstr "Művelet ID"
#: view:audittrail.rule:0
msgid "Users (if User is not added then it will applicable for all users)"
msgstr ""
+"Felhasználók (ha nincs felhasználó hozzáadva akkor az összes felhasználóra "
+"érvényes)"
#. module: audittrail
#: view:audittrail.rule:0
@@ -282,17 +293,19 @@ msgid ""
"There is already a rule defined on this object\n"
" You cannot define another: please edit the existing one."
msgstr ""
+"Erre az objektumra már van szabály\n"
+" Nem tud másikat meghatározni: kérem szerkessze a meglévőt."
#. module: audittrail
#: field:audittrail.rule,log_unlink:0
msgid "Log Deletes"
-msgstr ""
+msgstr "Naplók a törlésre"
#. module: audittrail
#: view:audittrail.log:0
#: view:audittrail.rule:0
msgid "Model"
-msgstr ""
+msgstr "Modell"
#. module: audittrail
#: field:audittrail.log.line,field_description:0
@@ -302,22 +315,22 @@ msgstr "Mező leírása"
#. module: audittrail
#: view:audittrail.log:0
msgid "Search Audittrail Log"
-msgstr ""
+msgstr "Sávvizsgálat napló keresése"
#. module: audittrail
#: field:audittrail.rule,log_write:0
msgid "Log Writes"
-msgstr ""
+msgstr "Napló az írásra"
#. module: audittrail
#: view:audittrail.view.log:0
msgid "Open Logs"
-msgstr ""
+msgstr "Naplók megnyitása"
#. module: audittrail
#: field:audittrail.log.line,new_value_text:0
msgid "New value Text"
-msgstr ""
+msgstr "Szöveh új értéke"
#. module: audittrail
#: field:audittrail.rule,name:0
@@ -333,29 +346,31 @@ msgstr "Új érték"
#: code:addons/audittrail/audittrail.py:223
#, python-format
msgid "'%s' field does not exist in '%s' model"
-msgstr ""
+msgstr "'%s' mező nem létezik a '%s' modellben"
#. module: audittrail
#: view:audittrail.log:0
msgid "AuditTrail Logs"
-msgstr ""
+msgstr "Sávvizsgálati naplók"
#. module: audittrail
#: view:audittrail.rule:0
msgid "Draft Rule"
-msgstr ""
+msgstr "Szabály tervezet"
#. module: audittrail
#: view:audittrail.log:0
#: model:ir.model,name:audittrail.model_audittrail_log
msgid "Audittrail Log"
-msgstr ""
+msgstr "Sávvizsgálati napló"
#. module: audittrail
#: help:audittrail.rule,log_action:0
msgid ""
"Select this if you want to keep track of actions on the object of this rule"
msgstr ""
+"VVálassza ezt, ha nyomon akarja követni ehhez a szabályhoz tartozó bármely "
+"objektum rekord műveleteit"
#. module: audittrail
#: view:audittrail.log:0
@@ -365,32 +380,32 @@ msgstr "Új érték : "
#. module: audittrail
#: field:audittrail.log.line,old_value_text:0
msgid "Old value Text"
-msgstr ""
+msgstr "Szöveg régi értéke"
#. module: audittrail
#: view:audittrail.view.log:0
msgid "Cancel"
-msgstr ""
+msgstr "Megszakítás"
#. module: audittrail
#: model:ir.model,name:audittrail.model_audittrail_view_log
msgid "View Log"
-msgstr ""
+msgstr "Napló megtekintése"
#. module: audittrail
#: model:ir.model,name:audittrail.model_audittrail_log_line
msgid "Log Line"
-msgstr ""
+msgstr "Napló a sorokra"
#. module: audittrail
#: view:audittrail.view.log:0
msgid "or"
-msgstr ""
+msgstr "vagy"
#. module: audittrail
#: field:audittrail.rule,log_action:0
msgid "Log Action"
-msgstr ""
+msgstr "napló a műveletekre"
#. module: audittrail
#: help:audittrail.rule,log_create:0
@@ -398,6 +413,8 @@ msgid ""
"Select this if you want to keep track of creation on any record of the "
"object of this rule"
msgstr ""
+"Válassza ezt, ha nyomon akarja követni ehhez a szabályhoz tartozó bármely "
+"objektum rekord létrehozását"
#~ msgid "State"
#~ msgstr "Állapot"
diff --git a/addons/auth_oauth/controllers/main.py b/addons/auth_oauth/controllers/main.py
index 1c38f7f4eae..3f7ef2f3f0c 100644
--- a/addons/auth_oauth/controllers/main.py
+++ b/addons/auth_oauth/controllers/main.py
@@ -64,8 +64,13 @@ class OAuthController(oeweb.Controller):
u = registry.get('res.users')
credentials = u.auth_oauth(cr, SUPERUSER_ID, provider, kw, context=context)
cr.commit()
- action = state.get('a', None)
- url = '/#action=' + action if action else '/'
+ action = state.get('a')
+ menu = state.get('m')
+ url = '/'
+ if action:
+ url = '/#action=%s' % action
+ elif menu:
+ url = '/#menu_id=%s' % menu
return login_and_redirect(req, *credentials, redirect_url=url)
except AttributeError:
# auth_signup is not installed
diff --git a/addons/auth_oauth/i18n/tr.po b/addons/auth_oauth/i18n/tr.po
new file mode 100644
index 00000000000..7faa18ccebf
--- /dev/null
+++ b/addons/auth_oauth/i18n/tr.po
@@ -0,0 +1,135 @@
+# Turkish translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-21 19:39+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Turkish <tr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-22 04:57+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,validation_endpoint:0
+msgid "Validation URL"
+msgstr "Onaylama URL"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,auth_endpoint:0
+msgid "Authentication URL"
+msgstr "Kimlik Doğrulama URL"
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_base_config_settings
+msgid "base.config.settings"
+msgstr "base.config.settings"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,name:0
+msgid "Provider name"
+msgstr "Sağlayıcı adı"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,scope:0
+msgid "Scope"
+msgstr "Kapsam"
+
+#. module: auth_oauth
+#: field:res.users,oauth_provider_id:0
+msgid "OAuth Provider"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,css_class:0
+msgid "CSS class"
+msgstr "CSS class"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,body:0
+msgid "Body"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_res_users
+msgid "Users"
+msgstr "Kullanıcılar"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,sequence:0
+msgid "unknown"
+msgstr "bilinmeyen"
+
+#. module: auth_oauth
+#: field:res.users,oauth_access_token:0
+msgid "OAuth Access Token"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,client_id:0
+#: field:base.config.settings,auth_oauth_facebook_client_id:0
+#: field:base.config.settings,auth_oauth_google_client_id:0
+msgid "Client ID"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.ui.menu,name:auth_oauth.menu_oauth_providers
+msgid "OAuth Providers"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_auth_oauth_provider
+msgid "OAuth2 provider"
+msgstr ""
+
+#. module: auth_oauth
+#: field:res.users,oauth_uid:0
+msgid "OAuth User ID"
+msgstr ""
+
+#. module: auth_oauth
+#: field:base.config.settings,auth_oauth_facebook_enabled:0
+msgid "Allow users to sign in with Facebook"
+msgstr "Kullanıcılara Facebook ile oturum için izin ver"
+
+#. module: auth_oauth
+#: sql_constraint:res.users:0
+msgid "OAuth UID must be unique per provider"
+msgstr ""
+
+#. module: auth_oauth
+#: help:res.users,oauth_uid:0
+msgid "Oauth Provider user_id"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,data_endpoint:0
+msgid "Data URL"
+msgstr "Data URL"
+
+#. module: auth_oauth
+#: view:auth.oauth.provider:0
+msgid "arch"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.actions.act_window,name:auth_oauth.action_oauth_provider
+msgid "Providers"
+msgstr "Sağlayıcılar"
+
+#. module: auth_oauth
+#: field:base.config.settings,auth_oauth_google_enabled:0
+msgid "Allow users to sign in with Google"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,enabled:0
+msgid "Allowed"
+msgstr "İzinVerildi"
diff --git a/addons/auth_openid/i18n/ru.po b/addons/auth_openid/i18n/ru.po
new file mode 100644
index 00000000000..6041300fe60
--- /dev/null
+++ b/addons/auth_openid/i18n/ru.po
@@ -0,0 +1,97 @@
+# Russian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-23 11:37+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Russian <ru@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-24 04:45+0000\n"
+"X-Generator: Launchpad (build 16540)\n"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:24
+#, python-format
+msgid "Username"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:12
+#: view:res.users:0
+#, python-format
+msgid "OpenID"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:30
+#: field:res.users,openid_url:0
+#, python-format
+msgid "OpenID URL"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:9
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:10
+#, python-format
+msgid "Google"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:11
+#, python-format
+msgid "Launchpad"
+msgstr ""
+
+#. module: auth_openid
+#: help:res.users,openid_email:0
+msgid "Used for disambiguation in case of a shared OpenID URL"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:18
+#, python-format
+msgid "Google Apps Domain"
+msgstr ""
+
+#. module: auth_openid
+#: field:res.users,openid_email:0
+msgid "OpenID Email"
+msgstr ""
+
+#. module: auth_openid
+#: field:res.users,openid_key:0
+msgid "OpenID Key"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:8
+#, python-format
+msgid "Password"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:10
+#, python-format
+msgid "Google Apps"
+msgstr ""
+
+#. module: auth_openid
+#: model:ir.model,name:auth_openid.model_res_users
+msgid "Users"
+msgstr ""
diff --git a/addons/auth_signup/i18n/es_CO.po b/addons/auth_signup/i18n/es_CO.po
new file mode 100644
index 00000000000..eb590e320ac
--- /dev/null
+++ b/addons/auth_signup/i18n/es_CO.po
@@ -0,0 +1,298 @@
+# Spanish (Colombia) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-21 21:49+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Colombia) <es_CO@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-22 04:57+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: auth_signup
+#: field:res.partner,signup_type:0
+msgid "Signup Token Type"
+msgstr "Tipo de palabra de ingreso"
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_uninvited:0
+msgid "Allow external users to sign up"
+msgstr "Permitir ingreso a usuarios externos"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:16
+#, python-format
+msgid "Confirm Password"
+msgstr "Confirmar Contraseña"
+
+#. module: auth_signup
+#: help:base.config.settings,auth_signup_uninvited:0
+msgid "If unchecked, only invited users may sign up."
+msgstr "Si no está marcado, sólo los usuarios invitados pueden ingresar."
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_base_config_settings
+msgid "base.config.settings"
+msgstr "base.config.settings"
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:265
+#, python-format
+msgid "Cannot send email: user has no email address."
+msgstr ""
+"No se pudo enviar el correo eléctronico: el usuario no tiene dirección de "
+"correo."
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:24
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:28
+#, python-format
+msgid "Reset password"
+msgstr "Restablecer contraseña"
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_template_user_id:0
+msgid "Template user for new users created through signup"
+msgstr ""
+"Plantilla de usuario para los nuevos usuarios creados a través del ingreso"
+
+#. module: auth_signup
+#: model:email.template,subject:auth_signup.reset_password_email
+msgid "Password reset"
+msgstr "Restablecer contraseña"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:117
+#, python-format
+msgid "Please enter a password and confirm it."
+msgstr "Por favor introduzca una contraseña y confírmela."
+
+#. module: auth_signup
+#: view:res.users:0
+msgid "Send an email to the user to (re)set their password."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:23
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:26
+#, python-format
+msgid "Sign Up"
+msgstr "Registro"
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "New"
+msgstr "Nuevo(a)"
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:258
+#, python-format
+msgid "Mail sent to:"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.users,state:0
+msgid "Status"
+msgstr "Estado"
+
+#. module: auth_signup
+#: model:email.template,body_html:auth_signup.reset_password_email
+msgid ""
+"\n"
+"<p>A password reset was requested for the OpenERP account linked to this "
+"email.</p>\n"
+"\n"
+"<p>You may change your password by following <a "
+"href=\"${object.signup_url}\">this link</a>.</p>\n"
+"\n"
+"<p>Note: If you do not expect this, you can safely ignore this email.</p>"
+msgstr ""
+"\n"
+"<p>Se ha solicitado un cambio de contraseña dedse la cuenta de OpenERP "
+"asociada con este correo eléctronico.</p>\n"
+"\n"
+"<p>Debería cambiar su contraseña siguiendo <a "
+"href=\"${object.signup_url}\">este enlace</a>.</p>\n"
+"\n"
+"<p>Nota: Si no espera estanotificación, puede ignorarla de forma segura.</p>"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:111
+#, python-format
+msgid "Please enter a name."
+msgstr "Por favor, introduzca un nombre."
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_res_users
+msgid "Users"
+msgstr "Usuarios"
+
+#. module: auth_signup
+#: field:res.partner,signup_url:0
+msgid "Signup URL"
+msgstr "URL de Ingreso"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:114
+#, python-format
+msgid "Please enter a username."
+msgstr "Por favor, introduzca un nombre de usuario."
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "Active"
+msgstr "Activo(a)"
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:269
+#, python-format
+msgid ""
+"Cannot send email: no outgoing email server configured.\n"
+"You can configure it under Settings/General Settings."
+msgstr ""
+"No se puede enviar el correo electrónico: no se ha configurado un servidor "
+"de correo saliente.\n"
+"Puede configurarlo en Configuración / Configuraciones Generales."
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:12
+#, python-format
+msgid "Username"
+msgstr "Nombre de Usuario"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:8
+#, python-format
+msgid "Name"
+msgstr "Nombre"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:170
+#, python-format
+msgid "Please enter a username or email address."
+msgstr ""
+"Por favor ingresea un Nombre de Usuario o dirección de correo electrónico."
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "Resetting Password"
+msgstr "Restableciendo la Contraseña"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:13
+#, python-format
+msgid "Username (Email)"
+msgstr "Nombre de Usuario (Dirección de correo electrónico)"
+
+#. module: auth_signup
+#: field:res.partner,signup_expiration:0
+msgid "Signup Expiration"
+msgstr "Vencimiento del Ingreso"
+
+#. module: auth_signup
+#: help:base.config.settings,auth_signup_reset_password:0
+msgid "This allows users to trigger a password reset from the Login page."
+msgstr ""
+"Esto permite a los usuarios lanzar un restablecimiento de la contraseña "
+"desde la página de Inicio de Sesión."
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:22
+#, python-format
+msgid "Log in"
+msgstr "Iniciar Sesión"
+
+#. module: auth_signup
+#: field:res.partner,signup_valid:0
+msgid "Signup Token is Valid"
+msgstr "La Palabra de Ingreso es Válida"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:108
+#: code:addons/auth_signup/static/src/js/auth_signup.js:111
+#: code:addons/auth_signup/static/src/js/auth_signup.js:114
+#: code:addons/auth_signup/static/src/js/auth_signup.js:117
+#: code:addons/auth_signup/static/src/js/auth_signup.js:120
+#: code:addons/auth_signup/static/src/js/auth_signup.js:167
+#: code:addons/auth_signup/static/src/js/auth_signup.js:170
+#, python-format
+msgid "Login"
+msgstr "Inicio de Sesión"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:94
+#, python-format
+msgid "Invalid signup token"
+msgstr "Palabra de ingreso no válida"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:120
+#, python-format
+msgid "Passwords do not match; please retype them."
+msgstr "Las contraseñas no coinciden. Por favor vuelva a escribirlas."
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:108
+#: code:addons/auth_signup/static/src/js/auth_signup.js:167
+#, python-format
+msgid "No database selected !"
+msgstr "No se ha seleccionado ninguna base de datos!"
+
+#. module: auth_signup
+#: view:res.users:0
+msgid "Reset Password"
+msgstr ""
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_reset_password:0
+msgid "Enable password reset from Login page"
+msgstr ""
+"Habilitar restablecimiento de la contraseña desde la página de Inicio de "
+"Sesión"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:27
+#, python-format
+msgid "Back to Login"
+msgstr "Volver al Inicio de Sesión"
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:22
+#, python-format
+msgid "Sign up"
+msgstr ""
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_res_partner
+msgid "Partner"
+msgstr "Empresa/Cliente"
+
+#. module: auth_signup
+#: field:res.partner,signup_token:0
+msgid "Signup Token"
+msgstr "Palabra de Ingreso"
diff --git a/addons/auth_signup/i18n/hu.po b/addons/auth_signup/i18n/hu.po
index ead6979d91c..91f76b57206 100644
--- a/addons/auth_signup/i18n/hu.po
+++ b/addons/auth_signup/i18n/hu.po
@@ -8,24 +8,24 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2013-01-11 17:36+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"PO-Revision-Date: 2013-03-20 13:50+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
"Language-Team: Hungarian <hu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:52+0000\n"
+"X-Launchpad-Export-Date: 2013-03-21 04:38+0000\n"
"X-Generator: Launchpad (build 16532)\n"
#. module: auth_signup
#: field:res.partner,signup_type:0
msgid "Signup Token Type"
-msgstr ""
+msgstr "Feliratkozó Token típus"
#. module: auth_signup
#: field:base.config.settings,auth_signup_uninvited:0
msgid "Allow external users to sign up"
-msgstr ""
+msgstr "Külső felhasználók bejelentkezésének engedéjezése"
#. module: auth_signup
#. openerp-web
@@ -37,18 +37,18 @@ msgstr "Jelszó megerõsítése"
#. module: auth_signup
#: help:base.config.settings,auth_signup_uninvited:0
msgid "If unchecked, only invited users may sign up."
-msgstr ""
+msgstr "He nincs bejelölve, vsak maghívott felhasználók jelentkezhetnek be."
#. module: auth_signup
#: model:ir.model,name:auth_signup.model_base_config_settings
msgid "base.config.settings"
-msgstr ""
+msgstr "base.config.settings"
#. module: auth_signup
#: code:addons/auth_signup/res_users.py:265
#, python-format
msgid "Cannot send email: user has no email address."
-msgstr ""
+msgstr "Nem küldhető e-mail: a felhasználónak nincs e-mail címe."
#. module: auth_signup
#. openerp-web
@@ -61,7 +61,7 @@ msgstr "Jelszó visszaállítása"
#. module: auth_signup
#: field:base.config.settings,auth_signup_template_user_id:0
msgid "Template user for new users created through signup"
-msgstr ""
+msgstr "Sablon felhasználó amit a új felhasznlók létrehozásához használ"
#. module: auth_signup
#: model:email.template,subject:auth_signup.reset_password_email
@@ -78,7 +78,7 @@ msgstr "Kérem adjon meg egy jelszót és erősítse meg."
#. module: auth_signup
#: view:res.users:0
msgid "Send an email to the user to (re)set their password."
-msgstr ""
+msgstr "Küldjön egy e-mailt a felhasználónak a jelszava visszaállításához."
#. module: auth_signup
#. openerp-web
@@ -97,12 +97,12 @@ msgstr "Új"
#: code:addons/auth_signup/res_users.py:258
#, python-format
msgid "Mail sent to:"
-msgstr ""
+msgstr "Címzett:"
#. module: auth_signup
#: field:res.users,state:0
msgid "Status"
-msgstr ""
+msgstr "Állapot"
#. module: auth_signup
#: model:email.template,body_html:auth_signup.reset_password_email
@@ -116,6 +116,15 @@ msgid ""
"\n"
"<p>Note: If you do not expect this, you can safely ignore this email.</p>"
msgstr ""
+"\n"
+"<p>Egy jelszó visszaállítást indított el az e-mailhez tartozó OpenERP "
+"fiókhoz.</p>\n"
+"\n"
+"<p>Meg kell változtatnia a jelszavát a következő <a "
+"href=\"${object.signup_url}\">linken</a>.</p>\n"
+"\n"
+"<p>Megjegyzés: Ha nem várta ezt az e-mail-t, akkor biztonságosan törölje "
+"azt.</p>"
#. module: auth_signup
#. openerp-web
@@ -132,14 +141,14 @@ msgstr "Felhasználók"
#. module: auth_signup
#: field:res.partner,signup_url:0
msgid "Signup URL"
-msgstr ""
+msgstr "Bejelentkezési URL elérési útvonal"
#. module: auth_signup
#. openerp-web
#: code:addons/auth_signup/static/src/js/auth_signup.js:114
#, python-format
msgid "Please enter a username."
-msgstr ""
+msgstr "Kérjük, adja meg a felhasználónevet."
#. module: auth_signup
#: selection:res.users,state:0
@@ -153,6 +162,8 @@ msgid ""
"Cannot send email: no outgoing email server configured.\n"
"You can configure it under Settings/General Settings."
msgstr ""
+"Nem küldhető e-mail: nincs kimenő e-mail szerver beállítva.\n"
+"Beállíthatja a Beállítások/Általános beállítások alatt."
#. module: auth_signup
#. openerp-web
@@ -173,7 +184,7 @@ msgstr "Név"
#: code:addons/auth_signup/static/src/js/auth_signup.js:170
#, python-format
msgid "Please enter a username or email address."
-msgstr ""
+msgstr "Kérem adjon meg egy felhasználónevet vagy e-mail címet."
#. module: auth_signup
#: selection:res.users,state:0
@@ -190,12 +201,14 @@ msgstr "Felhasználónév (Email)"
#. module: auth_signup
#: field:res.partner,signup_expiration:0
msgid "Signup Expiration"
-msgstr ""
+msgstr "Bejelentkezési határidő"
#. module: auth_signup
#: help:base.config.settings,auth_signup_reset_password:0
msgid "This allows users to trigger a password reset from the Login page."
msgstr ""
+"Ez lehetővé teszi a felhasználó részére a jelszó megváltoztatásának "
+"elindítását a bejelentkezési oldalról."
#. module: auth_signup
#. openerp-web
@@ -247,12 +260,12 @@ msgstr "Nincs kiválasztott adatbázis!"
#. module: auth_signup
#: view:res.users:0
msgid "Reset Password"
-msgstr ""
+msgstr "Jelszó visszaállítása"
#. module: auth_signup
#: field:base.config.settings,auth_signup_reset_password:0
msgid "Enable password reset from Login page"
-msgstr ""
+msgstr "Jelszóváltoztató engedélyezése a belépési oldalról"
#. module: auth_signup
#. openerp-web
diff --git a/addons/base_action_rule/base_action_rule_view.xml b/addons/base_action_rule/base_action_rule_view.xml
index 4e551fa21c5..5eaaf08dad4 100644
--- a/addons/base_action_rule/base_action_rule_view.xml
+++ b/addons/base_action_rule/base_action_rule_view.xml
@@ -27,8 +27,8 @@
<page string="Conditions">
<group>
<group name="filter" string="Filter Condition">
- <field name="filter_pre_id" domain="[('model_id','=',model), ('user_id', '=', False)]" context="{'default_model_id': model}"/>
- <field name="filter_id" domain="[('model_id','=',model), ('user_id', '=', False)]" context="{'default_model_id': model}"/>
+ <field name="filter_pre_id" domain="[('model_id','=',model)]" context="{'default_model_id': model}"/>
+ <field name="filter_id" domain="[('model_id','=',model)]" context="{'default_model_id': model}"/>
</group>
<group name="timing" string="Timer">
<field name="trg_date_id"/>
diff --git a/addons/contacts/i18n/es_CO.po b/addons/contacts/i18n/es_CO.po
new file mode 100644
index 00000000000..d4b8e87b899
--- /dev/null
+++ b/addons/contacts/i18n/es_CO.po
@@ -0,0 +1,46 @@
+# Spanish (Colombia) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-21 21:43+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Colombia) <es_CO@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-22 04:57+0000\n"
+"X-Generator: Launchpad (build 16532)\n"
+
+#. module: contacts
+#: model:ir.actions.act_window,help:contacts.action_contacts
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a contact in your address book.\n"
+" </p><p>\n"
+" OpenERP helps you easily track all activities related to\n"
+" a customer; discussions, history of business opportunities,\n"
+" documents, etc.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Pulse para añadir un contacto a su libreta de direcciones.\n"
+" </p><p>\n"
+" OpenERP le ayuda a seguir el rastro a todas las actividades "
+"relativas a\n"
+" un cliente: discusiones, histórico de oportunidades de negocio,\n"
+" documentos, etc.\n"
+" </p>\n"
+" "
+
+#. module: contacts
+#: model:ir.actions.act_window,name:contacts.action_contacts
+#: model:ir.ui.menu,name:contacts.menu_contacts
+msgid "Contacts"
+msgstr "Contactos"
diff --git a/addons/hr_payroll/test/payslip.yml b/addons/hr_payroll/test/payslip.yml
index 0e60a5b6af4..f78ad4a374d 100644
--- a/addons/hr_payroll/test/payslip.yml
+++ b/addons/hr_payroll/test/payslip.yml
@@ -68,9 +68,8 @@
I verify that the payslip is in done state
-
!python {model: hr.payslip}: |
- from openerp.tools.translate import _
payslip_brw=self.browse(cr, uid, ref("hr_payslip_0"))
- assert(payslip_brw.state == 'done'), _('State not changed!')
+ assert(payslip_brw.state == 'done'), 'State not changed!'
-
I want to check refund payslip so I click on refund button.
-
diff --git a/addons/hr_payroll_account/test/hr_payroll_account.yml b/addons/hr_payroll_account/test/hr_payroll_account.yml
index c8b6bf42fdd..c637b5f319a 100644
--- a/addons/hr_payroll_account/test/hr_payroll_account.yml
+++ b/addons/hr_payroll_account/test/hr_payroll_account.yml
@@ -89,9 +89,8 @@
I verify the payslip is in draft state.
-
!python {model: hr.payslip}: |
- from openerp.tools.translate import _
payslip_brw=self.browse(cr, uid, ref("hr_payslip_0"))
- assert(payslip_brw.state == 'draft'), _('State not changed!')
+ assert(payslip_brw.state == 'draft'), 'State not changed!'
-
I click on "Compute Sheet" button.
-
@@ -120,7 +119,6 @@
I verify that the payslip is in done state.
-
!python {model: hr.payslip}: |
- from openerp.tools.translate import _
payslip_brw=self.browse(cr, uid, ref("hr_payslip_0"))
- assert(payslip_brw.state == 'done'), _('State not changed!')
+ assert(payslip_brw.state == 'done'), 'State not changed!'
diff --git a/addons/hr_timesheet/hr_timesheet.py b/addons/hr_timesheet/hr_timesheet.py
index 6a538e5d09c..cc9c0653a85 100644
--- a/addons/hr_timesheet/hr_timesheet.py
+++ b/addons/hr_timesheet/hr_timesheet.py
@@ -74,8 +74,9 @@ class hr_analytic_timesheet(osv.osv):
toremove = {}
for obj in self.browse(cr, uid, ids, context=context):
toremove[obj.line_id.id] = True
+ super(hr_analytic_timesheet, self).unlink(cr, uid, ids, context=context)
self.pool.get('account.analytic.line').unlink(cr, uid, toremove.keys(), context=context)
- return super(hr_analytic_timesheet, self).unlink(cr, uid, ids, context=context)
+ return True
def on_change_unit_amount(self, cr, uid, id, prod_id, unit_amount, company_id, unit=False, journal_id=False, context=None):
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml
index 74d0fa1daf6..17ac669d26d 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml
@@ -9,16 +9,17 @@
<form string="Create Invoice" version="7.0">
<notebook>
<page string="Billing Data">
- <group>
- <group string="Do you want to show details of work in invoice?">
- <field name="date"/>
- <field name="time"/>
- <field name="name"/>
- <field name="price"/>
- </group>
- <group string="Force to use a specific product">
- <field name="product"/>
- </group>
+ <group cols="2">
+ <group string="Do you want to show details of work in invoice?" colspan="1" cols="2">
+ <field name="date"/>
+ <field name="time"/>
+ <field name="name"/>
+ <field name="price"/>
+ </group>
+ <group string="Force to use a specific product" colspan="1" cols="2">
+ <p class="oe_grey" colspan="2">When reinvoicing costs, the amount on the invoice lines is given by the sale price of the corresponding product (if any, and if its sale price is not 0). You can use the following field to enforce the use of a single product for all the chosen lines in the future invoices.</p>
+ <field name="product"/>
+ </group>
</group>
</page>
</notebook>
diff --git a/addons/l10n_be_coda/l10n_be_coda_view.xml b/addons/l10n_be_coda/l10n_be_coda_view.xml
index 2464e5e9082..8c11913b14d 100644
--- a/addons/l10n_be_coda/l10n_be_coda_view.xml
+++ b/addons/l10n_be_coda/l10n_be_coda_view.xml
@@ -41,6 +41,7 @@
<field name="priority">10</field>
<field name="arch" type="xml">
<tree editable="bottom" string="Statement lines">
+ <field name="statement_id" readonly="1" invisible="1"/>
<field name="sequence" readonly="1" invisible="1"/>
<field name="date"/>
<field name="name"/>
diff --git a/addons/mail/mail_alias.py b/addons/mail/mail_alias.py
index d9c49d833ab..d5e3b675b56 100644
--- a/addons/mail/mail_alias.py
+++ b/addons/mail/mail_alias.py
@@ -186,10 +186,13 @@ class mail_alias(osv.Model):
def create_unique_alias(self, cr, uid, vals, model_name=None, context=None):
"""Creates an email.alias record according to the values provided in ``vals``,
with 2 alterations: the ``alias_name`` value may be suffixed in order to
- make it unique, and the ``alias_model_id`` value will set to the
- model ID of the ``model_name`` value, if provided,
+ make it unique (and certain unsafe characters replaced), and
+ he ``alias_model_id`` value will set to the model ID of the ``model_name``
+ value, if provided,
"""
- alias_name = re.sub(r'[^\w+]', '-', remove_accents(vals['alias_name'])).lower()
+ # when an alias name appears to already be an email, we keep the local part only
+ alias_name = remove_accents(vals['alias_name']).lower().split('@')[0]
+ alias_name = re.sub(r'[^\w+.]+', '-', alias_name)
alias_name = self._find_unique(cr, uid, alias_name, context=context)
vals['alias_name'] = alias_name
if model_name:
diff --git a/addons/mail/mail_followers.py b/addons/mail/mail_followers.py
index aa23e418d35..450b81dabbf 100644
--- a/addons/mail/mail_followers.py
+++ b/addons/mail/mail_followers.py
@@ -95,6 +95,9 @@ class mail_notification(osv.Model):
# Do not send to partners without email address defined
if not partner.email:
continue
+ # Do not send to partners having same email address than the author (can cause loops or bounce effect due to messy database)
+ if message.author_id and message.author_id.email == partner.email:
+ continue
# Partner does not want to receive any emails or is opt-out
if partner.notification_email_send == 'none':
continue
@@ -136,10 +139,10 @@ class mail_notification(osv.Model):
company = user.company_id.website and "<a style='color:inherit' href='%s'>%s</a>" % (user.company_id.website, user.company_id.name) or user.company_id.name
else:
company = user.name
- signature_company = _('<small>Send by %(company)s using %(openerp)s.</small>' % {
+ signature_company = _('<small>Send by %(company)s using %(openerp)s.</small>') % {
'company': company,
'openerp': "<a style='color:inherit' href='https://www.openerp.com/'>OpenERP</a>"
- })
+ }
footer = tools.append_content_to_html(footer, signature_company, plaintext=False, container_tag='div')
return footer
@@ -186,11 +189,16 @@ class mail_notification(osv.Model):
signature_company = self.get_signature_footer(cr, uid, user_id, res_model=msg.model, res_id=msg.res_id, context=context)
body_html = tools.append_content_to_html(body_html, signature_company, plaintext=False, container_tag='div')
+ references = False
+ if msg.parent_id:
+ references = msg.parent_id.message_id
+
mail_values = {
'mail_message_id': msg.id,
'auto_delete': True,
'body_html': body_html,
- 'recipient_ids': [(4, id) for id in notify_partner_ids]
+ 'recipient_ids': [(4, id) for id in notify_partner_ids],
+ 'references': references,
}
if msg.email_from:
mail_values['email_from'] = msg.email_from
diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index 43d0d707699..c5a7e227465 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -21,6 +21,7 @@
import base64
import logging
+import re
from urllib import urlencode
from urlparse import urljoin
@@ -96,9 +97,19 @@ class mail_mail(osv.Model):
return values.get('reply_to')
email_reply_to = False
+ # model, res_id: comes from values OR related message
+ model = values.get('model')
+ res_id = values.get('res_id')
+ if values.get('mail_message_id') and (not model or not res_id):
+ message = self.pool.get('mail.message').browse(cr, uid, values.get('mail_message_id'), context=context)
+ if not model:
+ model = message.model
+ if not res_id:
+ res_id = message.res_id
+
# if model and res_id: try to use ``message_get_reply_to`` that returns the document alias
- if values.get('model') and values.get('res_id') and hasattr(self.pool.get(values.get('model')), 'message_get_reply_to'):
- email_reply_to = self.pool.get(values.get('model')).message_get_reply_to(cr, uid, [values.get('res_id')], context=context)[0]
+ if model and res_id and hasattr(self.pool.get(model), 'message_get_reply_to'):
+ email_reply_to = self.pool.get(model).message_get_reply_to(cr, uid, [res_id], context=context)[0]
# no alias reply_to -> reply_to will be the email_from, only the email part
if not email_reply_to and values.get('email_from'):
emails = tools.email_split(values.get('email_from'))
@@ -106,10 +117,13 @@ class mail_mail(osv.Model):
email_reply_to = emails[0]
# format 'Document name <email_address>'
- if email_reply_to and values.get('model') and values.get('res_id'):
- document_name = self.pool.get(values.get('model')).name_get(cr, SUPERUSER_ID, [values.get('res_id')], context=context)[0]
+ if email_reply_to and model and res_id:
+ document_name = self.pool.get(model).name_get(cr, SUPERUSER_ID, [res_id], context=context)[0]
if document_name:
- email_reply_to = _('Followers of %s <%s>') % (document_name[1], email_reply_to)
+ # sanitize document name
+ sanitized_doc_name = re.sub(r'[^\w+.]+', '-', document_name[1])
+ # generate reply to
+ email_reply_to = _('"Followers of %s" <%s>') % (sanitized_doc_name, email_reply_to)
return email_reply_to
@@ -242,7 +256,7 @@ class mail_mail(osv.Model):
body = self.send_get_mail_body(cr, uid, mail, partner=partner, context=context)
subject = self.send_get_mail_subject(cr, uid, mail, partner=partner, context=context)
body_alternative = tools.html2plaintext(body)
- email_to = [partner.email] if partner else tools.email_split(mail.email_to)
+ email_to = ['%s <%s>' % (partner.name, partner.email)] if partner else tools.email_split(mail.email_to)
return {
'body': body,
'body_alternative': body_alternative,
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index b8bd028289f..778d7d53bd1 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -416,9 +416,15 @@ class mail_thread(osv.AbstractModel):
def _message_find_partners(self, cr, uid, message, header_fields=['From'], context=None):
""" Find partners related to some header fields of the message. """
+ partner_obj = self.pool.get('res.partner')
+ partner_ids = []
s = ', '.join([decode(message.get(h)) for h in header_fields if message.get(h)])
- return [partner_id for email in tools.email_split(s)
- for partner_id in self.pool.get('res.partner').search(cr, uid, [('email', 'ilike', email)], limit=1, context=context)]
+ for email_address in tools.email_split(s):
+ related_partners = partner_obj.search(cr, uid, [('email', 'ilike', email_address), ('user_ids', '!=', False)], limit=1, context=context)
+ if not related_partners:
+ related_partners = partner_obj.search(cr, uid, [('email', 'ilike', email_address)], limit=1, context=context)
+ partner_ids += related_partners
+ return partner_ids
def _message_find_user_id(self, cr, uid, message, context=None):
from_local_part = tools.email_split(decode(message.get('From')))[0]
@@ -527,6 +533,11 @@ class mail_thread(osv.AbstractModel):
# Legacy: fallback to matching [ID] in the Subject
match = tools.res_re.search(decode_header(message, 'Subject'))
thread_id = match and match.group(1)
+ # Convert into int (bug spotted in 7.0 because of str)
+ try:
+ thread_id = int(thread_id)
+ except:
+ thread_id = False
assert thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new'), \
"No possible route found for incoming message with Message-Id %s. " \
"Create an appropriate mail.alias or force the destination model." % message_id
@@ -929,6 +940,22 @@ class mail_thread(osv.AbstractModel):
model = False
if thread_id:
model = context.get('thread_model', self._name) if self._name == 'mail.thread' else self._name
+ if model != self._name:
+ del context['thread_model']
+ return self.pool.get(model).message_post(cr, uid, thread_id, body=body, subject=subject, type=type, subtype=subtype, parent_id=parent_id, attachments=attachments, context=context, content_subtype=content_subtype, **kwargs)
+
+ # 0: Parse email-from, try to find a better author_id based on document's followers for incoming emails
+ email_from = kwargs.get('email_from')
+ if email_from and thread_id and type == 'email' and kwargs.get('author_id'):
+ email_list = tools.email_split(email_from)
+ doc = self.browse(cr, uid, thread_id, context=context)
+ if email_list and doc:
+ author_ids = self.pool.get('res.partner').search(cr, uid, [
+ ('email', 'ilike', email_list[0]),
+ ('id', 'in', [f.id for f in doc.message_follower_ids])
+ ], limit=1, context=context)
+ if author_ids:
+ kwargs['author_id'] = author_ids[0]
# 1: Handle content subtype: if plaintext, converto into HTML
if content_subtype == 'plaintext':
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index f6e098b466d..ad69f7e41c3 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -688,6 +688,10 @@ openerp.mail = function (session) {
on_message_post: function (event) {
var self = this;
+ if (self.flag_post) {
+ return;
+ }
+ self.flag_post = true;
if (this.do_check_attachment_upload() && (this.attachment_ids.length || this.$('textarea').val().match(/\S+/))) {
if (this.is_log) {
this.do_send_message_post([], this.is_log);
@@ -735,6 +739,7 @@ openerp.mail = function (session) {
thread.insert_message( message, root ? undefined : self.$el, root );
});
self.on_cancel();
+ self.flag_post = false;
});
},
@@ -910,9 +915,6 @@ openerp.mail = function (session) {
// read messages
self.parent_thread.message_fetch(this.domain, this.context, false, function (arg, data) {
- if (self.options.root_thread == self.parent_thread) {
- data.reverse();
- }
self.id = false;
// insert the message on dom after this message
self.parent_thread.switch_new_message( data, self.$el );
@@ -1212,7 +1214,7 @@ openerp.mail = function (session) {
this.partner_ids = datasets.partner_ids;
this.messages = [];
- this.options.flat_mode = !!(this.options.display_indented_thread > this.thread_level ? this.options.display_indented_thread - this.thread_level : 0);
+ this.options.flat_mode = (this.options.display_indented_thread - this.thread_level > 0);
// object compose message
this.compose_message = false;
@@ -1434,8 +1436,8 @@ openerp.mail = function (session) {
create_message_object: function (data) {
var self = this;
- var data = _.extend(data, {'thread_level': data.thread_level ? data.thread_level : self.thread_level});
- data.options = _.extend(self.options, data.options);
+ data.thread_level = self.thread_level || 0;
+ data.options = _.extend(data.options || {}, self.options);
if (data.type=='expandable') {
var message = new mail.ThreadExpandable(self, data, {'context':{
@@ -1480,8 +1482,7 @@ openerp.mail = function (session) {
}
this.$('.oe_view_nocontent').remove();
-
- if (dom_insert_after) {
+ if (dom_insert_after && dom_insert_after.parent()[0] == self.$el[0]) {
message.insertAfter(dom_insert_after);
} else if (prepend) {
message.prependTo(self.$el);
@@ -1500,6 +1501,7 @@ openerp.mail = function (session) {
*/
switch_new_message: function (records, dom_insert_after) {
var self=this;
+ var dom_insert_after = typeof dom_insert_after == 'object' ? dom_insert_after : false;
_(records).each(function (record) {
var thread = self.browse_thread({
'id': record.parent_id,
@@ -1508,7 +1510,7 @@ openerp.mail = function (session) {
// create object and attach to the thread object
var message = thread.create_message_object( record );
// insert the message on dom
- thread.insert_message( message, typeof dom_insert_after == 'object' ? dom_insert_after : false);
+ thread.insert_message( message, dom_insert_after);
});
if (!records.length && this.options.root_thread == this) {
this.no_message();
diff --git a/addons/mail/tests/__init__.py b/addons/mail/tests/__init__.py
index b945da54655..ff1080b0580 100644
--- a/addons/mail/tests/__init__.py
+++ b/addons/mail/tests/__init__.py
@@ -19,11 +19,12 @@
#
##############################################################################
-from . import test_mail_message, test_mail_features, test_message_read, test_invite
+from . import test_mail_message, test_mail_features, test_mail_gateway, test_message_read, test_invite
checks = [
test_mail_message,
test_mail_features,
+ test_mail_gateway,
test_message_read,
test_invite,
]
diff --git a/addons/mail/tests/test_mail_base.py b/addons/mail/tests/test_mail_base.py
index fb53220ef1f..a3b90288f0b 100644
--- a/addons/mail/tests/test_mail_base.py
+++ b/addons/mail/tests/test_mail_base.py
@@ -70,9 +70,9 @@ class TestMailBase(common.TransactionCase):
# Test users to use through the various tests
self.user_raoul_id = self.res_users.create(cr, uid,
- {'name': 'Raoul Grosbedon', 'signature': 'Raoul', 'email': 'raoul@raoul.fr', 'login': 'raoul', 'groups_id': [(6, 0, [self.group_employee_id])]})
+ {'name': 'Raoul Grosbedon', 'signature': 'SignRaoul', 'email': 'raoul@raoul.fr', 'login': 'raoul', 'groups_id': [(6, 0, [self.group_employee_id])]})
self.user_bert_id = self.res_users.create(cr, uid,
- {'name': 'Bert Tartignole', 'signature': 'Bert', 'email': 'bert@bert.fr', 'login': 'bert', 'groups_id': [(6, 0, [])]})
+ {'name': 'Bert Tartignole', 'signature': 'SignBert', 'email': 'bert@bert.fr', 'login': 'bert', 'groups_id': [(6, 0, [])]})
self.user_raoul = self.res_users.browse(cr, uid, self.user_raoul_id)
self.user_bert = self.res_users.browse(cr, uid, self.user_bert_id)
self.user_admin = self.res_users.browse(cr, uid, uid)
diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py
index da7f2ae351c..2d0019c0b8a 100644
--- a/addons/mail/tests/test_mail_features.py
+++ b/addons/mail/tests/test_mail_features.py
@@ -22,164 +22,29 @@
from openerp.addons.mail.tests.test_mail_base import TestMailBase
from openerp.tools.mail import html_sanitize
-MAIL_TEMPLATE = """Return-Path: <whatever-2a840@postmaster.twitter.com>
-To: {to}
-Received: by mail1.openerp.com (Postfix, from userid 10002)
- id 5DF9ABFB2A; Fri, 10 Aug 2012 16:16:39 +0200 (CEST)
-From: Sylvie Lelitre <sylvie.lelitre@agrolait.com>
-Subject: {subject}
-MIME-Version: 1.0
-Content-Type: multipart/alternative;
- boundary="----=_Part_4200734_24778174.1344608186754"
-Date: Fri, 10 Aug 2012 14:16:26 +0000
-Message-ID: <1198923581.41972151344608186760.JavaMail@agrolait.com>
-{extra}
-------=_Part_4200734_24778174.1344608186754
-Content-Type: text/plain; charset=utf-8
-Content-Transfer-Encoding: quoted-printable
-
-Please call me as soon as possible this afternoon!
-
---
-Sylvie
-------=_Part_4200734_24778174.1344608186754
-Content-Type: text/html; charset=utf-8
-Content-Transfer-Encoding: quoted-printable
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
- <head>=20
- <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8" />
- </head>=20
- <body style=3D"margin: 0; padding: 0; background: #ffffff;-webkit-text-size-adjust: 100%;">=20
-
- <p>Please call me as soon as possible this afternoon!</p>
-
- <p>--<br/>
- Sylvie
- <p>
- </body>
-</html>
-------=_Part_4200734_24778174.1344608186754--
-"""
-
-MAIL_TEMPLATE_PLAINTEXT = """Return-Path: <whatever-2a840@postmaster.twitter.com>
-To: {to}
-Received: by mail1.openerp.com (Postfix, from userid 10002)
- id 5DF9ABFB2A; Fri, 10 Aug 2012 16:16:39 +0200 (CEST)
-From: Sylvie Lelitre <sylvie.lelitre@agrolait.com>
-Subject: {subject}
-MIME-Version: 1.0
-Content-Type: text/plain
-Date: Fri, 10 Aug 2012 14:16:26 +0000
-Message-ID: {msg_id}
-{extra}
-
-Please call me as soon as possible this afternoon!
-
---
-Sylvie
-"""
-
class test_mail(TestMailBase):
-
- def test_00_message_process(self):
- """ Testing incoming emails processing. """
- cr, uid, user_raoul = self.cr, self.uid, self.user_raoul
-
- # groups@.. will cause the creation of new mail groups
- self.mail_group_model_id = self.ir_model.search(cr, uid, [('model', '=', 'mail.group')])[0]
- self.mail_alias.create(cr, uid, {'alias_name': 'groups', 'alias_model_id': self.mail_group_model_id})
-
- # Incoming mail creates a new mail_group "frogs"
- self.assertEqual(self.mail_group.search(cr, uid, [('name', '=', 'frogs')]), [])
- mail_frogs = MAIL_TEMPLATE.format(to='groups@example.com, other@gmail.com', subject='frogs', extra='')
- self.mail_thread.message_process(cr, uid, None, mail_frogs)
- frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'frogs')])
- self.assertTrue(len(frog_groups) == 1)
-
- # Previously-created group can be emailed now - it should have an implicit alias group+frogs@...
- frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
- group_messages = frog_group.message_ids
- self.assertTrue(len(group_messages) == 1, 'New group should only have the original message')
- mail_frog_news = MAIL_TEMPLATE.format(to='Friendly Frogs <group+frogs@example.com>', subject='news', extra='')
- self.mail_thread.message_process(cr, uid, None, mail_frog_news)
- frog_group.refresh()
- self.assertTrue(len(frog_group.message_ids) == 2, 'Group should contain 2 messages now')
-
- # Even with a wrong destination, a reply should end up in the correct thread
- mail_reply = MAIL_TEMPLATE.format(to='erroneous@example.com>', subject='Re: news',
- extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
- self.mail_thread.message_process(cr, uid, None, mail_reply)
- frog_group.refresh()
- self.assertTrue(len(frog_group.message_ids) == 3, 'Group should contain 3 messages now')
-
- # No model passed and no matching alias must raise
- mail_spam = MAIL_TEMPLATE.format(to='noone@example.com', subject='spam', extra='')
- self.assertRaises(Exception,
- self.mail_thread.message_process,
- cr, uid, None, mail_spam)
-
- # plain text content should be wrapped and stored as html
- test_msg_id = '<deadcafe.1337@smtp.agrolait.com>'
- mail_text = MAIL_TEMPLATE_PLAINTEXT.format(to='groups@example.com', subject='frogs', extra='', msg_id=test_msg_id)
- self.mail_thread.message_process(cr, uid, None, mail_text)
- new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id', '=', test_msg_id)])[0])
- self.assertEqual(new_mail.body, '<pre>\nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n</pre>',
- 'plaintext mail incorrectly parsed')
-
- # Do: post a new message, with a known partner
- test_msg_id = '<deadcafe.1337-2@smtp.agrolait.com>'
- TEMPLATE_MOD = MAIL_TEMPLATE_PLAINTEXT.replace('Sylvie Lelitre <sylvie.lelitre@agrolait.com>', user_raoul.email)
- mail_new = TEMPLATE_MOD.format(to='Friendly Frogs <group+frogs@example.com>', subject='extra news', extra='', msg_id=test_msg_id)
- self.mail_thread.message_process(cr, uid, None, mail_new)
- new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id', '=', test_msg_id)])[0])
- # Test: author_id set, not email_from
- self.assertEqual(new_mail.author_id, user_raoul.partner_id, 'message process wrong author found')
- self.assertEqual(new_mail.email_from, user_raoul.email, 'message process wrong email_from')
-
- # Do: post a new message, with a unknown partner
- test_msg_id = '<deadcafe.1337-3@smtp.agrolait.com>'
- TEMPLATE_MOD = MAIL_TEMPLATE_PLAINTEXT.replace('Sylvie Lelitre <sylvie.lelitre@agrolait.com>', '_abcd_')
- mail_new = TEMPLATE_MOD.format(to='Friendly Frogs <group+frogs@example.com>', subject='super news', extra='', msg_id=test_msg_id)
- self.mail_thread.message_process(cr, uid, None, mail_new)
- new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id', '=', test_msg_id)])[0])
- # Test: author_id set, not email_from
- self.assertFalse(new_mail.author_id, 'message process shnould not have found a partner for _abcd_ email address')
- self.assertIn('_abcd_', new_mail.email_from, 'message process should set en email_from when not finding a partner_id')
-
- def test_05_thread_parent_resolution(self):
- """Verify parent/child relationships are correctly established when processing incoming mails"""
+
+ def test_000_alias_setup(self):
+ """ Test basic mail.alias setup works, before trying to use them for routing """
cr, uid = self.cr, self.uid
- group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
- msg1 = group_pigs.message_post(body='My Body', subject='1')
- msg2 = group_pigs.message_post(body='My Body', subject='2')
- msg1, msg2 = self.mail_message.browse(cr, uid, [msg1, msg2])
- self.assertTrue(msg1.message_id, "New message should have a proper message_id")
-
- # Reply to msg1, make sure the reply is properly attached using the various reply identification mechanisms
- # 1. In-Reply-To header
- reply_msg = MAIL_TEMPLATE.format(to='Pretty Pigs <group+pigs@example.com>, other@gmail.com', subject='Re: 1',
- extra='In-Reply-To: %s' % msg1.message_id)
- self.mail_group.message_process(cr, uid, None, reply_msg)
-
- # 2. References header
- reply_msg2 = MAIL_TEMPLATE.format(to='Pretty Pigs <group+pigs@example.com>, other@gmail.com', subject='Re: Re: 1',
- extra='References: <2233@a.com>\r\n\t<3edss_dsa@b.com> %s' % msg1.message_id)
- self.mail_group.message_process(cr, uid, None, reply_msg2)
-
- # 3. Subject contains [<ID>] + model passed to message+process -> only attached to group, not to mail
- reply_msg3 = MAIL_TEMPLATE.format(to='Pretty Pigs <group+pigs@example.com>, other@gmail.com',
- extra='', subject='Re: [%s] 1' % self.group_pigs_id)
- self.mail_group.message_process(cr, uid, 'mail.group', reply_msg3)
+ self.user_valentin_id = self.res_users.create(cr, uid,
+ {'name': 'Valentin Cognito', 'email': 'valentin.cognito@gmail.com', 'login': 'valentin.cognito'})
+ self.user_valentin = self.res_users.browse(cr, uid, self.user_valentin_id)
+ self.assertEquals(self.user_valentin.alias_name, self.user_valentin.login, "Login should be used as alias")
- group_pigs.refresh()
- msg1.refresh()
- self.assertEqual(5, len(group_pigs.message_ids), 'group should contain 5 messages')
- self.assertEqual(2, len(msg1.child_ids), 'msg1 should have 2 children now')
+ self.user_pagan_id = self.res_users.create(cr, uid,
+ {'name': 'Pagan Le Marchant', 'email': 'plmarchant@gmail.com', 'login': 'plmarchant@gmail.com'})
+ self.user_pagan = self.res_users.browse(cr, uid, self.user_pagan_id)
+ self.assertEquals(self.user_pagan.alias_name, 'plmarchant', "If login is an email, the alias should keep only the local part")
+
+ self.user_barty_id = self.res_users.create(cr, uid,
+ {'name': 'Bartholomew Ironside', 'email': 'barty@gmail.com', 'login': 'b4r+_#_R3wl$$'})
+ self.user_barty = self.res_users.browse(cr, uid, self.user_barty_id)
+ self.assertEquals(self.user_barty.alias_name, 'b4r+_-_r3wl-', 'Disallowed chars should be replaced by hyphens')
- def test_10_followers_function_field(self):
+
+ def test_00_followers_function_field(self):
""" Tests designed for the many2many function field 'follower_ids'.
We will test to perform writes using the many2many commands 0, 3, 4,
5 and 6. """
@@ -236,7 +101,7 @@ class test_mail(TestMailBase):
follower_ids = set([follower.partner_id.id for follower in self.mail_followers.browse(cr, uid, fol_obj_ids)])
self.assertEqual(follower_ids, set([partner_bert_id, user_admin.partner_id.id]), 'Bert and Admin should be the followers of dummy mail.group data')
- def test_11_message_followers_and_subtypes(self):
+ def test_05_message_followers_and_subtypes(self):
""" Tests designed for the subscriber API as well as message subtypes """
cr, uid, user_admin, user_raoul, group_pigs = self.cr, self.uid, self.user_admin, self.user_raoul, self.group_pigs
# Data: message subtypes
@@ -288,7 +153,7 @@ class test_mail(TestMailBase):
self.assertTrue(subtype_data['mt_mg_nodef']['followed'], 'Admin should follow mt_mg_nodef in pigs')
self.assertTrue(subtype_data['mt_all_nodef']['followed'], 'Admin should follow mt_all_nodef in pigs')
- def test_20_message_quote_context(self):
+ def test_10_message_quote_context(self):
""" Tests designed for message_post. """
cr, uid, user_admin, group_pigs = self.cr, self.uid, self.user_admin, self.group_pigs
@@ -306,239 +171,396 @@ class test_mail(TestMailBase):
self.assertNotIn('First answer, should not be displayed', result, 'Old answer should not be in quote.')
self.assertNotIn('My answer I am propagating', result, 'Thread header content should be in quote.')
- def test_21_message_post(self):
+ def test_20_message_post(self):
""" Tests designed for message_post. """
cr, uid, user_raoul, group_pigs = self.cr, self.uid, self.user_raoul, self.group_pigs
- self.res_users.write(cr, uid, [uid], {'signature': 'Admin', 'email': 'a@a'})
+
+ # --------------------------------------------------
+ # Data creation
+ # --------------------------------------------------
+ # 0 - Update existing users-partners
+ self.res_users.write(cr, uid, [uid], {'email': 'a@a'})
+ self.res_users.write(cr, uid, [self.user_raoul_id], {'email': 'r@r'})
# 1 - Bert Tartopoils, with email, should receive emails for comments and emails
p_b_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'})
# 2 - Carine Poilvache, with email, should receive emails for emails
p_c_id = self.res_partner.create(cr, uid, {'name': 'Carine Poilvache', 'email': 'c@c', 'notification_email_send': 'email'})
# 3 - Dédé Grosbedon, without email, to test email verification; should receive emails for every message
- p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'notification_email_send': 'all'})
-
- # Subscribe Raoul, #1, #2
- group_pigs.message_subscribe([self.partner_raoul_id, p_b_id, p_c_id])
-
- # Mail data
+ p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'email': 'd@d', 'notification_email_send': 'all'})
+ # 4 - Attachments
+ attach1_id = self.ir_attachment.create(cr, user_raoul.id, {
+ 'name': 'Attach1', 'datas_fname': 'Attach1',
+ 'datas': 'bWlncmF0aW9uIHRlc3Q=',
+ 'res_model': 'mail.compose.message', 'res_id': 0})
+ attach2_id = self.ir_attachment.create(cr, user_raoul.id, {
+ 'name': 'Attach2', 'datas_fname': 'Attach2',
+ 'datas': 'bWlncmF0aW9uIHRlc3Q=',
+ 'res_model': 'mail.compose.message', 'res_id': 0})
+ attach3_id = self.ir_attachment.create(cr, user_raoul.id, {
+ 'name': 'Attach3', 'datas_fname': 'Attach3',
+ 'datas': 'bWlncmF0aW9uIHRlc3Q=',
+ 'res_model': 'mail.compose.message', 'res_id': 0})
+ # 5 - Mail data
_subject = 'Pigs'
_mail_subject = 'Re: %s' % (group_pigs.name)
_body1 = '<p>Pigs rules</p>'
- _mail_body1 = '<p>Pigs rules</p>'
- _mail_signature1 = '<p>Raoul</p>'
- _mail_bodyalt1 = 'Pigs rules\n'
- _mail_signaturealt1 = '\nRaoul\n'
- _body2 = '<html>Pigs rules</html>'
- _mail_body2 = '<div><p>Pigs rules</p></div>'
- _mail_signature2 = '<p>Raoul</p>'
- _mail_bodyalt2 = 'Pigs rules\n'
- _mail_signaturealt2 = '\nRaoul\n'
- _attachments = [('First', 'My first attachment'), ('Second', 'My second attachment')]
-
- # ----------------------------------------
- # CASE1: post comment, body and subject specified
- # ----------------------------------------
-
- # 1. Post a new comment on Pigs
+ _body2 = '<html>Pigs rocks</html>'
+ _attachments = [
+ ('List1', 'My first attachment'),
+ ('List2', 'My second attachment')
+ ]
+
+ # --------------------------------------------------
+ # CASE1: post comment + partners + attachments
+ # --------------------------------------------------
+
+ # Data: set alias_domain to see emails with alias
+ self.registry('ir.config_parameter').set_param(self.cr, self.uid, 'mail.catchall.domain', 'schlouby.fr')
+ # Data: change Pigs name to test reply_to
+ self.mail_group.write(cr, uid, [self.group_pigs_id], {'name': '"Pigs" !ù $%-'})
+
+ # Do: subscribe Raoul
+ new_follower_ids = [self.partner_raoul_id]
+ group_pigs.message_subscribe(new_follower_ids)
+ # Test: group followers = Raoul + uid
+ group_fids = [follower.id for follower in group_pigs.message_follower_ids]
+ test_fids = new_follower_ids + [self.partner_admin_id]
+ self.assertEqual(set(test_fids), set(group_fids),
+ 'message_subscribe: incorrect followers after subscribe')
+
+ # Do: Raoul message_post on Pigs
self._init_mock_build_email()
- msg1_id = self.mail_group.message_post(cr, user_raoul.id, self.group_pigs_id, body=_body1, subject=_subject, type='comment', subtype='mt_comment')
- message1 = self.mail_message.browse(cr, uid, msg1_id)
+ msg1_id = self.mail_group.message_post(cr, user_raoul.id, self.group_pigs_id,
+ body=_body1, subject=_subject, partner_ids=[p_b_id, p_c_id],
+ attachment_ids=[attach1_id, attach2_id], attachments=_attachments,
+ type='comment', subtype='mt_comment')
+ msg = self.mail_message.browse(cr, uid, msg1_id)
+ msg_message_id = msg.message_id
+ msg_pids = [partner.id for partner in msg.notified_partner_ids]
+ msg_aids = [attach.id for attach in msg.attachment_ids]
sent_emails = self._build_email_kwargs_list
- # Test: mail.mail notifications have been deleted
- self.assertFalse(self.mail_mail.search(cr, uid, [('mail_message_id', '=', msg1_id)]), 'mail.mail notifications should have been auto-deleted!')
- # Test: mail_message: subject is _subject, body is _body1 (no formatting done)
- self.assertEqual(message1.subject, _subject, 'mail.message subject incorrect')
- self.assertEqual(message1.body, _body1, 'mail.message body incorrect')
- # Test: sent_email: email send by server: correct subject, body, body_alternative
- self.assertEqual(len(sent_emails), 2, 'sent_email number of sent emails incorrect')
- for sent_email in sent_emails:
- self.assertEqual(sent_email['subject'], _subject, 'sent_email subject incorrect')
- self.assertIn(_mail_body1, sent_email['body'], 'sent_email body incorrect')
- self.assertIn(_mail_signature1, sent_email['body'], 'sent_email body incorrect (no signature)')
- self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)')
- # the html2plaintext uses etree or beautiful soup, so the result may be slighly different
- # depending if you have installed beautiful soup.
- self.assertIn(_mail_bodyalt1, sent_email['body_alternative'], 'sent_email body_alternative is incorrect')
- self.assertIn(_mail_signaturealt1, sent_email['body_alternative'], 'sent_email body_alternative is incorrect (no signature)')
- self.assertIn("OpenERP", sent_email['body_alternative'], 'sent_email body incorrect (no OpenERP company)')
- # Test: mail_message: notified_partner_ids = group followers
- message_pids = set([partner.id for partner in message1.notified_partner_ids])
+
+ # Test: mail_message: subject and body not modified
+ self.assertEqual(_subject, msg.subject, 'message_post: mail.message subject incorrect')
+ self.assertEqual(_body1, msg.body, 'message_post: mail.message body incorrect')
+ # Test: mail_message: notified_partner_ids = group followers + partner_ids - author
test_pids = set([self.partner_admin_id, p_b_id, p_c_id])
- self.assertEqual(test_pids, message_pids, 'mail.message notified partners incorrect')
+ self.assertEqual(test_pids, set(msg_pids), 'message_post: mail.message notified partners incorrect')
+ # Test: mail_message: attachments (4, attachment_ids + attachments)
+ test_aids = set([attach1_id, attach2_id])
+ msg_attach_names = set([attach.name for attach in msg.attachment_ids])
+ test_attach_names = set(['Attach1', 'Attach2', 'List1', 'List2'])
+ self.assertEqual(len(msg_aids), 4,
+ 'message_post: mail.message wrong number of attachments')
+ self.assertEqual(msg_attach_names, test_attach_names,
+ 'message_post: mail.message attachments incorrectly added')
+ self.assertTrue(test_aids.issubset(set(msg_aids)),
+ 'message_post: mail.message attachments duplicated')
+ for attach in msg.attachment_ids:
+ self.assertEqual(attach.res_model, 'mail.group',
+ 'message_post: mail.message attachments were not linked to the document')
+ self.assertEqual(attach.res_id, group_pigs.id,
+ 'message_post: mail.message attachments were not linked to the document')
+ if 'List' in attach.name:
+ self.assertIn((attach.name, attach.datas.decode('base64')), _attachments,
+ 'message_post: mail.message attachment name / data incorrect')
+ dl_attach = self.mail_message.download_attachment(cr, user_raoul.id, id_message=msg.id, attachment_id=attach.id)
+ self.assertIn((dl_attach['filename'], dl_attach['base64'].decode('base64')), _attachments,
+ 'message_post: mail.message download_attachment is incorrect')
+
+ # Test: followers: same as before (author was already subscribed)
+ group_pigs.refresh()
+ group_fids = [follower.id for follower in group_pigs.message_follower_ids]
+ test_fids = new_follower_ids + [self.partner_admin_id]
+ self.assertEqual(set(test_fids), set(group_fids),
+ 'message_post: wrong followers after posting')
+
+ # Test: mail_mail: notifications have been deleted
+ self.assertFalse(self.mail_mail.search(cr, uid, [('mail_message_id', '=', msg1_id)]),
+ 'message_post: mail.mail notifications should have been auto-deleted!')
+
+ # Test: notifications emails: to a and b, c is email only, r is author
+ test_emailto = ['Administrator <a@a>', 'Bert Tartopoils <b@b>']
+ self.assertEqual(len(sent_emails), 2,
+ 'message_post: notification emails wrong number of send emails')
+ self.assertEqual(set([m['email_to'][0] for m in sent_emails]), set(test_emailto),
+ 'message_post: notification emails wrong recipients (email_to)')
+ for sent_email in sent_emails:
+ self.assertEqual(sent_email['email_from'], 'Raoul Grosbedon <raoul@schlouby.fr>',
+ 'message_post: notification email wrong email_from: should use alias of sender')
+ self.assertEqual(len(sent_email['email_to']), 1,
+ 'message_post: notification email sent to more than one email address instead of a precise partner')
+ self.assertIn(sent_email['email_to'][0], test_emailto,
+ 'message_post: notification email email_to incorrect')
+ self.assertEqual(sent_email['reply_to'], '"Followers of -Pigs-" <group+pigs@schlouby.fr>',
+ 'message_post: notification email reply_to incorrect')
+ self.assertEqual(_subject, sent_email['subject'],
+ 'message_post: notification email subject incorrect')
+ self.assertIn(_body1, sent_email['body'],
+ 'message_post: notification email body incorrect')
+ self.assertIn(user_raoul.signature, sent_email['body'],
+ 'message_post: notification email body should contain the sender signature')
+ self.assertIn('Pigs rules', sent_email['body_alternative'],
+ 'message_post: notification email body alternative should contain the body')
+ self.assertNotIn('<p>', sent_email['body_alternative'],
+ 'message_post: notification email body alternative still contains html')
+ self.assertIn(user_raoul.signature, sent_email['body_alternative'],
+ 'message_post: notification email body alternative should contain the sender signature')
+ self.assertFalse(sent_email['references'],
+ 'message_post: references should be False when sending a message that is not a reply')
+
# Test: notification linked to this message = group followers = notified_partner_ids
notif_ids = self.mail_notification.search(cr, uid, [('message_id', '=', msg1_id)])
notif_pids = set([notif.partner_id.id for notif in self.mail_notification.browse(cr, uid, notif_ids)])
- self.assertEqual(notif_pids, test_pids, 'mail.message notification partners incorrect')
- # Test: sent_email: email_to should contain b@b, not c@c (pref email), not a@a (writer)
- for sent_email in sent_emails:
- self.assertTrue(set(sent_email['email_to']).issubset(set(['a@a', 'b@b'])), 'sent_email email_to is incorrect')
+ self.assertEqual(notif_pids, test_pids,
+ 'message_post: mail.message created mail.notification incorrect')
- # ----------------------------------------
- # CASE2: post an email with attachments, parent_id, partner_ids, parent notification
- # ----------------------------------------
+ # Data: Pigs name back to normal
+ self.mail_group.write(cr, uid, [self.group_pigs_id], {'name': 'Pigs'})
+
+ # --------------------------------------------------
+ # CASE2: reply + parent_id + parent notification
+ # --------------------------------------------------
- # 1. Post a new email comment on Pigs
+ # Data: remove alias_domain to see emails with alias
+ param_ids = self.registry('ir.config_parameter').search(cr, uid, [('key', '=', 'mail.catchall.domain')])
+ self.registry('ir.config_parameter').unlink(cr, uid, param_ids)
+
+ # Do: Raoul message_post on Pigs
self._init_mock_build_email()
- msg2_id = self.mail_group.message_post(cr, user_raoul.id, self.group_pigs_id, body=_body2, type='email', subtype='mt_comment',
- partner_ids=[p_d_id], parent_id=msg1_id, attachments=_attachments,
- context={'mail_post_autofollow': True})
- message2 = self.mail_message.browse(cr, uid, msg2_id)
+ msg2_id = self.mail_group.message_post(cr, user_raoul.id, self.group_pigs_id,
+ body=_body2, type='email', subtype='mt_comment',
+ partner_ids=[p_d_id], parent_id=msg1_id, attachment_ids=[attach3_id],
+ context={'mail_post_autofollow': True})
+ msg = self.mail_message.browse(cr, uid, msg2_id)
+ msg_pids = [partner.id for partner in msg.notified_partner_ids]
+ msg_aids = [attach.id for attach in msg.attachment_ids]
sent_emails = self._build_email_kwargs_list
- self.assertFalse(self.mail_mail.search(cr, uid, [('mail_message_id', '=', msg2_id)]), 'mail.mail notifications should have been auto-deleted!')
- # Test: mail_message: subject is False, body is _body2 (no formatting done), parent_id is msg_id
- self.assertEqual(message2.subject, False, 'mail.message subject incorrect')
- self.assertEqual(message2.body, html_sanitize(_body2), 'mail.message body incorrect')
- self.assertEqual(message2.parent_id.id, msg1_id, 'mail.message parent_id incorrect')
- # Test: sent_email: email send by server: correct automatic subject, body, body_alternative
- self.assertEqual(len(sent_emails), 3, 'sent_email number of sent emails incorrect')
- for sent_email in sent_emails:
- self.assertEqual(sent_email['subject'], _mail_subject, 'sent_email subject incorrect')
- self.assertIn(_mail_body2, sent_email['body'], 'sent_email body incorrect')
- self.assertIn(_mail_signature2, sent_email['body'], 'sent_email body incorrect (no signature)')
- self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)')
- # body_alternative
- self.assertIn(_mail_bodyalt2, sent_email['body_alternative'], 'sent_email body_alternative is incorrect')
- self.assertIn(_mail_signaturealt2, sent_email['body_alternative'], 'sent_email body_alternative is incorrect (no signature)')
- self.assertIn("OpenERP", sent_email['body'], 'sent_email body incorrect (no OpenERP company)')
+
+ # Test: mail_message: subject is False, body, parent_id is msg_id
+ self.assertEqual(msg.subject, False, 'message_post: mail.message subject incorrect')
+ self.assertEqual(msg.body, html_sanitize(_body2), 'message_post: mail.message body incorrect')
+ self.assertEqual(msg.parent_id.id, msg1_id, 'message_post: mail.message parent_id incorrect')
# Test: mail_message: notified_partner_ids = group followers
- message_pids = set([partner.id for partner in message2.notified_partner_ids])
- test_pids = set([self.partner_admin_id, p_b_id, p_c_id, p_d_id])
- self.assertEqual(message_pids, test_pids, 'mail.message partners incorrect')
- # Test: notifications linked to this message = group followers = notified_partner_ids
+ test_pids = [self.partner_admin_id, p_d_id]
+ self.assertEqual(set(test_pids), set(msg_pids), 'message_post: mail.message partners incorrect')
+ # Test: mail_message: notifications linked to this message = group followers = notified_partner_ids
notif_ids = self.mail_notification.search(cr, uid, [('message_id', '=', msg2_id)])
- notif_pids = set([notif.partner_id.id for notif in self.mail_notification.browse(cr, uid, notif_ids)])
- self.assertEqual(notif_pids, test_pids, 'mail.message notification partners incorrect')
- # Test: sent_email: email_to should contain b@b, c@c, not a@a (writer)
+ notif_pids = [notif.partner_id.id for notif in self.mail_notification.browse(cr, uid, notif_ids)]
+ self.assertEqual(set(test_pids), set(notif_pids), 'message_post: mail.message notification partners incorrect')
+
+ # Test: mail_mail: notifications deleted
+ self.assertFalse(self.mail_mail.search(cr, uid, [('mail_message_id', '=', msg2_id)]), 'mail.mail notifications should have been auto-deleted!')
+
+ # Test: emails send by server (to a, b, c, d)
+ test_emailto = [u'Administrator <a@a>', u'Bert Tartopoils <b@b>', u'Carine Poilvache <c@c>', u'D\xe9d\xe9 Grosbedon <d@d>']
+ # self.assertEqual(len(sent_emails), 3, 'sent_email number of sent emails incorrect')
for sent_email in sent_emails:
- self.assertTrue(set(sent_email['email_to']).issubset(set(['a@a', 'b@b', 'c@c'])), 'sent_email email_to incorrect')
- # Test: attachments
- for attach in message2.attachment_ids:
- self.assertEqual(attach.res_model, 'mail.group', 'mail.message attachment res_model incorrect')
- self.assertEqual(attach.res_id, self.group_pigs_id, 'mail.message attachment res_id incorrect')
- self.assertIn((attach.name, attach.datas.decode('base64')), _attachments,
- 'mail.message attachment name / data incorrect')
- # Test: download attachments
- for attach in message2.attachment_ids:
- dl_attach = self.mail_message.download_attachment(cr, user_raoul.id, id_message=message2.id, attachment_id=attach.id)
- self.assertIn((dl_attach['filename'], dl_attach['base64'].decode('base64')), _attachments, 'mail.message download_attachment is incorrect')
-
- # 2. Dédé has been notified -> should also have been notified of the parent message
- message1.refresh()
- message_pids = set([partner.id for partner in message1.notified_partner_ids])
+ self.assertEqual(sent_email['email_from'], 'Raoul Grosbedon <r@r>',
+ 'message_post: notification email wrong email_from: should use email of sender when no alias domain set')
+ self.assertEqual(len(sent_email['email_to']), 1,
+ 'message_post: notification email sent to more than one email address instead of a precise partner')
+ self.assertIn(sent_email['email_to'][0], test_emailto,
+ 'message_post: notification email email_to incorrect')
+ self.assertEqual(sent_email['reply_to'], '"Followers of Pigs" <r@r>',
+ 'message_post: notification email reply_to incorrect: should name Followers of Pigs, and have raoul email')
+ self.assertEqual(_mail_subject, sent_email['subject'],
+ 'message_post: notification email subject incorrect')
+ self.assertIn(html_sanitize(_body2), sent_email['body'],
+ 'message_post: notification email does not contain the body')
+ self.assertIn(user_raoul.signature, sent_email['body'],
+ 'message_post: notification email body should contain the sender signature')
+ self.assertIn('Pigs rocks', sent_email['body_alternative'],
+ 'message_post: notification email body alternative should contain the body')
+ self.assertNotIn('<p>', sent_email['body_alternative'],
+ 'message_post: notification email body alternative still contains html')
+ self.assertIn(user_raoul.signature, sent_email['body_alternative'],
+ 'message_post: notification email body alternative should contain the sender signature')
+ self.assertIn(msg_message_id, sent_email['references'],
+ 'message_post: notification email references lacks parent message message_id')
+ # Test: attachments + download
+ for attach in msg.attachment_ids:
+ self.assertEqual(attach.res_model, 'mail.group',
+ 'message_post: mail.message attachment res_model incorrect')
+ self.assertEqual(attach.res_id, self.group_pigs_id,
+ 'message_post: mail.message attachment res_id incorrect')
+
+ # Test: Dédé has been notified -> should also have been notified of the parent message
+ msg = self.mail_message.browse(cr, uid, msg1_id)
+ msg_pids = set([partner.id for partner in msg.notified_partner_ids])
test_pids = set([self.partner_admin_id, p_b_id, p_c_id, p_d_id])
- self.assertEqual(test_pids, message_pids, 'mail.message parent notification not created')
+ self.assertEqual(test_pids, msg_pids, 'message_post: mail.message parent notification not created')
- # 3. Reply to the last message, check that its parent will be the first message
+ # Do: reply to last message
msg3_id = self.mail_group.message_post(cr, user_raoul.id, self.group_pigs_id, body='Test', parent_id=msg2_id)
- message = self.mail_message.browse(cr, uid, msg3_id)
- self.assertEqual(message.parent_id.id, msg1_id, 'message_post did not flatten the thread structure')
+ msg = self.mail_message.browse(cr, uid, msg3_id)
+ # Test: check that its parent will be the first message
+ self.assertEqual(msg.parent_id.id, msg1_id, 'message_post did not flatten the thread structure')
def test_25_message_compose_wizard(self):
""" Tests designed for the mail.compose.message wizard. """
- cr, uid, user_admin, group_pigs = self.cr, self.uid, self.user_admin, self.group_pigs
+ cr, uid, user_raoul, group_pigs = self.cr, self.uid, self.user_raoul, self.group_pigs
mail_compose = self.registry('mail.compose.message')
- self.res_users.write(cr, uid, [uid], {'signature': 'Admin', 'email': 'a@a'})
- group_bird_id = self.mail_group.create(cr, uid, {'name': 'Bird', 'description': 'Bird resistance'}, {'mail_create_nolog': True})
- group_bird = self.mail_group.browse(cr, uid, group_bird_id)
- # Mail data
+ # --------------------------------------------------
+ # Data creation
+ # --------------------------------------------------
+ # 0 - Update existing users-partners
+ self.res_users.write(cr, uid, [uid], {'email': 'a@a'})
+ self.res_users.write(cr, uid, [self.user_raoul_id], {'email': 'r@r'})
+ # 1 - Bert Tartopoils, with email, should receive emails for comments and emails
+ p_b_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'})
+ # 2 - Carine Poilvache, with email, should receive emails for emails
+ p_c_id = self.res_partner.create(cr, uid, {'name': 'Carine Poilvache', 'email': 'c@c', 'notification_email_send': 'email'})
+ # 3 - Dédé Grosbedon, without email, to test email verification; should receive emails for every message
+ p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'email': 'd@d', 'notification_email_send': 'all'})
+ # 4 - Create a Bird mail.group, that will be used to test mass mailing
+ group_bird_id = self.mail_group.create(cr, uid,
+ {
+ 'name': 'Bird',
+ 'description': 'Bird resistance',
+ }, context={'mail_create_nolog': True})
+ group_bird = self.mail_group.browse(cr, uid, group_bird_id)
+ # 5 - Mail data
_subject = 'Pigs'
_body = 'Pigs <b>rule</b>'
- _reply_subject = 'Re: Pigs'
+ _reply_subject = 'Re: %s' % _subject
_attachments = [
{'name': 'First', 'datas_fname': 'first.txt', 'datas': 'My first attachment'.encode('base64')},
{'name': 'Second', 'datas_fname': 'second.txt', 'datas': 'My second attachment'.encode('base64')}
]
_attachments_test = [('first.txt', 'My first attachment'), ('second.txt', 'My second attachment')]
-
- # 1 - Bert Tartopoils, with email, should receive emails for comments and emails
- p_b_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'})
- # 2 - Carine Poilvache, with email, should never receive emails
- p_c_id = self.res_partner.create(cr, uid, {'name': 'Carine Poilvache', 'email': 'c@c', 'notification_email_send': 'email'})
- # 3 - Dédé Grosbedon, without email, to test email verification; should receive emails for every message
- p_d_id = self.res_partner.create(cr, uid, {'name': 'Dédé Grosbedon', 'email': 'd@d', 'notification_email_send': 'all'})
-
- # Subscribe #1
+ # 6 - Subscribe Bert to Pigs
group_pigs.message_subscribe([p_b_id])
- # ----------------------------------------
- # CASE1: comment on group_pigs
- # ----------------------------------------
-
- # 1. Comment group_pigs with body_text and subject
- compose_id = mail_compose.create(cr, uid,
- {'subject': _subject, 'body': _body, 'partner_ids': [(4, p_c_id), (4, p_d_id)]},
- {'default_composition_mode': 'comment', 'default_model': 'mail.group', 'default_res_id': self.group_pigs_id,
- 'default_content_subtype': 'plaintext'})
+ # --------------------------------------------------
+ # CASE1: wizard + partners + context keys
+ # --------------------------------------------------
+
+ # Do: Raoul wizard-composes on Pigs with auto-follow for partners, not for author
+ compose_id = mail_compose.create(cr, user_raoul.id,
+ {
+ 'subject': _subject,
+ 'body': _body,
+ 'partner_ids': [(4, p_c_id), (4, p_d_id)],
+ }, context={
+ 'default_composition_mode': 'comment',
+ 'default_model': 'mail.group',
+ 'default_res_id': self.group_pigs_id,
+ })
compose = mail_compose.browse(cr, uid, compose_id)
+
# Test: mail.compose.message: composition_mode, model, res_id
- self.assertEqual(compose.composition_mode, 'comment', 'mail.compose.message incorrect composition_mode')
- self.assertEqual(compose.model, 'mail.group', 'mail.compose.message incorrect model')
- self.assertEqual(compose.res_id, self.group_pigs_id, 'mail.compose.message incorrect res_id')
+ self.assertEqual(compose.composition_mode, 'comment', 'compose wizard: mail.compose.message incorrect composition_mode')
+ self.assertEqual(compose.model, 'mail.group', 'compose wizard: mail.compose.message incorrect model')
+ self.assertEqual(compose.res_id, self.group_pigs_id, 'compose wizard: mail.compose.message incorrect res_id')
- # 2. Post the comment, get created message
- mail_compose.send_mail(cr, uid, [compose_id], {'mail_post_autofollow': True})
+ # Do: Post the comment
+ mail_compose.send_mail(cr, user_raoul.id, [compose_id], {'mail_post_autofollow': True, 'mail_create_nosubscribe': True})
group_pigs.refresh()
message = group_pigs.message_ids[0]
- # Test: mail.message: subject, body inside pre
- self.assertEqual(message.subject, _subject, 'mail.message incorrect subject')
- self.assertEqual(message.body, '<p>%s</p>' % _body, 'mail.message incorrect body')
- # Test: mail.message: notified_partner_ids = entries in mail.notification: group_pigs fans (a, b) + mail.compose.message partner_ids (c, d)
- msg_pids = [partner.id for partner in message.notified_partner_ids]
- test_pids = [p_b_id, p_c_id, p_d_id]
- notif_ids = self.mail_notification.search(cr, uid, [('message_id', '=', message.id)])
- self.assertEqual(len(notif_ids), 3, 'mail.message: too much notifications created')
- self.assertEqual(set(msg_pids), set(test_pids), 'mail.message notified_partner_ids incorrect')
- # ----------------------------------------
- # CASE2: reply to last comment with attachments
- # ----------------------------------------
+ # Test: mail.group: followers (c and d added by auto follow key; raoul not added by nosubscribe key)
+ pigs_pids = [p.id for p in group_pigs.message_follower_ids]
+ test_pids = [self.partner_admin_id, p_b_id, p_c_id, p_d_id]
+ self.assertEqual(set(pigs_pids), set(test_pids),
+ 'compose wizard: mail_post_autofollow and mail_create_nosubscribe context keys not correctly taken into account')
- # 1. Update last comment subject, reply with attachments
- message.write({'subject': _subject})
- compose_id = mail_compose.create(cr, uid,
- {'attachment_ids': [(0, 0, _attachments[0]), (0, 0, _attachments[1])]},
- {'default_composition_mode': 'reply', 'default_model': 'mail.thread', 'default_res_id': self.group_pigs_id, 'default_parent_id': message.id})
+ # Test: mail.message: subject, body inside p
+ self.assertEqual(message.subject, _subject, 'compose wizard: mail.message incorrect subject')
+ self.assertEqual(message.body, '<p>%s</p>' % _body, 'compose wizard: mail.message incorrect body')
+ # Test: mail.message: notified_partner_ids = admin + bert (followers) + c + d (recipients)
+ msg_pids = [partner.id for partner in message.notified_partner_ids]
+ test_pids = [self.partner_admin_id, p_b_id, p_c_id, p_d_id]
+ self.assertEqual(set(msg_pids), set(test_pids),
+ 'compose wizard: mail.message notified_partner_ids incorrect')
+
+ # --------------------------------------------------
+ # CASE2: reply + attachments
+ # --------------------------------------------------
+
+ # Do: Reply with attachments
+ compose_id = mail_compose.create(cr, user_raoul.id,
+ {
+ 'attachment_ids': [(0, 0, _attachments[0]), (0, 0, _attachments[1])]
+ }, context={
+ 'default_composition_mode': 'reply',
+ 'default_model': 'mail.thread',
+ 'default_res_id': self.group_pigs_id,
+ 'default_parent_id': message.id
+ })
compose = mail_compose.browse(cr, uid, compose_id)
- # Test: model, res_id, parent_id
- self.assertEqual(compose.model, 'mail.group', 'mail.compose.message incorrect model')
- self.assertEqual(compose.res_id, self.group_pigs_id, 'mail.compose.message incorrect res_id')
- self.assertEqual(compose.parent_id.id, message.id, 'mail.compose.message incorrect parent_id')
- # Test: mail.message: subject as Re:.., body in html, parent_id
- self.assertEqual(compose.subject, _reply_subject, 'mail.message incorrect subject')
- # self.assertIn('Administrator wrote:<blockquote><pre>Pigs rules</pre></blockquote>', compose.body, 'mail.message body is incorrect')
- self.assertEqual(compose.parent_id and compose.parent_id.id, message.id, 'mail.message parent_id incorrect')
- # Test: mail.message: attachments
+
+ # Test: mail.compose.message: model, res_id, parent_id
+ self.assertEqual(compose.model, 'mail.group', 'compose wizard: mail.compose.message incorrect model')
+ self.assertEqual(compose.res_id, self.group_pigs_id, 'compose wizard: mail.compose.message incorrect res_id')
+ self.assertEqual(compose.parent_id.id, message.id, 'compose wizard: mail.compose.message incorrect parent_id')
+
+ # Test: mail.compose.message: subject as Re:.., body, parent_id
+ self.assertEqual(compose.subject, _reply_subject, 'compose wizard: mail.compose.message incorrect subject')
+ self.assertFalse(compose.body, 'compose wizard: mail.compose.message body should not contain parent message body')
+ self.assertEqual(compose.parent_id and compose.parent_id.id, message.id, 'compose wizard: mail.compose.message parent_id incorrect')
+ # Test: mail.compose.message: attachments
for attach in compose.attachment_ids:
- self.assertIn((attach.datas_fname, attach.datas.decode('base64')), _attachments_test, 'mail.message attachment name / data incorrect')
+ self.assertIn((attach.datas_fname, attach.datas.decode('base64')), _attachments_test,
+ 'compose wizard: mail.message attachment name / data incorrect')
- # ----------------------------------------
+ # --------------------------------------------------
# CASE3: mass_mail on Pigs and Bird
- # ----------------------------------------
-
- # 1. mass_mail on pigs and bird
- compose_id = mail_compose.create(cr, uid,
- {'subject': _subject, 'body': '${object.description}'},
- {'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': False, 'default_notify': True,
- 'active_ids': [self.group_pigs_id, group_bird_id]})
+ # --------------------------------------------------
+
+ # Do: Compose in mass_mail_mode on pigs and bird
+ compose_id = mail_compose.create(cr, user_raoul.id,
+ {
+ 'subject': _subject,
+ 'body': '${object.description}',
+ 'partner_ids': [(4, p_c_id), (4, p_d_id)],
+ }, context={
+ 'default_composition_mode': 'mass_mail',
+ 'default_model': 'mail.group',
+ 'default_res_id': False,
+ 'active_ids': [self.group_pigs_id, group_bird_id],
+ })
compose = mail_compose.browse(cr, uid, compose_id)
- # 2. Post the comment, get created message for each group
- mail_compose.send_mail(cr, uid, [compose_id],
- context={'default_res_id': -1, 'active_ids': [self.group_pigs_id, group_bird_id]})
+ # D: Post the comment, get created message for each group
+ mail_compose.send_mail(cr, user_raoul.id, [compose_id], context={
+ 'default_res_id': -1,
+ 'active_ids': [self.group_pigs_id, group_bird_id]
+ })
group_pigs.refresh()
group_bird.refresh()
message1 = group_pigs.message_ids[0]
message2 = group_bird.message_ids[0]
+
# Test: Pigs and Bird did receive their message
test_msg_ids = self.mail_message.search(cr, uid, [], limit=2)
- self.assertIn(message1.id, test_msg_ids, 'Pigs did not receive its mass mailing message')
- self.assertIn(message2.id, test_msg_ids, 'Bird did not receive its mass mailing message')
- # Test: mail.message: subject, body
- self.assertEqual(message1.subject, _subject, 'mail.message subject incorrect')
- self.assertEqual(message1.body, '<p>%s</p>' % group_pigs.description, 'mail.message body incorrect')
- self.assertEqual(message2.subject, _subject, 'mail.message subject incorrect')
- self.assertEqual(message2.body, '<p>%s</p>' % group_bird.description, 'mail.message body incorrect')
+ self.assertIn(message1.id, test_msg_ids, 'compose wizard: Pigs did not receive its mass mailing message')
+ self.assertIn(message2.id, test_msg_ids, 'compose wizard: Bird did not receive its mass mailing message')
+
+ # Test: mail.message: subject, body, subtype, notified partners (nobody + specific recipients)
+ self.assertEqual(message1.subject, _subject,
+ 'compose wizard: message_post: mail.message in mass mail subject incorrect')
+ self.assertEqual(message1.body, '<p>%s</p>' % group_pigs.description,
+ 'compose wizard: message_post: mail.message in mass mail body incorrect')
+ self.assertEqual(set([p.id for p in message1.notified_partner_ids]), set([p_c_id, p_d_id]),
+ 'compose wizard: message_post: mail.message in mass mail incorrect notified partners')
+ self.assertEqual(message2.subject, _subject,
+ 'compose wizard: message_post: mail.message in mass mail subject incorrect')
+ self.assertEqual(message2.body, '<p>%s</p>' % group_bird.description,
+ 'compose wizard: message_post: mail.message in mass mail body incorrect')
+ self.assertEqual(set([p.id for p in message2.notified_partner_ids]), set([p_c_id, p_d_id]),
+ 'compose wizard: message_post: mail.message in mass mail incorrect notified partners')
+
+ # Test: mail.group followers: author not added as follower in mass mail mode
+ pigs_pids = [p.id for p in group_pigs.message_follower_ids]
+ test_pids = [self.partner_admin_id, p_b_id, p_c_id, p_d_id]
+ self.assertEqual(set(pigs_pids), set(test_pids),
+ 'compose wizard: mail_post_autofollow and mail_create_nosubscribe context keys not correctly taken into account')
+ bird_pids = [p.id for p in group_bird.message_follower_ids]
+ test_pids = [self.partner_admin_id]
+ self.assertEqual(set(bird_pids), set(test_pids),
+ 'compose wizard: mail_post_autofollow and mail_create_nosubscribe context keys not correctly taken into account')
def test_30_needaction(self):
""" Tests for mail.message needaction. """
diff --git a/addons/mail/tests/test_mail_gateway.py b/addons/mail/tests/test_mail_gateway.py
new file mode 100644
index 00000000000..eb6ba22067b
--- /dev/null
+++ b/addons/mail/tests/test_mail_gateway.py
@@ -0,0 +1,330 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2012-TODAY OpenERP S.A. <http://openerp.com>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.addons.mail.tests.test_mail_base import TestMailBase
+
+MAIL_TEMPLATE = """Return-Path: <whatever-2a840@postmaster.twitter.com>
+To: {to}
+Received: by mail1.openerp.com (Postfix, from userid 10002)
+ id 5DF9ABFB2A; Fri, 10 Aug 2012 16:16:39 +0200 (CEST)
+From: {email_from}
+Subject: {subject}
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+ boundary="----=_Part_4200734_24778174.1344608186754"
+Date: Fri, 10 Aug 2012 14:16:26 +0000
+Message-ID: {msg_id}
+{extra}
+------=_Part_4200734_24778174.1344608186754
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+
+Please call me as soon as possible this afternoon!
+
+--
+Sylvie
+------=_Part_4200734_24778174.1344608186754
+Content-Type: text/html; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>=20
+ <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8" />
+ </head>=20
+ <body style=3D"margin: 0; padding: 0; background: #ffffff;-webkit-text-size-adjust: 100%;">=20
+
+ <p>Please call me as soon as possible this afternoon!</p>
+
+ <p>--<br/>
+ Sylvie
+ <p>
+ </body>
+</html>
+------=_Part_4200734_24778174.1344608186754--
+"""
+
+MAIL_TEMPLATE_PLAINTEXT = """Return-Path: <whatever-2a840@postmaster.twitter.com>
+To: {to}
+Received: by mail1.openerp.com (Postfix, from userid 10002)
+ id 5DF9ABFB2A; Fri, 10 Aug 2012 16:16:39 +0200 (CEST)
+From: Sylvie Lelitre <sylvie.lelitre@agrolait.com>
+Subject: {subject}
+MIME-Version: 1.0
+Content-Type: text/plain
+Date: Fri, 10 Aug 2012 14:16:26 +0000
+Message-ID: {msg_id}
+{extra}
+
+Please call me as soon as possible this afternoon!
+
+--
+Sylvie
+"""
+
+
+class TestMailgateway(TestMailBase):
+
+ def test_00_message_process(self):
+ """ Testing incoming emails processing. """
+ cr, uid, user_raoul = self.cr, self.uid, self.user_raoul
+
+ def format_and_process(template, to='groups@example.com, other@gmail.com', subject='Frogs',
+ extra='', email_from='Sylvie Lelitre <test.sylvie.lelitre@agrolait.com>',
+ msg_id='<1198923581.41972151344608186760.JavaMail@agrolait.com>',
+ model=None):
+ self.assertEqual(self.mail_group.search(cr, uid, [('name', '=', subject)]), [])
+ mail = template.format(to=to, subject=subject, extra=extra, email_from=email_from, msg_id=msg_id)
+ self.mail_thread.message_process(cr, uid, model, mail)
+ return self.mail_group.search(cr, uid, [('name', '=', subject)])
+
+ # --------------------------------------------------
+ # Data creation
+ # --------------------------------------------------
+
+ # groups@.. will cause the creation of new mail groups
+ self.mail_group_model_id = self.ir_model.search(cr, uid, [('model', '=', 'mail.group')])[0]
+ alias_id = self.mail_alias.create(cr, uid, {
+ 'alias_name': 'groups',
+ 'alias_user_id': False,
+ 'alias_model_id': self.mail_group_model_id})
+
+ # --------------------------------------------------
+ # Test1: new record creation
+ # --------------------------------------------------
+
+ # Do: incoming mail from an unknown partner on an alias creates a new mail_group "frogs"
+ self._init_mock_build_email()
+ frog_groups = format_and_process(MAIL_TEMPLATE, to='groups@example.com, other@gmail.com')
+ sent_emails = self._build_email_kwargs_list
+ # Test: one group created by mailgateway administrator
+ self.assertTrue(len(frog_groups) == 1)
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ # Test: one message that is the incoming email
+ self.assertEqual(len(frog_group.message_ids), 1,
+ 'message_process: newly created group should have the incoming email in message_ids')
+ msg = frog_group.message_ids[0]
+ self.assertEqual('Frogs', msg.subject,
+ 'message_process: newly created group should have the incoming email as first message')
+ self.assertIn('Please call me as soon as possible this afternoon!', msg.body,
+ 'message_process: newly created group should have the incoming email as first message')
+ self.assertEqual('email', msg.type,
+ 'message_process: newly created group should have an email as first message')
+ self.assertEqual('Discussions', msg.subtype_id.name,
+ 'message_process: newly created group should not have a log first message but an email')
+ # Test: message: unknown email address -> message has email_from, not author_id
+ self.assertFalse(msg.author_id,
+ 'message_process: message on created group should not have an author_id')
+ self.assertIn('test.sylvie.lelitre@agrolait.com', msg.email_from,
+ 'message_process: message on created group should have an email_from')
+ # Test: followers: nobody
+ self.assertEqual(len(frog_group.message_follower_ids), 0, 'message_process: newly create group should not have any follower')
+ # Test: sent emails: no-one
+ self.assertEqual(len(sent_emails), 0,
+ 'message_process: should create emails without any follower added')
+ # Data: unlink group
+ frog_group.unlink()
+
+ # Do: incoming email from a known partner on an alias with known recipients, alias is owned by user that can create a group
+ self.mail_alias.write(cr, uid, [alias_id], {'alias_user_id': self.user_raoul_id})
+ p1id = self.res_partner.create(cr, uid, {'name': 'Sylvie Lelitre', 'email': 'test.sylvie.lelitre@agrolait.com'})
+ p2id = self.res_partner.create(cr, uid, {'name': 'Other Poilvache', 'email': 'other@gmail.com'})
+ self._init_mock_build_email()
+ frog_groups = format_and_process(MAIL_TEMPLATE, to='groups@example.com, other@gmail.com')
+ sent_emails = self._build_email_kwargs_list
+ # Test: one group created by raoul
+ self.assertTrue(len(frog_groups) == 1)
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ # Test: one message that is the incoming email
+ self.assertEqual(len(frog_group.message_ids), 1,
+ 'message_process: newly created group should have the incoming email in message_ids')
+ msg = frog_group.message_ids[0]
+ # Test: message: unknown email address -> message has email_from, not author_id
+ self.assertEqual(p1id, msg.author_id.id,
+ 'message_process: message on created group should have Sylvie as author_id')
+ self.assertIn('Sylvie Lelitre <test.sylvie.lelitre@agrolait.com>', msg.email_from,
+ 'message_process: message on created group should have have an email_from')
+ # Test: author (not recipient and not raoul (as alias owner)) added as follower
+ frog_follower_ids = set([p.id for p in frog_group.message_follower_ids])
+ self.assertEqual(frog_follower_ids, set([p1id]),
+ 'message_process: newly created group should have 1 follower (author, not creator, not recipients)')
+ # Test: sent emails: no-one, no bounce effet
+ self.assertEqual(len(sent_emails), 0,
+ 'message_process: should not bounce incoming emails')
+ # Data: unlink group
+ frog_group.unlink()
+
+ # Do: incoming email from a known partner that is also an user that can create a mail.group
+ self.res_users.create(cr, uid, {'partner_id': p1id, 'login': 'sylvie', 'groups_id': [(6, 0, [self.group_employee_id])]})
+ frog_groups = format_and_process(MAIL_TEMPLATE, to='groups@example.com, other@gmail.com')
+ # Test: one group created by Sylvie
+ self.assertTrue(len(frog_groups) == 1)
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ # Test: one message that is the incoming email
+ self.assertEqual(len(frog_group.message_ids), 1,
+ 'message_process: newly created group should have the incoming email in message_ids')
+ # Test: author (and not recipient) added as follower
+ frog_follower_ids = set([p.id for p in frog_group.message_follower_ids])
+ self.assertEqual(frog_follower_ids, set([p1id]),
+ 'message_process: newly created group should have 1 follower (author, not creator, not recipients)')
+ # Test: sent emails: no-one, no bounce effet
+ self.assertEqual(len(sent_emails), 0,
+ 'message_process: should not bounce incoming emails')
+
+ # --------------------------------------------------
+ # Test2: discussion update
+ # --------------------------------------------------
+
+ # Do: even with a wrong destination, a reply should end up in the correct thread
+ frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other@gmail.com',
+ to='erroneous@example.com>', subject='Re: news',
+ extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
+ # Test: no group 'Re: news' created, still only 1 Frogs group
+ self.assertEqual(len(frog_groups), 0,
+ 'message_process: reply on Frogs should not have created a new group with new subject')
+ frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
+ self.assertEqual(len(frog_groups), 1,
+ 'message_process: reply on Frogs should not have created a duplicate group with old subject')
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ # Test: one new message
+ self.assertTrue(len(frog_group.message_ids) == 2, 'message_process: group should contain 2 messages after reply')
+ # Test: author (and not recipient) added as follower
+ frog_follower_ids = set([p.id for p in frog_group.message_follower_ids])
+ self.assertEqual(frog_follower_ids, set([p1id, p2id]),
+ 'message_process: after reply, group should have 2 followers')
+
+ # --------------------------------------------------
+ # Test3: email_from and partner finding
+ # --------------------------------------------------
+
+ # Data: extra partner with Raoul's email -> test the 'better author finding'
+ extra_partner_id = self.res_partner.create(cr, uid, {'name': 'A-Raoul', 'email': 'test_raoul@email.com'})
+ # extra_user_id = self.res_users.create(cr, uid, {'name': 'B-Raoul', 'email': self.user_raoul.email})
+ # extra_user_pid = self.res_users.browse(cr, uid, extra_user_id).partner_id.id
+
+ # Do: post a new message, with a known partner -> duplicate emails -> partner
+ format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
+ to='erroneous@example.com>', subject='Re: news (2)',
+ extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
+ frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ # Test: author is A-Raoul (only existing)
+ self.assertEqual(frog_group.message_ids[0].author_id.id, extra_partner_id,
+ 'message_process: email_from -> author_id wrong')
+
+ # Do: post a new message, with a known partner -> duplicate emails -> user
+ frog_group.message_unsubscribe([extra_partner_id])
+ raoul_email = self.user_raoul.email
+ self.res_users.write(cr, uid, self.user_raoul_id, {'email': 'test_raoul@email.com'})
+ format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
+ to='erroneous@example.com>', subject='Re: news (3)',
+ extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
+ frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ # Test: author is Raoul (user), not A-Raoul
+ self.assertEqual(frog_group.message_ids[0].author_id.id, self.partner_raoul_id,
+ 'message_process: email_from -> author_id wrong')
+
+ # Do: post a new message, with a known partner -> duplicate emails -> partner because is follower
+ frog_group.message_unsubscribe([self.partner_raoul_id])
+ frog_group.message_subscribe([extra_partner_id])
+ raoul_email = self.user_raoul.email
+ self.res_users.write(cr, uid, self.user_raoul_id, {'email': 'test_raoul@email.com'})
+ format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
+ to='erroneous@example.com>', subject='Re: news (3)',
+ extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
+ frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ # Test: author is Raoul (user), not A-Raoul
+ self.assertEqual(frog_group.message_ids[0].author_id.id, extra_partner_id,
+ 'message_process: email_from -> author_id wrong')
+
+ self.res_users.write(cr, uid, self.user_raoul_id, {'email': raoul_email})
+
+ # --------------------------------------------------
+ # Test4: misc gateway features
+ # --------------------------------------------------
+
+ # Do: incoming email with model that does not accepts incoming emails must raise
+ self.assertRaises(AssertionError,
+ format_and_process,
+ MAIL_TEMPLATE, to='noone@example.com', subject='spam', extra='', model='res.country')
+
+ # Do: incoming email without model and without alias must raise
+ self.assertRaises(AssertionError,
+ format_and_process,
+ MAIL_TEMPLATE, to='noone@example.com', subject='spam', extra='')
+
+ # Do: incoming email with model that accepting incoming emails as fallback
+ frog_groups = format_and_process(MAIL_TEMPLATE, to='noone@example.com', subject='Spammy', extra='', model='mail.group')
+ self.assertEqual(len(frog_groups), 1,
+ 'message_process: erroneous email but with a fallback model should have created a new mail.group')
+
+ # Do: incoming email in plaintext should be stored as html
+ frog_groups = format_and_process(MAIL_TEMPLATE_PLAINTEXT, to='groups@example.com', subject='Frogs Return', extra='', msg_id='<deadcafe.1337@smtp.agrolait.com>')
+ # Test: one group created with one message
+ self.assertTrue(len(frog_groups) == 1)
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ msg = frog_group.message_ids[0]
+ # Test: plain text content should be wrapped and stored as html
+ self.assertEqual(msg.body, '<pre>\nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n</pre>',
+ 'message_process: plaintext incoming email incorrectly parsed')
+
+ def test_10_thread_parent_resolution(self):
+ """ Testing parent/child relationships are correctly established when processing incoming mails """
+ cr, uid = self.cr, self.uid
+
+ def format(template, to='Pretty Pigs <group+pigs@example.com>, other@gmail.com', subject='Re: 1',
+ extra='', email_from='Sylvie Lelitre <test.sylvie.lelitre@agrolait.com>',
+ msg_id='<1198923581.41972151344608186760.JavaMail@agrolait.com>'):
+ return template.format(to=to, subject=subject, extra=extra, email_from=email_from, msg_id=msg_id)
+
+ group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
+ msg1 = group_pigs.message_post(body='My Body', subject='1')
+ msg2 = group_pigs.message_post(body='My Body', subject='2')
+ msg1, msg2 = self.mail_message.browse(cr, uid, [msg1, msg2])
+ self.assertTrue(msg1.message_id, "message_process: new message should have a proper message_id")
+
+ # Reply to msg1, make sure the reply is properly attached using the various reply identification mechanisms
+ # 0. Direct alias match
+ reply_msg1 = format(MAIL_TEMPLATE, to='Pretty Pigs <group+pigs@example.com>', extra='In-Reply-To: %s' % msg1.message_id)
+ self.mail_group.message_process(cr, uid, None, reply_msg1)
+
+ # 1. In-Reply-To header
+ reply_msg2 = format(MAIL_TEMPLATE, to='erroneous@example.com', extra='In-Reply-To: %s' % msg1.message_id)
+ self.mail_group.message_process(cr, uid, None, reply_msg2)
+
+ # 2. References header
+ reply_msg3 = format(MAIL_TEMPLATE, to='erroneous@example.com', extra='References: <2233@a.com>\r\n\t<3edss_dsa@b.com> %s' % msg1.message_id)
+ self.mail_group.message_process(cr, uid, None, reply_msg3)
+
+ # 3. Subject contains [<ID>] + model passed to message+process -> only attached to group, but not to mail (not in msg1.child_ids)
+ reply_msg4 = format(MAIL_TEMPLATE, to='erroneous@example.com', extra='', subject='Re: [%s] 1' % self.group_pigs_id)
+ self.mail_group.message_process(cr, uid, 'mail.group', reply_msg4)
+
+ group_pigs.refresh()
+ msg1.refresh()
+ self.assertEqual(6, len(group_pigs.message_ids), 'message_process: group should contain 6 messages')
+ self.assertEqual(3, len(msg1.child_ids), 'message_process: msg1 should have 3 children now')
+
+ def test_20_private_discussion(self):
+ """ Testing private discussion between partners. """
+ pass
diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index 5622d723eb9..66e7149ac6d 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -23,6 +23,7 @@ import base64
import re
from openerp import tools
+from openerp import SUPERUSER_ID
from openerp.osv import osv
from openerp.osv import fields
from openerp.tools.safe_eval import safe_eval as eval
@@ -136,6 +137,29 @@ class mail_compose_message(osv.TransientModel):
'same_thread': lambda self, cr, uid, ctx={}: True,
}
+ def check_access_rule(self, cr, uid, ids, operation, context=None):
+ """ Access rules of mail.compose.message:
+ - create: if
+ - model, no res_id, I create a message in mass mail mode
+ - then: fall back on mail.message acces rules
+ """
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+
+ # Author condition (CREATE (mass_mail))
+ if operation == 'create' and uid != SUPERUSER_ID:
+ # read mail_compose_message.ids to have their values
+ message_values = {}
+ cr.execute('SELECT DISTINCT id, model, res_id FROM "%s" WHERE id = ANY (%%s) AND res_id = 0' % self._table, (ids,))
+ for id, rmod, rid in cr.fetchall():
+ message_values[id] = {'model': rmod, 'res_id': rid}
+ # remove from the set to check the ids that mail_compose_message accepts
+ author_ids = [mid for mid, message in message_values.iteritems()
+ if message.get('model') and not message.get('res_id')]
+ ids = list(set(ids) - set(author_ids))
+
+ return super(mail_compose_message, self).check_access_rule(cr, uid, ids, operation, context=context)
+
def _notify(self, cr, uid, newid, context=None):
""" Override specific notify method of mail.message, because we do
not want that feature in the wizard. """
@@ -244,8 +268,12 @@ class mail_compose_message(osv.TransientModel):
self.pool.get('mail.mail').create(cr, uid, post_values, context=context)
else:
subtype = 'mail.mt_comment'
- if is_log or (mass_mail_mode and not wizard.notify):
+ if is_log: # log a note: subtype is False
subtype = False
+ elif mass_mail_mode: # mass mail: is a log pushed to recipients unless specified, author not added
+ if not wizard.notify:
+ subtype = False
+ context = dict(context, mail_create_nosubscribe=True) # add context key to avoid subscribing the author
msg_id = active_model_pool.message_post(cr, uid, [res_id], type='comment', subtype=subtype, context=context, **post_values)
# mass_mailing, post without notify: notify specific partners
if mass_mail_mode and not wizard.notify and post_values['partner_ids']:
diff --git a/addons/membership/test/test_membership.yml b/addons/membership/test/test_membership.yml
index 40d1785c29a..489b8b06afb 100644
--- a/addons/membership/test/test_membership.yml
+++ b/addons/membership/test/test_membership.yml
@@ -31,7 +31,6 @@
I'm Opening that Invoice which is created for "Seagate".
-
!python {model: res.partner}: |
- from openerp.tools.translate import _
invoice_pool = self.pool.get('account.invoice')
partner_pool = self.pool.get('res.partner')
membership_line_pool = self.pool.get('membership.membership_line')
@@ -39,7 +38,7 @@
membership_line_ids = membership_line_pool.search(cr, uid, [('membership_id','=',ref('product_product_membershipproduct0')),('partner','=',ref('base.res_partner_19'))])
membership_lines = membership_line_pool.browse(cr, uid, membership_line_ids)
- assert membership_lines, _('Membership is not registrated.')
+ assert membership_lines, 'Membership is not registrated.'
membership_line = membership_lines[0]
invoice_pool.signal_invoice_open(cr, uid, [membership_line.account_invoice_id.id])
@@ -105,7 +104,6 @@
I'm doing to make credit note of invoice which is paid by "Seagate" to cancel membership.
-
!python {model: account.invoice}: |
- from openerp.tools.translate import _
invoice_pool = self.pool.get('account.invoice')
partner_pool = self.pool.get('res.partner')
membership_line_pool = self.pool.get('membership.membership_line')
@@ -114,7 +112,7 @@
membership_line_ids = membership_line_pool.search(cr, uid, [('membership_id','=',ref('product_product_membershipproduct0')),('partner','=',ref('base.res_partner_19'))])
membership_lines = membership_line_pool.browse(cr, uid, membership_line_ids)
- assert membership_lines, _('Membership is not registrated.')
+ assert membership_lines, 'Membership is not registrated.'
membership_line = membership_lines[0]
refund_id = invoice_refund_pool.create(cr, uid, {'description': 'Refund of Membership', 'filter_refund': 'refund'}, {'active_id': membership_line.account_invoice_id.id})
invoice_refund_pool.invoice_refund(cr, uid, [refund_id], {'active_id': membership_line.account_invoice_id.id, 'active_ids': [membership_line.account_invoice_id.id]})
diff --git a/addons/mrp/i18n/es_MX.po b/addons/mrp/i18n/es_MX.po
index 82d584be219..f9fb2d53cb7 100644
--- a/addons/mrp/i18n/es_MX.po
+++ b/addons/mrp/i18n/es_MX.po
@@ -1,72 +1,61 @@
-# Translation of OpenERP Server.
-# This file contains the translation of the following modules:
-# * mrp
+# Spanish (Mexico) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 6.0dev\n"
-"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-03-12 16:35+0000\n"
-"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
-"<jesteve@zikzakmedia.com>\n"
-"Language-Team: \n"
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2013-03-23 21:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Mexico) <es_MX@li.org>\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-05 04:59+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2013-03-24 04:45+0000\n"
+"X-Generator: Launchpad (build 16540)\n"
#. module: mrp
-#: field:mrp.production,move_created_ids:0
-#: field:mrp.production,move_created_ids2:0
-msgid "Moves Created"
-msgstr "Movimientos creados"
+#: help:mrp.config.settings,module_mrp_repair:0
+msgid ""
+"Allows to manage all product repairs.\n"
+" * Add/remove products in the reparation\n"
+" * Impact for stocks\n"
+" * Invoicing (products and/or services)\n"
+" * Warranty concept\n"
+" * Repair quotation report\n"
+" * Notes for the technician and for the final customer.\n"
+" This installs the module mrp_repair."
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.mrp_production_action
-msgid ""
-"Manufacturing Orders are usually proposed automatically by OpenERP based on "
-"the bill of materials and the procurement rules, but you can also create "
-"manufacturing orders manually. OpenERP will handle the consumption of the "
-"raw materials (stock decrease) and the production of the finished products "
-"(stock increase) when the order is processed."
+#: report:mrp.production.order:0
+msgid "No. Of Cycles"
msgstr ""
-"Las órdenes de fabricación suelen ser propuestas automáticamente por OpenERP "
-"en base a la lista de materiales y las reglas de abastecimiento, pero "
-"también puede crear órdenes de fabricación manualmente. OpenERP controlará "
-"el consumo de las materias primas (disminución de stock) y la producción de "
-"los productos terminados (aumento de stock) cuando se procese la orden."
#. module: mrp
#: help:mrp.production,location_src_id:0
msgid "Location where the system will look for components."
-msgstr "Ubicación donde el sistema buscará los componentes."
+msgstr ""
#. module: mrp
#: field:mrp.production,workcenter_lines:0
msgid "Work Centers Utilisation"
-msgstr "Utilización del centro de producción"
+msgstr ""
#. module: mrp
#: view:mrp.routing.workcenter:0
msgid "Routing Work Centers"
-msgstr "Ruta de centros de producción"
-
-#. module: mrp
-#: model:ir.module.module,shortdesc:mrp.module_meta_information
-msgid "Manufacturing Resource Planning"
-msgstr "Planificación de recursos de fabricación (MRP)"
-
-#. module: mrp
-#: report:mrp.production.order:0
-msgid "No. Of Cycles"
-msgstr "Núm. de ciclos"
+msgstr ""
#. module: mrp
+#: field:mrp.production.workcenter.line,cycle:0
#: field:mrp.routing.workcenter,cycle_nbr:0
+#: field:report.workcenter.load,cycle:0
msgid "Number of Cycles"
-msgstr "Número de ciclos"
+msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_minimumstockprocure0
@@ -74,26 +63,12 @@ msgid ""
"The 'Minimum stock rule' allows the system to create procurement orders "
"automatically as soon as the minimum stock is reached."
msgstr ""
-"La 'regla de stock mínimo' permite al sistema de crear órdenes de "
-"abasteciemiento automáticamente cuando el stock mínimo es alcanzado"
-
-#. module: mrp
-#: field:mrp.production,picking_id:0
-#: field:mrp.production.order,picking_id:0
-msgid "Picking list"
-msgstr "Albarán"
-
-#. module: mrp
-#: code:addons/mrp/report/price.py:121
-#, python-format
-msgid "Hourly Cost"
-msgstr "Coste horario"
#. module: mrp
#: code:addons/mrp/report/price.py:130
#, python-format
-msgid "Cost Price per Uom"
-msgstr "Precio de coste pour Udm"
+msgid "Hourly Cost"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
@@ -101,36 +76,32 @@ msgid "Scrap Products"
msgstr "Productos de desecho"
#. module: mrp
-#: view:mrp.production.order:0
-#: field:mrp.production.order,day:0
-msgid "Day"
-msgstr "Día"
+#: view:mrp.workcenter:0
+msgid "Mrp Workcenter"
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_routing_action
#: model:ir.ui.menu,name:mrp.menu_mrp_routing_action
msgid "Routings"
-msgstr "Procesos productivos"
-
-#. module: mrp
-#: field:mrp.workcenter,product_id:0
-msgid "Work Center Product"
-msgstr "Producto centro de producción"
+msgstr ""
#. module: mrp
#: view:mrp.bom:0
msgid "Search Bill Of Material"
-msgstr "Buscar lista de materiales"
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_stockproduct1
msgid "For stockable products and consumables"
-msgstr "Para productos almacenables y consumibles"
+msgstr ""
#. module: mrp
-#: model:process.transition,name:mrp.process_transition_stockproduction0
-msgid "To Produce"
-msgstr "A producir"
+#: help:mrp.bom,message_unread:0
+#: help:mrp.production,message_unread:0
+#: help:mrp.production.workcenter.line,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
#. module: mrp
#: help:mrp.routing.workcenter,cycle_nbr:0
@@ -138,76 +109,63 @@ msgid ""
"Number of iterations this work center has to do in the specified operation "
"of the routing."
msgstr ""
-"Número de iteraciones que debe realizar este centro de producción en la "
-"operación indicada de la ruta."
+
+#. module: mrp
+#: view:product.product:0
+msgid "False"
+msgstr ""
#. module: mrp
#: view:mrp.bom:0
#: field:mrp.bom,code:0
-#: view:mrp.production:0
#: field:mrp.production,name:0
msgid "Reference"
-msgstr "Referencia"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Finished Products"
-msgstr "Productos finalizados"
+msgstr ""
#. module: mrp
-#: model:process.transition,name:mrp.process_transition_servicerfq0
-#: model:process.transition,name:mrp.process_transition_stockrfq0
-msgid "To Buy"
-msgstr "A comprar"
+#: view:mrp.production:0
+msgid "Manufacturing Orders which are currently in production."
+msgstr ""
#. module: mrp
-#: view:mrp.production.order:0
-msgid "Raw Material Location"
-msgstr "Ubicación de materias primas"
+#: help:mrp.bom,message_summary:0
+#: help:mrp.production,message_summary:0
+#: help:mrp.production.workcenter.line,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
#. module: mrp
-#: help:mrp.installer,mrp_operations:0
-msgid ""
-"Enhances production orders with readiness states as well as the start date "
-"and end date of execution of the order."
+#: model:process.transition,name:mrp.process_transition_servicerfq0
+#: model:process.transition,name:mrp.process_transition_stockrfq0
+msgid "To Buy"
msgstr ""
-"Mejora las órdenes de producción con los estados de preparación, así como la "
-"fecha de inicio y final de la ejecución de la orden."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_purchaseprocure0
msgid "The system launches automatically a RFQ to the preferred supplier."
msgstr ""
-"El sistema crea automáticamente una petición de presupuesto al proveedor "
-"preferido."
#. module: mrp
#: view:mrp.production:0
msgid "Products to Finish"
-msgstr "Productos a terminar"
+msgstr ""
#. module: mrp
#: selection:mrp.bom,method:0
msgid "Set / Pack"
-msgstr "Conjunto / Paquete"
-
-#. module: mrp
-#: field:mrp.installer,mrp_subproduct:0
-msgid "MRP Subproducts"
-msgstr "Subproductos MRP"
-
-#. module: mrp
-#: view:mrp.production:0
-#: field:mrp.production,state:0
-#: view:mrp.production.order:0
-#: field:mrp.production.order,state:0
-msgid "State"
-msgstr "Estado"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,costs_hour:0
msgid "Cost per hour"
-msgstr "Coste por hora"
+msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_stockproduction0
@@ -215,188 +173,221 @@ msgid ""
"In case the Supply method of the product is Produce, the system creates a "
"production order."
msgstr ""
-"En caso de que el método de suministro del producto es Producir, el sistema "
-"crea una orden de producción."
-
-#. module: mrp
-#: view:mrp.production:0
-msgid "UOM"
-msgstr "UdM"
#. module: mrp
#: field:change.production.qty,product_qty:0
-#: field:mrp.bom,product_qty:0
-#: field:mrp.production,product_qty:0
-#: view:mrp.production.order:0
-#: field:mrp.production.order,product_qty:0
-#: field:mrp.production.product.line,product_qty:0
msgid "Product Qty"
-msgstr "Ctdad producto"
+msgstr ""
#. module: mrp
-#: help:mrp.workcenter,product_id:0
-msgid ""
-"Fill this product to track easily your production costs in the analytic "
-"accounting."
+#: view:mrp.production:0
+msgid "Unit of Measure"
msgstr ""
-"Introduzca este producto para realizar fácilmente un seguimiento de sus "
-"costes de producción en la contabilidad analítica."
#. module: mrp
#: model:process.node,note:mrp.process_node_purchaseprocure0
msgid "For purchased material"
-msgstr "Para material comprado"
+msgstr ""
#. module: mrp
-#: field:mrp.bom.revision,indice:0
-msgid "Revision"
-msgstr "Revisión"
+#: model:ir.ui.menu,name:mrp.menu_mrp_production_order_action
+msgid "Order Planning"
+msgstr ""
#. module: mrp
-#: model:ir.ui.menu,name:mrp.next_id_77
-msgid "Reporting"
-msgstr "Informe"
+#: field:mrp.config.settings,module_mrp_operations:0
+msgid "Allow detailed planning of work order"
+msgstr ""
+
+#. module: mrp
+#: code:addons/mrp/mrp.py:633
+#, python-format
+msgid "Cannot cancel manufacturing order!"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,costs_cycle_account_id:0
msgid "Cycle Account"
-msgstr "Cuenta ciclo"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:121
+#: code:addons/mrp/report/price.py:130
#, python-format
msgid "Work Cost"
-msgstr "Coste del trabajo"
-
-#. module: mrp
-#: report:bom.structure:0
-msgid "["
-msgstr "["
+msgstr ""
#. module: mrp
#: model:process.transition,name:mrp.process_transition_procureserviceproduct0
msgid "Procurement of services"
-msgstr "Abastecimiento de servicios"
+msgstr ""
#. module: mrp
#: view:mrp.workcenter:0
msgid "Capacity Information"
-msgstr "Información de capacidad"
+msgstr ""
+
+#. module: mrp
+#: field:mrp.routing,workcenter_lines:0
+msgid "Work Centers"
+msgstr ""
+
+#. module: mrp
+#: model:ir.actions.act_window,help:mrp.mrp_routing_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a routing.\n"
+" </p><p>\n"
+" Routings allow you to create and manage the manufacturing\n"
+" operations that should be followed within your work centers "
+"in\n"
+" order to produce a product. They are attached to bills of\n"
+" materials that will define the required raw materials.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: mrp
+#: view:mrp.production:0
+#: field:mrp.production,move_created_ids2:0
+msgid "Produced Products"
+msgstr ""
#. module: mrp
#: report:mrp.production.order:0
msgid "Destination Location"
-msgstr "Ubicación destino"
+msgstr ""
#. module: mrp
-#: view:mrp.installer:0
-msgid "title"
-msgstr "título"
+#: view:mrp.config.settings:0
+msgid "Master Data"
+msgstr ""
#. module: mrp
-#: model:ir.ui.menu,name:mrp.menu_mrp_bom
-msgid "Master Data"
-msgstr "Datos principales"
+#: field:mrp.config.settings,module_mrp_byproduct:0
+msgid "Produce several products from one manufacturing order"
+msgstr ""
#. module: mrp
-#: model:process.transition,note:mrp.process_transition_stockmts0
+#: help:mrp.config.settings,group_mrp_properties:0
msgid ""
-"The system waits for the products to be available in the stock. These "
-"products are typically procured manually or through a minimum stock rule."
+"The selection of the right Bill of Material to use will depend on the "
+"properties specified on the sales order and the Bill of Material."
+msgstr ""
+
+#. module: mrp
+#: view:mrp.bom:0
+msgid ""
+"When processing a sales order for this product, the delivery order\n"
+" will contain the raw materials, instead of "
+"the finished product."
msgstr ""
-"El sistema espera a que los productos estén disponibles en el stock. Estos "
-"productos suelen ser adquiridos de forma manual o a través de una regla de "
-"stock mínimo."
#. module: mrp
#: report:mrp.production.order:0
msgid "Partner Ref"
-msgstr "Ref. empresa"
+msgstr ""
#. module: mrp
#: selection:mrp.workcenter.load,measure_unit:0
msgid "Amount in hours"
-msgstr "Cantidad en horas"
+msgstr ""
#. module: mrp
#: field:mrp.production,product_lines:0
msgid "Scheduled goods"
-msgstr "Bienes planificados"
+msgstr ""
#. module: mrp
#: selection:mrp.bom,type:0
msgid "Sets / Phantom"
-msgstr "Conjuntos / Fantasma"
-
-#. module: mrp
-#: help:mrp.bom,position:0
-msgid "Reference to a position in an external plan."
-msgstr "Referencia a una ubicación en una plan. externa"
-
-#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "August"
-msgstr "Agosto"
+msgstr ""
#. module: mrp
-#: constraint:stock.move:0
-msgid "You try to assign a lot which is not from the same product"
-msgstr "Está intentando asignar un lote que no es del mismo producto"
+#: view:mrp.production:0
+#: field:mrp.production,state:0
+msgid "Status"
+msgstr ""
#. module: mrp
-#: model:ir.model,name:mrp.model_mrp_production_order
-msgid "Production Order Report"
-msgstr "Informe de órden de producción"
+#: help:mrp.bom,position:0
+msgid "Reference to a position in an external plan."
+msgstr ""
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "June"
-msgstr "Junio"
+#: model:res.groups,name:mrp.group_mrp_routings
+msgid "Manage Routings"
+msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_product_produce
msgid "Product Produce"
-msgstr "Producir producto"
+msgstr ""
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "October"
-msgstr "Octubre"
+#: constraint:mrp.bom:0
+msgid "Error ! You cannot create recursive BoM."
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:177
-#, python-format
-msgid "Components Cost of "
-msgstr "Coste de los componentes de "
+#: model:ir.model,name:mrp.model_mrp_routing_workcenter
+msgid "Work Center Usage"
+msgstr ""
#. module: mrp
#: model:process.transition,name:mrp.process_transition_procurestockableproduct0
msgid "Procurement of stockable Product"
-msgstr "Abastecimiento de producto almacenable"
+msgstr ""
#. module: mrp
-#: view:mrp.bom:0
-msgid "Default UOM"
-msgstr "UdM por defecto"
+#: model:ir.actions.act_window,help:mrp.mrp_production_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a manufacturing order. \n"
+" </p><p>\n"
+" A manufacuring order, based on a bill of materials, will\n"
+" consume raw materials and produce finished products.\n"
+" </p><p>\n"
+" Manufacturing orders are usually proposed automatically "
+"based\n"
+" on customer requirements or automated rules like the "
+"minimum\n"
+" stock rule.\n"
+" </p>\n"
+" "
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:130
+#: sql_constraint:mrp.production:0
+msgid "Reference must be unique per Company!"
+msgstr ""
+
+#. module: mrp
+#: code:addons/mrp/report/price.py:139
#: report:bom.structure:0
+#: view:mrp.bom:0
#: field:mrp.product_price,number:0
+#: view:mrp.production:0
#: report:mrp.production.order:0
#, python-format
msgid "Quantity"
-msgstr "Cantidad"
+msgstr ""
#. module: mrp
-#: field:mrp.production.workcenter.line,hour:0
-msgid "Nbr of hours"
-msgstr "Nº de horas"
+#: help:mrp.workcenter,product_id:0
+msgid ""
+"Fill this product to easily track your production costs in the analytic "
+"accounting."
+msgstr ""
+
+#. module: mrp
+#: field:mrp.workcenter,product_id:0
+msgid "Work Center Product"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Confirm Production"
-msgstr "Confirmar producción"
+msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_stockproduct0
@@ -404,8 +395,6 @@ msgid ""
"The system creates an order (production or purchased) depending on the sold "
"quantity and the products parameters."
msgstr ""
-"El sistema crea una orden (de producción o de compra) en función de la "
-"cantidad vendida y los parámetros de los productos."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_servicemts0
@@ -413,49 +402,85 @@ msgid ""
"This is used in case of a service without any impact in the system, a "
"training session for instance."
msgstr ""
-"Esto se utiliza en caso de un servicio sin ningún tipo de impacto en el "
-"sistema, una sesión de formación, por ejemplo."
#. module: mrp
-#: field:mrp.installer,mrp_repair:0
-msgid "Repairs"
-msgstr "Reparaciones"
+#: field:mrp.bom,product_qty:0
+#: field:mrp.production,product_qty:0
+#: field:mrp.production.product.line,product_qty:0
+msgid "Product Quantity"
+msgstr ""
#. module: mrp
-#: field:mrp.installer,stock_location:0
-msgid "Advanced Routes"
-msgstr "Rutas avanzadas"
+#: help:mrp.production,picking_id:0
+msgid ""
+"This is the Internal Picking List that brings the finished product to the "
+"production plan"
+msgstr ""
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_view_resource_calendar_search_mrp
msgid "Working Time"
-msgstr "Horario trabajo"
+msgstr ""
+
+#. module: mrp
+#: help:mrp.production,state:0
+msgid ""
+"When the production order is created the status is set to 'Draft'.\n"
+" If the order is confirmed the status is set to 'Waiting "
+"Goods'.\n"
+" If any exceptions are there, the status is set to 'Picking "
+"Exception'.\n"
+" If the stock is available then the status is set to 'Ready "
+"to Produce'.\n"
+" When the production gets started then the status is set to "
+"'In Production'.\n"
+" When the production is over, the status is set to 'Done'."
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_report_in_out_picking_tree
msgid "Weekly Stock Value Variation"
-msgstr "Variación del valor del stock semanal"
+msgstr ""
#. module: mrp
-#: help:mrp.installer,mrp_repair:0
+#: model:ir.actions.act_window,help:mrp.mrp_property_action
msgid ""
-"Enables warranty and repair management (and their impact on stocks and "
-"invoicing)."
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new property.\n"
+" </p><p>\n"
+" The Properties in OpenERP are used to select the right bill "
+"of\n"
+" materials for manufacturing a product when you have "
+"different\n"
+" ways of building the same product. You can assign several\n"
+" properties to each bill of materials. When a salesperson\n"
+" creates a sales order, they can relate it to several "
+"properties\n"
+" and OpenERP will automatically select the BoM to use "
+"according\n"
+" the needs.\n"
+" </p>\n"
+" "
msgstr ""
-"Activa la garantía y la gestión de reparaciones (y su impacto sobre stocks y "
-"facturación)"
#. module: mrp
-#: field:mrp.production,date_planned_date:0
+#: view:mrp.production:0
+#: field:mrp.production,date_planned:0
#: report:mrp.production.order:0
-#: field:mrp.production.order,date_planned:0
msgid "Scheduled Date"
-msgstr "Fecha programada"
+msgstr ""
#. module: mrp
+#: code:addons/mrp/procurement.py:124
+#, python-format
+msgid "Manufacturing Order <em>%s</em> created."
+msgstr ""
+
+#. module: mrp
+#: view:mrp.bom:0
#: report:mrp.production.order:0
msgid "Bill Of Material"
-msgstr "Lista de Material"
+msgstr ""
#. module: mrp
#: help:mrp.routing,location_id:0
@@ -464,70 +489,51 @@ msgid ""
"needed.Set a location if you produce at a fixed location. This can be a "
"partner location if you subcontract the manufacturing operations."
msgstr ""
-"Dejarlo vacío si se produce en el mismo lugar en que los productos acabados "
-"son necesarios. Indique una ubicación si se produce en una ubicación fija. "
-"Puede ser una ubicación de otra empresa si subcontrata las operaciones de "
-"fabricación."
#. module: mrp
#: view:board.board:0
msgid "Stock Value Variation"
-msgstr "Variación del valor de stock"
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action2
msgid "Bill of Materials Structure"
-msgstr "Estructura lista de materiales"
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_serviceproduct0
msgid "Product type is service"
-msgstr "Producto de tipo servicio"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.mrp_property_group_action
-msgid ""
-"Define specific property groups that can be assigned to the properties of "
-"your bill of materials."
+#: help:mrp.workcenter,costs_cycle:0
+msgid "Specify Cost of Work Center per cycle."
msgstr ""
-"Definir grupos específicos de propiedad que se pueden asignar a las "
-"propiedades de su lista de materiales."
#. module: mrp
#: model:process.transition,name:mrp.process_transition_bom0
msgid "Manufacturing decomposition"
-msgstr "Descomposición fabricación"
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_serviceproduct1
msgid "For Services."
-msgstr "Para servicios"
-
-#. module: mrp
-#: field:mrp.bom.revision,date:0
-msgid "Modification Date"
-msgstr "Fecha de modificación"
-
-#. module: mrp
-#: help:mrp.workcenter,costs_cycle_account_id:0
-#: help:mrp.workcenter,costs_hour_account_id:0
-msgid ""
-"Complete this only if you want automatic analytic accounting entries on "
-"production orders."
msgstr ""
-"Rellenarlo sólo si desea crear entradas automáticas de contabilidad "
-"analítica según órdenes de producción."
-
-#. module: mrp
-#: field:mrp.production.workcenter.line,cycle:0
-msgid "Nbr of cycles"
-msgstr "Nº de ciclos"
#. module: mrp
#: model:process.node,note:mrp.process_node_orderrfq0
#: model:process.node,note:mrp.process_node_rfq0
msgid "Request for Quotation."
-msgstr "Solicitud de presupuesto."
+msgstr ""
+
+#. module: mrp
+#: view:change.production.qty:0
+#: view:mrp.config.settings:0
+#: view:mrp.product.produce:0
+#: view:mrp.product_price:0
+#: view:mrp.workcenter.load:0
+msgid "or"
+msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_billofmaterialrouting0
@@ -535,94 +541,88 @@ msgid ""
"The Bill of Material is linked to a routing, i.e. the succession of work "
"centers."
msgstr ""
-"La lista de materiales está vinculada a una ruta, es decir, la sucesión de "
-"centros de producción."
#. module: mrp
-#: constraint:product.product:0
-msgid "Error: Invalid ean code"
-msgstr "Error: Código EAN no válido"
+#: view:mrp.production:0
+#: field:mrp.production,move_created_ids:0
+msgid "Products to Produce"
+msgstr ""
+
+#. module: mrp
+#: view:mrp.config.settings:0
+msgid "Apply"
+msgstr ""
#. module: mrp
#: view:mrp.routing:0
#: field:mrp.routing,location_id:0
msgid "Production Location"
-msgstr "Ubicación de producción"
-
-#. module: mrp
-#: view:mrp.production:0
-msgid "Change Qty"
-msgstr "Cambiar Ctd."
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Force Reservation"
-msgstr "Forzar reservas"
-
-#. module: mrp
-#: field:mrp.bom.revision,author_id:0
-msgid "Author"
-msgstr "Autor"
+msgstr ""
#. module: mrp
#: field:report.mrp.inout,value:0
msgid "Stock value"
-msgstr "Valor del stock"
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_product_bom_structure
msgid "Product BoM Structure"
-msgstr "Estructura LdM del producto"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Search Production"
-msgstr "Buscar producción"
-
-#. module: mrp
-#: code:addons/mrp/report/price.py:130
-#, python-format
-msgid "Supplier Price per Uom"
-msgstr "Precio proveedor por UdM"
+msgstr ""
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "March"
-msgstr "Marzo"
+#: help:mrp.routing.workcenter,sequence:0
+msgid ""
+"Gives the sequence order when displaying a list of routing Work Centers."
+msgstr ""
#. module: mrp
#: field:mrp.bom,child_complete_ids:0
msgid "BoM Hierarchy"
-msgstr "Estructura LdM"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,name:mrp.act_mrp_product_produce
-#: view:mrp.product.produce:0
-#: view:mrp.production:0
-msgid "Produce"
-msgstr "Producir"
+#: model:process.transition,name:mrp.process_transition_stockproduction0
+msgid "To Produce"
+msgstr ""
#. module: mrp
-#: help:mrp.workcenter,costs_cycle:0
-msgid "Specify Cost of Work Center per cycle."
+#: help:mrp.config.settings,module_stock_no_autopicking:0
+msgid ""
+"This module allows an intermediate picking process to provide raw materials "
+"to production orders.\n"
+" For example to manage production made by your suppliers (sub-"
+"contracting).\n"
+" To achieve this, set the assembled product which is sub-"
+"contracted to \"No Auto-Picking\"\n"
+" and put the location of the supplier in the routing of the "
+"assembly operation.\n"
+" This installs the module stock_no_autopicking."
msgstr ""
#. module: mrp
#: selection:mrp.production,state:0
-#: view:mrp.production.order:0
-#: selection:mrp.production.order,state:0
msgid "Picking Exception"
-msgstr "Excepción albarán"
+msgstr ""
#. module: mrp
#: field:mrp.bom,bom_lines:0
msgid "BoM Lines"
-msgstr "Líneas de las listas de materiales"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,time_start:0
msgid "Time before prod."
-msgstr "Tiempo antes producción"
+msgstr ""
#. module: mrp
#: help:mrp.routing,active:0
@@ -630,59 +630,53 @@ msgid ""
"If the active field is set to False, it will allow you to hide the routing "
"without removing it."
msgstr ""
-"Si el campo activo se desmarca, permite ocultar la ruta sin eliminarla."
#. module: mrp
#: model:process.transition,name:mrp.process_transition_billofmaterialrouting0
msgid "Material Routing"
-msgstr "Ruta del material"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
#: field:mrp.production,move_lines2:0
#: report:mrp.production.order:0
-#: field:mrp.production.order,consumed_products:0
msgid "Consumed Products"
-msgstr "Productos consumidos"
-
-#. module: mrp
-#: constraint:mrp.bom:0
-msgid "Error ! You can not create recursive BoM."
-msgstr "¡Error! No puede crear Listas de Material recursivas."
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_mrp_workcenter_load_wizard
#: model:ir.model,name:mrp.model_mrp_workcenter_load
#: model:ir.model,name:mrp.model_report_workcenter_load
msgid "Work Center Load"
-msgstr "Carga centro de producción"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/procurement.py:45
+#: code:addons/mrp/procurement.py:50
#, python-format
msgid "No BoM defined for this product !"
-msgstr "¡No se ha definido LdM para este producto!"
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_bom_form_action2
#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action2
msgid "Bill of Material Components"
-msgstr "Componentes de lista de materiales"
+msgstr ""
#. module: mrp
-#: field:mrp.production.order,nbr:0
-msgid "# of Lines"
-msgstr "Nº de líneas"
+#: model:ir.model,name:mrp.model_stock_move
+msgid "Stock Move"
+msgstr ""
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_planning
+#: view:mrp.config.settings:0
msgid "Planning"
-msgstr "Planificación"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Ready"
-msgstr "Preparado"
+msgstr ""
#. module: mrp
#: help:mrp.production,routing_id:0
@@ -692,142 +686,151 @@ msgid ""
"operations and to plan future loads on work centers based on production "
"plannification."
msgstr ""
-"Lista de las operaciones (lista de los centros de trabajo) para producir los "
-"productos acabados. La ruta se utiliza principalmente para calcular los "
-"costes del centro de trabajo durante las operaciones y planificar la carga "
-"en el futuro en los centros de trabajo basada en la planificación de "
-"producción."
#. module: mrp
#: help:mrp.workcenter,time_cycle:0
msgid "Time in hours for doing one cycle."
-msgstr "Tiempo en horas para realizar un ciclo."
+msgstr ""
#. module: mrp
-#: report:bom.structure:0
-msgid "BOM Ref"
-msgstr "Ref LdM"
+#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action2
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a component to a bill of material.\n"
+" </p><p>\n"
+" Bills of materials components are components and by-"
+"products\n"
+" used to create master bills of materials. Use this menu to\n"
+" search in which BoM a specific component is used.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: mrp
+#: constraint:mrp.bom:0
+msgid "BoM line product should not be same as BoM product."
+msgstr ""
#. module: mrp
#: view:mrp.production:0
-#: selection:mrp.production,state:0
-#: view:mrp.production.order:0
-#: selection:mrp.production.order,state:0
msgid "In Production"
-msgstr "En producción"
+msgstr ""
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_property
msgid "Master Bill of Materials"
-msgstr "Lista de materiales maestra"
+msgstr ""
#. module: mrp
-#: help:mrp.bom,product_uos:0
+#: help:mrp.config.settings,module_product_manufacturer:0
msgid ""
-"Product UOS (Unit of Sale) is the unit of measurement for the invoicing and "
-"promotion of stock."
+"This allows you to define the following for a product:\n"
+" * Manufacturer\n"
+" * Manufacturer Product Name\n"
+" * Manufacturer Product Code\n"
+" * Product Attributes.\n"
+" This installs the module product_manufacturer."
msgstr ""
-"UdV del producto (Unidad de Venta) es la unidad de medida para la "
-"facturación y la promoción de existencias."
#. module: mrp
#: view:mrp.product_price:0
#: view:mrp.workcenter.load:0
msgid "Print"
-msgstr "Imprimir"
+msgstr ""
#. module: mrp
#: view:mrp.bom:0
#: view:mrp.workcenter:0
msgid "Type"
-msgstr "Tipo"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:150
-#: code:addons/mrp/report/price.py:201
-#, python-format
-msgid "Total Cost of "
-msgstr "Coste total de "
+#: model:ir.actions.act_window,help:mrp.mrp_workcenter_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a work center.\n"
+" </p><p>\n"
+" Work Centers allow you to create and manage manufacturing\n"
+" units. They consist of workers and/or machines, which are\n"
+" considered as units for task assignation as well as "
+"capacity\n"
+" and planning forecast.\n"
+" </p>\n"
+" "
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_minimumstockrule0
msgid "Linked to the 'Minimum stock rule' supplying method."
-msgstr "Vinculado al método de abastecimiento 'Regla de stock mínimo'."
+msgstr ""
#. module: mrp
#: selection:mrp.workcenter.load,time_unit:0
msgid "Per month"
-msgstr "Por mes"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
-#: code:addons/mrp/wizard/change_production_qty.py:77
-#: code:addons/mrp/wizard/change_production_qty.py:82
-#, python-format
-msgid "Couldn't find bill of material for product"
-msgstr "No se puede encontrar la lista de material para el producto"
+#: help:mrp.bom,product_uom:0
+msgid ""
+"Unit of Measure (Unit of Measure) is the unit of measurement for the "
+"inventory control"
+msgstr ""
#. module: mrp
#: report:bom.structure:0
msgid "Product Name"
-msgstr "Nombre producto"
-
-#. module: mrp
-#: code:addons/mrp/mrp.py:495
-#, python-format
-msgid "Invalid action !"
-msgstr "¡Acción no válida!"
+msgstr ""
#. module: mrp
#: help:mrp.bom,product_efficiency:0
msgid "A factor of 0.9 means a loss of 10% within the production process."
msgstr ""
-"Un factor de 0.9 indica una pérdida del 10% en el proceso de producción."
#. module: mrp
-#: view:mrp.installer:0
-msgid ""
-"Add more functionalities to the core Manufacturing Application with the "
-"following addons."
+#: code:addons/mrp/mrp.py:737
+#: code:addons/mrp/mrp.py:765
+#, python-format
+msgid "Warning!"
msgstr ""
-"Añada más funcionalidades en el núcleo de la aplicación de fabricación con "
-"los siguientes módulos."
#. module: mrp
#: report:mrp.production.order:0
msgid "Printing date"
-msgstr "Fecha impresión"
+msgstr ""
#. module: mrp
#: model:process.node,name:mrp.process_node_orderrfq0
#: model:process.node,name:mrp.process_node_rfq0
msgid "RFQ"
-msgstr "Petición presupuesto"
+msgstr ""
#. module: mrp
#: model:process.transition,name:mrp.process_transition_producttostockrules0
msgid "Procurement rule"
-msgstr "Regla de abastecimiento"
+msgstr ""
#. module: mrp
-#: help:mrp.workcenter,costs_hour:0
-msgid "Specify Cost of Work center per hour."
-msgstr "Especificar costes del centro de trabajo por hora."
+#: help:mrp.workcenter,costs_cycle_account_id:0
+#: help:mrp.workcenter,costs_hour_account_id:0
+msgid ""
+"Fill this only if you want automatic analytic accounting entries on "
+"production orders."
+msgstr ""
#. module: mrp
#: view:mrp.production:0
-msgid "Partial"
-msgstr "Parcial"
+msgid "Mark as Started"
+msgstr ""
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "September"
-msgstr "Septiembre"
+#: view:mrp.production:0
+msgid "Partial"
+msgstr ""
#. module: mrp
#: report:mrp.production.order:0
msgid "WorkCenter"
-msgstr "Centro de producción"
+msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_procureserviceproduct0
@@ -836,194 +839,188 @@ msgid ""
"order creates a RFQ for a subcontracting purchase order or waits until the "
"service is done (= the delivery of the products)."
msgstr ""
-"Dependiendo del método elegido para \"suministrar\" del servicio, la orden "
-"de abastecimiento crea una solicitud de presupuesto para un pedido de compra "
-"(subcontratación) o espera hasta que el servicio se realice (= la entrega de "
-"los productos)."
#. module: mrp
#: selection:mrp.production,priority:0
-#: selection:mrp.production.order,priority:0
msgid "Urgent"
-msgstr "Urgente"
+msgstr ""
#. module: mrp
-#: model:ir.model,name:mrp.model_mrp_routing_workcenter
-msgid "Work Center Usage"
+#: view:mrp.production:0
+msgid "Manufacturing Orders which are waiting for raw materials."
+msgstr ""
+
+#. module: mrp
+#: code:addons/mrp/mrp.py:285
+#, python-format
+msgid ""
+"The Product Unit of Measure you chose has a different category than in the "
+"product form."
msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_production
+#: view:mrp.config.settings:0
+#: view:mrp.production:0
+#: field:mrp.production.workcenter.line,production_id:0
+#: field:procurement.order,production_id:0
msgid "Manufacturing Order"
-msgstr "Órden de producción"
+msgstr ""
#. module: mrp
#: model:process.transition,name:mrp.process_transition_productionprocureproducts0
msgid "Procurement of raw material"
-msgstr "Abastecimiento de materias primas"
+msgstr ""
#. module: mrp
-#: help:mrp.routing.workcenter,hour_nbr:0
+#: sql_constraint:mrp.bom:0
msgid ""
-"Time in hours for this work center to achieve the operation of the specified "
-"routing."
+"All product quantities must be greater than 0.\n"
+"You should install the mrp_byproduct module if you want to manage extra "
+"products on BoMs !"
msgstr ""
-"Tiempo en horas para este centro de producción para realizar la operación de "
-"la ruta indicada."
#. module: mrp
#: view:mrp.production:0
#: field:mrp.production,cycle_total:0
msgid "Total Cycles"
-msgstr "Total ciclos"
+msgstr ""
#. module: mrp
#: selection:mrp.production,state:0
-#: view:mrp.production.order:0
-#: selection:mrp.production.order,state:0
msgid "Ready to Produce"
-msgstr "Listo para producir"
+msgstr ""
#. module: mrp
-#: field:mrp.bom.revision,name:0
-msgid "Modification name"
-msgstr "Nombre de modificación"
+#: field:mrp.bom,message_is_follower:0
+#: field:mrp.production,message_is_follower:0
+#: field:mrp.production.workcenter.line,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
#. module: mrp
#: view:mrp.bom:0
#: view:mrp.production:0
-#: field:mrp.production.order,date:0
msgid "Date"
-msgstr "Fecha"
+msgstr ""
#. module: mrp
-#: field:mrp.bom,type:0
-msgid "BoM Type"
-msgstr "Tipo de lista de materiales"
+#: model:ir.actions.act_window,help:mrp.mrp_production_action_planning
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to start a new manufacturing order. \n"
+" </p><p>\n"
+" A manufacuring order, based on a bill of materials, will\n"
+" consume raw materials and produce finished products.\n"
+" </p><p>\n"
+" Manufacturing orders are usually proposed automatically "
+"based\n"
+" on customer requirements or automated rules like the "
+"minimum\n"
+" stock rule.\n"
+" </p>\n"
+" "
+msgstr ""
#. module: mrp
-#: view:mrp.production.order:0
-msgid "Extended Filters..."
-msgstr "Filtros extendidos..."
+#: field:mrp.bom,type:0
+msgid "BoM Type"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/procurement.py:47
+#: code:addons/mrp/procurement.py:52
#, python-format
msgid ""
"Procurement '%s' has an exception: 'No BoM defined for this product !'"
msgstr ""
-"Abastecimiento '%s' tiene una excepción: 'El producto no tiene LdM definida!'"
#. module: mrp
-#: view:mrp.production.order:0
#: view:mrp.property:0
msgid "Search"
-msgstr "Buscar"
+msgstr ""
#. module: mrp
-#: field:report.workcenter.load,cycle:0
-msgid "Nbr of cycle"
-msgstr "Núm. de ciclo"
+#: model:process.node,note:mrp.process_node_billofmaterial0
+msgid "Product's structure"
+msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_res_company
msgid "Companies"
-msgstr "Compañías"
+msgstr ""
+
+#. module: mrp
+#: code:addons/mrp/mrp.py:634
+#, python-format
+msgid ""
+"You must first cancel related internal picking attached to this "
+"manufacturing order."
+msgstr ""
#. module: mrp
#: model:process.node,name:mrp.process_node_minimumstockrule0
#: model:process.node,name:mrp.process_node_productminimumstockrule0
msgid "Minimum Stock"
-msgstr "Stock mínimo"
-
-#. module: mrp
-#: model:ir.ui.menu,name:mrp.menus_dash_mrp
-msgid "Dashboard"
-msgstr "Tablero"
+msgstr ""
#. module: mrp
-#: view:board.board:0
-msgid "Work Center Future Load"
-msgstr "Carga futura del centro de producción"
+#: code:addons/mrp/report/price.py:160
+#: code:addons/mrp/report/price.py:211
+#, python-format
+msgid "Total Cost of %s %s"
+msgstr ""
#. module: mrp
#: model:process.node,name:mrp.process_node_stockproduct0
#: model:process.node,name:mrp.process_node_stockproduct1
#: model:process.process,name:mrp.process_process_stockableproductprocess0
msgid "Stockable Product"
-msgstr "Producto almacenable"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:121
+#: code:addons/mrp/report/price.py:130
#, python-format
msgid "Work Center name"
-msgstr "Nombre del centro de producción"
+msgstr ""
#. module: mrp
#: field:mrp.routing,code:0
msgid "Code"
-msgstr "Código"
+msgstr ""
#. module: mrp
#: report:mrp.production.order:0
msgid "No. Of Hours"
-msgstr "Núm. de horas"
-
-#. module: mrp
-#: field:mrp.installer,mrp_jit:0
-msgid "Just In Time Scheduling"
-msgstr "Planificación 'Just in Time'"
+msgstr ""
#. module: mrp
#: view:mrp.property:0
-#: view:mrp.property.group:0
msgid "Property Group"
-msgstr "Grupo de propiedad"
+msgstr ""
#. module: mrp
-#: view:mrp.production:0
-msgid "Qty"
-msgstr "Ctd."
+#: field:mrp.config.settings,group_mrp_routings:0
+msgid "Manage routings and work orders "
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_production0
msgid "Manufacturing Plan."
-msgstr "Plan de producción"
+msgstr ""
#. module: mrp
#: view:mrp.routing:0
#: view:mrp.workcenter:0
msgid "Inactive"
-msgstr "Inactivo"
-
-#. module: mrp
-#: help:mrp.installer,mrp_subproduct:0
-msgid ""
-"Enables multiple product output from a single production order: without "
-"this, a production order can have only one output product."
msgstr ""
-"Habilita la salida de múltiples productos de una sola orden de producción: "
-"sin ello, una orden de producción sólo puede tener un producto de salida."
#. module: mrp
#: view:change.production.qty:0
+#: view:mrp.config.settings:0
#: view:mrp.product.produce:0
#: view:mrp.product_price:0
-#: view:mrp.production:0
#: view:mrp.workcenter.load:0
msgid "Cancel"
-msgstr "Cancelar"
-
-#. module: mrp
-#: view:mrp.production:0
-msgid "Split in production lots"
-msgstr "Dividir en lotes de producción"
-
-#. module: mrp
-#: help:mrp.workcenter,capacity_per_cycle:0
-msgid ""
-"Number of operations this Work Center can do in parallel. If this Work "
-"Center represents a team of 5 workers, the capacity per cycle is 5."
msgstr ""
#. module: mrp
@@ -1032,310 +1029,248 @@ msgid ""
"If the service has a 'Buy' supply method, this creates a RFQ, a "
"subcontracting demand for instance."
msgstr ""
-"Si el servicio tiene un método de suministro 'Comprar', se crea una "
-"solicitud de presupuesto, por ejemplo, una petición de subcontratación."
-
-#. module: mrp
-#: field:mrp.production,move_prod_id:0
-msgid "Move product"
-msgstr "Movimiento producto"
#. module: mrp
#: view:mrp.production:0
msgid "Late"
-msgstr "Retrasado"
+msgstr ""
#. module: mrp
#: model:process.node,name:mrp.process_node_servicemts0
msgid "Make to stock"
-msgstr "Obtener para stock"
-
-#. module: mrp
-#: help:mrp.routing.workcenter,sequence:0
-msgid ""
-"Gives the sequence order when displaying a list of routing work centers."
msgstr ""
-"Proporciona el orden de secuencias cuando se muestra una lista de "
-"enrutamiento de los centros de trabajo."
#. module: mrp
#: report:bom.structure:0
msgid "BOM Name"
-msgstr "Nombre LdM"
+msgstr ""
#. module: mrp
+#: model:ir.actions.act_window,name:mrp.act_product_manufacturing_open
+#: model:ir.actions.act_window,name:mrp.mrp_production_action
+#: model:ir.actions.act_window,name:mrp.mrp_production_action_planning
+#: model:ir.ui.menu,name:mrp.menu_mrp_production_action
#: view:mrp.production:0
-msgid "Start Production"
-msgstr "Empezar producción"
-
-#. module: mrp
-#: model:ir.actions.act_window,name:mrp.open_board_manufacturing
-#: model:ir.ui.menu,name:mrp.menu_board_manufacturing
-msgid "Production Dashboard"
-msgstr "Tablero de producción"
+msgid "Manufacturing Orders"
+msgstr ""
#. module: mrp
-#: view:mrp.production:0
-msgid "Source Loc."
-msgstr "Ubic. orígen"
+#: selection:mrp.production,state:0
+msgid "Awaiting Raw Materials"
+msgstr ""
#. module: mrp
#: field:mrp.bom,position:0
msgid "Internal Reference"
-msgstr "Referencia interna"
-
-#. module: mrp
-#: help:mrp.installer,stock_location:0
-msgid ""
-"Manages product routes and paths within and between locations (e.g. "
-"warehouses)."
msgstr ""
-"Gestiona las rutas y caminos de los productos dentro y entre las ubicaciones "
-"(por ejemplo, almacenes)."
#. module: mrp
-#: model:process.node,note:mrp.process_node_billofmaterial0
-msgid "Product's structure"
-msgstr "Estructura de producto"
+#: field:mrp.production,product_uos_qty:0
+msgid "Product UoS Quantity"
+msgstr ""
#. module: mrp
#: field:mrp.bom,name:0
#: report:mrp.production.order:0
#: field:mrp.production.product.line,name:0
+#: view:mrp.property:0
#: field:mrp.routing,name:0
#: field:mrp.routing.workcenter,name:0
msgid "Name"
-msgstr "Nombre"
-
-#. module: mrp
-#: view:mrp.installer:0
-msgid "MRP Application Configuration"
-msgstr "Configuración aplicación MRP"
+msgstr ""
#. module: mrp
-#: help:mrp.installer,mrp_jit:0
-msgid ""
-"Enables Just In Time computation of procurement orders.\n"
-"\n"
-"While it's more resource intensive than the default setup, the JIT computer "
-"avoids having to wait for the procurement scheduler to run or having to run "
-"the procurement scheduler manually."
+#: report:mrp.production.order:0
+msgid "Production Order N° :"
msgstr ""
-"Permite el cálculo de las órdenes de abastecimiento justo a tiempo (Just In "
-"Time).\n"
-"\n"
-"Si bien consume más recursos que la configuración predeterminada, el cálculo "
-"JIT evita tener que esperar a que se ejecute el planificador de "
-"abastecimientos o tener que ejecutar el planificador de abastecimientos de "
-"forma manual."
#. module: mrp
#: field:mrp.product.produce,mode:0
msgid "Mode"
-msgstr "Modo"
+msgstr ""
#. module: mrp
-#: report:bom.structure:0
-msgid "]"
-msgstr "]"
+#: help:mrp.bom,message_ids:0
+#: help:mrp.production,message_ids:0
+#: help:mrp.production.workcenter.line,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter.load,measure_unit:0
msgid "Amount measuring unit"
-msgstr "Importe unidad de medida"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.mrp_production_action_planning
+#: help:mrp.config.settings,module_mrp_jit:0
msgid ""
-"Manufacturing Orders describe the operations that need to be carried out and "
-"the raw materials usage for each production stage. You use specifications "
-"(bills of materials or BoM) to work out the raw material requirements and "
-"the manufacturing orders needed for the finished products. Once the bills of "
-"materials have been defined, OpenERP is capable of automatically deciding on "
-"the manufacturing route depending on the needs of the company."
+"This allows Just In Time computation of procurement orders.\n"
+" All procurement orders will be processed immediately, which "
+"could in some\n"
+" cases entail a small performance impact.\n"
+" This installs the module mrp_jit."
msgstr ""
-"Las órdenes de fabricación describen las operaciones que deben ser "
-"realizadas y las materias primas necesarias para cada etapa de fabricación. "
-"Utilice las especificaciones (listas de materiales o LdM) para obtener las "
-"necesidades de materias primas y las órdenes de fabricación necesarias para "
-"los productos finales. Una vez las listas de materiales hayan sido "
-"definidas, OpenERP es capz de decidir automáticamente al ruta de fabricación "
-"en función de las necesidades de la compañía."
#. module: mrp
-#: constraint:mrp.production:0
-msgid "Order quantity cannot be negative or zero !"
-msgstr "¡Cantidad ordenada no puede ser negativa o cero!"
+#: help:mrp.workcenter,costs_hour:0
+msgid "Specify Cost of Work Center per hour."
+msgstr ""
+
+#. module: mrp
+#: help:mrp.workcenter,capacity_per_cycle:0
+msgid ""
+"Number of operations this Work Center can do in parallel. If this Work "
+"Center represents a team of 5 workers, the capacity per cycle is 5."
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action3
msgid "Manufacturing Orders in Progress"
-msgstr "Órdenes de producción en progreso"
-
-#. module: mrp
-#: model:ir.module.module,description:mrp.module_meta_information
-msgid ""
-"\n"
-" This is the base module to manage the manufacturing process in OpenERP.\n"
-"\n"
-" Features:\n"
-" * Make to Stock / Make to Order (by line)\n"
-" * Multi-level BoMs, no limit\n"
-" * Multi-level routing, no limit\n"
-" * Routing and work center integrated with analytic accounting\n"
-" * Scheduler computation periodically / Just In Time module\n"
-" * Multi-pos, multi-warehouse\n"
-" * Different reordering policies\n"
-" * Cost method by product: standard price, average price\n"
-" * Easy analysis of troubles or needs\n"
-" * Very flexible\n"
-" * Allows to browse Bill of Materials in complete structure\n"
-" that include child and phantom BoMs\n"
-" It supports complete integration and planification of stockable goods,\n"
-" consumable of services. Services are completely integrated with the "
-"rest\n"
-" of the software. For instance, you can set up a sub-contracting service\n"
-" in a BoM to automatically purchase on order the assembly of your "
-"production.\n"
-"\n"
-" Reports provided by this module:\n"
-" * Bill of Material structure and components\n"
-" * Load forecast on Work Centers\n"
-" * Print a production order\n"
-" * Stock forecasts\n"
-" Dashboard provided by this module::\n"
-" * List of next production orders\n"
-" * List of deliveries (out picking)\n"
-" * Graph of work center load\n"
-" * List of procurement in exception\n"
-" "
+msgstr ""
+
+#. module: mrp
+#: model:ir.actions.client,name:mrp.action_client_mrp_menu
+msgid "Open MRP Menu"
msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action4
msgid "Manufacturing Orders Waiting Products"
-msgstr "Órdenes de producción en espera de productos"
+msgstr ""
#. module: mrp
#: view:mrp.bom:0
#: view:mrp.production:0
-#: view:mrp.production.order:0
#: view:mrp.property:0
#: view:mrp.routing:0
#: view:mrp.workcenter:0
msgid "Group By..."
-msgstr "Agrupar por..."
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:121
+#: code:addons/mrp/report/price.py:130
#, python-format
msgid "Cycles Cost"
-msgstr "Coste ciclos"
+msgstr ""
+
+#. module: mrp
+#: code:addons/mrp/wizard/change_production_qty.py:83
+#: code:addons/mrp/wizard/change_production_qty.py:88
+#, python-format
+msgid "Cannot find bill of material for this product."
+msgstr ""
#. module: mrp
#: selection:mrp.workcenter.load,measure_unit:0
msgid "Amount in cycles"
-msgstr "Valor en ciclos"
+msgstr ""
#. module: mrp
#: field:mrp.production,location_dest_id:0
-#: view:mrp.production.order:0
-#: field:mrp.production.order,location_dest_id:0
msgid "Finished Products Location"
-msgstr "Ubicación productos finalizados"
+msgstr ""
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_pm_resources_config
msgid "Resources"
-msgstr "Recursos"
+msgstr ""
+
+#. module: mrp
+#: help:mrp.routing.workcenter,hour_nbr:0
+msgid ""
+"Time in hours for this Work Center to achieve the operation of the specified "
+"routing."
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,costs_journal_id:0
msgid "Analytic Journal"
-msgstr "Diario analítico"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,name:mrp.mrp_workcenter_action
-#: model:ir.ui.menu,name:mrp.menu_view_resource_search_mrp
-#: field:mrp.routing,workcenter_lines:0
-msgid "Work Centers"
-msgstr "Centros de producción"
+#: code:addons/mrp/report/price.py:139
+#, python-format
+msgid "Supplier Price per Unit of Measure"
+msgstr ""
#. module: mrp
#: selection:mrp.workcenter.load,time_unit:0
msgid "Per week"
-msgstr "Por semana"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.mrp_routing_action
-msgid ""
-"Routings allow you to create and manage the manufacturing operations that "
-"should be followed within your work centers in order to produce a product. "
-"They are attached to bills of materials that will define the required raw "
-"materials."
+#: field:mrp.bom,message_unread:0
+#: field:mrp.production,message_unread:0
+#: field:mrp.production.workcenter.line,message_unread:0
+msgid "Unread Messages"
msgstr ""
-"Las rutas le permiten crear y gestionar las operaciones de fabricación a "
-"realizar en sus centros de producción para fabricar un producto. Están "
-"relacionadas con las listas de materiales que definirán las materias primas "
-"necesarias."
#. module: mrp
-#: field:report.workcenter.load,hour:0
-msgid "Nbr of hour"
-msgstr "Núm. de hora"
+#: model:process.transition,note:mrp.process_transition_stockmts0
+msgid ""
+"The system waits for the products to be available in the stock. These "
+"products are typically procured manually or through a minimum stock rule."
+msgstr ""
#. module: mrp
#: view:mrp.routing:0
msgid "Work Center Operations"
-msgstr "Operaciones del centro de producción"
+msgstr ""
#. module: mrp
#: view:mrp.routing:0
msgid "Notes"
-msgstr "Notas"
+msgstr ""
+
+#. module: mrp
+#: view:mrp.production:0
+msgid "Manufacturing Orders which are ready to start production."
+msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_bom
#: view:mrp.bom:0
#: field:mrp.production,bom_id:0
-#: field:mrp.production.order,bom_id:0
#: model:process.node,name:mrp.process_node_billofmaterial0
msgid "Bill of Material"
-msgstr "Lista de material"
+msgstr ""
#. module: mrp
#: view:mrp.workcenter.load:0
msgid "Select time unit"
-msgstr "Seleccionar unidad de tiempo"
+msgstr ""
+
+#. module: mrp
+#: model:ir.actions.act_window,name:mrp.product_supply_method_produce
+#: model:ir.ui.menu,name:mrp.menu_mrp_bom
+#: model:ir.ui.menu,name:mrp.menu_mrp_product_form
+#: view:mrp.config.settings:0
+msgid "Products"
+msgstr ""
#. module: mrp
#: view:report.workcenter.load:0
msgid "Work Center load"
-msgstr "Carga centro de producción"
+msgstr ""
#. module: mrp
#: help:mrp.production,location_dest_id:0
msgid "Location where the system will stock the finished products."
-msgstr "Ubicación donde el sistema almacenará los productos finalizados."
+msgstr ""
#. module: mrp
-#: help:mrp.production,picking_id:0
+#: help:mrp.routing.workcenter,routing_id:0
msgid ""
-"This is the Internal Picking List that brings the finished product to the "
-"production plan"
+"Routing indicates all the Work Centers used, for how long and/or cycles.If "
+"Routing is indicated then,the third tab of a production order (Work Centers) "
+"will be automatically pre-completed."
msgstr ""
-"Este es el albarán interno que trae el producto terminado hacia el plan de "
-"producción."
#. module: mrp
-#: field:stock.change.standard.price,change_parent_price:0
-msgid "Change Parent Price"
-msgstr "Cambiar precio padre"
-
-#. module: mrp
-#: model:ir.model,name:mrp.model_stock_move
-msgid "Stock Move"
-msgstr "Moviemiento de stock"
+#: code:addons/mrp/mrp.py:505
+#, python-format
+msgid "Invalid Action!"
+msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_producttostockrules0
@@ -1344,96 +1279,69 @@ msgid ""
"maxi quantity. It's available in the Inventory management menu and "
"configured by product."
msgstr ""
-"La regla de stock mínimo es una regla de abastecimiento automático basado en "
-"una cantidad mínima y máxima. Está disponible en el menú de gestión de "
-"inventario y configurable por producto."
-
-#. module: mrp
-#: selection:mrp.workcenter.load,time_unit:0
-msgid "Day by day"
-msgstr "Día por día"
#. module: mrp
-#: view:mrp.bom:0
-msgid "Revisions"
-msgstr "Revisiones"
+#: code:addons/mrp/report/price.py:187
+#, python-format
+msgid "Components Cost of %s %s"
+msgstr ""
#. module: mrp
-#: view:mrp.installer:0
-msgid "Configure Your Manufacturing Resource Planning Application"
+#: selection:mrp.workcenter.load,time_unit:0
+msgid "Day by day"
msgstr ""
-"Configure su aplicación de planificación de recursos de fabricación (MRP)"
#. module: mrp
#: field:mrp.production,priority:0
-#: field:mrp.production.order,priority:0
msgid "Priority"
-msgstr "Prioridad"
+msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_stock_picking
+#: field:mrp.production,picking_id:0
msgid "Picking List"
-msgstr "Albarán"
+msgstr ""
#. module: mrp
-#: view:mrp.production.order:0
-msgid "Month -1"
-msgstr "Mes -1"
+#: help:mrp.production,bom_id:0
+msgid ""
+"Bill of Materials allow you to define the list of required raw materials to "
+"make a finished product."
+msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:375
#, python-format
-msgid "Manufacturing order '%s' is scheduled for the %s."
-msgstr "Órden de producción '%s' planificada para el '%s'"
+msgid "%s (copy)"
+msgstr ""
#. module: mrp
-#: report:mrp.production.order:0
-msgid "Production Order N° :"
-msgstr "Núm. orden producción :"
+#: model:ir.model,name:mrp.model_mrp_production_product_line
+msgid "Production Scheduled Product"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/report/price.py:204
#, python-format
-msgid "Manufacturing order '%s' is ready to produce."
-msgstr "Orden fabricación '%s' está preparada para producir."
-
-#. module: mrp
-#: model:ir.model,name:mrp.model_mrp_production_product_line
-msgid "Production Scheduled Product"
-msgstr "Fabricación planificada producto"
+msgid "Work Cost of %s %s"
+msgstr ""
#. module: mrp
#: help:res.company,manufacturing_lead:0
msgid "Security days for each manufacturing operation."
-msgstr "Días de seguridad para cada operación de fabricación."
+msgstr ""
#. module: mrp
#: model:process.node,name:mrp.process_node_mts0
#: model:process.transition,name:mrp.process_transition_servicemts0
#: model:process.transition,name:mrp.process_transition_stockmts0
msgid "Make to Stock"
-msgstr "Obtener para stock"
-
-#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "July"
-msgstr "Julio"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action
-msgid ""
-"Master Bills of Materials allow you to create and manage the list of "
-"necessary raw materials used to make a finished product. OpenERP will use "
-"these BoMs to automatically propose manufacturing orders according to "
-"product needs. You can either create a bill of materials to define specific "
-"production steps or define a single multi-level bill of materials."
+#: constraint:mrp.production:0
+msgid "Order quantity cannot be negative or zero!"
msgstr ""
-"Las listas de materiales maestras le permiten crear y gestionar la lista de "
-"las materias primas necesarias utilizadas para fabricar un producto acabado. "
-"OpenERP utilizará estas LdMs para proponer automáticamente órdenes de "
-"fabricación en función de las necesidades de producto. Puede crear una lista "
-"de materiales para definir los pasos de producción o definir una única lista "
-"de materiales multi-nivel."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_stockrfq0
@@ -1441,100 +1349,96 @@ msgid ""
"In case the Supply method of the product is Buy, the system creates a "
"purchase order."
msgstr ""
-"En caso de que el método de suministro del producto se Compra, el sistema "
-"crea un pedido de compra."
#. module: mrp
#: model:ir.model,name:mrp.model_procurement_order
msgid "Procurement"
-msgstr "Abastecimiento"
+msgstr ""
+
+#. module: mrp
+#: field:mrp.config.settings,module_product_manufacturer:0
+msgid "Define manufacturers on products "
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_view_mrp_product_price_wizard
#: view:mrp.product_price:0
msgid "Product Cost Structure"
-msgstr "Estructura de los costes del producto"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:130
+#: code:addons/mrp/report/price.py:139
#, python-format
msgid "Components suppliers"
-msgstr "Proveedores de componentes"
-
-#. module: mrp
-#: model:ir.model,name:mrp.model_mrp_installer
-msgid "mrp.installer"
-msgstr "mrp.instalador"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Production Work Centers"
-msgstr "Centros de trabajo de producción"
-
-#. module: mrp
-#: view:mrp.production.order:0
-#: field:mrp.production.order,month:0
-msgid "Month"
-msgstr "Mes"
-
-#. module: mrp
-#: code:addons/mrp/wizard/change_production_qty.py:62
-#, python-format
-msgid "Active Id is not found"
-msgstr "ID activo no se encuentra"
+msgstr ""
#. module: mrp
#: view:mrp.workcenter:0
msgid "Search for mrp workcenter"
-msgstr "Buscar por centro de producción mrp"
+msgstr ""
#. module: mrp
#: view:mrp.bom:0
msgid "BoM Structure"
-msgstr "Despiece de la LdM"
+msgstr ""
#. module: mrp
#: field:mrp.production,date_start:0
-#: field:mrp.production.order,date_start:0
msgid "Start Date"
-msgstr "Fecha inicial"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,costs_hour_account_id:0
msgid "Hour Account"
-msgstr "Cuenta horas"
+msgstr ""
+
+#. module: mrp
+#: field:mrp.bom,product_uom:0
+#: field:mrp.production,product_uom:0
+#: field:mrp.production.product.line,product_uom:0
+msgid "Product Unit of Measure"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Destination Loc."
-msgstr "Ubic. destino"
+msgstr ""
#. module: mrp
-#: field:mrp.production.order,product_id2:0
-msgid "Product Consumed"
-msgstr "Producto consumido"
+#: field:mrp.bom,method:0
+msgid "Method"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Pending"
-msgstr "Pendiente"
+msgstr ""
#. module: mrp
#: field:mrp.bom,active:0
#: field:mrp.routing,active:0
msgid "Active"
-msgstr "Activo"
+msgstr ""
#. module: mrp
-#: model:process.node,name:mrp.process_node_procureproducts0
-msgid "Procure Products"
-msgstr "Abastecer productos"
+#: help:mrp.config.settings,group_mrp_routings:0
+msgid ""
+"Routings allow you to create and manage the manufacturing operations that "
+"should be followed\n"
+" within your work centers in order to produce a product. They "
+"are attached to bills of materials\n"
+" that will define the required raw materials."
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,name:mrp.action_report_workcenter_load_tree
#: view:report.workcenter.load:0
msgid "Work Center Loads"
-msgstr "Cargas centro de producción"
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_property_action
@@ -1542,118 +1446,128 @@ msgstr "Cargas centro de producción"
#: view:mrp.bom:0
#: field:mrp.bom,property_ids:0
#: view:mrp.property:0
-#: view:procurement.order:0
#: field:procurement.order,property_ids:0
msgid "Properties"
-msgstr "Propiedades"
+msgstr ""
#. module: mrp
#: help:mrp.production,origin:0
msgid ""
"Reference of the document that generated this production order request."
msgstr ""
-"Referencia al documento que generó esta solicitud de orden de producción."
#. module: mrp
-#: sql_constraint:mrp.bom:0
-msgid ""
-"All product quantities must be greater than 0.\n"
-"You should install the mrp_subproduct module if you want to manage extra "
-"products on BoMs !"
+#: model:process.transition,name:mrp.process_transition_minimumstockprocure0
+msgid "'Minimum stock rule' material"
msgstr ""
-"Todas las cantidades de producto deben de ser superiores a cero.\n"
-"¡Debe instalar el módulo mrp_subproduct si quiere gestionar productos extra "
-"en las LdM!"
#. module: mrp
#: view:mrp.production:0
msgid "Extra Information"
-msgstr "Información extra"
+msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_change_production_qty
msgid "Change Quantity of Products"
-msgstr "Cambiar cantidad de productos"
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_productionorder0
msgid "Drives the procurement orders for raw material."
-msgstr "Guía las órdenes de abastecimiento para materias primas."
+msgstr ""
#. module: mrp
-#: view:mrp.production.order:0
-msgid "Current"
-msgstr "Actual"
+#: field:mrp.production.product.line,product_uos_qty:0
+msgid "Product UOS Quantity"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,costs_general_account_id:0
msgid "General Account"
-msgstr "Cuenta general"
+msgstr ""
#. module: mrp
#: report:mrp.production.order:0
msgid "SO Number"
-msgstr "Número venta"
+msgstr ""
+
+#. module: mrp
+#: code:addons/mrp/mrp.py:505
+#, python-format
+msgid "Cannot delete a manufacturing order in state '%s'."
+msgstr ""
#. module: mrp
#: selection:mrp.production,state:0
-#: view:mrp.production.order:0
-#: selection:mrp.production.order,state:0
msgid "Done"
-msgstr "Realizado"
+msgstr ""
#. module: mrp
-#: model:ir.model,name:mrp.model_stock_change_standard_price
-msgid "Change Standard Price"
-msgstr "Cambio de precio estándar"
+#: view:product.product:0
+msgid "When you sell this product, OpenERP will trigger"
+msgstr ""
#. module: mrp
#: field:mrp.production,origin:0
#: report:mrp.production.order:0
-#: field:mrp.production.order,origin:0
msgid "Source Document"
-msgstr "Documento origen"
+msgstr ""
#. module: mrp
#: selection:mrp.production,priority:0
-#: selection:mrp.production.order,priority:0
msgid "Not urgent"
-msgstr "No urgente"
+msgstr ""
#. module: mrp
-#: help:stock.change.standard.price,change_parent_price:0
-msgid ""
-"This will change the price of parent products also according to the BoM "
-"structure specified for the product."
+#: field:mrp.production,user_id:0
+msgid "Responsible"
msgstr ""
-"Esto cambiará el precio de los productos padre de acuerdo a la estructura de "
-"la lista de materiales del producto."
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action2
msgid "Manufacturing Orders To Start"
-msgstr "Órdenes de producción a iniciar"
-
-#. module: mrp
-#: code:addons/mrp/mrp.py:495
-#, python-format
-msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
-"¡No se puede eliminar orden(es) de producción que están en estado %s!"
#. module: mrp
+#: model:ir.actions.act_window,name:mrp.mrp_workcenter_action
#: model:ir.model,name:mrp.model_mrp_workcenter
+#: model:ir.ui.menu,name:mrp.menu_view_resource_search_mrp
#: field:mrp.production.workcenter.line,workcenter_id:0
#: field:mrp.routing.workcenter,workcenter_id:0
#: view:mrp.workcenter:0
#: field:report.workcenter.load,workcenter_id:0
msgid "Work Center"
-msgstr "Centro de producción"
+msgstr ""
+
+#. module: mrp
+#: model:ir.actions.act_window,help:mrp.mrp_property_group_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a group of properties.\n"
+" </p><p>\n"
+" Define specific property groups that can be assigned to "
+"your\n"
+" bill of materials and sales orders. Properties allows "
+"OpenERP\n"
+" to automatically select the right bill of materials "
+"according\n"
+" to properties selected in the sales order by salesperson.\n"
+" </p><p>\n"
+" For instance, in the property group \"Warranty\", you an "
+"have\n"
+" two properties: 1 year warranty, 3 years warranty. "
+"Depending\n"
+" on the propoerties selected in the sales order, OpenERP "
+"will\n"
+" schedule a production using the matching bill of materials.\n"
+" </p>\n"
+" "
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,capacity_per_cycle:0
msgid "Capacity per Cycle"
-msgstr "Capacidad por ciclo"
+msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_product_product
@@ -1662,116 +1576,83 @@ msgstr "Capacidad por ciclo"
#: view:mrp.production:0
#: field:mrp.production,product_id:0
#: report:mrp.production.order:0
-#: view:mrp.production.order:0
-#: field:mrp.production.order,product_id:0
#: field:mrp.production.product.line,product_id:0
msgid "Product"
-msgstr "Producto"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
#: field:mrp.production,hour_total:0
msgid "Total Hours"
-msgstr "Total horas"
+msgstr ""
#. module: mrp
#: field:mrp.production,location_src_id:0
-#: field:mrp.production.order,location_src_id:0
msgid "Raw Materials Location"
-msgstr "Ubicación materias primas"
+msgstr ""
#. module: mrp
#: view:mrp.product_price:0
msgid "Print Cost Structure of Product."
-msgstr "Imprimir la estructura de costes del producto"
+msgstr ""
#. module: mrp
#: field:mrp.bom,product_uos:0
#: field:mrp.production.product.line,product_uos:0
msgid "Product UOS"
-msgstr "UdV del producto"
-
-#. module: mrp
-#: model:ir.actions.act_window,help:mrp.mrp_workcenter_action
-msgid ""
-"Work Centers allow you to create and manage manufacturing units consisting "
-"of one or more persons and/or machines that can be considered as a unit for "
-"capacity and planning forecasting."
msgstr ""
-"Los centros de trabajo le permiten crear y administrar unidades de "
-"producción que consisten en una o más personas y / o máquinas que se pueden "
-"considerar como una unidad para la capacidad de planificación y previsión."
#. module: mrp
#: view:mrp.production:0
msgid "Consume Products"
-msgstr "Consumir productos"
+msgstr ""
#. module: mrp
-#: field:mrp.bom,product_uom:0
-#: field:mrp.production,product_uom:0
-#: field:mrp.production.order,product_uom:0
-#: field:mrp.production.product.line,product_uom:0
-msgid "Product UOM"
-msgstr "UdM del producto"
+#: model:ir.actions.act_window,name:mrp.act_mrp_product_produce
+#: view:mrp.product.produce:0
+#: view:mrp.production:0
+msgid "Produce"
+msgstr ""
#. module: mrp
#: model:process.node,name:mrp.process_node_stock0
#: model:process.transition,name:mrp.process_transition_servicemto0
#: model:process.transition,name:mrp.process_transition_stockproduct0
msgid "Make to Order"
-msgstr "Obtener bajo pedido"
-
-#. module: mrp
-#: model:ir.actions.act_window,name:mrp.action_report_mrp_production_order
-#: model:ir.ui.menu,name:mrp.menu_report_mrp_production_orders_tree
-msgid "Production Analysis"
-msgstr "Análisis de producción"
-
-#. module: mrp
-#: code:addons/mrp/mrp.py:349
-#, python-format
-msgid "Copy"
-msgstr "Copiar"
+msgstr ""
#. module: mrp
-#: view:mrp.production.lot.line:0
-msgid "Production Products"
-msgstr "Productos producidos"
+#: help:mrp.workcenter,note:0
+msgid ""
+"Description of the Work Center. Explain here what's a cycle according to "
+"this Work Center."
+msgstr ""
#. module: mrp
#: field:mrp.production,date_finished:0
-#: field:mrp.production.order,date_finished:0
msgid "End Date"
-msgstr "Fecha final"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,resource_id:0
msgid "Resource"
-msgstr "Recurso"
+msgstr ""
#. module: mrp
#: help:mrp.bom,date_start:0
#: help:mrp.bom,date_stop:0
msgid "Validity of this BoM or component. Keep empty if it's always valid."
msgstr ""
-"Validez de esta LdM o componente. Dejarlo vacío si siempre es válido."
#. module: mrp
#: field:mrp.production,product_uos:0
msgid "Product UoS"
-msgstr "UdV del producto"
-
-#. module: mrp
-#: view:mrp.production.order:0
-msgid "#Line Orders"
-msgstr "Nº línea órdenes"
+msgstr ""
#. module: mrp
#: selection:mrp.production,priority:0
-#: selection:mrp.production.order,priority:0
msgid "Very Urgent"
-msgstr "Muy urgente"
+msgstr ""
#. module: mrp
#: help:mrp.bom,routing_id:0
@@ -1781,53 +1662,42 @@ msgid ""
"operations and to plan future loads on work centers based on production "
"planning."
msgstr ""
-"La lista de operaciones (lista de los centros de trabajo) para producir los "
-"productos terminados. La ruta se utiliza principalmente para calcular los "
-"costes del centro de trabajo durante las operaciones de carga y planificar "
-"el futuro en los centros de trabajo basado en la planificación de la "
-"producción."
#. module: mrp
#: view:change.production.qty:0
msgid "Approve"
-msgstr "Aprobar"
+msgstr ""
+
+#. module: mrp
+#: view:mrp.config.settings:0
+msgid "Order"
+msgstr ""
#. module: mrp
#: view:mrp.property.group:0
msgid "Properties categories"
-msgstr "Categorías de propiedades"
+msgstr ""
#. module: mrp
#: help:mrp.production.workcenter.line,sequence:0
msgid "Gives the sequence order when displaying a list of work orders."
msgstr ""
-"Indica el orden de secuencia cuando se muestra una lista de órdenes de "
-"trabajo."
#. module: mrp
#: report:mrp.production.order:0
msgid "Source Location"
-msgstr "Ubicación origen"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
#: view:mrp.production.product.line:0
msgid "Scheduled Products"
-msgstr "Productos planificados"
-
-#. module: mrp
-#: view:mrp.production.lot.line:0
-msgid "Production Products Consommation"
-msgstr "Consumición de productos producidos"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,name:mrp.mrp_production_action
-#: model:ir.actions.act_window,name:mrp.mrp_production_action_planning
-#: model:ir.ui.menu,name:mrp.menu_mrp_production_action
-#: model:ir.ui.menu,name:mrp.menu_mrp_production_order_action
-#: view:mrp.production:0
-msgid "Manufacturing Orders"
-msgstr "Órdenes de producción"
+#: model:res.groups,name:mrp.group_mrp_manager
+msgid "Manager"
+msgstr ""
#. module: mrp
#: help:mrp.product.produce,mode:0
@@ -1838,46 +1708,49 @@ msgid ""
"the quantity selected and it will finish the production order when total "
"ordered quantities are produced."
msgstr ""
-"El modo 'Sólo consumir' sólo se consumen los productos con la cantidad "
-"seleccionada.\n"
-"El modo 'Consumo y Producción' se consumen y también se producen los "
-"productos con la cantidad seleccionada y finalizará la orden de producción "
-"cuando el total de las cantidades solicitadas se han producido."
#. module: mrp
#: view:mrp.production:0
#: report:mrp.production.order:0
msgid "Work Orders"
-msgstr "Órdenes de trabajo"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,costs_cycle:0
msgid "Cost per cycle"
-msgstr "Coste por ciclo"
+msgstr ""
#. module: mrp
#: model:process.node,name:mrp.process_node_serviceproduct0
#: model:process.node,name:mrp.process_node_serviceproduct1
msgid "Service"
-msgstr "Servicio"
+msgstr ""
#. module: mrp
#: selection:mrp.production,state:0
-#: selection:mrp.production.order,state:0
msgid "Cancelled"
-msgstr "Cancelado"
+msgstr ""
#. module: mrp
-#: view:mrp.production.order:0
-msgid "BOM"
-msgstr "LdM"
+#: view:mrp.production:0
+msgid "(Update)"
+msgstr ""
#. module: mrp
-#: help:mrp.bom,product_uom:0
+#: help:mrp.config.settings,module_mrp_operations:0
+msgid ""
+"This allows to add state, date_start,date_stop in production order operation "
+"lines (in the \"Work Centers\" tab).\n"
+" This installs the module mrp_operations."
+msgstr ""
+
+#. module: mrp
+#: code:addons/mrp/mrp.py:737
+#, python-format
msgid ""
-"UoM (Unit of Measure) is the unit of measurement for the inventory control"
+"You are going to consume total %s quantities of \"%s\".\n"
+"But you can only consume up to total %s quantities."
msgstr ""
-"UdM(Unidad de medida) es la unidad de medida para el control de inventario"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_bom0
@@ -1886,88 +1759,112 @@ msgid ""
"are products themselves) can also have their own Bill of Material (multi-"
"level)."
msgstr ""
-"La lista de materiales es la composición del producto. Los componentes (que "
-"son también productos) pueden tener sus propias listas de materiales (multi-"
-"nivel)."
#. module: mrp
#: field:mrp.bom,company_id:0
#: field:mrp.production,company_id:0
-#: view:mrp.production.order:0
-#: field:mrp.production.order,company_id:0
#: field:mrp.routing,company_id:0
#: field:mrp.routing.workcenter,company_id:0
#: view:mrp.workcenter:0
msgid "Company"
-msgstr "Compañía"
+msgstr ""
+
+#. module: mrp
+#: view:mrp.bom:0
+msgid "Default Unit of Measure"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,time_cycle:0
msgid "Time for 1 cycle (hour)"
-msgstr "Tiempo para 1 ciclo (horas)"
+msgstr ""
#. module: mrp
#: model:ir.actions.report.xml,name:mrp.report_mrp_production_report
#: field:mrp.production.product.line,production_id:0
-#: field:mrp.production.workcenter.line,production_id:0
#: model:process.node,name:mrp.process_node_production0
#: model:process.node,name:mrp.process_node_productionorder0
msgid "Production Order"
-msgstr "Orden de producción"
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_productminimumstockrule0
msgid "Automatic procurement rule"
-msgstr "Regla de abastecimiento automática"
+msgstr ""
+
+#. module: mrp
+#: field:mrp.bom,message_ids:0
+#: field:mrp.production,message_ids:0
+#: field:mrp.production.workcenter.line,message_ids:0
+msgid "Messages"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Compute Data"
-msgstr "Calcular datos"
+msgstr ""
#. module: mrp
-#: field:mrp.production,product_uos_qty:0
-msgid "Product UoS Qty"
-msgstr "Cant. UdV del producto"
+#: code:addons/mrp/mrp.py:610
+#: code:addons/mrp/wizard/change_production_qty.py:83
+#: code:addons/mrp/wizard/change_production_qty.py:88
+#, python-format
+msgid "Error!"
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:130
+#: code:addons/mrp/report/price.py:139
#: view:mrp.bom:0
#, python-format
msgid "Components"
-msgstr "Componentes"
+msgstr ""
#. module: mrp
#: report:bom.structure:0
#: model:ir.actions.report.xml,name:mrp.report_bom_structure
msgid "BOM Structure"
-msgstr "Despiece de la LdM"
+msgstr ""
+
+#. module: mrp
+#: field:mrp.config.settings,module_mrp_jit:0
+msgid "Generate procurement in real time"
+msgstr ""
#. module: mrp
#: field:mrp.bom,date_stop:0
msgid "Valid Until"
-msgstr "Válido hasta"
+msgstr ""
#. module: mrp
#: field:mrp.bom,date_start:0
msgid "Valid From"
-msgstr "Válido desde"
+msgstr ""
#. module: mrp
#: selection:mrp.bom,type:0
msgid "Normal BoM"
-msgstr "LdM normal"
+msgstr ""
#. module: mrp
#: field:res.company,manufacturing_lead:0
msgid "Manufacturing Lead Time"
-msgstr "Tiempo entrega de fabricación"
+msgstr ""
+
+#. module: mrp
+#: code:addons/mrp/mrp.py:285
+#, python-format
+msgid "Warning"
+msgstr ""
#. module: mrp
#: field:mrp.bom,product_uos_qty:0
-#: field:mrp.production.product.line,product_uos_qty:0
msgid "Product UOS Qty"
-msgstr "Ctdad UdV producto"
+msgstr ""
+
+#. module: mrp
+#: field:mrp.production,move_prod_id:0
+msgid "Product Move"
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,help:mrp.action_report_in_out_picking_tree
@@ -1976,24 +1873,23 @@ msgid ""
"linked to manufacturing activities, receptions of products and delivery "
"orders."
msgstr ""
-"La variación semanal del valor del stock permite realizar un seguimiento de "
-"la evolución del valor del stock relativo a las actividades de fabricacion, "
-"recepciónd de productos y ordenes de entrega."
#. module: mrp
#: view:mrp.product.produce:0
msgid "Confirm"
-msgstr "Confirmar"
+msgstr ""
#. module: mrp
#: field:mrp.bom,product_efficiency:0
msgid "Manufacturing Efficiency"
-msgstr "Eficiencia de la producción"
+msgstr ""
#. module: mrp
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr "¡Error! No puede crear compañías recursivas."
+#: field:mrp.bom,message_follower_ids:0
+#: field:mrp.production,message_follower_ids:0
+#: field:mrp.production.workcenter.line,message_follower_ids:0
+msgid "Followers"
+msgstr ""
#. module: mrp
#: help:mrp.bom,active:0
@@ -2001,475 +1897,388 @@ msgid ""
"If the active field is set to False, it will allow you to hide the bills of "
"material without removing it."
msgstr ""
-"Si el campo activo se desmarca, permite ocultar las listas de material sin "
-"eliminarlas."
#. module: mrp
#: field:mrp.bom,product_rounding:0
msgid "Product Rounding"
-msgstr "Redondeo del producto"
-
-#. module: mrp
-#: model:ir.model,name:mrp.model_mrp_production_workcenter_line
-#: field:mrp.production.workcenter.line,name:0
-msgid "Work Order"
-msgstr "Orden de trabajo"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.action_report_mrp_production_order
-msgid ""
-"This reporting allows you to analyse your manufacturing activities and "
-"performance."
+#: selection:mrp.production,state:0
+msgid "New"
msgstr ""
-"Estos informes le permiten analizar sus actividad productiva y su "
-"rendimiento."
#. module: mrp
#: selection:mrp.product.produce,mode:0
msgid "Consume Only"
-msgstr "Consumir únicamente"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Recreate Picking"
-msgstr "Volver a crear albarán"
-
-#. module: mrp
-#: help:mrp.bom,type:0
-msgid ""
-"If a sub-product is used in several products, it can be useful to create its "
-"own BoM. Though if you don't want separated production orders for this sub-"
-"product, select Set/Phantom as BoM type. If a Phantom BoM is used for a root "
-"product, it will be sold and shipped as a set of components, instead of "
-"being produced."
msgstr ""
-"Si un sub-producto se utiliza en varios productos, puede ser útil crear su "
-"propia lista de materiales. Aunque si no quiere órdenes de producción "
-"separadas para este sub-producto, seleccione Conjunto/Fantasma como tipo de "
-"LdM. Si una LdM fantasma se utiliza para un producto raíz, será vendida y "
-"enviada como un conjunto de componentes, en vez de ser producida."
-
-#. module: mrp
-#: field:mrp.bom,method:0
-msgid "Method"
-msgstr "Método"
-
-#. module: mrp
-#: help:mrp.production,state:0
-msgid ""
-"When the production order is created the state is set to 'Draft'.\n"
-" If the order is confirmed the state is set to 'Waiting Goods'.\n"
-" If any exceptions are there, the state is set to 'Picking Exception'. "
-" \n"
-"If the stock is available then the state is set to 'Ready to Produce'.\n"
-" When the production gets started then the state is set to 'In Production'.\n"
-" When the production is over, the state is set to 'Done'."
-msgstr ""
-"Cuando se crea la orden de fabricación su estado es fijado a \"Borrador\"\n"
-" Si la orden está confirmdada, el estado es fijado a \"Esperando "
-"mercancía\"\n"
-" Si existe alguna excepción, el estado es fijado a \"Excepcion de "
-"abastecimiento\"\n"
-"Si el stock está disponible, el estado es fijado a \"Listo para producir\"\n"
-" Cuando la fabricación comienza, el estado es fijado a \"En producción\"\n"
-" Cuando la fabricación finaliza, el estado es fijado a \"Realizado\""
#. module: mrp
#: selection:mrp.bom,method:0
msgid "On Order"
-msgstr "En orden"
+msgstr ""
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_configuration
-#: view:res.company:0
msgid "Configuration"
-msgstr "Configuración"
+msgstr ""
+
+#. module: mrp
+#: view:mrp.bom:0
+msgid "Starting Date"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter,time_stop:0
msgid "Time after prod."
-msgstr "Tiempo después producción"
+msgstr ""
#. module: mrp
#: field:mrp.workcenter.load,time_unit:0
msgid "Type of period"
-msgstr "Tipo de período"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Total Qty"
-msgstr "Ctdad total"
+msgstr ""
#. module: mrp
+#: field:mrp.production.workcenter.line,hour:0
#: field:mrp.routing.workcenter,hour_nbr:0
+#: field:report.workcenter.load,hour:0
msgid "Number of Hours"
-msgstr "Número de horas"
+msgstr ""
#. module: mrp
#: view:mrp.workcenter:0
msgid "Costing Information"
-msgstr "Información de costes"
+msgstr ""
#. module: mrp
#: model:process.node,name:mrp.process_node_purchaseprocure0
msgid "Procurement Orders"
-msgstr "Órdenes de abastecimiento"
+msgstr ""
#. module: mrp
#: help:mrp.bom,product_rounding:0
msgid "Rounding applied on the product quantity."
-msgstr "Redondeo aplicado sobre la cantidad de producto"
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_stock0
msgid "Assignment from Production or Purchase Order."
-msgstr "Asignación desde producción o pedido de compra."
+msgstr ""
#. module: mrp
-#: field:mrp.routing.workcenter,routing_id:0
-msgid "Parent Routing"
-msgstr "Proceso productivo padre"
+#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a bill of material. \n"
+" </p><p>\n"
+" Bills of Materials allow you to define the list of required "
+"raw\n"
+" materials used to make a finished product; through a "
+"manufacturing\n"
+" order or a pack of products.\n"
+" </p><p>\n"
+" OpenERP uses these BoMs to automatically propose "
+"manufacturing\n"
+" orders according to procurement needs.\n"
+" </p>\n"
+" "
+msgstr ""
#. module: mrp
-#: view:mrp.installer:0
-msgid "Configure"
-msgstr "Configurar"
+#: field:mrp.routing.workcenter,routing_id:0
+msgid "Parent Routing"
+msgstr ""
#. module: mrp
#: help:mrp.workcenter,time_start:0
msgid "Time in hours for the setup."
-msgstr "Tiempo en horas para la configuración."
+msgstr ""
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "December"
-msgstr "Diciembre"
+#: field:mrp.config.settings,module_mrp_repair:0
+msgid "Manage repairs of products "
+msgstr ""
#. module: mrp
-#: field:mrp.installer,config_logo:0
-msgid "Image"
-msgstr "Imagen"
+#: help:mrp.config.settings,module_mrp_byproduct:0
+msgid ""
+"You can configure by-products in the bill of material.\n"
+" Without this module: A + B + C -> D.\n"
+" With this module: A + B + C -> D + E.\n"
+" This installs the module mrp_byproduct."
+msgstr ""
#. module: mrp
-#: field:mrp.bom.revision,bom_id:0
#: field:procurement.order,bom_id:0
msgid "BoM"
-msgstr "Lista de materiales (LdM)"
+msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_report_mrp_inout
#: view:report.mrp.inout:0
msgid "Stock value variation"
-msgstr "Variación del valor del stock"
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_mts0
#: model:process.node,note:mrp.process_node_servicemts0
msgid "Assignment from stock."
-msgstr "Asignación desde stock."
-
-#. module: mrp
-#: selection:mrp.production,state:0
-#: view:mrp.production.order:0
-#: selection:mrp.production.order,state:0
-msgid "Waiting Goods"
-msgstr "Esperando mercancía"
-
-#. module: mrp
-#: field:mrp.bom.revision,last_indice:0
-msgid "last indice"
-msgstr "Último índice"
-
-#. module: mrp
-#: field:mrp.bom,revision_ids:0
-#: view:mrp.bom.revision:0
-msgid "BoM Revisions"
-msgstr "Revisiones lista de materiales"
+msgstr ""
#. module: mrp
-#: selection:mrp.production,state:0
-#: selection:mrp.production.order,state:0
-msgid "Draft"
-msgstr "Borrador"
+#: code:addons/mrp/report/price.py:139
+#, python-format
+msgid "Cost Price per Unit of Measure"
+msgstr ""
#. module: mrp
#: field:report.mrp.inout,date:0
+#: view:report.workcenter.load:0
#: field:report.workcenter.load,name:0
msgid "Week"
-msgstr "Semana"
-
-#. module: mrp
-#: field:mrp.installer,progress:0
-msgid "Configuration Progress"
-msgstr "Progreso de la configuración"
+msgstr ""
#. module: mrp
#: selection:mrp.production,priority:0
-#: selection:mrp.production.order,priority:0
msgid "Normal"
-msgstr "Normal"
+msgstr ""
+
+#. module: mrp
+#: view:mrp.production:0
+msgid "Production started late"
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_routing0
msgid "Manufacturing Steps."
-msgstr "Etapas de producción."
+msgstr ""
#. module: mrp
-#: code:addons/mrp/report/price.py:136
+#: code:addons/mrp/report/price.py:146
#: model:ir.actions.report.xml,name:mrp.report_cost_structure
#, python-format
msgid "Cost Structure"
-msgstr "Estructura de costes"
+msgstr ""
#. module: mrp
-#: selection:mrp.product.produce,mode:0
-msgid "Consume & Produce"
-msgstr "Consumir y Producir"
+#: model:res.groups,name:mrp.group_mrp_user
+msgid "User"
+msgstr ""
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "November"
-msgstr "Noviembre"
+#: selection:mrp.product.produce,mode:0
+msgid "Consume & Produce"
+msgstr ""
#. module: mrp
#: field:mrp.bom,bom_id:0
msgid "Parent BoM"
-msgstr "Lista de materiales (LdM) padre"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action2
-msgid ""
-"Bills of materials components are components and sub-products used to create "
-"master bills of materials. Use this menu to search in which BoM a specific "
-"component is used."
+#: report:bom.structure:0
+msgid "BOM Ref"
msgstr ""
-"Los componente de listas de materiales son componentes y sub-productos "
-"utilizados para crear listas de materiales maestras. Utilice este menú para "
-"buscar en qué LdM es utilizado un componente específico."
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "January"
-msgstr "Enero"
+#: code:addons/mrp/mrp.py:765
+#, python-format
+msgid ""
+"You are going to produce total %s quantities of \"%s\".\n"
+"But you can only produce up to total %s quantities."
+msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_stockproduct0
msgid "Product type is Stockable or Consumable."
-msgstr "Tipo de producto es almacenable o consumible."
+msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
-#: code:addons/mrp/wizard/change_production_qty.py:77
-#: code:addons/mrp/wizard/change_production_qty.py:82
-#, python-format
-msgid "Error"
-msgstr "Error"
+#: selection:mrp.production,state:0
+msgid "Production Started"
+msgstr ""
+
+#. module: mrp
+#: model:process.node,name:mrp.process_node_procureproducts0
+msgid "Procure Products"
+msgstr ""
#. module: mrp
#: field:mrp.product.produce,product_qty:0
msgid "Select Quantity"
-msgstr "Seleccionar cantidad"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,name:mrp.act_product_product_2_mrp_bom
#: model:ir.actions.act_window,name:mrp.mrp_bom_form_action
+#: model:ir.actions.act_window,name:mrp.product_open_bom
#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action
+#: view:mrp.bom:0
+#: view:product.product:0
#: field:product.product,bom_ids:0
msgid "Bill of Materials"
-msgstr "Lista de materiales (LdM)"
+msgstr ""
#. module: mrp
-#: help:mrp.routing.workcenter,routing_id:0
+#: code:addons/mrp/mrp.py:610
+#, python-format
+msgid "Cannot find a bill of material for this product."
+msgstr ""
+
+#. module: mrp
+#: view:product.product:0
msgid ""
-"Routing indicates all the Work Centers used, for how long and/or cycles.If "
-"Routing is indicated then,the third tab of a production order (Work Centers) "
-"will be automatically pre-completed."
+"using the bill of materials assigned to this product.\n"
+" The delivery order will be ready once the production "
+"is done."
msgstr ""
#. module: mrp
-#: model:ir.model,name:mrp.model_mrp_bom_revision
-msgid "Bill of Material Revision"
-msgstr "Revisión de lista de materiales"
+#: field:mrp.config.settings,module_stock_no_autopicking:0
+msgid "Manage manual picking to fulfill manufacturing orders "
+msgstr ""
#. module: mrp
#: view:mrp.routing.workcenter:0
#: view:mrp.workcenter:0
msgid "General Information"
-msgstr "Información general"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Productions"
-msgstr "Producciones"
-
-#. module: mrp
-#: code:addons/mrp/report/price.py:194
-#, python-format
-msgid "Work Cost of "
-msgstr "Coste trabajo de "
-
-#. module: mrp
-#: help:mrp.workcenter,note:0
-msgid ""
-"Description of the Work Center. Explain here what's a cycle according to "
-"this Work Center."
msgstr ""
#. module: mrp
-#: model:ir.model,name:mrp.model_mrp_routing
-#: view:mrp.bom:0
-#: field:mrp.bom,routing_id:0
+#: model:ir.model,name:mrp.model_stock_move_split
#: view:mrp.production:0
-#: field:mrp.production,routing_id:0
-#: field:mrp.production.order,routing_id:0
-#: view:mrp.routing:0
-#: model:process.node,name:mrp.process_node_routing0
-msgid "Routing"
-msgstr "Proceso productivo"
-
-#. module: mrp
-#: field:mrp.installer,mrp_operations:0
-msgid "Manufacturing Operations"
-msgstr "Operaciones de producción"
-
-#. module: mrp
-#: field:mrp.production,date_planned:0
-msgid "Scheduled date"
-msgstr "Fecha planificada"
-
-#. module: mrp
-#: constraint:stock.move:0
-msgid "You must assign a production lot for this product"
-msgstr "Debe asignar un lote de producción para este producto"
+msgid "Split in Serial Numbers"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.mrp_property_action
+#: help:mrp.bom,product_uos:0
msgid ""
-"The Properties in OpenERP are used to select the right bill of materials for "
-"manufacturing a product when you have different ways of building the same "
-"product. You can assign several properties to each Bill of Materials. When a "
-"sales person creates a sales order, he can relate it to several properties "
-"and OpenERP will automatically select the BoM to use according the the needs."
+"Product UOS (Unit of Sale) is the unit of measurement for the invoicing and "
+"promotion of stock."
msgstr ""
-"Las propiedades en OpenERP se utilizan para seleccionar la correcta lista de "
-"materiales para la fabricación de uno de los productos cuando se tienen "
-"diferentes formas de fabricar el mismo producto. Puede asignar varias "
-"propiedades para cada lista de materiales. Cuando un vendedor crea un pedido "
-"de cliente, él puede relacionarlo con varias propiedades y OpenERP "
-"seleccionará automáticamente la lista de materiales para utilizar según las "
-"necesidades."
#. module: mrp
-#: view:mrp.production.order:0
+#: view:mrp.production:0
#: field:stock.move,production_id:0
msgid "Production"
-msgstr "Producción"
+msgstr ""
#. module: mrp
-#: view:board.board:0
-msgid "Procurements in Exception"
-msgstr "Abastecimientos en excepción"
+#: model:ir.model,name:mrp.model_mrp_production_workcenter_line
+#: field:mrp.production.workcenter.line,name:0
+msgid "Work Order"
+msgstr ""
#. module: mrp
-#: model:process.transition,name:mrp.process_transition_minimumstockprocure0
-msgid "'Minimum stock rule' material"
-msgstr "material 'regla stock mínimo'"
+#: view:board.board:0
+msgid "Procurements in Exception"
+msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_product_price
msgid "Product Price"
-msgstr "Precio del producto"
-
-#. module: mrp
-#: model:ir.actions.act_window,name:mrp.action_mrp_installer
-msgid "MRP Applications Configuration"
-msgstr "Configuración de las aplicaciónes MRP"
-
-#. module: mrp
-#: model:ir.model,name:mrp.model_stock_move_split
-msgid "Split in Production lots"
-msgstr "Dividir en lotes de producción"
+msgstr ""
#. module: mrp
#: view:change.production.qty:0
msgid "Change Quantity"
-msgstr "Cambiar cantidad"
+msgstr ""
#. module: mrp
#: view:change.production.qty:0
#: model:ir.actions.act_window,name:mrp.action_change_production_qty
msgid "Change Product Qty"
-msgstr "Cambiar Ctd. producto"
+msgstr ""
#. module: mrp
-#: view:mrp.bom.revision:0
-#: field:mrp.bom.revision,description:0
-#: view:mrp.property:0
-#: view:mrp.property.group:0
#: field:mrp.routing,note:0
-#: view:mrp.routing.workcenter:0
#: field:mrp.routing.workcenter,note:0
-#: view:mrp.workcenter:0
#: field:mrp.workcenter,note:0
msgid "Description"
-msgstr "Descripción"
-
-#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "May"
-msgstr "Mayo"
+msgstr ""
#. module: mrp
#: view:board.board:0
msgid "Manufacturing board"
-msgstr "Tablero fabricación"
-
-#. module: mrp
-#: field:mrp.production,date_planned_end:0
-msgid "Scheduled End Date"
-msgstr "Fecha de fin planificada"
+msgstr ""
#. module: mrp
-#: model:ir.actions.act_window,help:mrp.action_report_workcenter_load_tree
-msgid ""
-"Work Center Loads gives you a projection of work center loads over a "
-"specified period. It is expressed in number of hours and machine related "
-"cycles."
+#: code:addons/mrp/wizard/change_production_qty.py:68
+#, python-format
+msgid "Active Id not found"
msgstr ""
-"Las cargas de los centros de producción muestran un pronóstico de la carga "
-"de los centros de producción respecto a un periodo determinado. Está "
-"expresado en número de horas y ciclos de máquina relacionados."
#. module: mrp
#: model:process.node,note:mrp.process_node_procureproducts0
msgid "The way to procurement depends on the product type."
-msgstr "La forma de abastecer depende del tipo de producto."
+msgstr ""
#. module: mrp
+#: model:ir.actions.act_window,name:mrp.open_board_manufacturing
+#: model:ir.ui.menu,name:mrp.menu_board_manufacturing
#: model:ir.ui.menu,name:mrp.menu_mrp_manufacturing
+#: model:ir.ui.menu,name:mrp.next_id_77
msgid "Manufacturing"
-msgstr "Fabricación"
+msgstr ""
#. module: mrp
-#: view:board.board:0
-msgid "Next Production Orders"
-msgstr "Próximas órdenes de producción"
+#: help:mrp.bom,type:0
+msgid ""
+"If a by-product is used in several products, it can be useful to create its "
+"own BoM. Though if you don't want separated production orders for this by-"
+"product, select Set/Phantom as BoM type. If a Phantom BoM is used for a root "
+"product, it will be sold and shipped as a set of components, instead of "
+"being produced."
+msgstr ""
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "February"
-msgstr "Febrero"
+#: model:ir.actions.act_window,name:mrp.action_mrp_configuration
+#: view:mrp.config.settings:0
+msgid "Configure Manufacturing"
+msgstr ""
+
+#. module: mrp
+#: view:product.product:0
+msgid ""
+"a manufacturing\n"
+" order"
+msgstr ""
+
+#. module: mrp
+#: field:mrp.config.settings,group_mrp_properties:0
+msgid "Allow several bill of materials per products using properties"
+msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_property_group_action
#: model:ir.ui.menu,name:mrp.menu_mrp_property_group_action
msgid "Property Groups"
-msgstr "Grupos de propiedades"
+msgstr ""
#. module: mrp
-#: selection:mrp.production.order,month:0
-msgid "April"
-msgstr "Abril"
+#: model:ir.model,name:mrp.model_mrp_routing
+#: view:mrp.bom:0
+#: field:mrp.bom,routing_id:0
+#: view:mrp.production:0
+#: field:mrp.production,routing_id:0
+#: view:mrp.routing:0
+#: model:process.node,name:mrp.process_node_routing0
+msgid "Routing"
+msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_procurestockableproduct0
@@ -2477,19 +2286,23 @@ msgid ""
"Depending on the chosen method to supply the stockable products, the "
"procurement order creates a RFQ, a production order, ... "
msgstr ""
-"Dependiendo del método elegido para suministrar los productos almacenables, "
-"la orden de abastecimiento crea una petición de presupuesto, una orden de "
-"producción, ... "
#. module: mrp
#: help:mrp.workcenter,time_stop:0
msgid "Time in hours for the cleaning."
-msgstr "Tiempo en horas para la limpieza."
+msgstr ""
+
+#. module: mrp
+#: field:mrp.bom,message_summary:0
+#: field:mrp.production,message_summary:0
+#: field:mrp.production.workcenter.line,message_summary:0
+msgid "Summary"
+msgstr ""
#. module: mrp
#: model:process.transition,name:mrp.process_transition_purchaseprocure0
msgid "Automatic RFQ"
-msgstr "Petición de presupuesto automática"
+msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_servicemto0
@@ -2497,8 +2310,6 @@ msgid ""
"If the service has a 'Produce' supply method, this creates a task in the "
"project management module of OpenERP."
msgstr ""
-"Si el servicio tiene un método de suministro 'Producir', se crea una tarea "
-"en el módulo de gestión de proyectos de OpenERP."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_productionprocureproducts0
@@ -2507,10 +2318,6 @@ msgid ""
"production order creates as much procurement orders as components listed in "
"the BOM, through a run of the schedulers (MRP)."
msgstr ""
-"Para poder suministrar materias primas (que deben ser compradas o "
-"producidas), la orden de producción genera tantas órdenes de abastecimiento "
-"como componentes figuren en la lista de materiales, a través de una "
-"ejecución de las planificaciones (MRP)."
#. module: mrp
#: help:mrp.product_price,number:0
@@ -2518,13 +2325,11 @@ msgid ""
"Specify quantity of products to produce or buy. Report of Cost structure "
"will be displayed base on this quantity."
msgstr ""
-"Indique la cantidad de productos a producir o comprar. El informe de la "
-"estructura de costes se muestra basándose en esta cantidad."
#. module: mrp
#: selection:mrp.bom,method:0
msgid "On Stock"
-msgstr "En stock"
+msgstr ""
#. module: mrp
#: field:mrp.bom,sequence:0
@@ -2532,897 +2337,26 @@ msgstr "En stock"
#: field:mrp.production.workcenter.line,sequence:0
#: field:mrp.routing.workcenter,sequence:0
msgid "Sequence"
-msgstr "Secuencia"
+msgstr ""
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_view_resource_calendar_leaves_search_mrp
msgid "Resource Leaves"
-msgstr "Ausencias recursos"
+msgstr ""
#. module: mrp
#: help:mrp.bom,sequence:0
msgid "Gives the sequence order when displaying a list of bills of material."
msgstr ""
-"Indica el orden de secuencia cuando se muestra una lista de listas de "
-"materiales."
+
+#. module: mrp
+#: model:ir.model,name:mrp.model_mrp_config_settings
+msgid "mrp.config.settings"
+msgstr ""
#. module: mrp
#: view:mrp.production:0
#: field:mrp.production,move_lines:0
#: report:mrp.production.order:0
-#: field:mrp.production.order,products_to_consume:0
msgid "Products to Consume"
-msgstr "Productos a consumir"
-
-#. module: mrp
-#: view:mrp.production.order:0
-#: field:mrp.production.order,year:0
-msgid "Year"
-msgstr "Año"
-
-#~ msgid "-"
-#~ msgstr "-"
-
-#~ msgid ""
-#~ "Triggers an automatic procurement for all products that have a virtual stock "
-#~ "under 0. You should probably not use this option, we suggest using a MTO "
-#~ "configuration on products."
-#~ msgstr ""
-#~ "Dispara un abastecimiento automático para todos los productos que tienen un "
-#~ "stock virtual menor que 0. Probablemente no debería utilizar esta opción, "
-#~ "sugerimos utilizar una configuración de MTO en productos."
-
-#~ msgid "Compute Stock Minimum Rules Only"
-#~ msgstr "Calcular sólo reglas de stock mínimo"
-
-#~ msgid "Exceptions Procurements"
-#~ msgstr "Excepciones de abastecimientos"
-
-#~ msgid "UoS Quantity"
-#~ msgstr "Cantidad UdV"
-
-#~ msgid "Routing Workcenters"
-#~ msgstr "Procesos productivos de los centros de producción"
-
-#~ msgid "Not used in computations, for information purpose only."
-#~ msgstr "No utilizado en cálculos, sólo con la finalidad de informar."
-
-#~ msgid "Packing list"
-#~ msgstr "Albarán"
-
-#~ msgid "Stockable Stock"
-#~ msgstr "Stock productos almacenables"
-
-#~ msgid "Origin"
-#~ msgstr "Origen"
-
-#~ msgid "Automatic orderpoint"
-#~ msgstr "Generación de orden automática"
-
-#, python-format
-#~ msgid "No supplier defined for this product !"
-#~ msgstr "¡No se ha definido un proveedor para este producto!"
-
-#, python-format
-#~ msgid "Product name"
-#~ msgstr "Nombre producto"
-
-#~ msgid "Invalid XML for View Architecture!"
-#~ msgstr "¡XML inválido para la definición de la vista!"
-
-#~ msgid ""
-#~ "This is the days added to what you promise to customers for security purpose"
-#~ msgstr ""
-#~ "Éstos son los días añadidos a los que promete a los clientes por razones de "
-#~ "seguridad"
-
-#~ msgid "Best price (not yet active!)"
-#~ msgstr "Mejor precio (aún no activo!)"
-
-#~ msgid "Product & Location"
-#~ msgstr "Producto & Ubicación"
-
-#~ msgid "MRP & Logistic Scheduler"
-#~ msgstr "Planificador MRP & Logística"
-
-#~ msgid ""
-#~ "Number of operation this workcenter can do in parallel. If this workcenter "
-#~ "represent a team of 5 workers, the capacity per cycle is 5."
-#~ msgstr ""
-#~ "Número de operaciones que este centro de producción puede realizar en "
-#~ "paralelo. Si este centro de producción tuviera un equipo de 5 trabajadores, "
-#~ "la capacidad por ciclo sería de 5."
-
-#~ msgid "Ask New Products"
-#~ msgstr "Solicitar nuevos productos"
-
-#~ msgid "Automatic Procurements"
-#~ msgstr "Abastecimientos automáticos"
-
-#~ msgid "Products Consummed"
-#~ msgstr "Productos consumidos"
-
-#~ msgid "Packing Exception"
-#~ msgstr "Excepción de empaquetado"
-
-#~ msgid "A purchase order is created for a sub-contracting demand."
-#~ msgstr "Una orden de compra es creada para sub-contratar la demanda."
-
-#~ msgid "Analytic Accounting"
-#~ msgstr "Contabilidad analítica"
-
-#~ msgid "Do nothing"
-#~ msgstr "No hacer nada"
-
-#, python-format
-#~ msgid "products"
-#~ msgstr "productos"
-
-#~ msgid "If the stock of a product is under 0, it will act like an orderpoint"
-#~ msgstr "Si el stock de un producto es menor que 0, actuará como una orden"
-
-#~ msgid "you can see the minimum stock rules from product"
-#~ msgstr "puede ver las reglas de stock mínimo desde producto"
-
-#~ msgid "This wizard will schedule procurements."
-#~ msgstr "Este asistente planificará abastecimientos."
-
-#~ msgid "Internal Ref."
-#~ msgstr "Ref. interna"
-
-#~ msgid "Status"
-#~ msgstr "Estado"
-
-#~ msgid "Stockable Production Order"
-#~ msgstr "Orden producción almacenable"
-
-#~ msgid "Stockable Request"
-#~ msgstr "Solicitud almacenable"
-
-#, python-format
-#~ msgid "Workcenter name"
-#~ msgstr "Nombre centro de producción"
-
-#~ msgid "Service on Order"
-#~ msgstr "Servicio sobre orden"
-
-#~ msgid ""
-#~ "When the virtual stock goes belong the Min Quantity, Open ERP generates a "
-#~ "procurement to bring the virtual stock to the Max Quantity."
-#~ msgstr ""
-#~ "Cuando el stock virtual disminuye por debajo de la cantidad mínima, OpenERP "
-#~ "genera un abastecimiento para que el stock virtual sea la cantidad máxima."
-
-#~ msgid "Stockable Make to Stock"
-#~ msgstr "Almacenable obtenido para stock"
-
-#~ msgid "Production Orders"
-#~ msgstr "Órdenes de producción"
-
-#~ msgid "Procure Service Product"
-#~ msgstr "Abastecer producto servicio"
-
-#, python-format
-#~ msgid "Product Quantity"
-#~ msgstr "Cantidad producto"
-
-#~ msgid "Procurements"
-#~ msgstr "Abastecimientos"
-
-#~ msgid "Production scheduled products"
-#~ msgstr "Producción planificada de productos"
-
-#~ msgid "Details"
-#~ msgstr "Detalles"
-
-#~ msgid "Procurement Process"
-#~ msgstr "Proceso de abastecimiento"
-
-#, python-format
-#~ msgid "Product Standard Price"
-#~ msgstr "Precio estándar producto"
-
-#~ msgid ""
-#~ "Rounding applied on the product quantity. For integer only values, put 1.0"
-#~ msgstr ""
-#~ "Redondeo aplicado a la cantidad de producto. Para valores siempre enteros "
-#~ "introduzca 1.0"
-
-#~ msgid "Reservation"
-#~ msgstr "Reserva"
-
-#~ msgid "product"
-#~ msgstr "producto"
-
-#~ msgid "max"
-#~ msgstr "máx"
-
-#~ msgid "Product to stock rules"
-#~ msgstr "Producto a reglas de stock"
-
-#, python-format
-#~ msgid "from stock: products assigned."
-#~ msgstr "desde stock: productos asignados."
-
-#~ msgid "Print product price"
-#~ msgstr "Imprimir coste del producto"
-
-#~ msgid "Make Procurement"
-#~ msgstr "Realizar abastecimiento"
-
-#~ msgid "If Procure method is Make to order and supply method is produce"
-#~ msgstr ""
-#~ "si método de abastecimiento es obtener bajo pedido y método de suministro es "
-#~ "producir"
-
-#~ msgid "Purchase Lead Time"
-#~ msgstr "Plazo de tiempo de compra"
-
-#~ msgid "Stockable Product Stock"
-#~ msgstr "Stock de producto almacenable"
-
-#~ msgid "Production Procure Products"
-#~ msgstr "Productos para abastecer la producción"
-
-#~ msgid "Service Product Process"
-#~ msgstr "Proceso producto de servicios"
-
-#~ msgid "Procurement convert into the draft purchase order."
-#~ msgstr "Abastecimiento se convierte en la orden de compra borrador."
-
-#~ msgid "Latest error"
-#~ msgstr "Último error"
-
-#, python-format
-#~ msgid "from stock and no minimum orderpoint rule defined"
-#~ msgstr "desde stock y no se ha definido regla mínima generación orden"
-
-#~ msgid "Routing workcenter usage"
-#~ msgstr "Procesos productivos del centro de producción"
-
-#~ msgid "If Product type is Stockable and procure method is make to stock"
-#~ msgstr ""
-#~ "Si el tipo de producto es almacenable y el método de abastecimiento es "
-#~ "obtener para stock"
-
-#~ msgid "Manufacturity Lead Time"
-#~ msgstr "Plazo de entrega de fabricación"
-
-#~ msgid "Exceptions Procurements to Fix"
-#~ msgstr "Excepciones de abastecimientos a corregir"
-
-#~ msgid "Workcenter Operations"
-#~ msgstr "Operaciones del centro de producción"
-
-#~ msgid "Production Orders Planning"
-#~ msgstr "Planificación órdenes de producción"
-
-#~ msgid "Factor that multiplies all times expressed in the workcenter."
-#~ msgstr ""
-#~ "Factor que multiplica todos los tiempos expresados en el centro de "
-#~ "producción."
-
-#~ msgid ""
-#~ "This is the Internal Picking List take bring the raw materials to the "
-#~ "production plan."
-#~ msgstr ""
-#~ "Ésta es la lista de empaquetado interna que lleva las materias primas a la "
-#~ "producción planificada."
-
-#~ msgid "Qty Multiple"
-#~ msgstr "Ctdad múltiple"
-
-#~ msgid "Waiting"
-#~ msgstr "En espera"
-
-#~ msgid "For stockable and consumable"
-#~ msgstr "Para almacenables y consumibles"
-
-#~ msgid "indice type"
-#~ msgstr "Tipo de índice"
-
-#, python-format
-#~ msgid "Hours Cost"
-#~ msgstr "Coste horas"
-
-#~ msgid "Production orders are created for the product manufacturing."
-#~ msgstr "Se crean órdenes de producción para la fabricación del producto."
-
-#~ msgid "Min Quantity"
-#~ msgstr "Cantidad mín"
-
-#~ msgid "Production orders"
-#~ msgstr "Órdenes de producción"
-
-#~ msgid "BoM Hyerarchy"
-#~ msgstr "Jerarquía LdM"
-
-#~ msgid "Procurement Lines"
-#~ msgstr "Líneas de abastecimiento"
-
-#~ msgid "If Product type is service and procure method is Make to stock"
-#~ msgstr ""
-#~ "si el tipo de producto es servicio y el método de abastecimiento es obtener "
-#~ "para stock"
-
-#~ msgid "If Product type is service"
-#~ msgstr "Si el tipo de producto es servicio"
-
-#, python-format
-#~ msgid "SUBTOTAL"
-#~ msgstr "SUBTOTAL"
-
-#~ msgid "Security Days"
-#~ msgstr "Días de seguridad"
-
-#~ msgid "Exception"
-#~ msgstr "Excepción"
-
-#~ msgid ""
-#~ "This wizard will planify the procurement for this product. This procurement "
-#~ "may generate task, production orders or purchase orders."
-#~ msgstr ""
-#~ "Este asistente planificará el abastecimiento para este producto. El "
-#~ "abastecimiento puede generar tareas, órdenes de producción o órdenes de "
-#~ "compra."
-
-#~ msgid "The system waits for requested products in stock."
-#~ msgstr "El sistema espera los productos solicitados en stock."
-
-#~ msgid "Serivce Stockable Order"
-#~ msgstr "Orden servicio almacenable"
-
-#~ msgid "From minimum stock rules, it goes for procure product."
-#~ msgstr "Desde reglas de stock mínimo, va a abastecer el producto."
-
-#~ msgid "Production done"
-#~ msgstr "Producción realizada"
-
-#, python-format
-#~ msgid "Unit Product Price"
-#~ msgstr "Precio producto unidad"
-
-#~ msgid "References"
-#~ msgstr "Referencias"
-
-#~ msgid "Machine"
-#~ msgstr "Fabricación"
-
-#~ msgid "Workcenter Name"
-#~ msgstr "Nombre centro de producción"
-
-#~ msgid "min"
-#~ msgstr "mín"
-
-#~ msgid ""
-#~ "Description of the workcenter. Explain here what's a cycle according to this "
-#~ "workcenter."
-#~ msgstr ""
-#~ "Descripción del centro de producción. Describa aquí que es un ciclo según "
-#~ "este centro de producción."
-
-#~ msgid "Human Resource"
-#~ msgstr "Recurso humano"
-
-#~ msgid "Workcenters"
-#~ msgstr "Centros de producción"
-
-#~ msgid "on order"
-#~ msgstr "bajo pedido"
-
-#~ msgid "Compute All Schedulers"
-#~ msgstr "Calcular todas las planificaciones"
-
-#~ msgid "Create Procurement"
-#~ msgstr "Crear abastecimiento"
-
-#, python-format
-#~ msgid "Product uom"
-#~ msgstr "UdM producto"
-
-#~ msgid "Number of Cycle"
-#~ msgstr "Número de ciclos"
-
-#~ msgid "Run procurement"
-#~ msgstr "Ejecutar abastecimiento"
-
-#~ msgid ""
-#~ "This is the time frame analysed by the scheduler when computing "
-#~ "procurements. All procurement that are not between today and today+range are "
-#~ "skipped for futur computation."
-#~ msgstr ""
-#~ "Éste es el intervalo temporal analizado por el planificador al calcular "
-#~ "abastecimientos. Todos los abastecimientos que no estén entre hoy y "
-#~ "hoy+intervalo son omitidos para el cálculos futuros."
-
-#~ msgid "Time Efficiency"
-#~ msgstr "Eficiencia temporal"
-
-#~ msgid "Scheduler Parameters"
-#~ msgstr "Parámetros del planificador"
-
-#~ msgid "A cycle is defined in the workcenter definition."
-#~ msgstr "En la definición de un centro de producción se define un ciclo."
-
-#~ msgid "Unit of Measure"
-#~ msgstr "Unidad de medida"
-
-#~ msgid "Procurement Method"
-#~ msgstr "Método abastecimiento"
-
-#~ msgid "Compute Procurements"
-#~ msgstr "Calcular abastecimientos"
-
-#~ msgid "Wait for available products for reservation"
-#~ msgstr "Esperar productos disponibles para reservarlos"
-
-#~ msgid "Validate"
-#~ msgstr "Validar"
-
-#~ msgid "Procurement Purchase"
-#~ msgstr "Compra de abastecimiento"
-
-#~ msgid "Number of products to produce"
-#~ msgstr "Número de productos a producir"
-
-#~ msgid "Material routing"
-#~ msgstr "Procesos productivos del material"
-
-#~ msgid "Minimum stock rule"
-#~ msgstr "Regla de stock mínimo"
-
-#~ msgid "Product Efficiency"
-#~ msgstr "Eficiencia del producto"
-
-#~ msgid "Orderpoint minimum rule"
-#~ msgstr "Regla mínima generación orden"
-
-#~ msgid "Service Make to Stock"
-#~ msgstr "Servicio obtener para stock"
-
-#~ msgid "Sale Ref"
-#~ msgstr "Ref. venta"
-
-#~ msgid "Location"
-#~ msgstr "Ubicación"
-
-#~ msgid "New Procurement"
-#~ msgstr "Nuevo abastecimiento"
-
-#~ msgid "Tool"
-#~ msgstr "Maquinaria"
-
-#~ msgid ""
-#~ "Location where the system will look for products used in raw materials."
-#~ msgstr ""
-#~ "Ubicación donde el sistema buscará productos utilizados en las materias "
-#~ "primas."
-
-#~ msgid "Planned Date"
-#~ msgstr "Fecha prevista"
-
-#~ msgid "Procurement orders"
-#~ msgstr "Órdenes de abastecimiento"
-
-#~ msgid "If product type is service and procure method is Make to order"
-#~ msgstr ""
-#~ "si el tipo de producto es servicio y el método de abastecimiento es obtener "
-#~ "bajo pedido"
-
-#~ msgid "Scheduler Range"
-#~ msgstr "Margen planificador"
-
-#~ msgid "Max Quantity"
-#~ msgstr "Cantidad máx"
-
-#~ msgid "Minimum Stock Procure"
-#~ msgstr "Abastecer stock mínimo"
-
-#~ msgid "This is the leads/security time for each purchase order."
-#~ msgstr "Éste es el plazo/seguridad de tiempo para cada orden de compra."
-
-#~ msgid "alphabetical indices"
-#~ msgstr "índices alfabéticos"
-
-#~ msgid "Procurement for raw materials."
-#~ msgstr "Abastecimiento para materia primas."
-
-#~ msgid "Note"
-#~ msgstr "Nota"
-
-#~ msgid "Procure Stockable Product"
-#~ msgstr "Abastecimiento producto almacenable"
-
-#~ msgid "Paid ?"
-#~ msgstr "¿Pagado?"
-
-#~ msgid "Define a routing to describe the manufacturing steps."
-#~ msgstr ""
-#~ "Definir un proceso productivo para describir los pasos de fabricación"
-
-#~ msgid "Define the product structure, with sub-products and/or components."
-#~ msgstr ""
-#~ "Definir la estructura del producto, con subproductos y/o componentes."
-
-#~ msgid ""
-#~ "Procurement is created if the product quantity is lower than the minimum "
-#~ "limit."
-#~ msgstr ""
-#~ "Se crea el abastecimiento si la cantidad de producto es menor que el límite "
-#~ "mínimo."
-
-#~ msgid "Date Closed"
-#~ msgstr "Fecha de cierre"
-
-#~ msgid "Properties composition"
-#~ msgstr "Composición de propiedades"
-
-#~ msgid "Production Orders Waiting Products"
-#~ msgstr "Órdenes de producción esperando productos"
-
-#~ msgid "Change Product Qty."
-#~ msgstr "Cambiar Ctd. producto"
-
-#~ msgid "The procurement quantity will by rounded up to this multiple."
-#~ msgstr "La cantidad abastecida será redondeada hacia arriba a este múltiplo."
-
-#~ msgid "Reordering Mode"
-#~ msgstr "Modo de pedir de nuevo"
-
-#~ msgid ""
-#~ "The Object name must start with x_ and not contain any special character !"
-#~ msgstr ""
-#~ "¡El nombre del objeto debe empezar con x_ y no contener ningún carácter "
-#~ "especial!"
-
-#~ msgid "Central document to procure products"
-#~ msgstr "Documento central para abastecer productos"
-
-#~ msgid "Production Orders in Progress"
-#~ msgstr "Órdenes de producción en proceso"
-
-#~ msgid "Minimum Stock Rules"
-#~ msgstr "Reglas de stock mínimo"
-
-#~ msgid ""
-#~ "Reference of the document that created this procurement.\n"
-#~ "This is automatically completed by Open ERP."
-#~ msgstr ""
-#~ "Referencia del documento que ha creado este abastecimiento.\n"
-#~ "Éste es completado automáticamente por OpenERP."
-
-#~ msgid "Product type is Stockable and procure method is make to stock"
-#~ msgstr ""
-#~ "Tipo de producto es almacenable y método de abastecimiento es obtener para "
-#~ "stock"
-
-#~ msgid "Product UoM"
-#~ msgstr "UdM del producto"
-
-#~ msgid "Workcenter"
-#~ msgstr "Centro de producción"
-
-#~ msgid "Purchase Order"
-#~ msgstr "Orden de compra"
-
-#~ msgid ""
-#~ "If you encode manually a procurement, you probably want to use a make to "
-#~ "order method."
-#~ msgstr ""
-#~ "Si codifica manualmente un abastecimiento, probablemente desea usar un "
-#~ "método obtener bajo pedido."
-
-#~ msgid "Stockable Order Request"
-#~ msgstr "Solicitud orden almacenable"
-
-#~ msgid "numeric indices"
-#~ msgstr "índices numéricos"
-
-#~ msgid "If Procure method is Make to order and supply method is buy"
-#~ msgstr ""
-#~ "si método de abastecimiento es obtener bajo pedido y método de suministro es "
-#~ "comprar"
-
-#~ msgid "if Product type is Stockable in procurement order"
-#~ msgstr "si el tipo de producto es almacenable en orden de abastecimiento"
-
-#~ msgid "Bill of material revisions"
-#~ msgstr "Revisiones lista de material"
-
-#~ msgid "Planification"
-#~ msgstr "Planificación"
-
-#~ msgid ""
-#~ "Use a phantom bill of material in raw materials lines that have to be "
-#~ "automatically computed in on eproduction order and not one per level.If you "
-#~ "put \"Phantom/Set\" at the root level of a bill of material it is considered "
-#~ "as a set or pack: the products are replaced by the components between the "
-#~ "sale order to the picking without going through the production order.The "
-#~ "normal BoM will generate one production order per BoM level."
-#~ msgstr ""
-#~ "Utilice una lista de materiales fantasma en líneas de materias primas que se "
-#~ "deban calcular automáticamente en una orden de producción y no una por "
-#~ "nivel. Si indica \"Fantasma/Conjunto\" en el nivel raíz de una lista de "
-#~ "materiales es considerada como un conjunto o paquete: Los productos se "
-#~ "reemplazan por los componentes entre el pedido de venta y el empaquetado sin "
-#~ "generar la orden de producción. La LdM normal generará una orden de "
-#~ "producción por nivel de LdM."
-
-#, python-format
-#~ msgid "No address defined for the supplier"
-#~ msgstr "No se ha definido dirección para el proveedor"
-
-#~ msgid "Your procurement request has been sent !"
-#~ msgstr "¡Su petición de abastecimiento ha sido enviada!"
-
-#~ msgid "Internal Procurement Request"
-#~ msgstr "Solicitud de abastecimiento interna"
-
-#~ msgid "Property Categories"
-#~ msgstr "Categorías de propiedades"
-
-#~ msgid "Compute Procurements Only"
-#~ msgstr "Calcular sólo abastecimientos"
-
-#~ msgid "Temporary Procurement Exceptions"
-#~ msgstr "Excepciones de abastecimiento temporales"
-
-#~ msgid "Confirmed"
-#~ msgstr "Confirmada"
-
-#~ msgid "Parameters"
-#~ msgstr "Parámetros"
-
-#~ msgid "Production workcenters used"
-#~ msgstr "Centros de producción utilizados"
-
-#~ msgid "Workcenters Utilisation"
-#~ msgstr "Utilización del centro de producción"
-
-#~ msgid ""
-#~ "Efficiency on the production. A factor of 0.9 means a loss of 10% in the "
-#~ "production."
-#~ msgstr ""
-#~ "Eficiencia en la producción. Un factor de 0.9 significa una pérdida del 10% "
-#~ "en la producción."
-
-#~ msgid "If procurement is make to order"
-#~ msgstr "si abastecimiento es obtener bajo pedido"
-
-#~ msgid "Minimum Stock Rule"
-#~ msgstr "Regla de stock mínimo"
-
-#~ msgid "New Bill of Materials"
-#~ msgstr "Nueva lista de materiales"
-
-#, python-format
-#~ msgid "Product quantity"
-#~ msgstr "Cantidad producto"
-
-#~ msgid "Property"
-#~ msgstr "Propiedad"
-
-#~ msgid "Canceled"
-#~ msgstr "Cancelado"
-
-#~ msgid "plus"
-#~ msgstr "más"
-
-#~ msgid "Stockable Product Process"
-#~ msgstr "Proceso producto almacenable"
-
-#~ msgid "New Production Order"
-#~ msgstr "Nueva orden de producción"
-
-#~ msgid "A Request for Quotation is created and sent to the supplier."
-#~ msgstr "Una solicitud de presupuesto es creada y enviada al proveedor."
-
-#~ msgid "Retry"
-#~ msgstr "Volver a intentar"
-
-#~ msgid "When any procuere products, it comes into the prpcurement orders"
-#~ msgstr ""
-#~ "Cuando alguien abastece productos, se convierte en las órdenes de "
-#~ "abastecimiento"
-
-#~ msgid "Production Orders To Start"
-#~ msgstr "Órdenes de producción a iniciar"
-
-#~ msgid "Procurement Reason"
-#~ msgstr "Motivo del abastecimiento"
-
-#~ msgid "An entry is being made from billing material to routing."
-#~ msgstr "Se crea una entrada desde material facturable a proceso productivo."
-
-#~ msgid "The normal working time of the workcenter."
-#~ msgstr "El horario de trabajo normal del centro de producción."
-
-#~ msgid "Order to Max"
-#~ msgstr "Ordenar el máximo"
-
-#~ msgid "In procurement order, if product type is service"
-#~ msgstr "En orden de abastecimiento, si tipo de producto es servicio"
-
-#~ msgid "from stock"
-#~ msgstr "desde stock"
-
-#~ msgid "Close"
-#~ msgstr "Cerrar"
-
-#, python-format
-#~ msgid "TOTAL"
-#~ msgstr "TOTAL"
-
-#~ msgid "Sale Name"
-#~ msgstr "Nombre venta"
-
-#, python-format
-#~ msgid "Product supplier"
-#~ msgstr "Proveedor producto"
-
-#~ msgid "Create minimum stock rules"
-#~ msgstr "Crear reglas de stock mínimo"
-
-#~ msgid "Warehouse"
-#~ msgstr "Almacén"
-
-#~ msgid "Service Product"
-#~ msgstr "Producto servicio"
-
-#~ msgid "Close Move at end"
-#~ msgstr "Movimiento de cierre al final"
-
-#~ msgid "Running"
-#~ msgstr "En proceso"
-
-#~ msgid "Unscheduled procurements"
-#~ msgstr "Abastecimientos no planificados"
-
-#~ msgid "Bill of Material Structure"
-#~ msgstr "Despiece de la lista de materiales"
-
-#~ msgid "Workcenter load"
-#~ msgstr "Carga del centro de producción"
-
-#~ msgid "Procurement Details"
-#~ msgstr "Detalles de abastecimiento"
-
-#~ msgid "You can see its bill of material which are used to make product"
-#~ msgstr ""
-#~ "Puede ver su lista de material que se utiliza para fabricar el producto"
-
-#~ msgid "Bill of Materials Components"
-#~ msgstr "Componentes de la lista de materiales"
-
-#, python-format
-#~ msgid "Warning !"
-#~ msgstr "¡Aviso!"
-
-#, python-format
-#~ msgid ""
-#~ "The production is in \"%s\" state. You can not change the production "
-#~ "quantity anymore"
-#~ msgstr ""
-#~ "La producción está en estado \"%s\". Ya no puede cambiar la cantidad a "
-#~ "producir."
-
-#~ msgid "Production Workcenters"
-#~ msgstr "Centros de producción"
-
-#~ msgid "Invalid model name in the action definition."
-#~ msgstr "Nombre de modelo no válido en la definición de acción."
-
-#~ msgid ""
-#~ "The list of operations (list of workcenters) to produce the finished "
-#~ "product. The routing is mainly used to compute workcenter costs during "
-#~ "operations and to plan futur loads on workcenters based on production "
-#~ "plannification."
-#~ msgstr ""
-#~ "La lista de operaciones (lista de centros de producción) para producir el "
-#~ "producto terminado. La ruta se utiliza principalmente para calcular los "
-#~ "costes de los centros de producción durante la fabricación y para prever "
-#~ "futuras cargas de los centros de producción a partir de la planificación de "
-#~ "la producción."
-
-#~ msgid "Workcenter Usage"
-#~ msgstr "Uso centro de producción"
-
-#~ msgid ""
-#~ "Routing indicates all the workcenters used, for how long and/or cycles.If "
-#~ "Routing is indicated then,the third tab of a production order (workcenters) "
-#~ "will be automatically pre-completed."
-#~ msgstr ""
-#~ "La ruta indica todos los centros de producción utilizados, por cuánto tiempo "
-#~ "y/o ciclos. Si se indica la ruta, entonces la tercera pestaña de una orden "
-#~ "de producción (centros de producción) será automáticamente pre-completada."
-
-#~ msgid ""
-#~ "Number of operations this work center can do in parallel. If this work "
-#~ "center represents a team of 5 workers, the capacity per cycle is 5."
-#~ msgstr ""
-#~ "El número de operaciones de este centro de trabajo se puede hacer en "
-#~ "paralelo. Si este centro de trabajo representa un equipo del 5 trabajadores, "
-#~ "la capacidad por ciclo es de 5."
-
-#~ msgid ""
-#~ "Description of the work center. Explain here what's a cycle according to "
-#~ "this work center."
-#~ msgstr ""
-#~ "Descripción del centro de trabajo. Explique aquí lo que es un ciclo de "
-#~ "acuerdo con este centro de trabajo."
-
-#~ msgid "Specify Cost of Work center per cycle."
-#~ msgstr "Especificar costes del centro de trabajo por ciclo."
-
-#~ msgid ""
-#~ "\n"
-#~ " This is the base module to manage the manufacturing process in OpenERP.\n"
-#~ "\n"
-#~ " Features:\n"
-#~ " * Make to Stock / Make to Order (by line)\n"
-#~ " * Multi-level BoMs, no limit\n"
-#~ " * Multi-level routing, no limit\n"
-#~ " * Routing and work center integrated with analytic accounting\n"
-#~ " * Scheduler computation periodically / Just In Time module\n"
-#~ " * Multi-pos, multi-warehouse\n"
-#~ " * Different reordering policies\n"
-#~ " * Cost method by product: standard price, average price\n"
-#~ " * Easy analysis of troubles or needs\n"
-#~ " * Very flexible\n"
-#~ " * Allows to browse Bill of Materials in complete structure\n"
-#~ " that include child and phantom BoMs\n"
-#~ " It supports complete integration and planification of stockable goods,\n"
-#~ " consumable of services. Services are completely integrated with the "
-#~ "rest\n"
-#~ " of the software. For instance, you can set up a sub-contracting service\n"
-#~ " in a BoM to automatically purchase on order the assembly of your "
-#~ "production.\n"
-#~ "\n"
-#~ " Reports provided by this module:\n"
-#~ " * Bill of Material structure and components\n"
-#~ " * Load forecast on workcenters\n"
-#~ " * Print a production order\n"
-#~ " * Stock forecasts\n"
-#~ " Dashboard provided by this module::\n"
-#~ " * List of next production orders\n"
-#~ " * List of deliveries (out picking)\n"
-#~ " * Graph of work center load\n"
-#~ " * List of procurement in exception\n"
-#~ " "
-#~ msgstr ""
-#~ "\n"
-#~ " Este es el módulo base para gestionar los procesos de fabricación en "
-#~ "OpenERP.\n"
-#~ "\n"
-#~ " Características:\n"
-#~ " *Obtener para stock / Obtener bajo pedido (por línea)\n"
-#~ " *BoMs multi-niveles, sin límite\n"
-#~ " *Ubicaciones multi-nivel, sin límite\n"
-#~ " *Ubicaciones y centros de trabajo integrados con la contabilidad "
-#~ "analítica\n"
-#~ " *Ejecución periódica del cálculo de la planificación / Módulo 'Just In "
-#~ "Time'\n"
-#~ " *Multi-pv, multi-almacén\n"
-#~ " *Diferentes políticas de pedido\n"
-#~ " *Método de coste por producto: precio estándar, precio medio\n"
-#~ " *Fácil análisis de problemas o necesidades\n"
-#~ " *Muy flexible\n"
-#~ " *Permite inspeccionar la estructura completa de Facturas de Materiales\n"
-#~ " que incluyen BoMs hijas y fantasmas\n"
-#~ " Soporta integración y planificación de mercancías almacenables,\n"
-#~ " y consumo de servicios. Los servicios se integran completamente con el "
-#~ "resto\n"
-#~ " de la aplicación. Por ejemplo, se puede establecer una servicio de "
-#~ "subcontratación\n"
-#~ " en una BoM para encargar automáticamente el montaje de su producción.\n"
-#~ "\n"
-#~ " Los informes que facilita este módulo:\n"
-#~ " *Componentes y estructura de la BoMs\n"
-#~ " *Previsión de carga de los centros de trabajo\n"
-#~ " *Previsión de almacén\n"
-#~ " Tableros proporcionados en este módulo:\n"
-#~ " *Lista de órdenes de producción próximas\n"
-#~ " *Lista de entregas\n"
-#~ " *Gráfico de carga del centro de trabajo\n"
-#~ " *Lista de órdenes de fabricación con excepciones\n"
-#~ " "
+msgstr ""
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index f3da234463c..2af1e876c70 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -701,11 +701,6 @@
<field name="prodlot_id" context="{'product_id': product_id}" groups="stock.group_production_lot"/>
<field name="state" invisible="1"/>
<field name="scrapped" invisible="1"/>
- <button
- name="%(stock.move_scrap)d"
- string="Scrap Products" type="action"
- icon="terp-gtk-jump-to-ltr"
- states="done,cancel"/>
</tree>
</field>
</group>
@@ -724,10 +719,6 @@
string="Partial"
type="action" states="confirmed,assigned"
icon="gtk-justify-fill"/>
- <button name="%(stock.move_scrap)d"
- string="Scrap Products" type="action"
- icon="terp-gtk-jump-to-ltr" context="{'scrap': True}"
- states="draft,waiting,confirmed,assigned"/>
</tree>
</field>
</group>
diff --git a/addons/mrp_repair/i18n/lv.po b/addons/mrp_repair/i18n/lv.po
new file mode 100644
index 00000000000..2e4e1148cf5
--- /dev/null
+++ b/addons/mrp_repair/i18n/lv.po
@@ -0,0 +1,819 @@
+# Latvian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-24 11:43+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Latvian <lv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-25 04:38+0000\n"
+"X-Generator: Launchpad (build 16540)\n"
+
+#. module: mrp_repair
+#: field:mrp.repair.line,move_id:0
+msgid "Inventory Move"
+msgstr ""
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Group By..."
+msgstr "Grupēt pēc..."
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Recreate Invoice"
+msgstr "Pārveidot rēķinu"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:371
+#, python-format
+msgid "You have to select a Partner Invoice Address in the repair form !"
+msgstr "Labojumu formā Jums ir jānorāda partnera rēķina adrese!"
+
+#. module: mrp_repair
+#: model:ir.actions.act_window,name:mrp_repair.action_cancel_repair
+#: view:mrp.repair.cancel:0
+msgid "Cancel Repair Order"
+msgstr "Atcelt labojumu orderi"
+
+#. module: mrp_repair
+#: field:mrp.repair.fee,to_invoice:0
+#: field:mrp.repair.line,to_invoice:0
+msgid "To Invoice"
+msgstr ""
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Unit of Measure"
+msgstr "Mērvienība"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Printing Date"
+msgstr "Drukāšanas datums"
+
+#. module: mrp_repair
+#: field:mrp.repair.make_invoice,group:0
+msgid "Group by partner invoice address"
+msgstr "Grupēt pēc partnera rēķina adreses"
+
+#. module: mrp_repair
+#: field:mrp.repair,message_unread:0
+msgid "Unread Messages"
+msgstr "Neizlasītie ziņojumi"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:435
+#, python-format
+msgid "No product defined on Fees!"
+msgstr "Maksājumam nav nodefinēts produkts!"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+#: field:mrp.repair,company_id:0
+msgid "Company"
+msgstr "Uzņēmums"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Set to Draft"
+msgstr "Atzīmēt kā melnrakstu"
+
+#. module: mrp_repair
+#: selection:mrp.repair,state:0
+msgid "Invoice Exception"
+msgstr "Rēķina izņēmums"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Serial Number"
+msgstr "Sērijas numurs"
+
+#. module: mrp_repair
+#: field:mrp.repair,address_id:0
+msgid "Delivery Address"
+msgstr "Piegādes adrese"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "History"
+msgstr "Vēsture"
+
+#. module: mrp_repair
+#: field:mrp.repair.fee,price_subtotal:0
+#: field:mrp.repair.line,price_subtotal:0
+msgid "Subtotal"
+msgstr "Kopā"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Invoice address :"
+msgstr "Rēķina adrese:"
+
+#. module: mrp_repair
+#: help:mrp.repair,partner_id:0
+msgid "Choose partner for whom the order will be invoiced and delivered."
+msgstr ""
+"Izvēlieties partneri kuram pēc ordera tiks izveidots rēķins un piegādāts."
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Guarantee limit"
+msgstr "Garantijas limits"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Notes"
+msgstr "Piezīmes"
+
+#. module: mrp_repair
+#: field:mrp.repair,message_ids:0
+msgid "Messages"
+msgstr "Ziņojumi"
+
+#. module: mrp_repair
+#: field:mrp.repair,amount_tax:0
+#: field:mrp.repair.fee,tax_id:0
+#: field:mrp.repair.line,tax_id:0
+msgid "Taxes"
+msgstr "Nodokļi"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:385
+#: code:addons/mrp_repair/mrp_repair.py:413
+#: code:addons/mrp_repair/mrp_repair.py:442
+#, python-format
+msgid "Error!"
+msgstr "Kļūda!"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Net Total :"
+msgstr "Neto kopā:"
+
+#. module: mrp_repair
+#: selection:mrp.repair,state:0
+#: selection:mrp.repair.line,state:0
+msgid "Cancelled"
+msgstr "Atcelts"
+
+#. module: mrp_repair
+#: help:mrp.repair,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Operations"
+msgstr "Operācijas"
+
+#. module: mrp_repair
+#: model:ir.actions.act_window,help:mrp_repair.action_repair_order_tree
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a reparation order. \n"
+" </p><p>\n"
+" In a repair order, you can detail the components you "
+"remove,\n"
+" add or replace and record the time you spent on the "
+"different\n"
+" operations.\n"
+" </p><p>\n"
+" The repair order uses the warranty date on the Serial Number "
+"in\n"
+" order to know if whether the repair should be invoiced to "
+"the\n"
+" customer or not.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: mrp_repair
+#: help:mrp.repair.line,state:0
+msgid ""
+" * The 'Draft' status is set automatically as draft when repair order in "
+"draft status. \n"
+"* The 'Confirmed' status is set automatically as confirm when repair order "
+"in confirm status. \n"
+"* The 'Done' status is set automatically when repair order is completed. "
+" \n"
+"* The 'Cancelled' status is set automatically when user cancel repair order."
+msgstr ""
+
+#. module: mrp_repair
+#: field:mrp.repair,move_id:0
+msgid "Move"
+msgstr "Kustība"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Tax"
+msgstr "Nodoklis"
+
+#. module: mrp_repair
+#: model:ir.actions.act_window,name:mrp_repair.action_repair_order_tree
+#: model:ir.ui.menu,name:mrp_repair.menu_repair_order
+msgid "Repair Orders"
+msgstr "Labojumu orderi"
+
+#. module: mrp_repair
+#: model:ir.actions.report.xml,name:mrp_repair.report_mrp_repair
+msgid "Quotation / Order"
+msgstr "Piedāvājums / Orderis"
+
+#. module: mrp_repair
+#: help:mrp.repair,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Extra Info"
+msgstr "Papildus informācija"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:336
+#: code:addons/mrp_repair/mrp_repair.py:349
+#: code:addons/mrp_repair/mrp_repair.py:435
+#: code:addons/mrp_repair/wizard/cancel_repair.py:49
+#, python-format
+msgid "Warning!"
+msgstr "Brīdinājums!"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "(update)"
+msgstr "(atjaunināt)"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+#: field:mrp.repair,partner_id:0
+msgid "Partner"
+msgstr "Partneris"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:385
+#, python-format
+msgid "No account defined for partner \"%s\"."
+msgstr "Nav nodefinēt konts partnerim \"%s\"."
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+#: selection:mrp.repair,state:0
+#: selection:mrp.repair.line,state:0
+msgid "Confirmed"
+msgstr "Apstiprināts"
+
+#. module: mrp_repair
+#: help:mrp.repair,state:0
+msgid ""
+" * The 'Draft' status is used when a user is encoding a new and unconfirmed "
+"repair order. \n"
+"* The 'Confirmed' status is used when a user confirms the repair order. "
+" \n"
+"* The 'Ready to Repair' status is used to start to repairing, user can start "
+"repairing only after repair order is confirmed. \n"
+"* The 'To be Invoiced' status is used to generate the invoice before or "
+"after repairing done. \n"
+"* The 'Done' status is set when repairing is completed. \n"
+"* The 'Cancelled' status is used when user cancel repair order."
+msgstr ""
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Repairs order"
+msgstr "Labojumu orderis"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:336
+#, python-format
+msgid "Serial number is required for operation line with product '%s'"
+msgstr "Sērijas numurs ir obligāts operācijas rindai ar produktu '%s'"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Repair Order N° :"
+msgstr "Labojumu orderis Nr. :"
+
+#. module: mrp_repair
+#: field:mrp.repair,prodlot_id:0
+#: field:mrp.repair.line,prodlot_id:0
+#: report:repair.order:0
+msgid "Lot Number"
+msgstr "Partijas numurs"
+
+#. module: mrp_repair
+#: field:mrp.repair,message_follower_ids:0
+msgid "Followers"
+msgstr "Sekotāji"
+
+#. module: mrp_repair
+#: field:mrp.repair,fees_lines:0
+msgid "Fees Lines"
+msgstr ""
+
+#. module: mrp_repair
+#: field:mrp.repair.line,type:0
+msgid "Type"
+msgstr "Veids"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Fees Line(s)"
+msgstr "Maksājumu rinda(s)"
+
+#. module: mrp_repair
+#: selection:mrp.repair,state:0
+msgid "To be Invoiced"
+msgstr "Tiks izrakstīts rēķins"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Shipping address :"
+msgstr "Piegādes adrese:"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Total :"
+msgstr "Kopā:"
+
+#. module: mrp_repair
+#: view:mrp.repair.cancel:0
+msgid ""
+"This operation will cancel the Repair process, but will not cancel it's "
+"Invoice. Do you want to continue?"
+msgstr ""
+"Šī darbība atcels labojumu procesu, bet neatcels tā rēķinu. Vai vēlaties "
+"turpināt?"
+
+#. module: mrp_repair
+#: field:mrp.repair,pricelist_id:0
+msgid "Pricelist"
+msgstr "Cenrādis"
+
+#. module: mrp_repair
+#: field:mrp.repair,quotation_notes:0
+msgid "Quotation Notes"
+msgstr "Piedāvājuma piezīmes"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+#: field:mrp.repair,state:0
+#: field:mrp.repair.line,state:0
+msgid "Status"
+msgstr "Statuss"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Search Reair Orders"
+msgstr "Meklēt labojumu orderus"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "(Add)"
+msgstr "(Pievienot)"
+
+#. module: mrp_repair
+#: model:ir.model,name:mrp_repair.model_mrp_repair_line
+#: view:mrp.repair:0
+msgid "Repair Line"
+msgstr "Labojumu rinda"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "N° :"
+msgstr "Nr. :"
+
+#. module: mrp_repair
+#: field:mrp.repair,invoice_method:0
+msgid "Invoice Method"
+msgstr "Rēķina metode"
+
+#. module: mrp_repair
+#: field:mrp.repair,repaired:0
+#: selection:mrp.repair,state:0
+msgid "Repaired"
+msgstr "Izlabots"
+
+#. module: mrp_repair
+#: field:mrp.repair.fee,invoice_line_id:0
+#: field:mrp.repair.line,invoice_line_id:0
+msgid "Invoice Line"
+msgstr "Rēķina rinda"
+
+#. module: mrp_repair
+#: selection:mrp.repair,invoice_method:0
+msgid "Before Repair"
+msgstr "Pirms labojumiem"
+
+#. module: mrp_repair
+#: field:mrp.repair,location_id:0
+msgid "Current Location"
+msgstr "Pašreizējā atrašanās vieta"
+
+#. module: mrp_repair
+#: view:mrp.repair.cancel:0
+msgid "Yes"
+msgstr "Jā"
+
+#. module: mrp_repair
+#: view:mrp.repair.cancel:0
+#: view:mrp.repair.make_invoice:0
+msgid "or"
+msgstr "vai"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+#: field:mrp.repair,invoiced:0
+#: field:mrp.repair.fee,invoiced:0
+#: field:mrp.repair.line,invoiced:0
+msgid "Invoiced"
+msgstr "Rēķins izrakstīts"
+
+#. module: mrp_repair
+#: field:mrp.repair.fee,product_uom:0
+#: field:mrp.repair.line,product_uom:0
+msgid "Product Unit of Measure"
+msgstr "Produkta mērvienība"
+
+#. module: mrp_repair
+#: view:mrp.repair.make_invoice:0
+msgid "Create invoices"
+msgstr "Izveidot rēķinus"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "(Remove)"
+msgstr "(Noņemt)"
+
+#. module: mrp_repair
+#: selection:mrp.repair.line,type:0
+msgid "Add"
+msgstr "Pievienot"
+
+#. module: mrp_repair
+#: selection:mrp.repair.line,state:0
+msgid "Draft"
+msgstr "Melnraksts"
+
+#. module: mrp_repair
+#: field:mrp.repair,name:0
+msgid "Repair Reference"
+msgstr "Labojuma atsauce"
+
+#. module: mrp_repair
+#: model:ir.model,name:mrp_repair.model_mrp_repair
+#: view:mrp.repair:0
+msgid "Repair Order"
+msgstr "Labojumu orderis"
+
+#. module: mrp_repair
+#: selection:mrp.repair,state:0
+msgid "Under Repair"
+msgstr ""
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Ready To Repair"
+msgstr "Gatavs labojumiem"
+
+#. module: mrp_repair
+#: field:mrp.repair,amount_untaxed:0
+msgid "Untaxed Amount"
+msgstr "Summa bez nodokļa"
+
+#. module: mrp_repair
+#: help:mrp.repair,invoice_method:0
+msgid ""
+"Selecting 'Before Repair' or 'After Repair' will allow you to generate "
+"invoice before or after the repair is done respectively. 'No invoice' means "
+"you don't want to generate invoice for this repair order."
+msgstr ""
+
+#. module: mrp_repair
+#: field:mrp.repair,guarantee_limit:0
+msgid "Warranty Expiration"
+msgstr "Garantijas termiņš"
+
+#. module: mrp_repair
+#: help:mrp.repair,pricelist_id:0
+msgid "Pricelist of the selected partner."
+msgstr "Atzīmētā partnera cenrādis."
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Guarantee Limit"
+msgstr "Garantijas limits"
+
+#. module: mrp_repair
+#: field:mrp.repair,default_address_id:0
+msgid "unknown"
+msgstr "nezināms"
+
+#. module: mrp_repair
+#: field:mrp.repair,product_id:0
+#: report:repair.order:0
+msgid "Product to Repair"
+msgstr "Produkts labojumam"
+
+#. module: mrp_repair
+#: selection:mrp.repair,invoice_method:0
+msgid "After Repair"
+msgstr "Pēc labojuma"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/wizard/cancel_repair.py:41
+#, python-format
+msgid "Active ID not Found"
+msgstr "Aktīvs ID nav atrasts"
+
+#. module: mrp_repair
+#: field:mrp.repair,message_is_follower:0
+msgid "Is a Follower"
+msgstr "Ir sekotājs"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Date"
+msgstr "Datums"
+
+#. module: mrp_repair
+#: model:ir.model,name:mrp_repair.model_mrp_repair_fee
+msgid "Repair Fees Line"
+msgstr "Labojuma maksājumu rinda"
+
+#. module: mrp_repair
+#: selection:mrp.repair,state:0
+msgid "Quotation"
+msgstr ""
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Confirm Repair"
+msgstr "Apstiprināt labojumu"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Repair Quotation"
+msgstr "Labojuma piedāvājums"
+
+#. module: mrp_repair
+#: field:mrp.repair,message_summary:0
+msgid "Summary"
+msgstr "Kopsavilkums"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "End Repair"
+msgstr "Beigt labojumu"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:413
+#: code:addons/mrp_repair/mrp_repair.py:442
+#, python-format
+msgid "No account defined for product \"%s\"."
+msgstr "Produktam \"%s\" nav nodefinēts konts."
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Quotations"
+msgstr "Piedāvājumi"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+#: field:mrp.repair.fee,product_uom_qty:0
+#: field:mrp.repair.line,product_uom_qty:0
+#: report:repair.order:0
+msgid "Quantity"
+msgstr "Daudzums"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Product Information"
+msgstr "Produkta informācija"
+
+#. module: mrp_repair
+#: model:ir.actions.act_window,name:mrp_repair.act_mrp_repair_invoice
+#: model:ir.model,name:mrp_repair.model_mrp_repair_make_invoice
+#: view:mrp.repair:0
+msgid "Make Invoice"
+msgstr "Veidot rēķinu"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Start Repair"
+msgstr "Sākt labojumu"
+
+#. module: mrp_repair
+#: field:mrp.repair.fee,price_unit:0
+#: field:mrp.repair.line,price_unit:0
+#: report:repair.order:0
+msgid "Unit Price"
+msgstr "Vienības cena"
+
+#. module: mrp_repair
+#: selection:mrp.repair.line,state:0
+msgid "Done"
+msgstr "Pabeigts"
+
+#. module: mrp_repair
+#: field:mrp.repair,invoice_id:0
+msgid "Invoice"
+msgstr "Rēķins"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Fees"
+msgstr "Maksājumi"
+
+#. module: mrp_repair
+#: view:mrp.repair.cancel:0
+#: view:mrp.repair.make_invoice:0
+msgid "Cancel"
+msgstr "Atcelt"
+
+#. module: mrp_repair
+#: field:mrp.repair.line,location_dest_id:0
+msgid "Dest. Location"
+msgstr "Piegādes vieta"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Operation Line(s)"
+msgstr "Operācijas rinda(s)"
+
+#. module: mrp_repair
+#: field:mrp.repair,location_dest_id:0
+msgid "Delivery Location"
+msgstr "Piegādes vieta"
+
+#. module: mrp_repair
+#: help:mrp.repair,deliver_bool:0
+msgid ""
+"Check this box if you want to manage the delivery once the product is "
+"repaired and create a picking with selected product. Note that you can "
+"select the locations in the Info tab, if you have the extended view."
+msgstr ""
+
+#. module: mrp_repair
+#: help:mrp.repair,guarantee_limit:0
+msgid ""
+"The warranty expiration limit is computed as: last move date + warranty "
+"defined on selected product. If the current date is below the warranty "
+"expiration limit, each operation and fee you will add will be set as 'not to "
+"invoiced' by default. Note that you can change manually afterwards."
+msgstr ""
+
+#. module: mrp_repair
+#: view:mrp.repair.make_invoice:0
+msgid "Create Invoice"
+msgstr "Izveidot rēķinu"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Reair Orders"
+msgstr "Labojumu orderi"
+
+#. module: mrp_repair
+#: field:mrp.repair.fee,name:0
+#: field:mrp.repair.line,name:0
+#: report:repair.order:0
+msgid "Description"
+msgstr "Apraksts"
+
+#. module: mrp_repair
+#: field:mrp.repair,operations:0
+msgid "Operation Lines"
+msgstr "Operāciju rindas"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+#: field:mrp.repair.fee,product_id:0
+#: field:mrp.repair.line,product_id:0
+msgid "Product"
+msgstr "Produkts"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Invoice Corrected"
+msgstr "Rēķins izlabots"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Price"
+msgstr "Cena"
+
+#. module: mrp_repair
+#: field:mrp.repair,deliver_bool:0
+msgid "Deliver"
+msgstr "Piegādāt"
+
+#. module: mrp_repair
+#: field:mrp.repair,internal_notes:0
+msgid "Internal Notes"
+msgstr "Iekšējās piezīmes"
+
+#. module: mrp_repair
+#: report:repair.order:0
+msgid "Taxes:"
+msgstr "Nodokļi:"
+
+#. module: mrp_repair
+#: view:mrp.repair.make_invoice:0
+msgid "Do you really want to create the invoice(s)?"
+msgstr "Vai Jūs tiešām vēlaties izveidot rēķinu(s)?"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:349
+#, python-format
+msgid "Repair order is already invoiced."
+msgstr "No labojumu ordera rēķins jau ir izveidots."
+
+#. module: mrp_repair
+#: field:mrp.repair,picking_id:0
+msgid "Picking"
+msgstr "Izsniegšana"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Untaxed amount"
+msgstr "Summa bez nodokļiem"
+
+#. module: mrp_repair
+#: field:mrp.repair.fee,repair_id:0
+#: field:mrp.repair.line,repair_id:0
+msgid "Repair Order Reference"
+msgstr "Labojumu ordera atsauce"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/wizard/cancel_repair.py:49
+#, python-format
+msgid "Repair order is not invoiced."
+msgstr "No labojumu ordera rēķins nav izveidots."
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Total amount"
+msgstr "Summa kopā"
+
+#. module: mrp_repair
+#: selection:mrp.repair.line,type:0
+msgid "Remove"
+msgstr "Izņemt"
+
+#. module: mrp_repair
+#: field:mrp.repair,partner_invoice_id:0
+msgid "Invoicing Address"
+msgstr "Rēķina adrese"
+
+#. module: mrp_repair
+#: help:mrp.repair,message_ids:0
+msgid "Messages and communication history"
+msgstr "Ziņojumu un komunikāciju vēsture"
+
+#. module: mrp_repair
+#: view:mrp.repair:0
+msgid "Invoicing"
+msgstr "Rēķina izrakstīšana"
+
+#. module: mrp_repair
+#: field:mrp.repair.line,location_id:0
+msgid "Source Location"
+msgstr "Resursa novietojums"
+
+#. module: mrp_repair
+#: model:ir.model,name:mrp_repair.model_mrp_repair_cancel
+#: view:mrp.repair:0
+msgid "Cancel Repair"
+msgstr "Atcelt labojumu"
+
+#. module: mrp_repair
+#: selection:mrp.repair,invoice_method:0
+msgid "No Invoice"
+msgstr "Nav rēķina"
+
+#. module: mrp_repair
+#: field:mrp.repair,amount_total:0
+msgid "Total"
+msgstr "Kopā"
+
+#. module: mrp_repair
+#: selection:mrp.repair,state:0
+msgid "Ready to Repair"
+msgstr "Gatavs labojumiem"
+
+#. module: mrp_repair
+#: code:addons/mrp_repair/mrp_repair.py:371
+#, python-format
+msgid "No partner !"
+msgstr "Nav partnera!"
diff --git a/addons/mrp_repair/test/test_mrp_repair_afterinv.yml b/addons/mrp_repair/test/test_mrp_repair_afterinv.yml
index 5ceb3f9b02b..eed121050b8 100644
--- a/addons/mrp_repair/test/test_mrp_repair_afterinv.yml
+++ b/addons/mrp_repair/test/test_mrp_repair_afterinv.yml
@@ -33,4 +33,4 @@
-
!python {model: mrp.repair}: |
repair_id = self.browse(cr, uid, [ref('mrp_repair_rmrp0')], context=context)[0]
- assert repair_id.invoice_id.id, _("No invoice exists for this repair order")
+ assert repair_id.invoice_id.id, "No invoice exists for this repair order"
diff --git a/addons/mrp_repair/test/test_mrp_repair_b4inv.yml b/addons/mrp_repair/test/test_mrp_repair_b4inv.yml
index 47e301cd0bd..83badf48be9 100644
--- a/addons/mrp_repair/test/test_mrp_repair_b4inv.yml
+++ b/addons/mrp_repair/test/test_mrp_repair_b4inv.yml
@@ -18,7 +18,7 @@
-
!python {model: mrp.repair}: |
repair_id = self.browse(cr, uid, [ref('mrp_repair_rmrp2')], context=context)[0]
- assert repair_id.invoice_id.id, _("No invoice exists for this repair order.")
+ assert repair_id.invoice_id.id, "No invoice exists for this repair order."
-
I start the Repairing process by clicking on "Start Repair" button.
-
diff --git a/addons/mrp_repair/test/test_mrp_repair_noneinv.yml b/addons/mrp_repair/test/test_mrp_repair_noneinv.yml
index 4334af01958..b8006d0d485 100644
--- a/addons/mrp_repair/test/test_mrp_repair_noneinv.yml
+++ b/addons/mrp_repair/test/test_mrp_repair_noneinv.yml
@@ -23,5 +23,5 @@
-
!python {model: mrp.repair}: |
repair_id = self.browse(cr, uid, [ref('mrp_repair_rmrp1')], context=context)[0]
- assert not repair_id.invoice_id.id, _("Invoice should not be exists for this repair order")
+ assert not repair_id.invoice_id.id, "Invoice should not be exists for this repair order"
diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py
index af5d7aa663c..7e8487b2b2b 100644
--- a/addons/point_of_sale/point_of_sale.py
+++ b/addons/point_of_sale/point_of_sale.py
@@ -89,7 +89,7 @@ class pos_config(osv.osv):
'sequence_id' : False,
}
d.update(default)
- return super(pos_order, self).copy(cr, uid, id, d, context=context)
+ return super(pos_config, self).copy(cr, uid, id, d, context=context)
def name_get(self, cr, uid, ids, context=None):
diff --git a/addons/point_of_sale/wizard/pos_box.py b/addons/point_of_sale/wizard/pos_box.py
index 14e653b915c..776d962a3a8 100644
--- a/addons/point_of_sale/wizard/pos_box.py
+++ b/addons/point_of_sale/wizard/pos_box.py
@@ -31,6 +31,10 @@ class PosBoxIn(PosBox):
_inherit = 'cash.box.in'
def _compute_values_for_statement_line(self, cr, uid, box, record, context=None):
+
+ if context is None:
+ context = {}
+
values = super(PosBoxIn, self)._compute_values_for_statement_line(cr, uid, box, record, context=context)
active_model = context.get('active_model', False) or False
diff --git a/addons/portal_anonymous/static/src/js/portal_anonymous.js b/addons/portal_anonymous/static/src/js/portal_anonymous.js
index a719a285908..d4f6351efc9 100644
--- a/addons/portal_anonymous/static/src/js/portal_anonymous.js
+++ b/addons/portal_anonymous/static/src/js/portal_anonymous.js
@@ -43,8 +43,12 @@ openerp.portal_anonymous = function(instance) {
instance.web.Login.include({
start: function() {
var self = this;
+ var anonymous_mode = (!self.session.session_is_valid() && !(self.params.token || self.params.login));
+ if (anonymous_mode) {
+ self.$el.hide();
+ }
return $.when(this._super()).then(function() {
- if (!self.session.session_is_valid() && !(self.params.token || self.params.login)) {
+ if (anonymous_mode) {
self.remember_credentials = false;
// XXX get login/pass from server (via a rpc call) ?
return self.do_login(self.selected_db, 'anonymous', 'anonymous');
diff --git a/addons/portal_project_long_term/__init__.py b/addons/portal_project_long_term/__init__.py
new file mode 100644
index 00000000000..c8d82ed19bd
--- /dev/null
+++ b/addons/portal_project_long_term/__init__.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2010-Today OpenERP S.A. (<http://www.openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
diff --git a/addons/portal_project_long_term/__openerp__.py b/addons/portal_project_long_term/__openerp__.py
new file mode 100644
index 00000000000..44156afbc06
--- /dev/null
+++ b/addons/portal_project_long_term/__openerp__.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2010-Today OpenERP S.A. (<http://www.openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+{
+ 'name': 'Portal Project Long Term',
+ 'version': '1.0',
+ 'category': 'Tools',
+ 'complexity': 'easy',
+ 'description': """
+This module adds necessary security rules and access rights for project long term and portal.
+=============================================================================================
+ """,
+ 'author': 'OpenERP SA',
+ 'depends': ['project_long_term', 'portal'],
+ 'data': [
+ 'security/portal_security.xml',
+ 'security/ir.model.access.csv',
+ ],
+ 'installable': True,
+ 'auto_install': True,
+ 'category': 'Hidden',
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/portal_project_long_term/security/ir.model.access.csv b/addons/portal_project_long_term/security/ir.model.access.csv
new file mode 100644
index 00000000000..738c264a71c
--- /dev/null
+++ b/addons/portal_project_long_term/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_issues,project_phase,project_long_term.model_project_phase,portal.group_portal,1,0,0,0
diff --git a/addons/portal_project_long_term/security/portal_security.xml b/addons/portal_project_long_term/security/portal_security.xml
new file mode 100644
index 00000000000..b46d277e4ee
--- /dev/null
+++ b/addons/portal_project_long_term/security/portal_security.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <record id="portal_project_long_term_rule" model="ir.rule">
+ <field name="name">Portal Personal Long term project</field>
+ <field ref="project_long_term.model_project_phase" name="model_id"/>
+ <field name="domain_force">['|',('project_id.message_follower_ids','in', [user.partner_id.id]),('task_ids.message_follower_ids','in', [user.partner_id.id])]</field>
+ <field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
+ <field eval="1" name="perm_unlink"/>
+ <field eval="1" name="perm_write"/>
+ <field eval="1" name="perm_read"/>
+ <field eval="0" name="perm_create"/>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/portal_sale/i18n/es_MX.po b/addons/portal_sale/i18n/es_MX.po
new file mode 100644
index 00000000000..2852d1f6327
--- /dev/null
+++ b/addons/portal_sale/i18n/es_MX.po
@@ -0,0 +1,548 @@
+# Spanish (Mexico) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-22 02:49+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Mexico) <es_MX@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-23 05:10+0000\n"
+"X-Generator: Launchpad (build 16540)\n"
+
+#. module: portal_sale
+#: model:ir.model,name:portal_sale.model_account_config_settings
+msgid "account.config.settings"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,help:portal_sale.portal_action_invoices
+msgid "We haven't sent you any invoice."
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,report_name:portal_sale.email_template_edi_sale
+msgid ""
+"${(object.name or '').replace('/','_')}_${object.state == 'draft' and "
+"'draft' or ''}"
+msgstr ""
+
+#. module: portal_sale
+#: model:res.groups,name:portal_sale.group_payment_options
+msgid "View Online Payment Options"
+msgstr ""
+
+#. module: portal_sale
+#: field:account.config.settings,group_payment_options:0
+msgid "Show payment buttons to employees too"
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,subject:portal_sale.email_template_edi_sale
+msgid ""
+"${object.company_id.name} ${object.state in ('draft', 'sent') and "
+"'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,help:portal_sale.action_quotations_portal
+msgid "We haven't sent you any quotation."
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.ui.menu,name:portal_sale.portal_sales_orders
+msgid "Sales Orders"
+msgstr ""
+
+#. module: portal_sale
+#: model:res.groups,comment:portal_sale.group_payment_options
+msgid ""
+"Members of this group see the online payment options\n"
+"on Sale Orders and Customer Invoices. These options are meant for customers "
+"who are accessing\n"
+"their documents through the portal."
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,body_html:portal_sale.email_template_edi_sale
+msgid ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Hello ${object.partner_id.name},</p>\n"
+" \n"
+" <p>Here is your ${object.state in ('draft', 'sent') and 'quotation' or "
+"'order confirmation'} from ${object.company_id.name}: </p>\n"
+"\n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENCES</strong><br />\n"
+" &nbsp;&nbsp;Order number: <strong>${object.name}</strong><br />\n"
+" &nbsp;&nbsp;Order total: <strong>${object.amount_total} "
+"${object.pricelist_id.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Order date: ${object.date_order}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Order reference: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.client_order_ref:\n"
+" &nbsp;&nbsp;Your reference: ${object.client_order_ref}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" &nbsp;&nbsp;Your contact: <a href=\"mailto:${object.user_id.email or "
+"''}?subject=Order%20${object.name}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p>\n"
+"\n"
+" <% set signup_url = object.get_signup_url() %>\n"
+" % if signup_url:\n"
+" <p>\n"
+" You can access this document and pay online via our Customer Portal:\n"
+" </p>\n"
+" <a style=\"display:block; width: 150px; height:20px; margin-left: "
+"120px; color: #DDD; font-family: 'Lucida Grande', Helvetica, Arial, sans-"
+"serif; font-size: 13px; font-weight: bold; text-align: center; text-"
+"decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; "
+"background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat "
+"no-repeat;\"\n"
+" href=\"${signup_url}\">View ${object.state in ('draft', 'sent') "
+"and 'Quotation' or 'Order'}</a>\n"
+" % endif\n"
+"\n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>It is also possible to directly pay with Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+"\n"
+" <br/>\n"
+" <p>If you have any question, do not hesitate to contact us.</p>\n"
+" <p>Thank you for choosing ${object.company_id.name or 'us'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Phone:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Web :&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" % endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
+msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Hola, buen día ${object.partner_id.name}:</p>\n"
+" \n"
+" <p>Esta es su ${object.state in ('draft', 'sent') and 'cotización' or "
+"'pedido'} de ${object.company_id.name}: </p>\n"
+"\n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENCIAS</strong><br />\n"
+" &nbsp;&nbsp;Número: <strong>${object.name}</strong><br />\n"
+" &nbsp;&nbsp;Total: <strong>${object.amount_total} "
+"${object.pricelist_id.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Fecha: ${object.date_order}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Origen: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.client_order_ref:\n"
+" &nbsp;&nbsp;Referencia de la orden de compra: "
+"${object.client_order_ref}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" &nbsp;&nbsp;Su contacto: <a href=\"mailto:${object.user_id.email or "
+"''}?subject=Order%20${object.name}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p>\n"
+"\n"
+" <% set signup_url = object.get_signup_url() %>\n"
+" % if signup_url:\n"
+" <p>\n"
+" Usted puede acceder a este documento y pagarlo en linea vía nuestro "
+"portal del cliente:\n"
+" </p>\n"
+" <a style=\"display:block; width: 150px; height:20px; margin-left: "
+"120px; color: #DDD; font-family: 'Lucida Grande', Helvetica, Arial, sans-"
+"serif; font-size: 13px; font-weight: bold; text-align: center; text-"
+"decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; "
+"background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat "
+"no-repeat;\"\n"
+" href=\"${signup_url}\">Ver ${object.state in ('draft', 'sent') "
+"and 'Cotización' or 'Pedido'}</a>\n"
+" % endif\n"
+"\n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>Tambien es posible pagarlo directamente con Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+"\n"
+" <br/>\n"
+" <p>Si tiene alguna pregunta no dude en contactarnos.</p>\n"
+" <p>¡Gracias por seleccionar a ${object.company_id.name or 'us'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Teléfono:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Página web :&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" % endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
+
+#. module: portal_sale
+#: model:email.template,report_name:portal_sale.email_template_edi_invoice
+msgid ""
+"Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' "
+"and 'draft' or ''}"
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,subject:portal_sale.email_template_edi_invoice
+msgid "${object.company_id.name} Invoice (Ref ${object.number or 'n/a' })"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.model,name:portal_sale.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,name:portal_sale.action_quotations_portal
+#: model:ir.ui.menu,name:portal_sale.portal_quotations
+msgid "Quotations"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.model,name:portal_sale.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
+#. module: portal_sale
+#: field:account.invoice,portal_payment_options:0
+#: field:sale.order,portal_payment_options:0
+msgid "Portal Payment Options"
+msgstr ""
+
+#. module: portal_sale
+#: help:account.config.settings,group_payment_options:0
+msgid ""
+"Show online payment options on Sale Orders and Customer Invoices to "
+"employees. If not checked, these options are only visible to portal users."
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,name:portal_sale.portal_action_invoices
+#: model:ir.ui.menu,name:portal_sale.portal_invoices
+msgid "Invoices"
+msgstr ""
+
+#. module: portal_sale
+#: view:account.config.settings:0
+msgid "Configure payment acquiring methods"
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,body_html:portal_sale.email_template_edi_invoice
+msgid ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Hello ${object.partner_id.name},</p>\n"
+"\n"
+" <p>A new invoice is available for you: </p>\n"
+" \n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENCES</strong><br />\n"
+" &nbsp;&nbsp;Invoice number: <strong>${object.number}</strong><br />\n"
+" &nbsp;&nbsp;Invoice total: <strong>${object.amount_total} "
+"${object.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Invoice date: ${object.date_invoice}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Order reference: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" &nbsp;&nbsp;Your contact: <a href=\"mailto:${object.user_id.email or "
+"''}?subject=Invoice%20${object.number}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p> \n"
+"\n"
+" <% set signup_url = object.get_signup_url() %>\n"
+" % if signup_url:\n"
+" <p>\n"
+" You can access the invoice document and pay online via our Customer "
+"Portal:\n"
+" </p>\n"
+" <a style=\"display:block; width: 150px; height:20px; margin-left: "
+"120px; color: #DDD; font-family: 'Lucida Grande', Helvetica, Arial, sans-"
+"serif; font-size: 13px; font-weight: bold; text-align: center; text-"
+"decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; "
+"background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat "
+"no-repeat;\"\n"
+" href=\"${signup_url}\">View Invoice</a>\n"
+" % endif\n"
+" \n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>It is also possible to directly pay with Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+" \n"
+" <br/>\n"
+" <p>If you have any question, do not hesitate to contact us.</p>\n"
+" <p>Thank you for choosing ${object.company_id.name or 'us'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Phone:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Web :&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" % endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
+msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Hola, buen día ${object.partner_id.name}:</p>\n"
+" \n"
+" <p>Esta es su ${object.state in ('draft', 'sent') and 'cotización' or "
+"'pedido'} de ${object.company_id.name}: </p>\n"
+"\n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENCIAS</strong><br />\n"
+" &nbsp;&nbsp;Número: <strong>${object.name}</strong><br />\n"
+" &nbsp;&nbsp;Total: <strong>${object.amount_total} "
+"${object.pricelist_id.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Fecha: ${object.date_order}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Origen: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.client_order_ref:\n"
+" &nbsp;&nbsp;Referencia de la orden de compra: "
+"${object.client_order_ref}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" &nbsp;&nbsp;Su contacto: <a href=\"mailto:${object.user_id.email or "
+"''}?subject=Order%20${object.name}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p>\n"
+"\n"
+" <% set signup_url = object.get_signup_url() %>\n"
+" % if signup_url:\n"
+" <p>\n"
+" Usted puede acceder a este documento y pagarlo en linea vía nuestro "
+"portal del cliente:\n"
+" </p>\n"
+" <a style=\"display:block; width: 150px; height:20px; margin-left: "
+"120px; color: #DDD; font-family: 'Lucida Grande', Helvetica, Arial, sans-"
+"serif; font-size: 13px; font-weight: bold; text-align: center; text-"
+"decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; "
+"background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat "
+"no-repeat;\"\n"
+" href=\"${signup_url}\">Ver ${object.state in ('draft', 'sent') "
+"and 'Cotización' or 'Pedido'}</a>\n"
+" % endif\n"
+"\n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>Tambien es posible pagarlo directamente con Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+"\n"
+" <br/>\n"
+" <p>Si tiene alguna pregunta no dude en contactarnos.</p>\n"
+" <p>¡Gracias por seleccionar a ${object.company_id.name or 'us'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Teléfono:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Página web :&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" % endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
+
+#. module: portal_sale
+#: model:ir.actions.act_window,help:portal_sale.action_orders_portal
+msgid "We haven't sent you any sales order."
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.model,name:portal_sale.model_account_invoice
+msgid "Invoice"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,name:portal_sale.action_orders_portal
+msgid "Sale Orders"
+msgstr ""
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index 9233a95634c..01dab2962f3 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -392,10 +392,18 @@ class project_issue(base_stage, osv.osv):
context=context)
def write(self, cr, uid, ids, vals, context=None):
- #Update last action date every time the user change the stage, the state or send a new email
- logged_fields = ['stage_id', 'state', 'message_ids']
- if any([field in vals for field in logged_fields]):
- vals['date_action_last'] = time.strftime('%Y-%m-%d %H:%M:%S')
+
+ #Update last action date every time the user changes the stage
+ if 'stage_id' in vals:
+ vals['date_action_last'] = time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
+ state = self.pool.get('project.task.type').browse(cr, uid, vals['stage_id'], context=context).state
+ for issue in self.browse(cr, uid, ids, context=context):
+ # Change from draft to not draft EXCEPT cancelled: The issue has been opened -> set the opening date
+ if issue.state == 'draft' and state not in ('draft', 'cancelled'):
+ vals['date_open'] = time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
+ # Change from not done to done: The issue has been closed -> set the closing date
+ if issue.state != 'done' and state == 'done':
+ vals['date_closed'] = time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
return super(project_issue, self).write(cr, uid, ids, vals, context)
@@ -545,6 +553,19 @@ class project_issue(base_stage, osv.osv):
return super(project_issue, self).message_update(cr, uid, ids, msg, update_vals=update_vals, context=context)
+ def message_post(self, cr, uid, thread_id, body='', subject=None, type='notification', subtype=None, parent_id=False, attachments=None, context=None, content_subtype='html', **kwargs):
+ """ Overrides mail_thread message_post so that we can set the date of last action field when
+ a new message is posted on the issue.
+ """
+ if context is None:
+ context = {}
+
+ res = super(project_issue, self).message_post(cr, uid, thread_id, body=body, subject=subject, type=type, subtype=subtype, parent_id=parent_id, attachments=attachments, context=context, content_subtype=content_subtype, **kwargs)
+
+ if thread_id:
+ self.write(cr, uid, thread_id, {'date_action_last': time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)
+
+ return res
class project(osv.osv):
_inherit = "project.project"
diff --git a/addons/report_webkit/__openerp__.py b/addons/report_webkit/__openerp__.py
index d1640ab2f30..b962669eee9 100644
--- a/addons/report_webkit/__openerp__.py
+++ b/addons/report_webkit/__openerp__.py
@@ -92,6 +92,9 @@ TODO:
'demo': [
"report/webkit_report_demo.xml",
],
+ 'test': [
+ "test/print.yml",
+ ],
'installable': True,
'auto_install': False,
'images': ['images/companies_webkit.jpeg','images/header_html.jpeg','images/header_img.jpeg'],
diff --git a/addons/report_webkit/test/print.yml b/addons/report_webkit/test/print.yml
new file mode 100644
index 00000000000..b201efa97de
--- /dev/null
+++ b/addons/report_webkit/test/print.yml
@@ -0,0 +1,10 @@
+-
+ Print the report_webkit demo report.
+-
+ !python {model: ir.actions.report.xml}: |
+ import os
+ from openerp import netsvc, tools
+ ids = self.pool['ir.actions.report.xml'].search(cr, uid, [], {})
+ (data, format) = netsvc.LocalService('report.webkit.ir.actions.report.xml').create(cr, uid, ids, {}, {})
+ if tools.config['test_report_directory']:
+ file(os.path.join(tools.config['test_report_directory'], 'report_webkit_demo_report.'+format), 'wb+').write(data)
diff --git a/addons/sale/report/sale_order.py b/addons/sale/report/sale_order.py
index b4f0b1589aa..134e87a0c2e 100644
--- a/addons/sale/report/sale_order.py
+++ b/addons/sale/report/sale_order.py
@@ -27,9 +27,18 @@ class order(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context=None):
super(order, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
- 'time': time,
+ 'time': time,
+ 'show_discount':self._show_discount,
})
+ def _show_discount(self, uid, context=None):
+ cr = self.cr
+ try:
+ group_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'sale', 'group_discount_per_so_line')[1]
+ except:
+ return False
+ return group_id in [x.id for x in self.pool.get('res.users').browse(cr, uid, uid, context=context).groups_id]
+
report_sxw.report_sxw('report.sale.order', 'sale.order', 'addons/sale/report/sale_order.rml', parser=order, header="external")
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale/report/sale_order.rml b/addons/sale/report/sale_order.rml
index a00d2d4e3ef..130220535f9 100644
--- a/addons/sale/report/sale_order.rml
+++ b/addons/sale/report/sale_order.rml
@@ -251,7 +251,7 @@
<para style="terp_tblheader_Details_Right">Unit Price</para>
</td>
<td>
- <para style="terp_tblheader_Details_Centre">Disc.(%)</para>
+ <para style="terp_tblheader_Details_Centre">[[not show_discount(user.id) and removeParentNode('para') ]]Disc.(%)</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Price</para>
@@ -275,7 +275,7 @@
<para style="terp_default_Right_9">[[ formatLang(line.price_unit , digits=get_digits(dp='Product Price'))]]</para>
</td>
<td>
- <para style="terp_default_Centre_9">[[ formatLang(line.discount, digits=get_digits(dp='Discount'))]]</para>
+ <para style="terp_default_Centre_9">[[show_discount(user.id) and formatLang(line.discount, digits=get_digits(dp='Discount')) or '']]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang(line.price_subtotal, digits=get_digits(dp='Account'), currency_obj=o.pricelist_id.currency_id) ]] </para>
diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py
index a20ba01f300..070e9c4336f 100644
--- a/addons/sale/report/sale_report.py
+++ b/addons/sale/report/sale_report.py
@@ -88,12 +88,11 @@ class sale_report(osv.osv):
s.project_id as analytic_account_id
from
sale_order s
- left join sale_order_line l on (s.id=l.order_id)
+ join sale_order_line l on (s.id=l.order_id)
left join product_product p on (l.product_id=p.id)
left join product_template t on (p.product_tmpl_id=t.id)
left join product_uom u on (u.id=l.product_uom)
left join product_uom u2 on (u2.id=t.uom_id)
- where l.product_id is not null
group by
l.product_id,
l.product_uom_qty,
diff --git a/addons/sale_mrp/test/sale_mrp.yml b/addons/sale_mrp/test/sale_mrp.yml
index 9b70e052854..5be5210b623 100644
--- a/addons/sale_mrp/test/sale_mrp.yml
+++ b/addons/sale_mrp/test/sale_mrp.yml
@@ -92,11 +92,10 @@
I verify that a procurement has been generated for sale order
-
!python {model: procurement.order}: |
- from openerp.tools.translate import _
sale_order_obj = self.pool.get('sale.order')
so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
proc_ids = self.search(cr, uid, [('origin','=',so.name)])
- assert proc_ids, _('No Procurements!')
+ assert proc_ids, 'No Procurements!'
-
Then I click on the "Run Procurement" button
-
@@ -112,7 +111,7 @@
sale_order_obj = self.pool.get('sale.order')
so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
proc_ids = self.search(cr, uid, [('origin','=',so.name) and ('state','=','running')])
- assert proc_ids, _('Procurement is not in the running state!')
+ assert proc_ids, 'Procurement is not in the running state!'
-
I verify that a manufacturing order has been generated, and that its name and reference are correct
-
@@ -120,7 +119,7 @@
mnf_obj = self.pool.get('mrp.production')
so = self.browse(cr, uid, ref("sale_order_so0"))
mnf_id = mnf_obj.search(cr, uid, [('origin','=',so.name)])
- assert mnf_id, _('Manufacturing order has not been generated')
+ assert mnf_id, 'Manufacturing order has not been generated'
mo = mnf_obj.browse(cr, uid, mnf_id)[0]
assert mo.sale_name == so.name, 'Wrong Name for the Manufacturing Order. Expected %s, Got %s' % (so.name, mo.name)
assert mo.sale_ref == so.client_order_ref, 'Wrong Sale Reference for the Manufacturing Order'
diff --git a/addons/sale_stock/report/sale_report.py b/addons/sale_stock/report/sale_report.py
index ade84b269e6..1f1e4a625be 100644
--- a/addons/sale_stock/report/sale_report.py
+++ b/addons/sale_stock/report/sale_report.py
@@ -68,8 +68,8 @@ class sale_report(osv.osv):
s.project_id as analytic_account_id
from
sale_order s
- left join sale_order_line l on (s.id=l.order_id)
- left join product_product p on (l.product_id=p.id)
+ join sale_order_line l on (s.id=l.order_id)
+ left join product_product p on (l.product_id=p.id)
left join product_template t on (p.product_tmpl_id=t.id)
left join product_uom u on (u.id=l.product_uom)
left join product_uom u2 on (u2.id=t.uom_id)
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 6bf020623f7..be0dd59468c 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -19,7 +19,6 @@
#
##############################################################################
-from lxml import etree
from datetime import datetime
from dateutil.relativedelta import relativedelta
import time
@@ -617,7 +616,7 @@ class stock_picking(osv.osv):
return res
def create(self, cr, user, vals, context=None):
- if ('name' not in vals) or (vals.get('name')=='/'):
+ if ('name' not in vals) or (vals.get('name')=='/') or (vals.get('name') == False):
seq_obj_name = self._name
vals['name'] = self.pool.get('ir.sequence').get(cr, user, seq_obj_name)
new_id = super(stock_picking, self).create(cr, user, vals, context)
@@ -704,29 +703,29 @@ class stock_picking(osv.osv):
default = {}
default = default.copy()
picking_obj = self.browse(cr, uid, id, context=context)
- move_obj=self.pool.get('stock.move')
- if ('name' not in default) or (picking_obj.name=='/'):
- seq_obj_name = 'stock.picking.' + picking_obj.type
+ move_obj = self.pool.get('stock.move')
+ if ('name' not in default) or (picking_obj.name == '/'):
+ seq_obj_name = 'stock.picking.' + picking_obj.type
default['name'] = self.pool.get('ir.sequence').get(cr, uid, seq_obj_name)
default['origin'] = ''
default['backorder_id'] = False
if 'invoice_state' not in default and picking_obj.invoice_state == 'invoiced':
default['invoice_state'] = '2binvoiced'
- res=super(stock_picking, self).copy(cr, uid, id, default, context)
+ res = super(stock_picking, self).copy(cr, uid, id, default, context)
if res:
picking_obj = self.browse(cr, uid, res, context=context)
for move in picking_obj.move_lines:
- move_obj.write(cr, uid, [move.id], {'tracking_id': False,'prodlot_id':False, 'move_history_ids2': [(6, 0, [])], 'move_history_ids': [(6, 0, [])]})
+ move_obj.write(cr, uid, [move.id], {'tracking_id': False, 'prodlot_id': False, 'move_history_ids2': [(6, 0, [])], 'move_history_ids': [(6, 0, [])]})
return res
-
+
def fields_view_get(self, cr, uid, view_id=None, view_type=False, context=None, toolbar=False, submenu=False):
if view_type == 'form' and not view_id:
mod_obj = self.pool.get('ir.model.data')
if self._name == "stock.picking.in":
- model,view_id = mod_obj.get_object_reference(cr, uid, 'stock', 'view_picking_in_form')
+ model, view_id = mod_obj.get_object_reference(cr, uid, 'stock', 'view_picking_in_form')
if self._name == "stock.picking.out":
- model,view_id = mod_obj.get_object_reference(cr, uid, 'stock', 'view_picking_out_form')
- return super(stock_picking,self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu)
+ model, view_id = mod_obj.get_object_reference(cr, uid, 'stock', 'view_picking_out_form')
+ return super(stock_picking, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu)
def onchange_partner_in(self, cr, uid, ids, partner_id=None, context=None):
return {}
@@ -2440,9 +2439,8 @@ class stock_move(osv.osv):
context = {}
ctx = context.copy()
for move in self.browse(cr, uid, ids, context=context):
- if move.state != 'draft' and not ctx.get('call_unlink',False):
- raise osv.except_osv(_('User Error!'),
- _('You can only delete draft moves.'))
+ if move.state != 'draft' and not ctx.get('call_unlink', False):
+ raise osv.except_osv(_('User Error!'), _('You can only delete draft moves.'))
return super(stock_move, self).unlink(
cr, uid, ids, context=ctx)
@@ -2470,13 +2468,20 @@ class stock_move(osv.osv):
raise osv.except_osv(_('Warning!'), _('Please provide a positive quantity to scrap.'))
res = []
for move in self.browse(cr, uid, ids, context=context):
+ source_location = move.location_id
+ if move.state == 'done':
+ source_location = move.location_dest_id
+ if source_location.usage != 'internal':
+ #restrict to scrap from a virtual location because it's meaningless and it may introduce errors in stock ('creating' new products from nowhere)
+ raise osv.except_osv(_('Error!'), _('Forbidden operation: it is not allowed to scrap products from a virtual location.'))
move_qty = move.product_qty
uos_qty = quantity / move_qty * move.product_uos_qty
default_val = {
+ 'location_id': source_location.id,
'product_qty': quantity,
'product_uos_qty': uos_qty,
'state': move.state,
- 'scrapped' : True,
+ 'scrapped': True,
'location_dest_id': location_id,
'tracking_id': move.tracking_id.id,
'prodlot_id': move.prodlot_id.id,
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index bc47d83dc89..6162d073fde 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -1129,7 +1129,7 @@
<field name="model">stock.move</field>
<field eval="8" name="priority"/>
<field name="arch" type="xml">
- <tree colors="grey:state == 'cancel';red:(state not in ('cancel','done')) and date > current_date" string="Moves" editable="top">
+ <tree colors="grey:state == 'cancel';red:(state not in ('cancel','done')) and date > current_date" string="Moves">
<field name="name"/>
<field name="picking_id" string="Reference"/>
<field name="origin"/>
diff --git a/addons/stock_location/test/stock_location_push_flow.yml b/addons/stock_location/test/stock_location_push_flow.yml
index 27164848f77..64bd30e0c99 100644
--- a/addons/stock_location/test/stock_location_push_flow.yml
+++ b/addons/stock_location/test/stock_location_push_flow.yml
@@ -94,12 +94,11 @@
I check the move is in waiting state.
-
!python {model: stock.picking }: |
- from openerp.tools.translate import _
picking_id = self.search(cr, uid, [('origin','=','Pushed Flow Test'),('type','=','out')])
if picking_id:
pick=self.browse(cr,uid,picking_id[0])
for move in pick.move_lines:
- assert(move.state == 'waiting'), _('Stock is not in waiting state')
+ assert(move.state == 'waiting'), 'Stock is not in waiting state'
-
I receive the order of the supplier Micro Link Technologies from the Incoming Shipments menu.
-
@@ -123,8 +122,7 @@
I check the Outgoing Orders is automatically done.
-
!python {model: stock.picking }: |
- from openerp.tools.translate import _
picking_id = self.search(cr, uid, [('origin','=','Pushed Flow Test'),('type','=','out')])
if picking_id:
pick=self.browse(cr,uid,picking_id[0])
- assert(pick.state == 'done'), _('Picking is not in done state')
+ assert(pick.state == 'done'), 'Picking is not in done state'
diff --git a/addons/subscription/subscription.py b/addons/subscription/subscription.py
index d181e97e8f0..92bde135bc6 100644
--- a/addons/subscription/subscription.py
+++ b/addons/subscription/subscription.py
@@ -85,6 +85,17 @@ class subscription_subscription(osv.osv):
'state': lambda *a: 'draft'
}
+ def _auto_end(self, cr, context=None):
+ super(subscription_subscription, self)._auto_end(cr, context=context)
+ # drop the FK from subscription to ir.cron, as it would cause deadlocks
+ # during cron job execution. When model_copy() tries to write() on the subscription,
+ # it has to wait for an ExclusiveLock on the cron job record, but the latter
+ # is locked by the cron system for the duration of the job!
+ # FIXME: the subscription module should be reviewed to simplify the scheduling process
+ # and to use a unique cron job for all subscriptions, so that it never needs to
+ # be updated during its execution.
+ cr.execute("ALTER TABLE %s DROP CONSTRAINT %s" % (self._table, '%s_cron_id_fkey' % self._table))
+
def set_process(self, cr, uid, ids, context=None):
for row in self.read(cr, uid, ids, context=context):
mapping = {'name':'name','interval_number':'interval_number','interval_type':'interval_type','exec_init':'numbercall','date_init':'nextcall'}