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 @@
- Last Reconciliation: + Latest Manual Reconciliation Processed:
- +
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 , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:05+0000\n" +"PO-Revision-Date: 2013-03-21 19:22+0000\n" +"Last-Translator: Liuming \n" +"Language-Team: Chinese (Simplified) \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 "" +"

\n" +" Click to create Accounting Test.\n" +"

\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/i18n/hu.po b/addons/analytic/i18n/hu.po index bf379e9f17c..4c6b076773d 100644 --- a/addons/analytic/i18n/hu.po +++ b/addons/analytic/i18n/hu.po @@ -7,14 +7,14 @@ 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-30 18:54+0000\n" -"Last-Translator: Krisztian Eyssen \n" +"PO-Revision-Date: 2013-03-25 13:25+0000\n" +"Last-Translator: krnkris \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:41+0000\n" -"X-Generator: Launchpad (build 16532)\n" +"X-Launchpad-Export-Date: 2013-03-26 04:44+0000\n" +"X-Generator: Launchpad (build 16540)\n" #. module: analytic #: field:account.analytic.account,child_ids:0 @@ -24,13 +24,13 @@ msgstr "Alárendelt gyűjtőkódok" #. module: analytic #: selection:account.analytic.account,state:0 msgid "In Progress" -msgstr "" +msgstr "Folyamatban" #. module: analytic #: code:addons/analytic/analytic.py:229 #, python-format msgid "Contract: " -msgstr "" +msgstr "Szerződés: " #. module: analytic #: selection:account.analytic.account,state:0 @@ -40,7 +40,7 @@ msgstr "Sablon" #. module: analytic #: view:account.analytic.account:0 msgid "End Date" -msgstr "" +msgstr "Befejezés dátuma" #. module: analytic #: help:account.analytic.line,unit_amount:0 @@ -64,6 +64,14 @@ msgid "" "The special type 'Template of Contract' allows you to define a template with " "default data that you can reuse easily." msgstr "" +"A nézet típus kiválasztásával, megtiltja ezzel a fiókkal a napló bejegyzés " +"készítését.\n" +"Az 'Elemző/gyüjtő számla' típust olyan fiókokhoz használja, melyeket csak " +"könyveléshez használ.\n" +"Ha Szerződést vagy Projektet választ, lehetősége lesz kezelni a fiók " +"érvényesítés és számlázási lehetőségeit.\n" +"A speciális 'Szerződési sablon' típus lehetővé teszi alapértékekkel " +"kitöltött sablon létrehozását, melyet könnyen ismét felhasználhat." #. module: analytic #: view:account.analytic.account:0 @@ -82,12 +90,12 @@ msgstr "" #. module: analytic #: selection:account.analytic.account,type:0 msgid "Contract or Project" -msgstr "" +msgstr "Projekt szerződése" #. module: analytic #: field:account.analytic.account,name:0 msgid "Account/Contract Name" -msgstr "" +msgstr "Fiók/Szerződés neve" #. module: analytic #: field:account.analytic.account,manager_id:0 @@ -97,7 +105,7 @@ msgstr "Felelős" #. module: analytic #: field:account.analytic.account,message_follower_ids:0 msgid "Followers" -msgstr "" +msgstr "Követők" #. module: analytic #: selection:account.analytic.account,state:0 @@ -107,28 +115,28 @@ msgstr "Lezárt" #. module: analytic #: model:mail.message.subtype,name:analytic.mt_account_pending msgid "Contract to Renew" -msgstr "" +msgstr "Megújítandó szerződés" #. module: analytic #: selection:account.analytic.account,state:0 msgid "New" -msgstr "" +msgstr "Új" #. module: analytic #: field:account.analytic.account,user_id:0 msgid "Project Manager" -msgstr "" +msgstr "Projektmenedzser" #. module: analytic #: field:account.analytic.account,state:0 msgid "Status" -msgstr "" +msgstr "Állapot" #. module: analytic #: code:addons/analytic/analytic.py:271 #, python-format msgid "%s (copy)" -msgstr "" +msgstr "%s (másolat)" #. module: analytic #: model:ir.model,name:analytic.model_account_analytic_line @@ -144,12 +152,12 @@ msgstr "Leírás" #. module: analytic #: field:account.analytic.account,message_unread:0 msgid "Unread Messages" -msgstr "" +msgstr "Olvasatlan üzenetek" #. module: analytic #: constraint:account.analytic.account:0 msgid "Error! You cannot create recursive analytic accounts." -msgstr "" +msgstr "Hiba! Nem tud visszatérő Elemző/Gyűjtő számlákat létrehozni." #. module: analytic #: field:account.analytic.account,company_id:0 @@ -160,12 +168,12 @@ msgstr "Vállalat" #. module: analytic #: view:account.analytic.account:0 msgid "Renewal" -msgstr "" +msgstr "Megújítás" #. module: analytic #: help:account.analytic.account,message_ids:0 msgid "Messages and communication history" -msgstr "" +msgstr "Üzenetek és kommunikációs történet" #. module: analytic #: model:mail.message.subtype,description:analytic.mt_account_opened @@ -194,7 +202,7 @@ msgstr "" #. module: analytic #: field:account.analytic.account,message_is_follower:0 msgid "Is a Follower" -msgstr "" +msgstr "Ez egy követő" #. module: analytic #: field:account.analytic.line,user_id:0 @@ -204,7 +212,7 @@ msgstr "Felhasználó" #. module: analytic #: model:mail.message.subtype,description:analytic.mt_account_pending msgid "Contract pending" -msgstr "" +msgstr "Szerződés függőben" #. module: analytic #: field:account.analytic.line,date:0 @@ -214,12 +222,12 @@ msgstr "Dátum" #. module: analytic #: model:mail.message.subtype,name:analytic.mt_account_closed msgid "Contract Finished" -msgstr "" +msgstr "Szerződés végrehejtva" #. module: analytic #: view:account.analytic.account:0 msgid "Terms and Conditions" -msgstr "" +msgstr "Kikötések és feltételek" #. module: analytic #: help:account.analytic.line,amount:0 @@ -233,17 +241,17 @@ msgstr "" #. module: analytic #: field:account.analytic.account,partner_id:0 msgid "Customer" -msgstr "" +msgstr "Vevő" #. module: analytic #: field:account.analytic.account,child_complete_ids:0 msgid "Account Hierarchy" -msgstr "" +msgstr "Számla fiók hierarchia, rangsor" #. module: analytic #: field:account.analytic.account,message_ids:0 msgid "Messages" -msgstr "" +msgstr "Üzenetek" #. module: analytic #: field:account.analytic.account,parent_id:0 @@ -253,23 +261,23 @@ msgstr "Fölérendelt gyűjtőkód" #. module: analytic #: view:account.analytic.account:0 msgid "Contract Information" -msgstr "" +msgstr "Szerződé információja" #. module: analytic #: field:account.analytic.account,template_id:0 #: selection:account.analytic.account,type:0 msgid "Template of Contract" -msgstr "" +msgstr "Szerződés sablonja" #. module: analytic #: field:account.analytic.account,message_summary:0 msgid "Summary" -msgstr "" +msgstr "Összegzés" #. module: analytic #: field:account.analytic.account,quantity_max:0 msgid "Prepaid Service Units" -msgstr "" +msgstr "Előre fizetett szolgáltatási egység" #. module: analytic #: field:account.analytic.account,credit:0 @@ -279,12 +287,12 @@ msgstr "Követel" #. module: analytic #: model:mail.message.subtype,name:analytic.mt_account_opened msgid "Contract Opened" -msgstr "" +msgstr "Szerződés megnyitva, elindítva" #. module: analytic #: model:mail.message.subtype,description:analytic.mt_account_closed msgid "Contract closed" -msgstr "" +msgstr "Szerződés lezárva" #. module: analytic #: selection:account.analytic.account,state:0 @@ -294,7 +302,7 @@ msgstr "Érvénytelenített" #. module: analytic #: selection:account.analytic.account,type:0 msgid "Analytic View" -msgstr "" +msgstr "Elemző nézet" #. module: analytic #: field:account.analytic.account,balance:0 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/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 , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \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 \n" +"Language-Team: Turkish \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 , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \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 \n" +"Language-Team: Russian \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 , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \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 \n" +"Language-Team: Spanish (Colombia) \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" +"

A password reset was requested for the OpenERP account linked to this " +"email.

\n" +"\n" +"

You may change your password by following this link.

\n" +"\n" +"

Note: If you do not expect this, you can safely ignore this email.

" +msgstr "" +"\n" +"

Se ha solicitado un cambio de contraseña dedse la cuenta de OpenERP " +"asociada con este correo eléctronico.

\n" +"\n" +"

Debería cambiar su contraseña siguiendo este enlace.

\n" +"\n" +"

Nota: Si no espera estanotificación, puede ignorarla de forma segura.

" + +#. 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/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 @@ - - + + 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 , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \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 \n" +"Language-Team: Spanish (Colombia) \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 "" +"

\n" +" Click to add a contact in your address book.\n" +"

\n" +" OpenERP helps you easily track all activities related to\n" +" a customer; discussions, history of business opportunities,\n" +" documents, etc.\n" +"

\n" +" " +msgstr "" +"

\n" +" Pulse para añadir un contacto a su libreta de direcciones.\n" +"

\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" +"

\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 @@
- - - - - - - - - - + + + + + + + + +

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.

+ +
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 @@ 10 + diff --git a/addons/mail/i18n/cs.po b/addons/mail/i18n/cs.po new file mode 100644 index 00000000000..e12668ab3ee --- /dev/null +++ b/addons/mail/i18n/cs.po @@ -0,0 +1,1687 @@ +# Czech 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 , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:04+0000\n" +"PO-Revision-Date: 2013-03-25 07:50+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Czech \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-26 04:44+0000\n" +"X-Generator: Launchpad (build 16540)\n" + +#. module: mail +#: view:mail.followers:0 +msgid "Followers Form" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_publisher_warranty_contract +msgid "publisher_warranty.contract" +msgstr "" + +#. module: mail +#: field:mail.compose.message,author_id:0 +#: field:mail.message,author_id:0 +msgid "Author" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Message Details" +msgstr "" + +#. module: mail +#: help:mail.mail,email_to:0 +msgid "Message recipients" +msgstr "" + +#. module: mail +#: help:mail.message.subtype,default:0 +msgid "Activated by default when subscribing." +msgstr "" + +#. module: mail +#: view:mail.message:0 +msgid "Comments" +msgstr "" + +#. module: mail +#: view:mail.alias:0 +#: view:mail.mail:0 +msgid "Group By..." +msgstr "" + +#. module: mail +#: help:mail.compose.message,body:0 +#: help:mail.message,body:0 +msgid "Automatically sanitized HTML contents" +msgstr "" + +#. module: mail +#: help:mail.alias,alias_name:0 +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" + +#. module: mail +#: model:ir.actions.act_window,name:mail.action_email_compose_message_wizard +#: view:mail.compose.message:0 +msgid "Compose Email" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:132 +#, python-format +msgid "Add them into recipients and followers" +msgstr "" + +#. module: mail +#: view:mail.group:0 +msgid "Group Name" +msgstr "" + +#. module: mail +#: selection:mail.group,public:0 +msgid "Public" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Body" +msgstr "" + +#. module: mail +#: view:mail.message:0 +msgid "Show messages to read" +msgstr "" + +#. module: mail +#: help:mail.compose.message,email_from:0 +#: help:mail.message,email_from:0 +msgid "" +"Email address of the sender. This field is set when no matching partner is " +"found for incoming emails." +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_compose_message +msgid "Email composition wizard" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail_followers.xml:23 +#, python-format +msgid "Add others" +msgstr "" + +#. module: mail +#: field:mail.message.subtype,parent_id:0 +msgid "Parent" +msgstr "" + +#. module: mail +#: field:mail.group,message_unread:0 +#: field:mail.thread,message_unread:0 +#: field:res.partner,message_unread:0 +msgid "Unread Messages" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:296 +#, python-format +msgid "show" +msgstr "" + +#. module: mail +#: help:mail.group,group_ids:0 +msgid "" +"Members of those groups will automatically added as followers. Note that " +"they will be able to manage their subscription manually if necessary." +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/js/mail.js:1019 +#, python-format +msgid "Do you really want to delete this message?" +msgstr "" + +#. module: mail +#: view:mail.message:0 +#: field:mail.notification,read:0 +msgid "Read" +msgstr "" + +#. module: mail +#: view:mail.group:0 +msgid "Search Groups" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/js/mail_followers.js:159 +#, python-format +msgid "followers" +msgstr "" + +#. module: mail +#: code:addons/mail/mail_message.py:726 +#, python-format +msgid "Access Denied" +msgstr "" + +#. module: mail +#: help:mail.group,image_medium:0 +msgid "" +"Medium-sized photo of the group. It is automatically resized as a 128x128px " +"image, with aspect ratio preserved. Use this field in form views or some " +"kanban views." +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:212 +#, python-format +msgid "Uploading error" +msgstr "" + +#. module: mail +#: model:mail.group,name:mail.group_support +msgid "Support" +msgstr "" + +#. module: mail +#: code:addons/mail/mail_message.py:727 +#, python-format +msgid "" +"The requested operation cannot be completed due to security restrictions. " +"Please contact your system administrator.\n" +"\n" +"(Document type: %s, Operation: %s)" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +#: selection:mail.mail,state:0 +msgid "Received" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Thread" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:29 +#, python-format +msgid "Open the full mail composer" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:29 +#, python-format +msgid "ò" +msgstr "" + +#. module: mail +#: field:base.config.settings,alias_domain:0 +msgid "Alias Domain" +msgstr "" + +#. module: mail +#: field:mail.group,group_ids:0 +msgid "Auto Subscription" +msgstr "" + +#. module: mail +#: field:mail.mail,references:0 +msgid "References" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:206 +#, python-format +msgid "No messages." +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_group +msgid "Discussion group" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:98 +#: code:addons/mail/static/src/xml/mail.xml:110 +#, python-format +msgid "uploading" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail_followers.xml:52 +#, python-format +msgid "more." +msgstr "" + +#. module: mail +#: help:mail.compose.message,type:0 +#: help:mail.message,type:0 +msgid "" +"Message type: email for email message, notification for system message, " +"comment for other messages such as user replies" +msgstr "" + +#. module: mail +#: help:mail.message.subtype,relation_field:0 +msgid "" +"Field used to link the related model to the subtype model when using " +"automatic subscription on a related document. The field is used to compute " +"getattr(related_document.relation_field)." +msgstr "" + +#. module: mail +#: selection:mail.mail,state:0 +msgid "Cancelled" +msgstr "" + +#. module: mail +#: field:mail.mail,reply_to:0 +msgid "Reply-To" +msgstr "" + +#. module: mail +#: code:addons/mail/wizard/invite.py:37 +#, python-format +msgid "
You have been invited to follow %s.
" +msgstr "" + +#. module: mail +#: help:mail.group,message_unread:0 +#: help:mail.thread,message_unread:0 +#: help:res.partner,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "" + +#. module: mail +#: field:mail.group,image_medium:0 +msgid "Medium-sized photo" +msgstr "" + +#. module: mail +#: model:ir.actions.client,name:mail.action_mail_to_me_feeds +#: model:ir.ui.menu,name:mail.mail_tomefeeds +msgid "To: me" +msgstr "" + +#. module: mail +#: field:mail.message.subtype,name:0 +msgid "Message Type" +msgstr "" + +#. module: mail +#: field:mail.mail,auto_delete:0 +msgid "Auto Delete" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail_followers.xml:12 +#: view:mail.group:0 +#, python-format +msgid "Unfollow" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:295 +#, python-format +msgid "show one more message" +msgstr "" + +#. module: mail +#: code:addons/mail/mail_mail.py:74 +#: code:addons/mail/res_users.py:69 +#, python-format +msgid "Invalid Action!" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:25 +#, python-format +msgid "User img" +msgstr "" + +#. module: mail +#: model:ir.actions.act_window,name:mail.action_view_mail_mail +#: model:ir.ui.menu,name:mail.menu_mail_mail +#: view:mail.mail:0 +#: view:mail.message:0 +msgid "Emails" +msgstr "" + +#. module: mail +#: field:mail.followers,partner_id:0 +msgid "Related Partner" +msgstr "" + +#. module: mail +#: help:mail.group,message_summary:0 +#: help:mail.thread,message_summary:0 +#: help:res.partner,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: mail +#: help:mail.alias,alias_model_id:0 +msgid "" +"The model (OpenERP Document Kind) to which this alias corresponds. Any " +"incoming email that does not reply to an existing record will cause the " +"creation of a new record of this model (e.g. a Project Task)" +msgstr "" + +#. module: mail +#: field:mail.message.subtype,relation_field:0 +msgid "Relation field" +msgstr "" + +#. module: mail +#: selection:mail.compose.message,type:0 +#: selection:mail.message,type:0 +msgid "System notification" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_res_partner +#: view:mail.mail:0 +msgid "Partner" +msgstr "" + +#. module: mail +#: model:ir.ui.menu,name:mail.mail_my_stuff +msgid "Organizer" +msgstr "" + +#. module: mail +#: field:mail.compose.message,subject:0 +#: field:mail.message,subject:0 +msgid "Subject" +msgstr "" + +#. module: mail +#: field:mail.wizard.invite,partner_ids:0 +msgid "Partners" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Retry" +msgstr "" + +#. module: mail +#: field:mail.compose.message,email_from:0 +#: field:mail.mail,email_from:0 +#: field:mail.message,email_from:0 +msgid "From" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +#: view:mail.message.subtype:0 +msgid "Email message" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_base_config_settings +msgid "base.config.settings" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:36 +#: view:mail.compose.message:0 +#, python-format +msgid "Send" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/js/mail_followers.js:155 +#, python-format +msgid "No followers" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Failed" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail_followers.xml:22 +#: model:ir.actions.act_window,name:mail.action_view_followers +#: model:ir.ui.menu,name:mail.menu_email_followers +#: view:mail.followers:0 +#: field:mail.group,message_follower_ids:0 +#: field:mail.thread,message_follower_ids:0 +#: field:res.partner,message_follower_ids:0 +#, python-format +msgid "Followers" +msgstr "" + +#. module: mail +#: model:ir.actions.client,name:mail.action_mail_archives_feeds +#: model:ir.ui.menu,name:mail.mail_archivesfeeds +msgid "Archives" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:97 +#: code:addons/mail/static/src/xml/mail.xml:109 +#, python-format +msgid "Delete this attachment" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:245 +#: view:mail.mail:0 +#, python-format +msgid "Reply" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/js/mail_followers.js:157 +#, python-format +msgid "One follower" +msgstr "" + +#. module: mail +#: field:mail.compose.message,type:0 +#: field:mail.message,type:0 +msgid "Type" +msgstr "" + +#. module: mail +#: selection:mail.compose.message,type:0 +#: view:mail.mail:0 +#: selection:mail.message,type:0 +msgid "Email" +msgstr "" + +#. module: mail +#: field:ir.ui.menu,mail_group_id:0 +msgid "Mail Group" +msgstr "" + +#. module: mail +#: selection:res.partner,notification_email_send:0 +msgid "Comments and Emails" +msgstr "" + +#. module: mail +#: field:mail.alias,alias_defaults:0 +msgid "Default Values" +msgstr "" + +#. module: mail +#: code:addons/mail/res_users.py:89 +#, python-format +msgid "%s has joined the %s network." +msgstr "" + +#. module: mail +#: help:mail.group,image_small:0 +msgid "" +"Small-sized photo of the group. It is automatically resized as a 64x64px " +"image, with aspect ratio preserved. Use this field anywhere a small image is " +"required." +msgstr "" + +#. module: mail +#: view:mail.compose.message:0 +#: field:mail.message,partner_ids:0 +msgid "Recipients" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:142 +#, python-format +msgid "<<<" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:43 +#, python-format +msgid "Write to the followers of this document..." +msgstr "" + +#. module: mail +#: field:mail.group,group_public_id:0 +msgid "Authorized Group" +msgstr "" + +#. module: mail +#: view:mail.group:0 +msgid "Join Group" +msgstr "" + +#. module: mail +#: help:mail.mail,email_from:0 +msgid "Message sender, taken from user preferences." +msgstr "" + +#. module: mail +#: code:addons/mail/wizard/invite.py:40 +#, python-format +msgid "
You have been invited to follow a new document.
" +msgstr "" + +#. module: mail +#: field:mail.compose.message,parent_id:0 +#: field:mail.message,parent_id:0 +msgid "Parent Message" +msgstr "" + +#. module: mail +#: field:mail.compose.message,res_id:0 +#: field:mail.followers,res_id:0 +#: field:mail.message,res_id:0 +#: field:mail.wizard.invite,res_id:0 +msgid "Related Document ID" +msgstr "" + +#. module: mail +#: model:ir.actions.client,help:mail.action_mail_to_me_feeds +msgid "" +"

\n" +" No private message.\n" +"

\n" +" This list contains messages sent to you.\n" +"

\n" +" " +msgstr "" + +#. module: mail +#: model:mail.group,name:mail.group_rd +msgid "R&D" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:61 +#, python-format +msgid "/web/binary/upload_attachment" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Advanced" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:244 +#, python-format +msgid "Move to Inbox" +msgstr "" + +#. module: mail +#: code:addons/mail/wizard/mail_compose_message.py:165 +#, python-format +msgid "Re:" +msgstr "" + +#. module: mail +#: field:mail.compose.message,to_read:0 +#: field:mail.message,to_read:0 +msgid "To read" +msgstr "" + +#. module: mail +#: code:addons/mail/res_users.py:69 +#, python-format +msgid "" +"You may not create a user. To create new users, you should use the " +"\"Settings > Users\" menu." +msgstr "" + +#. module: mail +#: help:mail.followers,res_model:0 +#: help:mail.wizard.invite,res_model:0 +msgid "Model of the followed resource" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:320 +#, python-format +msgid "like" +msgstr "" + +#. module: mail +#: view:mail.compose.message:0 +#: view:mail.wizard.invite:0 +msgid "Cancel" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:47 +#, python-format +msgid "Share with my followers..." +msgstr "" + +#. module: mail +#: field:mail.notification,partner_id:0 +msgid "Contact" +msgstr "" + +#. module: mail +#: view:mail.group:0 +msgid "" +"Only the invited followers can read the\n" +" discussions on this group." +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_ir_ui_menu +msgid "ir.ui.menu" +msgstr "" + +#. module: mail +#: view:mail.message:0 +msgid "Has attachments" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "on" +msgstr "" + +#. module: mail +#: code:addons/mail/mail_message.py:915 +#, python-format +msgid "" +"The following partners chosen as recipients for the email have no email " +"address linked :" +msgstr "" + +#. module: mail +#: help:mail.alias,alias_defaults:0 +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_message_subtype +msgid "Message subtypes" +msgstr "" + +#. module: mail +#: help:mail.compose.message,notified_partner_ids:0 +#: help:mail.message,notified_partner_ids:0 +msgid "" +"Partners that have a notification pushing this message in their mailboxes" +msgstr "" + +#. module: mail +#: selection:mail.compose.message,type:0 +#: view:mail.mail:0 +#: selection:mail.message,type:0 +msgid "Comment" +msgstr "" + +#. module: mail +#: model:ir.actions.client,help:mail.action_mail_inbox_feeds +msgid "" +"

\n" +" Good Job! Your inbox is empty.\n" +"

\n" +" Your inbox contains private messages or emails sent to " +"you\n" +" as well as information related to documents or people " +"you\n" +" follow.\n" +"

\n" +" " +msgstr "" + +#. module: mail +#: field:mail.mail,notification:0 +msgid "Is Notification" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:188 +#, python-format +msgid "Compose a new message" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Send Now" +msgstr "" + +#. module: mail +#: code:addons/mail/mail_mail.py:74 +#, python-format +msgid "" +"Unable to send email, please configure the sender's email address or alias." +msgstr "" + +#. module: mail +#: help:res.users,alias_id:0 +msgid "" +"Email address internally associated with this user. Incoming emails will " +"appear in the user's notifications." +msgstr "" + +#. module: mail +#: field:mail.group,image:0 +msgid "Photo" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:56 +#: code:addons/mail/static/src/xml/mail.xml:191 +#: view:mail.compose.message:0 +#: view:mail.wizard.invite:0 +#, python-format +msgid "or" +msgstr "" + +#. module: mail +#: help:mail.compose.message,vote_user_ids:0 +#: help:mail.message,vote_user_ids:0 +msgid "Users that voted for this message" +msgstr "" + +#. module: mail +#: help:mail.group,alias_id:0 +msgid "" +"The email address associated with this group. New emails received will " +"automatically create new topics." +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Month" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Email Search" +msgstr "" + +#. module: mail +#: field:mail.compose.message,child_ids:0 +#: field:mail.message,child_ids:0 +msgid "Child Messages" +msgstr "" + +#. module: mail +#: field:mail.alias,alias_user_id:0 +msgid "Owner" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_res_users +msgid "Users" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_message +#: field:mail.mail,mail_message_id:0 +#: view:mail.message:0 +#: field:mail.notification,message_id:0 +#: field:mail.wizard.invite,message:0 +msgid "Message" +msgstr "" + +#. module: mail +#: help:mail.followers,res_id:0 +#: help:mail.wizard.invite,res_id:0 +msgid "Id of the followed resource" +msgstr "" + +#. module: mail +#: field:mail.compose.message,body:0 +#: field:mail.message,body:0 +msgid "Contents" +msgstr "" + +#. module: mail +#: model:ir.actions.act_window,name:mail.action_view_mail_alias +#: model:ir.ui.menu,name:mail.mail_alias_menu +msgid "Aliases" +msgstr "" + +#. module: mail +#: help:mail.message.subtype,description:0 +msgid "" +"Description that will be added in the message posted for this subtype. If " +"void, the name will be added instead." +msgstr "" + +#. module: mail +#: field:mail.compose.message,vote_user_ids:0 +#: field:mail.message,vote_user_ids:0 +msgid "Votes" +msgstr "" + +#. module: mail +#: view:mail.group:0 +msgid "Group" +msgstr "" + +#. module: mail +#: help:mail.compose.message,starred:0 +#: help:mail.message,starred:0 +msgid "Current user has a starred notification linked to this message" +msgstr "" + +#. module: mail +#: field:mail.group,public:0 +msgid "Privacy" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Notification" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/js/mail.js:650 +#, python-format +msgid "Please complete partner's informations" +msgstr "" + +#. module: mail +#: view:mail.wizard.invite:0 +msgid "Add Followers" +msgstr "" + +#. module: mail +#: view:mail.compose.message:0 +msgid "Followers of selected items and" +msgstr "" + +#. module: mail +#: field:mail.alias,alias_force_thread_id:0 +msgid "Record Thread ID" +msgstr "" + +#. module: mail +#: model:ir.ui.menu,name:mail.mail_group_root +msgid "My Groups" +msgstr "" + +#. module: mail +#: model:ir.actions.client,help:mail.action_mail_archives_feeds +msgid "" +"

\n" +" No message found and no message sent yet.\n" +"

\n" +" Click on the top-right icon to compose a message. This\n" +" message will be sent by email if it's an internal " +"contact.\n" +"

\n" +" " +msgstr "" + +#. module: mail +#: view:mail.mail:0 +#: field:mail.mail,state:0 +msgid "Status" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +#: selection:mail.mail,state:0 +msgid "Outgoing" +msgstr "" + +#. module: mail +#: selection:res.partner,notification_email_send:0 +msgid "All feeds" +msgstr "" + +#. module: mail +#: help:mail.compose.message,record_name:0 +#: help:mail.message,record_name:0 +msgid "Name get of the related document." +msgstr "" + +#. module: mail +#: model:ir.actions.act_window,name:mail.action_view_notifications +#: model:ir.model,name:mail.model_mail_notification +#: model:ir.ui.menu,name:mail.menu_email_notifications +#: field:mail.compose.message,notification_ids:0 +#: view:mail.message:0 +#: field:mail.message,notification_ids:0 +#: view:mail.notification:0 +msgid "Notifications" +msgstr "" + +#. module: mail +#: view:mail.alias:0 +msgid "Search Alias" +msgstr "" + +#. module: mail +#: help:mail.alias,alias_force_thread_id:0 +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" + +#. module: mail +#: help:mail.message.subtype,name:0 +msgid "" +"Message subtype gives a more precise type on the message, especially for " +"system notifications. For example, it can be a notification related to a new " +"record (New), or to a stage change in a process (Stage change). Message " +"subtypes allow to precisely tune the notifications the user want to receive " +"on its wall." +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "by" +msgstr "" + +#. module: mail +#: model:mail.group,name:mail.group_best_sales_practices +msgid "Best Sales Practices" +msgstr "" + +#. module: mail +#: selection:mail.group,public:0 +msgid "Selected Group Only" +msgstr "" + +#. module: mail +#: field:mail.group,message_is_follower:0 +#: field:mail.thread,message_is_follower:0 +#: field:res.partner,message_is_follower:0 +msgid "Is a Follower" +msgstr "" + +#. module: mail +#: view:mail.alias:0 +#: view:mail.mail:0 +msgid "User" +msgstr "" + +#. module: mail +#: view:mail.group:0 +msgid "Groups" +msgstr "" + +#. module: mail +#: view:mail.message:0 +msgid "Messages Search" +msgstr "" + +#. module: mail +#: field:mail.compose.message,date:0 +#: field:mail.message,date:0 +msgid "Date" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:34 +#, python-format +msgid "Post" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Extended Filters..." +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:122 +#, python-format +msgid "To:" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:193 +#, python-format +msgid "Write to my followers" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: mail +#: field:mail.message.subtype,default:0 +msgid "Default" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:294 +#, python-format +msgid "show more message" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:246 +#, python-format +msgid "Mark as Todo" +msgstr "" + +#. module: mail +#: help:mail.message.subtype,parent_id:0 +msgid "Parent subtype, used for automatic subscription." +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_wizard_invite +msgid "Invite wizard" +msgstr "" + +#. module: mail +#: field:mail.group,message_summary:0 +#: field:mail.thread,message_summary:0 +#: field:res.partner,message_summary:0 +msgid "Summary" +msgstr "" + +#. module: mail +#: help:mail.message.subtype,res_model:0 +msgid "" +"Model the subtype applies to. If False, this subtype applies to all models." +msgstr "" + +#. module: mail +#: field:mail.compose.message,subtype_id:0 +#: field:mail.followers,subtype_ids:0 +#: field:mail.message,subtype_id:0 +#: view:mail.message.subtype:0 +msgid "Subtype" +msgstr "" + +#. module: mail +#: view:mail.group:0 +msgid "Group Form" +msgstr "" + +#. module: mail +#: field:mail.compose.message,starred:0 +#: field:mail.message,starred:0 +#: field:mail.notification,starred:0 +msgid "Starred" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:296 +#, python-format +msgid "more messages" +msgstr "" + +#. module: mail +#: code:addons/mail/update.py:93 +#, python-format +msgid "Error" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail_followers.xml:13 +#, python-format +msgid "Following" +msgstr "" + +#. module: mail +#: sql_constraint:mail.alias:0 +msgid "" +"Unfortunately this email alias is already used, please choose a unique one" +msgstr "" + +#. module: mail +#: help:mail.alias,alias_user_id:0 +msgid "" +"The owner of records created upon receiving emails on this alias. If this " +"field is not set the system will attempt to find the right owner based on " +"the sender (From) address, or will use the Administrator account if no " +"system user is found for that address." +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail_followers.xml:52 +#, python-format +msgid "And" +msgstr "" + +#. module: mail +#: field:mail.compose.message,message_id:0 +#: field:mail.message,message_id:0 +msgid "Message-Id" +msgstr "" + +#. module: mail +#: help:mail.group,image:0 +msgid "" +"This field holds the image used as photo for the group, limited to " +"1024x1024px." +msgstr "" + +#. module: mail +#: field:mail.compose.message,attachment_ids:0 +#: view:mail.mail:0 +#: field:mail.message,attachment_ids:0 +msgid "Attachments" +msgstr "" + +#. module: mail +#: field:mail.compose.message,record_name:0 +#: field:mail.message,record_name:0 +msgid "Message Record Name" +msgstr "" + +#. module: mail +#: field:mail.mail,email_cc:0 +msgid "Cc" +msgstr "" + +#. module: mail +#: help:mail.notification,starred:0 +msgid "Starred message that goes into the todo mailbox" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:125 +#: view:mail.compose.message:0 +#, python-format +msgid "Followers of" +msgstr "" + +#. module: mail +#: help:mail.mail,auto_delete:0 +msgid "Permanently delete this email after sending it, to save space" +msgstr "" + +#. module: mail +#: model:ir.actions.client,name:mail.action_mail_group_feeds +msgid "Discussion Group" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:242 +#, python-format +msgid "Done" +msgstr "" + +#. module: mail +#: model:mail.message.subtype,name:mail.mt_comment +msgid "Discussions" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail_followers.xml:11 +#, python-format +msgid "Follow" +msgstr "" + +#. module: mail +#: field:mail.group,name:0 +msgid "Name" +msgstr "" + +#. module: mail +#: model:mail.group,name:mail.group_all_employees +msgid "Whole Company" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:131 +#: code:addons/mail/static/src/xml/mail.xml:278 +#: view:mail.compose.message:0 +#, python-format +msgid "and" +msgstr "" + +#. module: mail +#: help:mail.mail,body_html:0 +msgid "Rich-text/HTML message" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +msgid "Creation Month" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:306 +#, python-format +msgid "Compose new Message" +msgstr "" + +#. module: mail +#: field:mail.group,menu_id:0 +msgid "Related Menu" +msgstr "" + +#. module: mail +#: view:mail.message:0 +msgid "Content" +msgstr "" + +#. module: mail +#: field:mail.mail,email_to:0 +msgid "To" +msgstr "" + +#. module: mail +#: field:mail.compose.message,notified_partner_ids:0 +#: field:mail.message,notified_partner_ids:0 +msgid "Notified partners" +msgstr "" + +#. module: mail +#: help:mail.group,public:0 +msgid "" +"This group is visible by non members. Invisible groups can add " +"members through the invite button." +msgstr "" + +#. module: mail +#: model:mail.group,name:mail.group_board +msgid "Board meetings" +msgstr "" + +#. module: mail +#: constraint:mail.alias:0 +msgid "" +"Invalid expression, it must be a literal python dictionary definition e.g. " +"\"{'field': 'value'}\"" +msgstr "" + +#. module: mail +#: field:mail.alias,alias_model_id:0 +msgid "Aliased Model" +msgstr "" + +#. module: mail +#: help:mail.compose.message,message_id:0 +#: help:mail.message,message_id:0 +msgid "Message unique identifier" +msgstr "" + +#. module: mail +#: field:mail.group,description:0 +#: field:mail.message.subtype,description:0 +msgid "Description" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_followers +msgid "Document Followers" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail_followers.xml:35 +#, python-format +msgid "Remove this follower" +msgstr "" + +#. module: mail +#: selection:res.partner,notification_email_send:0 +msgid "Never" +msgstr "" + +#. module: mail +#: field:mail.mail,mail_server_id:0 +msgid "Outgoing mail server" +msgstr "" + +#. module: mail +#: code:addons/mail/mail_message.py:919 +#, python-format +msgid "Partners email addresses not found" +msgstr "" + +#. module: mail +#: view:mail.mail:0 +#: selection:mail.mail,state:0 +msgid "Sent" +msgstr "" + +#. module: mail +#: field:mail.mail,body_html:0 +msgid "Rich-text Contents" +msgstr "" + +#. module: mail +#: help:mail.compose.message,to_read:0 +#: help:mail.message,to_read:0 +msgid "Current user has an unread notification linked to this message" +msgstr "" + +#. module: mail +#: help:res.partner,notification_email_send:0 +msgid "" +"Choose in which case you want to receive an email when you receive new feeds." +msgstr "" + +#. module: mail +#: model:ir.actions.act_window,name:mail.action_view_groups +#: model:ir.ui.menu,name:mail.mail_allgroups +msgid "Join a group" +msgstr "" + +#. module: mail +#: model:ir.actions.client,help:mail.action_mail_group_feeds +msgid "" +"

\n" +" No message in this group.\n" +"

\n" +" " +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:213 +#, python-format +msgid "Please, wait while the file is uploading." +msgstr "" + +#. module: mail +#: view:mail.group:0 +msgid "" +"This group is visible by everyone,\n" +" including your customers if you " +"installed\n" +" the portal module." +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:243 +#, python-format +msgid "Set back to Todo" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:128 +#, python-format +msgid "this document" +msgstr "" + +#. module: mail +#: field:mail.compose.message,filter_id:0 +msgid "Filters" +msgstr "" + +#. module: mail +#: field:res.partner,notification_email_send:0 +msgid "Receive Feeds by Email" +msgstr "" + +#. module: mail +#: help:base.config.settings,alias_domain:0 +msgid "" +"If you have setup a catch-all email domain redirected to the OpenERP server, " +"enter the domain name here." +msgstr "" + +#. module: mail +#: model:ir.actions.act_window,name:mail.action_view_mail_message +#: model:ir.ui.menu,name:mail.menu_mail_message +#: field:mail.group,message_ids:0 +#: view:mail.message:0 +#: field:mail.thread,message_ids:0 +#: field:res.partner,message_ids:0 +msgid "Messages" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:141 +#, python-format +msgid "others..." +msgstr "" + +#. module: mail +#: model:ir.actions.client,name:mail.action_mail_star_feeds +#: model:ir.ui.menu,name:mail.mail_starfeeds +msgid "To-do" +msgstr "" + +#. module: mail +#: view:mail.alias:0 +#: field:mail.alias,alias_name:0 +#: field:mail.group,alias_id:0 +#: field:res.users,alias_id:0 +msgid "Alias" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_mail +msgid "Outgoing Mails" +msgstr "" + +#. module: mail +#: help:mail.compose.message,notification_ids:0 +#: help:mail.message,notification_ids:0 +msgid "" +"Technical field holding the message notifications. Use notified_partner_ids " +"to access notified partners." +msgstr "" + +#. module: mail +#: model:ir.ui.menu,name:mail.mail_feeds +#: model:ir.ui.menu,name:mail.mail_feeds_main +msgid "Messaging" +msgstr "" + +#. module: mail +#: view:mail.alias:0 +#: field:mail.message.subtype,res_model:0 +msgid "Model" +msgstr "" + +#. module: mail +#: view:mail.message:0 +msgid "Unread" +msgstr "" + +#. module: mail +#: help:mail.followers,subtype_ids:0 +msgid "" +"Message subtypes followed, meaning subtypes that will be pushed onto the " +"user's Wall." +msgstr "" + +#. module: mail +#: help:mail.group,message_ids:0 +#: help:mail.thread,message_ids:0 +#: help:res.partner,message_ids:0 +msgid "Messages and communication history" +msgstr "" + +#. module: mail +#: help:mail.mail,references:0 +msgid "Message references, such as identifiers of previous messages" +msgstr "" + +#. module: mail +#: field:mail.compose.message,composition_mode:0 +msgid "Composition mode" +msgstr "" + +#. module: mail +#: field:mail.compose.message,model:0 +#: field:mail.followers,res_model:0 +#: field:mail.message,model:0 +#: field:mail.wizard.invite,res_model:0 +msgid "Related Document Model" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:321 +#, python-format +msgid "unlike" +msgstr "" + +#. module: mail +#: help:mail.compose.message,author_id:0 +#: help:mail.message,author_id:0 +msgid "" +"Author of the message. If not set, email_from may hold an email address that " +"did not match any partner." +msgstr "" + +#. module: mail +#: help:mail.mail,email_cc:0 +msgid "Carbon copy message recipients" +msgstr "" + +#. module: mail +#: field:mail.alias,alias_domain:0 +msgid "Alias domain" +msgstr "" + +#. module: mail +#: code:addons/mail/update.py:93 +#, python-format +msgid "Error during communication with the publisher warranty server." +msgstr "" + +#. module: mail +#: selection:mail.group,public:0 +msgid "Private" +msgstr "" + +#. module: mail +#: model:ir.actions.client,help:mail.action_mail_star_feeds +msgid "" +"

\n" +" No todo.\n" +"

\n" +" When you process messages in your inbox, you can mark " +"some\n" +" as todo. From this menu, you can process all your " +"todo.\n" +"

\n" +" " +msgstr "" + +#. module: mail +#: selection:mail.mail,state:0 +msgid "Delivery Failed" +msgstr "" + +#. module: mail +#: field:mail.compose.message,partner_ids:0 +msgid "Additional contacts" +msgstr "" + +#. module: mail +#: help:mail.compose.message,parent_id:0 +#: help:mail.message,parent_id:0 +msgid "Initial thread message." +msgstr "" + +#. module: mail +#: model:mail.group,name:mail.group_hr_policies +msgid "HR Policies" +msgstr "" + +#. module: mail +#: selection:res.partner,notification_email_send:0 +msgid "Emails only" +msgstr "" + +#. module: mail +#: model:ir.actions.client,name:mail.action_mail_inbox_feeds +#: model:ir.ui.menu,name:mail.mail_inboxfeeds +msgid "Inbox" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/xml/mail.xml:58 +#, python-format +msgid "File" +msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/js/many2many_tags_email.js:63 +#, python-format +msgid "Please complete partner's informations and Email" +msgstr "" + +#. module: mail +#: model:ir.actions.act_window,name:mail.action_view_message_subtype +#: model:ir.ui.menu,name:mail.menu_message_subtype +msgid "Subtypes" +msgstr "" + +#. module: mail +#: model:ir.model,name:mail.model_mail_alias +msgid "Email Aliases" +msgstr "" + +#. module: mail +#: field:mail.group,image_small:0 +msgid "Small-sized photo" +msgstr "" + +#. module: mail +#: help:mail.mail,reply_to:0 +msgid "Preferred response address for the message" +msgstr "" 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 "%s" % (user.company_id.website, user.company_id.name) or user.company_id.name else: company = user.name - signature_company = _('Send by %(company)s using %(openerp)s.' % { + signature_company = _('Send by %(company)s using %(openerp)s.') % { 'company': company, 'openerp': "OpenERP" - }) + } 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 ' - 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: -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 -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 - - - - =20 - - =20 - =20 - -

Please call me as soon as possible this afternoon!

- -

--
- Sylvie -

- - -------=_Part_4200734_24778174.1344608186754-- -""" - -MAIL_TEMPLATE_PLAINTEXT = """Return-Path: -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 -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 ', 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 = '' - 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, '

\nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n
', - 'plaintext mail incorrectly parsed') - - # Do: post a new message, with a known partner - test_msg_id = '' - TEMPLATE_MOD = MAIL_TEMPLATE_PLAINTEXT.replace('Sylvie Lelitre ', user_raoul.email) - mail_new = TEMPLATE_MOD.format(to='Friendly Frogs ', 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 = '' - TEMPLATE_MOD = MAIL_TEMPLATE_PLAINTEXT.replace('Sylvie Lelitre ', '_abcd_') - mail_new = TEMPLATE_MOD.format(to='Friendly Frogs ', 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") + 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") - # 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 , other@gmail.com', subject='Re: 1', - extra='In-Reply-To: %s' % msg1.message_id) - self.mail_group.message_process(cr, uid, None, reply_msg) + 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") - # 2. References header - reply_msg2 = MAIL_TEMPLATE.format(to='Pretty Pigs , 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) + 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') - # 3. Subject contains [] + model passed to message+process -> only attached to group, not to mail - reply_msg3 = MAIL_TEMPLATE.format(to='Pretty Pigs , other@gmail.com', - extra='', subject='Re: [%s] 1' % self.group_pigs_id) - self.mail_group.message_process(cr, uid, 'mail.group', reply_msg3) - 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') - - 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 = '

Pigs rules

' - _mail_body1 = '

Pigs rules

' - _mail_signature1 = '

Raoul

' - _mail_bodyalt1 = 'Pigs rules\n' - _mail_signaturealt1 = '\nRaoul\n' - _body2 = 'Pigs rules' - _mail_body2 = '

Pigs rules

' - _mail_signature2 = '

Raoul

' - _mail_bodyalt2 = 'Pigs rules\n' - _mail_signaturealt2 = '\nRaoul\n' - _attachments = [('First', 'My first attachment'), ('Second', 'My second attachment')] + _body2 = 'Pigs rocks' + _attachments = [ + ('List1', 'My first attachment'), + ('List2', 'My second attachment') + ] - # ---------------------------------------- - # CASE1: post comment, body and subject specified - # ---------------------------------------- + # -------------------------------------------------- + # CASE1: post comment + partners + attachments + # -------------------------------------------------- - # 1. Post a new comment on Pigs + # 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 ', 'Bert Tartopoils '] + 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 ', + '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-" ', + '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('

', 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'}) - # 1. Post a new email comment on Pigs + # -------------------------------------------------- + # CASE2: reply + parent_id + parent notification + # -------------------------------------------------- + + # 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 ', u'Bert Tartopoils ', u'Carine Poilvache ', u'D\xe9d\xe9 Grosbedon '] + # 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') + self.assertEqual(sent_email['email_from'], 'Raoul Grosbedon ', + '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" ', + '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('

', 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') - # 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]) + # 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 rule' - _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 - # ---------------------------------------- + # -------------------------------------------------- + # CASE1: wizard + partners + context keys + # -------------------------------------------------- - # 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'}) + # 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') - # 2. Post the comment, get created message - mail_compose.send_mail(cr, uid, [compose_id], {'mail_post_autofollow': True}) + # Test: mail.compose.message: composition_mode, model, 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') + + # 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, '

%s

' % _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) + + # 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') + + # Test: mail.message: subject, body inside p + self.assertEqual(message.subject, _subject, 'compose wizard: mail.message incorrect subject') + self.assertEqual(message.body, '

%s

' % _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 = [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') + 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 to last comment with attachments - # ---------------------------------------- + # -------------------------------------------------- + # CASE2: reply + attachments + # -------------------------------------------------- - # 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}) + # 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:
Pigs rules
', 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, '

%s

' % group_pigs.description, 'mail.message body incorrect') - self.assertEqual(message2.subject, _subject, 'mail.message subject incorrect') - self.assertEqual(message2.body, '

%s

' % 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, '

%s

' % 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, '

%s

' % 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. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.addons.mail.tests.test_mail_base import TestMailBase + +MAIL_TEMPLATE = """Return-Path: +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 + + + + =20 + + =20 + =20 + +

Please call me as soon as possible this afternoon!

+ +

--
+ Sylvie +

+ + +------=_Part_4200734_24778174.1344608186754-- +""" + +MAIL_TEMPLATE_PLAINTEXT = """Return-Path: +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 +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 ', + 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 ', 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 ', + 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 ', + 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 ', + 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='') + # 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, '

\nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n
', + '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 , other@gmail.com', subject='Re: 1', + extra='', email_from='Sylvie Lelitre ', + 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 ', 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 [] + 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 , 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) " -"\n" -"Language-Team: \n" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \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 \n" +"Language-Team: Spanish (Mexico) \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" - -#. module: mrp -#: model:ir.actions.act_window,help:mrp.mrp_production_action +#: help:mrp.config.settings,module_mrp_repair:0 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." +"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 "" -"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." - -#. module: mrp -#: field:mrp.production,workcenter_lines:0 -msgid "Work Centers Utilisation" -msgstr "Utilización del centro de producción" - -#. 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 +#: help:mrp.production,location_src_id:0 +msgid "Location where the system will look for components." +msgstr "" + +#. module: mrp +#: field:mrp.production,workcenter_lines:0 +msgid "Work Centers Utilisation" +msgstr "" + +#. module: mrp +#: view:mrp.routing.workcenter:0 +msgid "Routing Work Centers" +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 +#: view:mrp.production:0 +msgid "Manufacturing Orders which are currently in production." +msgstr "" + +#. module: mrp +#: 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 #: model:process.transition,name:mrp.process_transition_servicerfq0 #: model:process.transition,name:mrp.process_transition_stockrfq0 msgid "To Buy" -msgstr "A comprar" - -#. module: mrp -#: view:mrp.production.order:0 -msgid "Raw Material Location" -msgstr "Ubicación de materias primas" - -#. 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." 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 "" +"

\n" +" Click to create a routing.\n" +"

\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" +"

\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" - -#. module: mrp -#: view:mrp.installer:0 -msgid "title" -msgstr "título" - -#. module: mrp -#: model:ir.ui.menu,name:mrp.menu_mrp_bom -msgid "Master Data" -msgstr "Datos principales" - -#. module: mrp -#: 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 "" -"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 +#: view:mrp.config.settings:0 +msgid "Master Data" +msgstr "" + +#. module: mrp +#: field:mrp.config.settings,module_mrp_byproduct:0 +msgid "Produce several products from one manufacturing order" +msgstr "" + +#. module: mrp +#: help:mrp.config.settings,group_mrp_properties:0 +msgid "" +"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 "" #. 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" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: field:mrp.production,state:0 +msgid "Status" +msgstr "" #. 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" +msgstr "" #. module: mrp -#: selection:mrp.production.order,month:0 -msgid "August" -msgstr "Agosto" - -#. 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" - -#. module: mrp -#: model:ir.model,name:mrp.model_mrp_production_order -msgid "Production Order Report" -msgstr "Informe de órden de producción" - -#. 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 "" +"

\n" +" Click to create a manufacturing order. \n" +"

\n" +" A manufacuring order, based on a bill of materials, will\n" +" consume raw materials and produce finished products.\n" +"

\n" +" Manufacturing orders are usually proposed automatically " +"based\n" +" on customer requirements or automated rules like the " +"minimum\n" +" stock rule.\n" +"

\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" - -#. module: mrp -#: help:mrp.installer,mrp_repair:0 -msgid "" -"Enables warranty and repair management (and their impact on stocks and " -"invoicing)." 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 +#: model:ir.actions.act_window,help:mrp.mrp_property_action +msgid "" +"

\n" +" Click to create a new property.\n" +"

\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" +"

\n" +" " +msgstr "" + +#. module: mrp +#: 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 %s 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,165 +489,140 @@ 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" - -#. 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." 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" - -#. 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." - -#. module: mrp -#: model:process.transition,note:mrp.process_transition_billofmaterialrouting0 -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" - -#. 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." - -#. 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" - -#. module: mrp -#: field:report.mrp.inout,value:0 -msgid "Stock value" -msgstr "Valor del stock" - -#. module: mrp -#: model:ir.actions.act_window,name:mrp.action_product_bom_structure -msgid "Product BoM Structure" -msgstr "Estructura LdM del producto" - -#. 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" - -#. module: mrp -#: selection:mrp.production.order,month:0 -msgid "March" -msgstr "Marzo" - -#. module: mrp -#: field:mrp.bom,child_complete_ids:0 -msgid "BoM Hierarchy" -msgstr "Estructura LdM" - -#. 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" #. module: mrp #: help:mrp.workcenter,costs_cycle:0 msgid "Specify Cost of Work Center per cycle." msgstr "" +#. module: mrp +#: model:process.transition,name:mrp.process_transition_bom0 +msgid "Manufacturing decomposition" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_serviceproduct1 +msgid "For Services." +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_orderrfq0 +#: model:process.node,note:mrp.process_node_rfq0 +msgid "Request for Quotation." +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 +msgid "" +"The Bill of Material is linked to a routing, i.e. the succession of work " +"centers." +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Force Reservation" +msgstr "" + +#. module: mrp +#: field:report.mrp.inout,value:0 +msgid "Stock value" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.action_product_bom_structure +msgid "Product BoM Structure" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Search Production" +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_stockproduction0 +msgid "To Produce" +msgstr "" + +#. module: mrp +#: 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 "" +"

\n" +" Click to add a component to a bill of material.\n" +"

\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" +"

\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 "" +"

\n" +" Click to add a work center.\n" +"

\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" +"

\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 "Mark as Started" +msgstr "" #. module: mrp #: view:mrp.production:0 msgid "Partial" -msgstr "Parcial" - -#. module: mrp -#: selection:mrp.production.order,month:0 -msgid "September" -msgstr "Septiembre" +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,188 +839,282 @@ 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 +#: model:ir.actions.act_window,help:mrp.mrp_production_action_planning +msgid "" +"

\n" +" Click to start a new manufacturing order. \n" +"

\n" +" A manufacuring order, based on a bill of materials, will\n" +" consume raw materials and produce finished products.\n" +"

\n" +" Manufacturing orders are usually proposed automatically " +"based\n" +" on customer requirements or automated rules like the " +"minimum\n" +" stock rule.\n" +"

\n" +" " +msgstr "" #. module: mrp #: field:mrp.bom,type:0 msgid "BoM Type" -msgstr "Tipo de lista de materiales" +msgstr "" #. module: mrp -#: view:mrp.production.order:0 -msgid "Extended Filters..." -msgstr "Filtros extendidos..." - -#. 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" +msgstr "" #. module: mrp -#: model:ir.ui.menu,name:mrp.menus_dash_mrp -msgid "Dashboard" -msgstr "Tablero" - -#. 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" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_servicerfq0 +msgid "" +"If the service has a 'Buy' supply method, this creates a RFQ, a " +"subcontracting demand for instance." +msgstr "" #. module: mrp #: view:mrp.production:0 -msgid "Split in production lots" -msgstr "Dividir en lotes de producción" +msgid "Late" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_servicemts0 +msgid "Make to stock" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +msgid "BOM Name" +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 "Manufacturing Orders" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Awaiting Raw Materials" +msgstr "" + +#. module: mrp +#: field:mrp.bom,position:0 +msgid "Internal Reference" +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "Production Order N° :" +msgstr "" + +#. module: mrp +#: field:mrp.product.produce,mode:0 +msgid "Mode" +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: help:mrp.config.settings,module_mrp_jit:0 +msgid "" +"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 "" + +#. module: mrp +#: help:mrp.workcenter,costs_hour:0 +msgid "Specify Cost of Work Center per hour." +msgstr "" #. module: mrp #: help:mrp.workcenter,capacity_per_cycle:0 @@ -1026,1257 +1123,140 @@ msgid "" "Center represents a team of 5 workers, the capacity per cycle is 5." msgstr "" -#. module: mrp -#: model:process.transition,note:mrp.process_transition_servicerfq0 -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" - -#. 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" - -#. module: mrp -#: 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" - -#. module: mrp -#: view:mrp.production:0 -msgid "Source Loc." -msgstr "Ubic. orígen" - -#. 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" - -#. module: mrp -#: field:mrp.bom,name:0 -#: report:mrp.production.order:0 -#: field:mrp.production.product.line,name: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" - -#. 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." -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" - -#. module: mrp -#: report:bom.structure:0 -msgid "]" -msgstr "]" - -#. module: mrp -#: field:mrp.workcenter.load,measure_unit:0 -msgid "Amount measuring unit" -msgstr "Importe unidad de medida" - -#. module: mrp -#: model:ir.actions.act_window,help:mrp.mrp_production_action_planning -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." -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!" - #. module: mrp #: model:ir.actions.act_window,name:mrp.mrp_production_action3 msgid "Manufacturing Orders in Progress" -msgstr "Órdenes de producción en progreso" +msgstr "" #. 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" -" " +#: 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" - -#. 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." 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" +#: field:mrp.bom,message_unread:0 +#: field:mrp.production,message_unread:0 +#: field:mrp.production.workcenter.line,message_unread:0 +msgid "Unread Messages" +msgstr "" + +#. module: mrp +#: 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." - -#. module: mrp -#: help:mrp.production,picking_id:0 -msgid "" -"This is the Internal Picking List that brings the finished product to the " -"production plan" 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" - -#. module: mrp -#: model:process.transition,note:mrp.process_transition_producttostockrules0 -msgid "" -"The Minimum Stock Rule is an automatic procurement rule based on a mini and " -"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" - -#. module: mrp -#: view:mrp.installer:0 -msgid "Configure Your Manufacturing Resource Planning Application" -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" - -#. module: mrp -#: model:ir.model,name:mrp.model_stock_picking -msgid "Picking List" -msgstr "Albarán" - -#. module: mrp -#: view:mrp.production.order:0 -msgid "Month -1" -msgstr "Mes -1" - -#. module: mrp -#: code:addons/mrp/mrp.py:924 -#, python-format -msgid "Manufacturing order '%s' is scheduled for the %s." -msgstr "Órden de producción '%s' planificada para el '%s'" - -#. module: mrp -#: report:mrp.production.order:0 -msgid "Production Order N° :" -msgstr "Núm. orden producción :" - -#. module: mrp -#: code:addons/mrp/mrp.py:640 -#, 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" - -#. 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." - -#. 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" - -#. 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." -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 -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" - -#. 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" - -#. module: mrp -#: code:addons/mrp/report/price.py:130 -#, 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" - -#. 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" - -#. module: mrp -#: view:mrp.workcenter:0 -msgid "Search for mrp workcenter" -msgstr "Buscar por centro de producción mrp" - -#. module: mrp -#: view:mrp.bom:0 -msgid "BoM Structure" -msgstr "Despiece de la LdM" - -#. module: mrp -#: field:mrp.production,date_start:0 -#: field:mrp.production.order,date_start:0 -msgid "Start Date" -msgstr "Fecha inicial" - -#. module: mrp -#: field:mrp.workcenter,costs_hour_account_id:0 -msgid "Hour Account" -msgstr "Cuenta horas" - -#. module: mrp -#: view:mrp.production:0 -msgid "Destination Loc." -msgstr "Ubic. destino" - -#. module: mrp -#: field:mrp.production.order,product_id2:0 -msgid "Product Consumed" -msgstr "Producto consumido" - -#. module: mrp -#: view:mrp.production:0 -msgid "Pending" -msgstr "Pendiente" - -#. module: mrp -#: field:mrp.bom,active:0 -#: field:mrp.routing,active:0 -msgid "Active" -msgstr "Activo" - -#. module: mrp -#: model:process.node,name:mrp.process_node_procureproducts0 -msgid "Procure Products" -msgstr "Abastecer productos" - -#. 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" - -#. module: mrp -#: model:ir.actions.act_window,name:mrp.mrp_property_action -#: model:ir.ui.menu,name:mrp.menu_mrp_property_action -#: 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" - -#. 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 !" -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" - -#. module: mrp -#: model:ir.model,name:mrp.model_change_production_qty -msgid "Change Quantity of Products" -msgstr "Cambiar cantidad de productos" - -#. 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." - -#. module: mrp -#: view:mrp.production.order:0 -msgid "Current" -msgstr "Actual" - -#. module: mrp -#: field:mrp.workcenter,costs_general_account_id:0 -msgid "General Account" -msgstr "Cuenta general" - -#. module: mrp -#: report:mrp.production.order:0 -msgid "SO Number" -msgstr "Número venta" - -#. module: mrp -#: selection:mrp.production,state:0 -#: view:mrp.production.order:0 -#: selection:mrp.production.order,state:0 -msgid "Done" -msgstr "Realizado" - -#. module: mrp -#: model:ir.model,name:mrp.model_stock_change_standard_price -msgid "Change Standard Price" -msgstr "Cambio de precio estándar" - -#. module: mrp -#: field:mrp.production,origin:0 -#: report:mrp.production.order:0 -#: field:mrp.production.order,origin:0 -msgid "Source Document" -msgstr "Documento origen" - -#. module: mrp -#: selection:mrp.production,priority:0 -#: selection:mrp.production.order,priority:0 -msgid "Not urgent" -msgstr "No urgente" - -#. 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." -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.model,name:mrp.model_mrp_workcenter -#: 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" - -#. module: mrp -#: field:mrp.workcenter,capacity_per_cycle:0 -msgid "Capacity per Cycle" -msgstr "Capacidad por ciclo" - -#. module: mrp -#: model:ir.model,name:mrp.model_product_product -#: view:mrp.bom:0 -#: field:mrp.bom,product_id:0 -#: 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" - -#. module: mrp -#: view:mrp.production:0 -#: field:mrp.production,hour_total:0 -msgid "Total Hours" -msgstr "Total horas" - -#. 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" - -#. module: mrp -#: view:mrp.product_price:0 -msgid "Print Cost Structure of Product." -msgstr "Imprimir la estructura de costes del producto" - -#. 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" - -#. 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" - -#. 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" - -#. module: mrp -#: view:mrp.production.lot.line:0 -msgid "Production Products" -msgstr "Productos producidos" - -#. module: mrp -#: field:mrp.production,date_finished:0 -#: field:mrp.production.order,date_finished:0 -msgid "End Date" -msgstr "Fecha final" - -#. module: mrp -#: field:mrp.workcenter,resource_id:0 -msgid "Resource" -msgstr "Recurso" - -#. 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" - -#. module: mrp -#: selection:mrp.production,priority:0 -#: selection:mrp.production.order,priority:0 -msgid "Very Urgent" -msgstr "Muy urgente" - -#. module: mrp -#: help:mrp.bom,routing_id:0 -msgid "" -"The list of operations (list of work centers) to produce the finished " -"product. The routing is mainly used to compute work center costs during " -"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" - -#. module: mrp -#: view:mrp.property.group:0 -msgid "Properties categories" -msgstr "Categorías de propiedades" - -#. 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" - -#. 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" - -#. 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" - -#. module: mrp -#: help:mrp.product.produce,mode:0 -msgid "" -"'Consume only' mode will only consume the products with the quantity " -"selected.\n" -"'Consume & Produce' mode will consume as well as produce the products with " -"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" - -#. module: mrp -#: field:mrp.workcenter,costs_cycle:0 -msgid "Cost per cycle" -msgstr "Coste por ciclo" - -#. module: mrp -#: model:process.node,name:mrp.process_node_serviceproduct0 -#: model:process.node,name:mrp.process_node_serviceproduct1 -msgid "Service" -msgstr "Servicio" - -#. module: mrp -#: selection:mrp.production,state:0 -#: selection:mrp.production.order,state:0 -msgid "Cancelled" -msgstr "Cancelado" - -#. module: mrp -#: view:mrp.production.order:0 -msgid "BOM" -msgstr "LdM" - -#. module: mrp -#: help:mrp.bom,product_uom:0 -msgid "" -"UoM (Unit of Measure) is the unit of measurement for the inventory control" -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 -msgid "" -"The Bill of Material is the product's decomposition. The components (that " -"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" - -#. module: mrp -#: field:mrp.workcenter,time_cycle:0 -msgid "Time for 1 cycle (hour)" -msgstr "Tiempo para 1 ciclo (horas)" - -#. 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" - -#. module: mrp -#: model:process.node,note:mrp.process_node_productminimumstockrule0 -msgid "Automatic procurement rule" -msgstr "Regla de abastecimiento automática" - -#. module: mrp -#: view:mrp.production:0 -msgid "Compute Data" -msgstr "Calcular datos" - -#. module: mrp -#: field:mrp.production,product_uos_qty:0 -msgid "Product UoS Qty" -msgstr "Cant. UdV del producto" - -#. module: mrp -#: code:addons/mrp/report/price.py:130 -#: view:mrp.bom:0 -#, python-format -msgid "Components" -msgstr "Componentes" - -#. module: mrp -#: report:bom.structure:0 -#: model:ir.actions.report.xml,name:mrp.report_bom_structure -msgid "BOM Structure" -msgstr "Despiece de la LdM" - -#. module: mrp -#: field:mrp.bom,date_stop:0 -msgid "Valid Until" -msgstr "Válido hasta" - -#. module: mrp -#: field:mrp.bom,date_start:0 -msgid "Valid From" -msgstr "Válido desde" - -#. module: mrp -#: selection:mrp.bom,type:0 -msgid "Normal BoM" -msgstr "LdM normal" - -#. module: mrp -#: field:res.company,manufacturing_lead:0 -msgid "Manufacturing Lead Time" -msgstr "Tiempo entrega de fabricación" - -#. 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" - -#. module: mrp -#: model:ir.actions.act_window,help:mrp.action_report_in_out_picking_tree -msgid "" -"Weekly Stock Value Variation enables you to track the stock value evolution " -"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" - -#. module: mrp -#: field:mrp.bom,product_efficiency:0 -msgid "Manufacturing Efficiency" -msgstr "Eficiencia de la producción" - -#. module: mrp -#: constraint:res.company:0 -msgid "Error! You can not create recursive companies." -msgstr "¡Error! No puede crear compañías recursivas." - -#. module: mrp -#: help:mrp.bom,active:0 -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" - -#. 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." -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" - -#. 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" - -#. module: mrp -#: model:ir.ui.menu,name:mrp.menu_mrp_configuration -#: view:res.company:0 -msgid "Configuration" -msgstr "Configuración" - -#. module: mrp -#: field:mrp.workcenter,time_stop:0 -msgid "Time after prod." -msgstr "Tiempo después producción" - -#. module: mrp -#: field:mrp.workcenter.load,time_unit:0 -msgid "Type of period" -msgstr "Tipo de período" - -#. module: mrp -#: view:mrp.production:0 -msgid "Total Qty" -msgstr "Ctdad total" - -#. module: mrp -#: field:mrp.routing.workcenter,hour_nbr:0 -msgid "Number of Hours" -msgstr "Número de horas" - -#. module: mrp -#: view:mrp.workcenter:0 -msgid "Costing Information" -msgstr "Información de costes" - -#. module: mrp -#: model:process.node,name:mrp.process_node_purchaseprocure0 -msgid "Procurement Orders" -msgstr "Órdenes de abastecimiento" - -#. module: mrp -#: help:mrp.bom,product_rounding:0 -msgid "Rounding applied on the product quantity." -msgstr "Redondeo aplicado sobre la cantidad de producto" - -#. 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." - -#. module: mrp -#: field:mrp.routing.workcenter,routing_id:0 -msgid "Parent Routing" -msgstr "Proceso productivo padre" - -#. module: mrp -#: view:mrp.installer:0 -msgid "Configure" -msgstr "Configurar" - -#. module: mrp -#: help:mrp.workcenter,time_start:0 -msgid "Time in hours for the setup." -msgstr "Tiempo en horas para la configuración." - -#. module: mrp -#: selection:mrp.production.order,month:0 -msgid "December" -msgstr "Diciembre" - -#. module: mrp -#: field:mrp.installer,config_logo:0 -msgid "Image" -msgstr "Imagen" - -#. module: mrp -#: field:mrp.bom.revision,bom_id:0 -#: field:procurement.order,bom_id:0 -msgid "BoM" -msgstr "Lista de materiales (LdM)" - -#. 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" - -#. 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" - -#. module: mrp -#: selection:mrp.production,state:0 -#: selection:mrp.production.order,state:0 -msgid "Draft" -msgstr "Borrador" - -#. module: mrp -#: field:report.mrp.inout,date: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" - -#. module: mrp -#: selection:mrp.production,priority:0 -#: selection:mrp.production.order,priority:0 -msgid "Normal" -msgstr "Normal" - -#. module: mrp -#: model:process.node,note:mrp.process_node_routing0 -msgid "Manufacturing Steps." -msgstr "Etapas de producción." - -#. module: mrp -#: code:addons/mrp/report/price.py:136 -#: model:ir.actions.report.xml,name:mrp.report_cost_structure -#, python-format -msgid "Cost Structure" -msgstr "Estructura de costes" - -#. module: mrp -#: selection:mrp.product.produce,mode:0 -msgid "Consume & Produce" -msgstr "Consumir y Producir" - -#. module: mrp -#: selection:mrp.production.order,month:0 -msgid "November" -msgstr "Noviembre" - -#. module: mrp -#: field:mrp.bom,bom_id:0 -msgid "Parent BoM" -msgstr "Lista de materiales (LdM) padre" - -#. 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." -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" - -#. 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." - -#. 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" - -#. module: mrp -#: field:mrp.product.produce,product_qty:0 -msgid "Select Quantity" -msgstr "Seleccionar cantidad" - -#. 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.ui.menu,name:mrp.menu_mrp_bom_form_action -#: field:product.product,bom_ids:0 -msgid "Bill of Materials" -msgstr "Lista de materiales (LdM)" #. module: mrp #: help:mrp.routing.workcenter,routing_id:0 @@ -2287,26 +1267,359 @@ msgid "" msgstr "" #. module: mrp -#: model:ir.model,name:mrp.model_mrp_bom_revision -msgid "Bill of Material Revision" -msgstr "Revisión de lista de materiales" +#: code:addons/mrp/mrp.py:505 +#, python-format +msgid "Invalid Action!" +msgstr "" #. module: mrp -#: view:mrp.routing.workcenter:0 -#: view:mrp.workcenter:0 -msgid "General Information" -msgstr "Información general" +#: model:process.transition,note:mrp.process_transition_producttostockrules0 +msgid "" +"The Minimum Stock Rule is an automatic procurement rule based on a mini and " +"maxi quantity. It's available in the Inventory management menu and " +"configured by product." +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:187 +#, python-format +msgid "Components Cost of %s %s" +msgstr "" + +#. module: mrp +#: selection:mrp.workcenter.load,time_unit:0 +msgid "Day by day" +msgstr "" + +#. module: mrp +#: field:mrp.production,priority:0 +msgid "Priority" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_stock_picking +#: field:mrp.production,picking_id:0 +msgid "Picking List" +msgstr "" + +#. module: mrp +#: 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:375 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_production_product_line +msgid "Production Scheduled Product" +msgstr "" + +#. module: mrp +#: code:addons/mrp/report/price.py:204 +#, python-format +msgid "Work Cost of %s %s" +msgstr "" + +#. module: mrp +#: help:res.company,manufacturing_lead:0 +msgid "Security days for each manufacturing operation." +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 "" + +#. module: mrp +#: constraint:mrp.production:0 +msgid "Order quantity cannot be negative or zero!" +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_stockrfq0 +msgid "" +"In case the Supply method of the product is Buy, the system creates a " +"purchase order." +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_procurement_order +msgid "Procurement" +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 "" + +#. module: mrp +#: code:addons/mrp/report/price.py:139 +#, python-format +msgid "Components suppliers" +msgstr "" #. module: mrp #: view:mrp.production:0 -msgid "Productions" -msgstr "Producciones" +msgid "Production Work Centers" +msgstr "" #. module: mrp -#: code:addons/mrp/report/price.py:194 +#: view:mrp.workcenter:0 +msgid "Search for mrp workcenter" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "BoM Structure" +msgstr "" + +#. module: mrp +#: field:mrp.production,date_start:0 +msgid "Start Date" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,costs_hour_account_id:0 +msgid "Hour Account" +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 "" + +#. module: mrp +#: field:mrp.bom,method:0 +msgid "Method" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Pending" +msgstr "" + +#. module: mrp +#: field:mrp.bom,active:0 +#: field:mrp.routing,active:0 +msgid "Active" +msgstr "" + +#. module: mrp +#: 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 +#: view:report.workcenter.load:0 +msgid "Work Center Loads" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_property_action +#: model:ir.ui.menu,name:mrp.menu_mrp_property_action +#: view:mrp.bom:0 +#: field:mrp.bom,property_ids:0 +#: view:mrp.property:0 +#: field:procurement.order,property_ids:0 +msgid "Properties" +msgstr "" + +#. module: mrp +#: help:mrp.production,origin:0 +msgid "" +"Reference of the document that generated this production order request." +msgstr "" + +#. module: mrp +#: model:process.transition,name:mrp.process_transition_minimumstockprocure0 +msgid "'Minimum stock rule' material" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Extra Information" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_change_production_qty +msgid "Change Quantity of Products" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_productionorder0 +msgid "Drives the procurement orders for raw material." +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "SO Number" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:505 #, python-format -msgid "Work Cost of " -msgstr "Coste trabajo de " +msgid "Cannot delete a manufacturing order in state '%s'." +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Done" +msgstr "" + +#. module: mrp +#: 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 +msgid "Source Document" +msgstr "" + +#. module: mrp +#: selection:mrp.production,priority:0 +msgid "Not urgent" +msgstr "" + +#. module: mrp +#: field:mrp.production,user_id:0 +msgid "Responsible" +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,name:mrp.mrp_production_action2 +msgid "Manufacturing Orders To Start" +msgstr "" + +#. 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 "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_property_group_action +msgid "" +"

\n" +" Click to create a group of properties.\n" +"

\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" +"

\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" +"

\n" +" " +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,capacity_per_cycle:0 +msgid "Capacity per Cycle" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_product_product +#: view:mrp.bom:0 +#: field:mrp.bom,product_id:0 +#: view:mrp.production:0 +#: field:mrp.production,product_id:0 +#: report:mrp.production.order:0 +#: field:mrp.production.product.line,product_id:0 +msgid "Product" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: field:mrp.production,hour_total:0 +msgid "Total Hours" +msgstr "" + +#. module: mrp +#: field:mrp.production,location_src_id:0 +msgid "Raw Materials Location" +msgstr "" + +#. module: mrp +#: view:mrp.product_price:0 +msgid "Print Cost Structure of Product." +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_uos:0 +#: field:mrp.production.product.line,product_uos:0 +msgid "Product UOS" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Consume Products" +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 "" + +#. 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 "" #. module: mrp #: help:mrp.workcenter,note:0 @@ -2316,160 +1629,656 @@ msgid "" msgstr "" #. module: mrp -#: 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 -#: 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" - -#. module: mrp -#: model:ir.actions.act_window,help:mrp.mrp_property_action -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." +#: field:mrp.production,date_finished:0 +msgid "End Date" 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 +#: field:mrp.workcenter,resource_id:0 +msgid "Resource" +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 "" + +#. module: mrp +#: field:mrp.production,product_uos:0 +msgid "Product UoS" +msgstr "" + +#. module: mrp +#: selection:mrp.production,priority:0 +msgid "Very Urgent" +msgstr "" + +#. module: mrp +#: help:mrp.bom,routing_id:0 +msgid "" +"The list of operations (list of work centers) to produce the finished " +"product. The routing is mainly used to compute work center costs during " +"operations and to plan future loads on work centers based on production " +"planning." +msgstr "" + +#. module: mrp +#: view:change.production.qty:0 +msgid "Approve" +msgstr "" + +#. module: mrp +#: view:mrp.config.settings:0 +msgid "Order" +msgstr "" + +#. module: mrp +#: view:mrp.property.group:0 +msgid "Properties categories" +msgstr "" + +#. module: mrp +#: help:mrp.production.workcenter.line,sequence:0 +msgid "Gives the sequence order when displaying a list of work orders." +msgstr "" + +#. module: mrp +#: report:mrp.production.order:0 +msgid "Source Location" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: view:mrp.production.product.line:0 +msgid "Scheduled Products" +msgstr "" + +#. module: mrp +#: model:res.groups,name:mrp.group_mrp_manager +msgid "Manager" +msgstr "" + +#. module: mrp +#: help:mrp.product.produce,mode:0 +msgid "" +"'Consume only' mode will only consume the products with the quantity " +"selected.\n" +"'Consume & Produce' mode will consume as well as produce the products with " +"the quantity selected and it will finish the production order when total " +"ordered quantities are produced." +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +#: report:mrp.production.order:0 +msgid "Work Orders" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,costs_cycle:0 +msgid "Cost per cycle" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_serviceproduct0 +#: model:process.node,name:mrp.process_node_serviceproduct1 +msgid "Service" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "Cancelled" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "(Update)" +msgstr "" + +#. module: mrp +#: 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 "" +"You are going to consume total %s quantities of \"%s\".\n" +"But you can only consume up to total %s quantities." +msgstr "" + +#. module: mrp +#: model:process.transition,note:mrp.process_transition_bom0 +msgid "" +"The Bill of Material is the product's decomposition. The components (that " +"are products themselves) can also have their own Bill of Material (multi-" +"level)." +msgstr "" + +#. module: mrp +#: field:mrp.bom,company_id:0 +#: field:mrp.production,company_id:0 +#: field:mrp.routing,company_id:0 +#: field:mrp.routing.workcenter,company_id:0 +#: view:mrp.workcenter:0 +msgid "Company" +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 "" + +#. module: mrp +#: model:ir.actions.report.xml,name:mrp.report_mrp_production_report +#: field:mrp.production.product.line,production_id:0 +#: model:process.node,name:mrp.process_node_production0 +#: model:process.node,name:mrp.process_node_productionorder0 +msgid "Production Order" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_productminimumstockrule0 +msgid "Automatic procurement rule" +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 "" + +#. module: mrp +#: 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:139 +#: view:mrp.bom:0 +#, python-format +msgid "Components" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +#: model:ir.actions.report.xml,name:mrp.report_bom_structure +msgid "BOM Structure" +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 "" + +#. module: mrp +#: field:mrp.bom,date_start:0 +msgid "Valid From" +msgstr "" + +#. module: mrp +#: selection:mrp.bom,type:0 +msgid "Normal BoM" +msgstr "" + +#. module: mrp +#: field:res.company,manufacturing_lead:0 +msgid "Manufacturing Lead Time" +msgstr "" + +#. module: mrp +#: code:addons/mrp/mrp.py:285 +#, python-format +msgid "Warning" +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_uos_qty:0 +msgid "Product UOS Qty" +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 +msgid "" +"Weekly Stock Value Variation enables you to track the stock value evolution " +"linked to manufacturing activities, receptions of products and delivery " +"orders." +msgstr "" + +#. module: mrp +#: view:mrp.product.produce:0 +msgid "Confirm" +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_efficiency:0 +msgid "Manufacturing Efficiency" +msgstr "" + +#. module: mrp +#: 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 +msgid "" +"If the active field is set to False, it will allow you to hide the bills of " +"material without removing it." +msgstr "" + +#. module: mrp +#: field:mrp.bom,product_rounding:0 +msgid "Product Rounding" +msgstr "" + +#. module: mrp +#: selection:mrp.production,state:0 +msgid "New" +msgstr "" + +#. module: mrp +#: selection:mrp.product.produce,mode:0 +msgid "Consume Only" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Recreate Picking" +msgstr "" + +#. module: mrp +#: selection:mrp.bom,method:0 +msgid "On Order" +msgstr "" + +#. module: mrp +#: model:ir.ui.menu,name:mrp.menu_mrp_configuration +msgid "Configuration" +msgstr "" + +#. module: mrp +#: view:mrp.bom:0 +msgid "Starting Date" +msgstr "" + +#. module: mrp +#: field:mrp.workcenter,time_stop:0 +msgid "Time after prod." +msgstr "" + +#. module: mrp +#: field:mrp.workcenter.load,time_unit:0 +msgid "Type of period" +msgstr "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Total Qty" +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 "" + +#. module: mrp +#: view:mrp.workcenter:0 +msgid "Costing Information" +msgstr "" + +#. module: mrp +#: model:process.node,name:mrp.process_node_purchaseprocure0 +msgid "Procurement Orders" +msgstr "" + +#. module: mrp +#: help:mrp.bom,product_rounding:0 +msgid "Rounding applied on the product quantity." +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_stock0 +msgid "Assignment from Production or Purchase Order." +msgstr "" + +#. module: mrp +#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action +msgid "" +"

\n" +" Click to create a bill of material. \n" +"

\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" +"

\n" +" OpenERP uses these BoMs to automatically propose " +"manufacturing\n" +" orders according to procurement needs.\n" +"

\n" +" " +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: field:mrp.config.settings,module_mrp_repair:0 +msgid "Manage repairs of products " +msgstr "" + +#. module: mrp +#: 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:procurement.order,bom_id:0 +msgid "BoM" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_report_mrp_inout +#: view:report.mrp.inout:0 +msgid "Stock value variation" +msgstr "" + +#. module: mrp +#: model:process.node,note:mrp.process_node_mts0 +#: model:process.node,note:mrp.process_node_servicemts0 +msgid "Assignment from stock." +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: selection:mrp.production,priority:0 +msgid "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 "" + +#. module: mrp +#: code:addons/mrp/report/price.py:146 +#: model:ir.actions.report.xml,name:mrp.report_cost_structure +#, python-format +msgid "Cost Structure" +msgstr "" + +#. module: mrp +#: model:res.groups,name:mrp.group_mrp_user +msgid "User" +msgstr "" + +#. module: mrp +#: selection:mrp.product.produce,mode:0 +msgid "Consume & Produce" +msgstr "" + +#. module: mrp +#: field:mrp.bom,bom_id:0 +msgid "Parent BoM" +msgstr "" + +#. module: mrp +#: report:bom.structure:0 +msgid "BOM Ref" +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: 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 "" +"using the bill of materials assigned to this product.\n" +" The delivery order will be ready once the production " +"is done." +msgstr "" + +#. module: mrp +#: 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 "" + +#. module: mrp +#: view:mrp.production:0 +msgid "Productions" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_stock_move_split +#: view:mrp.production:0 +msgid "Split in Serial Numbers" +msgstr "" + +#. module: mrp +#: help:mrp.bom,product_uos:0 +msgid "" +"Product UOS (Unit of Sale) is the unit of measurement for the invoicing and " +"promotion of stock." +msgstr "" + +#. module: mrp +#: view:mrp.production:0 #: field:stock.move,production_id:0 msgid "Production" -msgstr "Producción" +msgstr "" + +#. module: mrp +#: model:ir.model,name:mrp.model_mrp_production_workcenter_line +#: field:mrp.production.workcenter.line,name:0 +msgid "Work Order" +msgstr "" #. module: mrp #: view:board.board:0 msgid "Procurements in Exception" -msgstr "Abastecimientos en excepción" - -#. module: mrp -#: model:process.transition,name:mrp.process_transition_minimumstockprocure0 -msgid "'Minimum stock rule' material" -msgstr "material 'regla stock mínimo'" +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" - -#. 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." 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 +#: code:addons/mrp/wizard/change_production_qty.py:68 +#, python-format +msgid "Active Id not found" +msgstr "" #. 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 @@ -