summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabien Meghazi <fme@openerp.com>2014-02-25 11:46:54 +0100
committerFabien Meghazi <fme@openerp.com>2014-02-25 11:46:54 +0100
commit35a7182893f3f46204b252d9fedf746902f9bba5 (patch)
tree31de7af0a82c49fa7ae84dbdf8137eea88c59392
parent6f670c58ce61254adcd37353b64f355527e2982b (diff)
parent2ab61cf001fab1d30050598931bfa39956cf4883 (diff)
[MERGE] upstream
bzr revid: fme@openerp.com-20140225104654-d1ni7z5t8w0qc7mw
-rw-r--r--addons/account/account_invoice.py2
-rw-r--r--addons/account/account_view.xml2
-rw-r--r--addons/account/i18n/fr_CA.po10849
-rw-r--r--addons/account/static/src/js/account_move_line_quickadd.js64
-rw-r--r--addons/account_analytic_analysis/account_analytic_analysis.py9
-rw-r--r--addons/account_voucher/account_voucher.py25
-rw-r--r--addons/account_voucher/voucher_sales_purchase_view.xml19
-rw-r--r--addons/account_voucher/wizard/account_statement_from_invoice.py4
-rw-r--r--addons/analytic_contract_hr_expense/i18n/ja.po72
-rw-r--r--addons/audittrail/audittrail.py16
-rw-r--r--addons/auth_oauth/controllers/main.py2
-rw-r--r--addons/auth_signup/controllers/main.py23
-rw-r--r--addons/auth_signup/res_users.py9
-rw-r--r--addons/auth_signup/views/auth_signup_login.xml2
-rw-r--r--addons/base_action_rule/base_action_rule.py7
-rw-r--r--addons/base_setup/res_config.py4
-rw-r--r--addons/base_setup/res_config_view.xml2
-rw-r--r--addons/base_vat/base_vat.py30
-rw-r--r--addons/calendar/calendar.py105
-rw-r--r--addons/calendar/calendar_demo.xml32
-rw-r--r--addons/calendar/calendar_view.xml32
-rw-r--r--addons/calendar/contacts.py2
-rw-r--r--addons/calendar/contacts_view.xml1
-rw-r--r--addons/calendar/static/src/js/base_calendar.js36
-rw-r--r--addons/calendar/test/calendar_test.yml9
-rw-r--r--addons/calendar/test/test_calendar_recurrent_event_case2.yml9
-rw-r--r--addons/crm/crm.py17
-rw-r--r--addons/crm/crm_case_section_view.xml13
-rw-r--r--addons/crm/crm_lead.py1
-rw-r--r--addons/crm/crm_lead_data.xml5
-rw-r--r--addons/crm/crm_lead_view.xml2
-rw-r--r--addons/crm/crm_phonecall_view.xml1
-rw-r--r--addons/crm/report/crm_lead_report.py4
-rw-r--r--addons/crm/report/crm_lead_report_view.xml15
-rw-r--r--addons/crm_partner_assign/crm_portal_view.xml4
-rw-r--r--addons/email_template/email_template_view.xml2
-rw-r--r--addons/event/event.py4
-rw-r--r--addons/fetchmail/fetchmail.py49
-rw-r--r--addons/gamification/html/index.html86
-rw-r--r--addons/gamification/i18n/gamification.pot6
-rw-r--r--addons/gamification/models/challenge.py25
-rw-r--r--addons/gamification/models/res_users.py19
-rw-r--r--addons/google_calendar/google_calendar.py631
-rw-r--r--addons/hr_holidays/hr_holidays_view.xml4
-rw-r--r--addons/hr_recruitment/i18n/zh_CN.po30
-rw-r--r--addons/hr_timesheet_sheet/i18n/zh_CN.po28
-rw-r--r--addons/hw_escpos/controllers/main.py3
-rw-r--r--addons/hw_proxy/doc/index.rst163
-rw-r--r--addons/hw_proxy/doc/manual.pdfbin0 -> 252150 bytes
-rw-r--r--addons/im/security/ir.model.access.csv2
-rw-r--r--addons/mail/data/mail_data.xml1
-rw-r--r--addons/mail/mail_message_subtype.py6
-rw-r--r--addons/mail/mail_message_subtype.xml19
-rw-r--r--addons/mail/mail_thread.py92
-rw-r--r--addons/mail/static/src/css/mail.css7
-rw-r--r--addons/mail/static/src/js/mail.js8
-rw-r--r--addons/mail/static/src/js/mail_followers.js12
-rw-r--r--addons/mail/static/src/xml/mail.xml37
-rw-r--r--addons/mail/static/src/xml/mail_followers.xml4
-rw-r--r--addons/mail/tests/test_mail_gateway.py6
-rw-r--r--addons/mail/wizard/mail_compose_message.py10
-rw-r--r--addons/mail/wizard/mail_compose_message_view.xml6
-rw-r--r--addons/mass_mailing/mail_thread.py3
-rw-r--r--addons/mass_mailing/mass_mailing.py4
-rw-r--r--addons/mrp/procurement.py3
-rw-r--r--addons/note/note.py9
-rw-r--r--addons/note/note_view.xml3
-rw-r--r--addons/note/security/ir.rule.xml41
-rw-r--r--addons/pad/py_etherpad/__init__.py4
-rw-r--r--addons/pad/static/src/css/etherpad.css5
-rw-r--r--addons/pad/static/src/js/pad.js2
-rw-r--r--addons/pad/static/src/xml/pad.xml2
-rw-r--r--addons/point_of_sale/point_of_sale.py21
-rw-r--r--addons/point_of_sale/report/pos_details_summary.py7
-rw-r--r--addons/point_of_sale/report/pos_details_summary.rml2
-rw-r--r--addons/portal_project/i18n/fi.po37
-rw-r--r--addons/portal_project_issue/i18n/fi.po47
-rw-r--r--addons/product/pricelist.py11
-rw-r--r--addons/product_expiry/i18n/am.po149
-rw-r--r--addons/project/project.py29
-rw-r--r--addons/project/project_data.xml5
-rw-r--r--addons/project_issue/project_issue_data.xml5
-rw-r--r--addons/purchase/purchase_view.xml2
-rw-r--r--addons/sale/sale.py4
-rw-r--r--addons/sale/sale_view.xml8
-rw-r--r--addons/sale_crm/sale_crm_data.xml2
-rw-r--r--addons/sale_crm/sale_crm_view.xml9
-rw-r--r--addons/sale_stock/sale_stock_view.xml4
-rw-r--r--addons/stock/product.py8
-rw-r--r--addons/web_linkedin/i18n/fi.po137
-rw-r--r--addons/website/controllers/main.py9
-rw-r--r--addons/website/models/ir_ui_view.py2
-rw-r--r--addons/website/models/website.py18
-rw-r--r--addons/website/static/src/css/snippets.css73
-rw-r--r--addons/website/static/src/css/snippets.sass61
-rw-r--r--addons/website/static/src/css/website.css35
-rw-r--r--addons/website/static/src/css/website.sass40
-rw-r--r--addons/website/static/src/js/website.ace.js91
-rw-r--r--addons/website/static/src/js/website.editor.js6
-rw-r--r--addons/website/static/src/js/website.editor.newpage.js34
-rw-r--r--addons/website/static/src/js/website.js13
-rw-r--r--addons/website/static/src/js/website.snippets.animation.js2
-rw-r--r--addons/website/static/src/js/website.snippets.editor.js96
-rw-r--r--addons/website/static/src/js/website.tour.banner.js7
-rw-r--r--addons/website/static/src/js/website.tour.js8
-rw-r--r--addons/website/static/src/xml/website.snippets.xml37
-rw-r--r--addons/website/static/src/xml/website.xml2
-rw-r--r--addons/website/tests/test_ui.py19
-rw-r--r--addons/website/views/snippets.xml234
-rw-r--r--addons/website/views/website_templates.xml25
-rw-r--r--addons/website_blog/static/description/index.html2
-rw-r--r--addons/website_blog/static/src/js/website.tour.blog.js12
-rw-r--r--addons/website_blog/tests/test_ui.py2
-rw-r--r--addons/website_event/static/src/js/website.tour.event.js2
-rw-r--r--addons/website_event/tests/test_ui.py2
-rw-r--r--addons/website_event_sale/models/sale_order.py2
-rw-r--r--addons/website_event_sale/tests/test_ui.py2
-rw-r--r--addons/website_livechat/__openerp__.py7
-rw-r--r--addons/website_livechat/models/website.py9
-rw-r--r--addons/website_livechat/views/res_config.xml22
-rw-r--r--addons/website_livechat/views/website_livechat.xml16
-rw-r--r--addons/website_mail/models/mail_message.py16
-rw-r--r--addons/website_quote/controllers/main.py5
-rw-r--r--addons/website_sale/controllers/main.py56
-rw-r--r--addons/website_sale/models/sale_order.py2
-rw-r--r--addons/website_sale/models/website.py38
-rw-r--r--addons/website_sale/tests/test_ui.py20
-rw-r--r--addons/website_sale/views/website_sale.xml51
128 files changed, 13024 insertions, 1306 deletions
diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py
index 42f3effd6f9..06e59232ac9 100644
--- a/addons/account/account_invoice.py
+++ b/addons/account/account_invoice.py
@@ -114,7 +114,7 @@ class account_invoice(osv.osv):
#we check if the invoice is partially reconciled and if there are other invoices
#involved in this partial reconciliation (and we sum these invoices)
for line in aml.reconcile_partial_id.line_partial_ids:
- if line.invoice:
+ if line.invoice and invoice.type == line.invoice.type:
nb_inv_in_partial_rec += 1
#store the max invoice id as for this invoice we will make a balance instead of a simple division
max_invoice_id = max(max_invoice_id, line.invoice.id)
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 0ef39d5884d..48d6320fbc3 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -1451,7 +1451,7 @@
<act_window
id="act_account_move_to_account_move_line_open"
name="Journal Items"
- context="{'search_default_journal_id': active_id, 'default_journal_id': active_id}"
+ context="{'search_default_move_id': active_id, 'default_move_id': active_id}"
res_model="account.move.line"
src_model="account.move"/>
diff --git a/addons/account/i18n/fr_CA.po b/addons/account/i18n/fr_CA.po
new file mode 100644
index 00000000000..9833ae4ae74
--- /dev/null
+++ b/addons/account/i18n/fr_CA.po
@@ -0,0 +1,10849 @@
+# French (Canada) translation for openobject-addons
+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2014-02-19 17:53+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: French (Canada) <fr_CA@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-02-20 05:14+0000\n"
+"X-Generator: Launchpad (build 16916)\n"
+
+#. module: account
+#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
+msgid "System payment"
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.fiscal.position.account:0
+msgid ""
+"An account fiscal position could be defined only once time on same accounts."
+msgstr ""
+
+#. module: account
+#: help:account.tax.code,sequence:0
+msgid ""
+"Determine the display order in the report 'Accounting \\ Reporting \\ "
+"Generic Reporting \\ Taxes \\ Taxes Report'"
+msgstr ""
+
+#. module: account
+#: view:account.move.reconcile:0
+msgid "Journal Entry Reconcile"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: view:account.bank.statement:0
+#: view:account.move.line:0
+msgid "Account Statistics"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Proforma/Open/Paid Invoices"
+msgstr ""
+
+#. module: account
+#: field:report.invoice.created,residual:0
+msgid "Residual"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_bank_statement.py:369
+#, python-format
+msgid "Journal item \"%s\" is not valid."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_report_aged_receivable
+msgid "Aged Receivable Till Today"
+msgstr ""
+
+#. module: account
+#: model:process.transition,name:account.process_transition_invoiceimport0
+msgid "Import from invoice or payment"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1058
+#: code:addons/account/account_move_line.py:1143
+#: code:addons/account/account_move_line.py:1210
+#, python-format
+msgid "Bad Account!"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: view:account.move.line:0
+msgid "Total Debit"
+msgstr ""
+
+#. module: account
+#: constraint:account.account.template:0
+msgid ""
+"Error!\n"
+"You cannot create recursive account templates."
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: view:account.automatic.reconcile:0
+#: field:account.move.line,reconcile_id:0
+#: view:account.move.line.reconcile:0
+#: view:account.move.line.reconcile.writeoff:0
+#: code:addons/account/static/src/xml/account_move_reconciliation.xml:30
+#, python-format
+msgid "Reconcile"
+msgstr "Réconciliation"
+
+#. module: account
+#: field:account.bank.statement,name:0
+#: field:account.bank.statement.line,ref:0
+#: field:account.entries.report,ref:0
+#: field:account.move,ref:0
+#: field:account.move.line,ref:0
+#: field:account.subscription,ref:0
+#: xsl:account.transfer:0
+#: field:cash.box.in,ref:0
+msgid "Reference"
+msgstr ""
+
+#. module: account
+#: help:account.payment.term,active:0
+msgid ""
+"If the active field is set to False, it will allow you to hide the payment "
+"term without removing it."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:641
+#: code:addons/account/account.py:686
+#: code:addons/account/account.py:781
+#: code:addons/account/account.py:1058
+#: code:addons/account/account_invoice.py:820
+#: code:addons/account/account_invoice.py:823
+#: code:addons/account/account_invoice.py:826
+#: code:addons/account/account_invoice.py:1545
+#: code:addons/account/account_move_line.py:98
+#: code:addons/account/account_move_line.py:771
+#: code:addons/account/account_move_line.py:824
+#: code:addons/account/account_move_line.py:864
+#: code:addons/account/wizard/account_fiscalyear_close.py:62
+#: code:addons/account/wizard/account_invoice_state.py:44
+#: code:addons/account/wizard/account_invoice_state.py:68
+#: code:addons/account/wizard/account_state_open.py:37
+#: code:addons/account/wizard/account_validate_account_move.py:39
+#: code:addons/account/wizard/account_validate_account_move.py:61
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3197
+#, python-format
+msgid "Miscellaneous Journal"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_open_closed_fiscalyear.py:39
+#, python-format
+msgid ""
+"You have to set the 'End of Year Entries Journal' for this Fiscal Year "
+"which is set after generating opening entries from 'Generate Opening "
+"Entries'."
+msgstr ""
+
+#. module: account
+#: field:account.fiscal.position.account,account_src_id:0
+#: field:account.fiscal.position.account.template,account_src_id:0
+msgid "Account Source"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_period
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a fiscal period.\n"
+" </p><p>\n"
+" An accounting period typically is a month or a quarter. It\n"
+" usually corresponds to the periods of the tax declaration.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_view_created_invoice_dashboard
+msgid "Invoices Created Within Past 15 Days"
+msgstr ""
+
+#. module: account
+#: field:accounting.report,label_filter:0
+msgid "Column Label"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,code_digits:0
+msgid "No. of digits to use for account code"
+msgstr ""
+
+#. module: account
+#: help:account.analytic.journal,type:0
+msgid ""
+"Gives the type of the analytic journal. When it needs for a document (eg: an "
+"invoice) to create analytic entries, OpenERP will look for a matching "
+"journal of the same type."
+msgstr ""
+
+#. module: account
+#: help:account.tax,account_analytic_collected_id:0
+msgid ""
+"Set the analytic account that will be used by default on the invoice tax "
+"lines for invoices. Leave empty if you don't want to use an analytic account "
+"on the invoice tax lines by default."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_tax_template_form
+#: model:ir.ui.menu,name:account.menu_action_account_tax_template_form
+msgid "Tax Templates"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_move_line_reconcile_select
+msgid "Move line reconcile select"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_supplierentriesreconcile0
+msgid "Accounting entries are an input of the reconciliation."
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_management_belgian_reports
+msgid "Belgian Reports"
+msgstr ""
+
+#. module: account
+#: model:mail.message.subtype,name:account.mt_invoice_validated
+msgid "Validated"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.account_type_income_view1
+msgid "Income View"
+msgstr ""
+
+#. module: account
+#: help:account.account,user_type:0
+msgid ""
+"Account Type is used for information purpose, to generate country-specific "
+"legal reports, and set the rules to close a fiscal year and generate opening "
+"entries."
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,sale_refund_sequence_next:0
+msgid "Next credit note number"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,module_account_voucher:0
+msgid ""
+"This includes all the basic requirements of voucher entries for bank, cash, "
+"sales, purchase, expense, contra, etc.\n"
+" This installs the module account_voucher."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_use_model_create_entry
+msgid "Manual Recurring"
+msgstr ""
+
+#. module: account
+#: field:account.automatic.reconcile,allow_write_off:0
+msgid "Allow write off"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.chart:0
+msgid "Select the Period for Analysis"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_invoice_tree3
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a customer refund. \n"
+" </p><p>\n"
+" A refund is a document that credits an invoice completely "
+"or\n"
+" partially.\n"
+" </p><p>\n"
+" Instead of manually creating a customer refund, you\n"
+" can generate it directly from the related customer invoice.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: help:account.installer,charts:0
+msgid ""
+"Installs localized accounting charts to match as closely as possible the "
+"accounting needs of your company based on your country."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_unreconcile
+msgid "Account Unreconcile"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,module_account_budget:0
+msgid "Budget management"
+msgstr ""
+
+#. module: account
+#: view:product.template:0
+msgid "Purchase Properties"
+msgstr ""
+
+#. module: account
+#: help:account.financial.report,style_overwrite:0
+msgid ""
+"You can set up here the format you want this record to be displayed. If you "
+"leave the automatic formatting, it will be computed based on the financial "
+"reports hierarchy (auto-computed field 'level')."
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,group_multi_currency:0
+msgid "Allow multi currencies"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:77
+#, python-format
+msgid "You must define an analytic journal of type '%s'!"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "June"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_automatic_reconcile.py:148
+#, python-format
+msgid "You must select accounts to reconcile."
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,group_analytic_accounting:0
+msgid "Allows you to use the analytic accounting."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: field:account.invoice,user_id:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,user_id:0
+msgid "Salesperson"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: view:account.invoice:0
+msgid "Responsible"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_bank_accounts_wizard
+msgid "account.bank.accounts.wizard"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,date_created:0
+#: field:account.move.reconcile,create_date:0
+msgid "Creation date"
+msgstr ""
+
+#. module: account
+#: selection:account.journal,type:0
+msgid "Purchase Refund"
+msgstr ""
+
+#. module: account
+#: selection:account.journal,type:0
+msgid "Opening/Closing Situation"
+msgstr ""
+
+#. module: account
+#: help:account.journal,currency:0
+msgid "The currency used to enter statement"
+msgstr ""
+
+#. module: account
+#: field:account.journal,default_debit_account_id:0
+msgid "Default Debit Account"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: view:account.move.line:0
+msgid "Total Credit"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,module_account_asset:0
+msgid ""
+"This allows you to manage the assets owned by a company or a person.\n"
+" It keeps track of the depreciation occurred on those assets, "
+"and creates account move for those depreciation lines.\n"
+" This installs the module account_asset. If you do not check "
+"this box, you will be able to do invoicing & payments,\n"
+" but not accounting (Journal Items, Chart of Accounts, ...)"
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement.line,name:0
+msgid "Originator to Beneficiary Information"
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/static/src/xml/account_move_line_quickadd.xml:8
+#, python-format
+msgid "Period :"
+msgstr ""
+
+#. module: account
+#: field:account.account.template,chart_template_id:0
+#: field:account.fiscal.position.template,chart_template_id:0
+#: field:account.tax.template,chart_template_id:0
+#: field:wizard.multi.charts.accounts,chart_template_id:0
+msgid "Chart Template"
+msgstr ""
+
+#. module: account
+#: selection:account.invoice.refund,filter_refund:0
+msgid "Modify: create refund, reconcile and create a new draft invoice"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,tax_calculation_rounding_method:0
+msgid ""
+"If you select 'Round per line' : for each tax, the tax amount will first be "
+"computed and rounded for each PO/SO/invoice line and then these rounded "
+"amounts will be summed, leading to the total amount for that tax. If you "
+"select 'Round globally': for each tax, the tax amount will be computed for "
+"each PO/SO/invoice line, then these amounts will be summed and eventually "
+"this total tax amount will be rounded. If you sell with tax included, you "
+"should choose 'Round per line' because you certainly want the sum of your "
+"tax-included line subtotals to be equal to the total amount with taxes."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_wizard_multi_charts_accounts
+msgid "wizard.multi.charts.accounts"
+msgstr ""
+
+#. module: account
+#: help:account.model.line,amount_currency:0
+msgid "The amount expressed in an optional other currency."
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+msgid "Available Coins"
+msgstr ""
+
+#. module: account
+#: field:accounting.report,enable_filter:0
+msgid "Enable Comparison"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+#: field:account.automatic.reconcile,journal_id:0
+#: view:account.bank.statement:0
+#: field:account.bank.statement,journal_id:0
+#: field:account.bank.statement.line,journal_id:0
+#: report:account.central.journal:0
+#: view:account.entries.report:0
+#: field:account.entries.report,journal_id:0
+#: view:account.invoice:0
+#: field:account.invoice,journal_id:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,journal_id:0
+#: view:account.journal:0
+#: field:account.journal.cashbox.line,journal_id:0
+#: field:account.journal.period,journal_id:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: view:account.model:0
+#: field:account.model,journal_id:0
+#: view:account.move:0
+#: field:account.move,journal_id:0
+#: field:account.move.bank.reconcile,journal_id:0
+#: view:account.move.line:0
+#: field:account.move.line,journal_id:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,journal_id:0
+#: model:ir.actions.report.xml,name:account.account_journal
+#: model:ir.model,name:account.model_account_journal
+#: field:validate.account.move,journal_id:0
+msgid "Journal"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_invoice_confirm
+msgid "Confirm the selected invoices"
+msgstr ""
+
+#. module: account
+#: field:account.addtmpl.wizard,cparent_id:0
+msgid "Parent target"
+msgstr ""
+
+#. module: account
+#: help:account.invoice.line,sequence:0
+msgid "Gives the sequence of this line when displaying the invoice."
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,account_id:0
+msgid "Account used in this journal"
+msgstr ""
+
+#. module: account
+#: help:account.aged.trial.balance,chart_account_id:0
+#: help:account.balance.report,chart_account_id:0
+#: help:account.central.journal,chart_account_id:0
+#: help:account.common.account.report,chart_account_id:0
+#: help:account.common.journal.report,chart_account_id:0
+#: help:account.common.partner.report,chart_account_id:0
+#: help:account.common.report,chart_account_id:0
+#: help:account.general.journal,chart_account_id:0
+#: help:account.partner.balance,chart_account_id:0
+#: help:account.partner.ledger,chart_account_id:0
+#: help:account.print.journal,chart_account_id:0
+#: help:account.report.general.ledger,chart_account_id:0
+#: help:account.vat.declaration,chart_account_id:0
+#: help:accounting.report,chart_account_id:0
+msgid "Select Charts of Accounts"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_invoice_refund
+msgid "Invoice Refund"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Li."
+msgstr ""
+
+#. module: account
+#: field:account.automatic.reconcile,unreconciled:0
+msgid "Not reconciled transactions"
+msgstr ""
+
+#. module: account
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+msgid "Counterpart"
+msgstr ""
+
+#. module: account
+#: view:account.fiscal.position:0
+#: field:account.fiscal.position,tax_ids:0
+#: field:account.fiscal.position.template,tax_ids:0
+msgid "Tax Mapping"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_fiscalyear_close_state
+#: model:ir.ui.menu,name:account.menu_wizard_fy_close_state
+msgid "Close a Fiscal Year"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_confirmstatementfromdraft0
+msgid "The accountant confirms the statement."
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/static/src/xml/account_move_reconciliation.xml:31
+#, python-format
+msgid "Nothing to reconcile"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,decimal_precision:0
+msgid "Decimal precision on journal entries"
+msgstr ""
+
+#. module: account
+#: selection:account.config.settings,period:0
+#: selection:account.installer,period:0
+msgid "3 Monthly"
+msgstr ""
+
+#. module: account
+#: field:ir.sequence,fiscal_ids:0
+msgid "Sequences"
+msgstr ""
+
+#. module: account
+#: field:account.financial.report,account_report_id:0
+#: selection:account.financial.report,type:0
+msgid "Report Value"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_validate_account_move.py:39
+#, python-format
+msgid ""
+"Specified journal does not have any account move entries in draft state for "
+"this period."
+msgstr ""
+
+#. module: account
+#: view:account.fiscal.position:0
+#: view:account.fiscal.position.template:0
+msgid "Taxes Mapping"
+msgstr ""
+
+#. module: account
+#: report:account.central.journal:0
+msgid "Centralized Journal"
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.sequence.fiscalyear:0
+msgid "Main Sequence must be different from current !"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_change_currency.py:64
+#: code:addons/account/wizard/account_change_currency.py:70
+#, python-format
+msgid "Current currency is not configured properly."
+msgstr ""
+
+#. module: account
+#: field:account.journal,profit_account_id:0
+msgid "Profit Account"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1156
+#, python-format
+msgid "No period found or more than one period found for the given date."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_report_account_type_sales
+msgid "Report of the Sales by Account Type"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3201
+#, python-format
+msgid "SAJ"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1591
+#, python-format
+msgid "Cannot create move with currency different from .."
+msgstr ""
+
+#. module: account
+#: model:email.template,report_name:account.email_template_edi_invoice
+msgid ""
+"Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' "
+"and 'draft' or ''}"
+msgstr ""
+
+#. module: account
+#: view:account.period:0
+#: view:account.period.close:0
+msgid "Close Period"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_common_partner_report
+msgid "Account Common Partner Report"
+msgstr ""
+
+#. module: account
+#: field:account.fiscalyear.close,period_id:0
+msgid "Opening Entries Period"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_journal_period
+msgid "Journal Period"
+msgstr ""
+
+#. module: account
+#: constraint:account.move:0
+msgid ""
+"You cannot create more than one move per period on a centralized journal."
+msgstr ""
+
+#. module: account
+#: help:account.tax,account_analytic_paid_id:0
+msgid ""
+"Set the analytic account that will be used by default on the invoice tax "
+"lines for refunds. Leave empty if you don't want to use an analytic account "
+"on the invoice tax lines by default."
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: selection:account.aged.trial.balance,result_selection:0
+#: selection:account.common.partner.report,result_selection:0
+#: selection:account.partner.balance,result_selection:0
+#: selection:account.partner.ledger,result_selection:0
+#: report:account.third_party_ledger:0
+#: code:addons/account/report/account_partner_balance.py:297
+#: code:addons/account/report/account_partner_ledger.py:272
+#, python-format
+msgid "Receivable Accounts"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "Configure your company bank accounts"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.refund:0
+msgid "Create Refund"
+msgstr ""
+
+#. module: account
+#: constraint:account.move.line:0
+msgid ""
+"The date of your Journal Entry is not in the defined period! You should "
+"change the date or remove this constraint from the journal."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_report_general_ledger
+msgid "General Ledger Report"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Re-Open"
+msgstr ""
+
+#. module: account
+#: view:account.use.model:0
+msgid "Are you sure you want to create entries?"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:1361
+#, python-format
+msgid "Invoice partially paid: %s%s of %s%s (%s%s remaining)."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Print Invoice"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_invoice_refund.py:111
+#, python-format
+msgid ""
+"Cannot %s invoice which is already reconciled, invoice should be "
+"unreconciled first. You can only refund this invoice."
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,display_detail:0
+msgid "Display children with hierarchy"
+msgstr ""
+
+#. module: account
+#: selection:account.payment.term.line,value:0
+#: selection:account.tax.template,type:0
+msgid "Percent"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_charts
+msgid "Charts"
+msgstr ""
+
+#. module: account
+#: code:addons/account/project/wizard/project_account_analytic_line.py:47
+#: model:ir.model,name:account.model_project_account_analytic_line
+#, python-format
+msgid "Analytic Entries by line"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.refund,filter_refund:0
+msgid "Refund Method"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_account_report
+msgid "Financial Report"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+#: view:account.analytic.journal:0
+#: field:account.analytic.journal,type:0
+#: field:account.bank.statement.line,type:0
+#: field:account.financial.report,type:0
+#: field:account.invoice,type:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,type:0
+#: view:account.journal:0
+#: field:account.journal,type:0
+#: field:account.move.reconcile,type:0
+#: xsl:account.transfer:0
+#: field:report.invoice.created,type:0
+msgid "Type"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:826
+#, python-format
+msgid ""
+"Taxes are missing!\n"
+"Click on compute button."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_subscription_line
+msgid "Account Subscription Line"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,reference:0
+msgid "The partner reference of this invoice."
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Supplier Invoices And Refunds"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:851
+#, python-format
+msgid "Entry is already reconciled."
+msgstr ""
+
+#. module: account
+#: view:account.move.line.unreconcile.select:0
+#: view:account.unreconcile.reconcile:0
+#: model:ir.model,name:account.model_account_move_line_unreconcile_select
+msgid "Unreconciliation"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_analytic_journal_report
+msgid "Account Analytic Journal"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Send by Email"
+msgstr ""
+
+#. module: account
+#: help:account.central.journal,amount_currency:0
+#: help:account.common.journal.report,amount_currency:0
+#: help:account.general.journal,amount_currency:0
+#: help:account.print.journal,amount_currency:0
+msgid ""
+"Print Report with the currency column if the currency differs from the "
+"company currency."
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.quantity_cost_ledger:0
+msgid "J.C./Move name"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+msgid "Account Code and Name"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "September"
+msgstr ""
+
+#. module: account
+#: selection:account.subscription,period_type:0
+msgid "days"
+msgstr ""
+
+#. module: account
+#: help:account.account.template,nocreate:0
+msgid ""
+"If checked, the new chart of accounts will not contain this by default."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_manual_reconcile
+msgid ""
+"<p>\n"
+" No journal items found.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1677
+#, python-format
+msgid ""
+"You cannot unreconcile journal items if they has been generated by the "
+" opening/closing fiscal "
+"year process."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_subscription_form_new
+msgid "New Subscription"
+msgstr ""
+
+#. module: account
+#: view:account.payment.term:0
+#: field:account.payment.term.line,value:0
+msgid "Computation"
+msgstr ""
+
+#. module: account
+#: field:account.journal.cashbox.line,pieces:0
+msgid "Values"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_tax_chart
+#: model:ir.actions.act_window,name:account.action_tax_code_tree
+#: model:ir.ui.menu,name:account.menu_action_tax_code_tree
+msgid "Chart of Taxes"
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear:0
+msgid "Create 3 Months Periods"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Due"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,purchase_journal_id:0
+msgid "Purchase journal"
+msgstr ""
+
+#. module: account
+#: model:mail.message.subtype,description:account.mt_invoice_paid
+msgid "Invoice paid"
+msgstr ""
+
+#. module: account
+#: view:validate.account.move:0
+#: view:validate.account.move.lines:0
+msgid "Approve"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: view:account.move:0
+#: view:report.invoice.created:0
+msgid "Total Amount"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,supplier_invoice_number:0
+msgid "The reference of this invoice as provided by the supplier."
+msgstr ""
+
+#. module: account
+#: selection:account.account,type:0
+#: selection:account.account.template,type:0
+#: selection:account.entries.report,type:0
+msgid "Consolidation"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.data_account_type_liability
+#: model:account.financial.report,name:account.account_financial_report_liability0
+#: model:account.financial.report,name:account.account_financial_report_liabilitysum0
+msgid "Liability"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:899
+#, python-format
+msgid "Please define sequence on the journal related to this invoice."
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_account_central_journal
+msgid "Centralizing Journal"
+msgstr ""
+
+#. module: account
+#: selection:account.journal,type:0
+msgid "Sale Refund"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_accountingstatemententries0
+msgid "Bank statement"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.line,move_id:0
+msgid "Move Line"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,tax_amount:0
+msgid ""
+"If the Tax account is a tax code account, this field will contain the taxed "
+"amount.If the tax account is base tax code, this field will contain the "
+"basic amount(without tax)."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Purchases"
+msgstr ""
+
+#. module: account
+#: field:account.model,lines_id:0
+msgid "Model Entries"
+msgstr ""
+
+#. module: account
+#: field:account.account,code:0
+#: report:account.account.balance:0
+#: field:account.account.template,code:0
+#: field:account.account.type,code:0
+#: report:account.analytic.account.balance:0
+#: report:account.analytic.account.inverted.balance:0
+#: report:account.analytic.account.journal:0
+#: field:account.analytic.line,code:0
+#: field:account.fiscalyear,code:0
+#: report:account.general.journal:0
+#: field:account.journal,code:0
+#: report:account.partner.balance:0
+#: field:account.period,code:0
+msgid "Code"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "Features"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:2346
+#: code:addons/account/account_bank_statement.py:424
+#: code:addons/account/account_invoice.py:77
+#: code:addons/account/account_invoice.py:775
+#: code:addons/account/account_move_line.py:195
+#, python-format
+msgid "No Analytic Journal !"
+msgstr ""
+
+#. module: account
+#: report:account.partner.balance:0
+#: model:ir.actions.act_window,name:account.action_account_partner_balance
+#: model:ir.actions.report.xml,name:account.account_3rdparty_account_balance
+#: model:ir.ui.menu,name:account.menu_account_partner_balance_report
+msgid "Partner Balance"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_gain_loss
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add an account.\n"
+" </p><p>\n"
+" When doing multi-currency transactions, you may loose or "
+"gain\n"
+" some amount due to changes of exchange rate. This menu "
+"gives\n"
+" you a forecast of the Gain or Loss you'd realized if those\n"
+" transactions were ended today. Only for accounts having a\n"
+" secondary currency set.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: field:account.bank.accounts.wizard,acc_name:0
+msgid "Account Name."
+msgstr ""
+
+#. module: account
+#: field:account.journal,with_last_closing_balance:0
+msgid "Opening With Last Closing Balance"
+msgstr ""
+
+#. module: account
+#: help:account.tax.code,notprintable:0
+msgid ""
+"Check this box if you don't want any tax related to this tax code to appear "
+"on invoices"
+msgstr ""
+
+#. module: account
+#: field:report.account.receivable,name:0
+msgid "Week of Year"
+msgstr ""
+
+#. module: account
+#: field:account.report.general.ledger,landscape:0
+msgid "Landscape Mode"
+msgstr ""
+
+#. module: account
+#: help:account.fiscalyear.close,fy_id:0
+msgid "Select a Fiscal year to close"
+msgstr ""
+
+#. module: account
+#: help:account.account.template,user_type:0
+msgid ""
+"These types are defined according to your country. The type contains more "
+"information about the account and its specificities."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Refund "
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_analytic_line.py:90
+#, python-format
+msgid "There is no expense account defined for this product: \"%s\" (id:%d)."
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+msgid "Applicability Options"
+msgstr ""
+
+#. module: account
+#: report:account.partner.balance:0
+msgid "In dispute"
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+#: model:ir.actions.act_window,name:account.action_view_bank_statement_tree
+#: model:ir.ui.menu,name:account.journal_cash_move_lines
+msgid "Cash Registers"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,sale_refund_journal_id:0
+msgid "Sale refund journal"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_view_bank_statement_tree
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new cash log.\n"
+" </p><p>\n"
+" A Cash Register allows you to manage cash entries in your "
+"cash\n"
+" journals. This feature provides an easy way to follow up "
+"cash\n"
+" payments on a daily basis. You can enter the coins that are "
+"in\n"
+" your cash box, and then post entries when money comes in or\n"
+" goes out of the cash box.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.data_account_type_bank
+#: selection:account.bank.accounts.wizard,account_type:0
+#: code:addons/account/account.py:3092
+#, python-format
+msgid "Bank"
+msgstr ""
+
+#. module: account
+#: field:account.period,date_start:0
+msgid "Start of Period"
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+msgid "Refunds"
+msgstr ""
+
+#. module: account
+#: model:process.transition,name:account.process_transition_confirmstatementfromdraft0
+msgid "Confirm statement"
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+msgid "Account Tax"
+msgstr ""
+
+#. module: account
+#: help:account.account,foreign_balance:0
+msgid ""
+"Total amount (in Secondary currency) for transactions held in secondary "
+"currency for this account."
+msgstr ""
+
+#. module: account
+#: field:account.fiscal.position.tax,tax_dest_id:0
+#: field:account.fiscal.position.tax.template,tax_dest_id:0
+msgid "Replacement Tax"
+msgstr ""
+
+#. module: account
+#: selection:account.move.line,centralisation:0
+msgid "Credit Centralisation"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_tax_code_template_form
+#: model:ir.ui.menu,name:account.menu_action_account_tax_code_template_form
+msgid "Tax Code Templates"
+msgstr ""
+
+#. module: account
+#: constraint:account.move.line:0
+msgid ""
+"The amount expressed in the secondary currency must be positif when journal "
+"item are debit and negatif when journal item are credit."
+msgstr ""
+
+#. module: account
+#: view:account.invoice.cancel:0
+msgid "Cancel Invoices"
+msgstr ""
+
+#. module: account
+#: help:account.journal,code:0
+msgid "The code will be displayed on reports."
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Taxes used in Purchases"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,tax_code_id:0
+#: field:account.tax,description:0
+#: view:account.tax.code:0
+#: field:account.tax.template,tax_code_id:0
+#: model:ir.model,name:account.model_account_tax_code
+msgid "Tax Code"
+msgstr ""
+
+#. module: account
+#: field:account.account,currency_mode:0
+msgid "Outgoing Currencies Rate"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+#: field:account.config.settings,chart_template_id:0
+msgid "Template"
+msgstr ""
+
+#. module: account
+#: selection:account.analytic.journal,type:0
+msgid "Situation"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,move_id:0
+msgid "The move of this entry line."
+msgstr ""
+
+#. module: account
+#: field:account.move.line.reconcile,trans_nbr:0
+msgid "# of Transaction"
+msgstr ""
+
+#. module: account
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+msgid "Entry Label"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,origin:0
+#: help:account.invoice.line,origin:0
+msgid "Reference of the document that produced this invoice."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+#: view:account.journal:0
+msgid "Others"
+msgstr ""
+
+#. module: account
+#: view:account.subscription:0
+msgid "Draft Subscription"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: report:account.account.balance:0
+#: field:account.automatic.reconcile,writeoff_acc_id:0
+#: field:account.bank.statement.line,account_id:0
+#: view:account.entries.report:0
+#: field:account.entries.report,account_id:0
+#: field:account.invoice,account_id:0
+#: field:account.invoice.line,account_id:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,account_id:0
+#: field:account.journal,account_control_ids:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: field:account.model.line,account_id:0
+#: view:account.move.line:0
+#: field:account.move.line,account_id:0
+#: field:account.move.line.reconcile.select,account_id:0
+#: field:account.move.line.unreconcile.select,account_id:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,account_id:0
+#: model:ir.model,name:account.model_account_account
+#: field:report.account.sales,account_id:0
+msgid "Account"
+msgstr ""
+
+#. module: account
+#: field:account.tax,include_base_amount:0
+msgid "Included in base amount"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+#: model:ir.actions.act_window,name:account.action_account_entries_report_all
+#: model:ir.ui.menu,name:account.menu_action_account_entries_report_all
+msgid "Entries Analysis"
+msgstr ""
+
+#. module: account
+#: field:account.account,level:0
+#: field:account.financial.report,level:0
+msgid "Level"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_change_currency.py:38
+#, python-format
+msgid "You can only change currency for Draft Invoice."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: view:account.invoice:0
+#: field:account.invoice.line,invoice_line_tax_id:0
+#: view:account.move:0
+#: view:account.move.line:0
+#: model:ir.actions.act_window,name:account.action_tax_form
+#: model:ir.ui.menu,name:account.account_template_taxes
+#: model:ir.ui.menu,name:account.menu_action_tax_form
+#: model:ir.ui.menu,name:account.menu_tax_report
+#: model:ir.ui.menu,name:account.next_id_27
+msgid "Taxes"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_financial_report.py:70
+#, python-format
+msgid "Select a starting and an ending period"
+msgstr ""
+
+#. module: account
+#: model:account.financial.report,name:account.account_financial_report_profitandloss0
+#: model:ir.actions.act_window,name:account.action_account_report_pl
+msgid "Profit and Loss"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_account_template
+msgid "Templates for Accounts"
+msgstr ""
+
+#. module: account
+#: view:account.tax.code.template:0
+msgid "Search tax template"
+msgstr ""
+
+#. module: account
+#: view:account.move.reconcile:0
+#: model:ir.actions.act_window,name:account.action_account_reconcile_select
+#: model:ir.actions.act_window,name:account.action_view_account_move_line_reconcile
+msgid "Reconcile Entries"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.report.xml,name:account.account_overdue
+#: view:res.company:0
+msgid "Overdue Payments"
+msgstr ""
+
+#. module: account
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+msgid "Initial Balance"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Reset to Draft"
+msgstr ""
+
+#. module: account
+#: view:account.aged.trial.balance:0
+#: view:account.common.report:0
+msgid "Report Options"
+msgstr ""
+
+#. module: account
+#: field:account.fiscalyear.close.state,fy_id:0
+msgid "Fiscal Year to Close"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,sale_sequence_prefix:0
+msgid "Invoice sequence"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_entries_report
+msgid "Journal Items Analysis"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.next_id_22
+msgid "Partners"
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement,state:0
+msgid ""
+"When new statement is created the status will be 'Draft'.\n"
+"And after getting confirmation from the bank it will be in 'Confirmed' "
+"status."
+msgstr ""
+
+#. module: account
+#: field:account.invoice.report,state:0
+msgid "Invoice Status"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: model:ir.model,name:account.model_account_bank_statement
+#: model:process.node,name:account.process_node_accountingstatemententries0
+#: model:process.node,name:account.process_node_bankstatement0
+#: model:process.node,name:account.process_node_supplierbankstatement0
+msgid "Bank Statement"
+msgstr ""
+
+#. module: account
+#: field:res.partner,property_account_receivable:0
+msgid "Account Receivable"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:612
+#: code:addons/account/account.py:767
+#: code:addons/account/account.py:768
+#, python-format
+msgid "%s (copy)"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: selection:account.balance.report,display_account:0
+#: selection:account.common.account.report,display_account:0
+#: report:account.general.ledger_landscape:0
+#: selection:account.partner.balance,display_partner:0
+#: selection:account.report.general.ledger,display_account:0
+msgid "With balance is not equal to 0"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1483
+#, python-format
+msgid ""
+"There is no default debit account defined \n"
+"on journal \"%s\"."
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+msgid "Search Taxes"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_analytic_cost_ledger
+msgid "Account Analytic Cost Ledger"
+msgstr ""
+
+#. module: account
+#: view:account.model:0
+msgid "Create entries"
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,nbr:0
+msgid "# of Items"
+msgstr ""
+
+#. module: account
+#: field:account.automatic.reconcile,max_amount:0
+msgid "Maximum write-off amount"
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/static/src/xml/account_move_reconciliation.xml:10
+#, python-format
+msgid ""
+"There is nothing to reconcile. All invoices and payments\n"
+" have been reconciled, your partner balance is clean."
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,code_digits:0
+#: field:account.config.settings,code_digits:0
+#: field:wizard.multi.charts.accounts,code_digits:0
+msgid "# of Digits"
+msgstr ""
+
+#. module: account
+#: field:account.journal,entry_posted:0
+msgid "Skip 'Draft' State for Manual Entries"
+msgstr ""
+
+#. module: account
+#: code:addons/account/report/common_report_header.py:92
+#: code:addons/account/wizard/account_report_common.py:164
+#, python-format
+msgid "Not implemented."
+msgstr ""
+
+#. module: account
+#: view:account.invoice.refund:0
+msgid "Credit Note"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "eInvoicing & Payments"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.cost.ledger.journal.report:0
+msgid "Cost Ledger for Period"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "# of Entries "
+msgstr ""
+
+#. module: account
+#: help:account.fiscal.position,active:0
+msgid ""
+"By unchecking the active field, you may hide a fiscal position without "
+"deleting it."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_temp_range
+msgid "A Temporary table used for Dashboard view"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_invoice_tree4
+#: model:ir.ui.menu,name:account.menu_action_invoice_tree4
+msgid "Supplier Refunds"
+msgstr ""
+
+#. module: account
+#: field:account.tax.code,code:0
+#: field:account.tax.code.template,code:0
+msgid "Case Code"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,company_footer:0
+msgid "Bank accounts footer preview"
+msgstr ""
+
+#. module: account
+#: selection:account.account,type:0
+#: selection:account.account.template,type:0
+#: selection:account.bank.statement,state:0
+#: selection:account.entries.report,type:0
+#: view:account.fiscalyear:0
+#: selection:account.fiscalyear,state:0
+#: selection:account.period,state:0
+msgid "Closed"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_recurrent_entries
+msgid "Recurring Entries"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_fiscal_position_template
+msgid "Template for Fiscal Position"
+msgstr ""
+
+#. module: account
+#: view:account.subscription:0
+msgid "Recurring"
+msgstr ""
+
+#. module: account
+#: field:account.journal,groups_id:0
+msgid "Groups"
+msgstr ""
+
+#. module: account
+#: field:report.invoice.created,amount_untaxed:0
+msgid "Untaxed"
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+msgid "Advanced Settings"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Search Bank Statements"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Unposted Journal Items"
+msgstr ""
+
+#. module: account
+#: view:account.chart.template:0
+#: field:account.chart.template,property_account_payable:0
+msgid "Payable Account"
+msgstr ""
+
+#. module: account
+#: field:account.tax,account_paid_id:0
+#: field:account.tax.template,account_paid_id:0
+msgid "Refund Tax Account"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_ir_sequence
+msgid "ir.sequence"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: field:account.bank.statement,line_ids:0
+msgid "Statement lines"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.cost_ledger:0
+msgid "Date/Code"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.line,general_account_id:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,general_account_id:0
+msgid "General Account"
+msgstr ""
+
+#. module: account
+#: field:res.partner,debit_limit:0
+msgid "Payable Limit"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_type_form
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to define a new account type.\n"
+" </p><p>\n"
+" An account type is used to determine how an account is used "
+"in\n"
+" each journal. The deferral method of an account type "
+"determines\n"
+" the process for the annual closing. Reports such as the "
+"Balance\n"
+" Sheet and the Profit and Loss report use the category\n"
+" (profit/loss or balance sheet).\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: view:account.invoice:0
+#: view:account.invoice.report:0
+#: field:account.move.line,invoice:0
+#: code:addons/account/account_invoice.py:1157
+#: model:ir.model,name:account.model_account_invoice
+#: model:res.request.link,name:account.req_link_invoice
+#, python-format
+msgid "Invoice"
+msgstr ""
+
+#. module: account
+#: field:account.move,balance:0
+msgid "balance"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_analytic0
+#: model:process.node,note:account.process_node_analyticcost0
+msgid "Analytic costs to invoice"
+msgstr ""
+
+#. module: account
+#: view:ir.sequence:0
+msgid "Fiscal Year Sequence"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,group_analytic_accounting:0
+msgid "Analytic accounting"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Sub-Total :"
+msgstr ""
+
+#. module: account
+#: help:res.company,tax_calculation_rounding_method:0
+msgid ""
+"If you select 'Round per Line' : for each tax, the tax amount will first be "
+"computed and rounded for each PO/SO/invoice line and then these rounded "
+"amounts will be summed, leading to the total amount for that tax. If you "
+"select 'Round Globally': for each tax, the tax amount will be computed for "
+"each PO/SO/invoice line, then these amounts will be summed and eventually "
+"this total tax amount will be rounded. If you sell with tax included, you "
+"should choose 'Round per line' because you certainly want the sum of your "
+"tax-included line subtotals to be equal to the total amount with taxes."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_report_account_type_sales_tree_all
+#: view:report.account_type.sales:0
+msgid "Sales by Account Type"
+msgstr ""
+
+#. module: account
+#: model:account.payment.term,name:account.account_payment_term_15days
+#: model:account.payment.term,note:account.account_payment_term_15days
+msgid "15 Days"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.periodical_processing_invoicing
+msgid "Invoicing"
+msgstr ""
+
+#. module: account
+#: code:addons/account/report/account_partner_balance.py:115
+#, python-format
+msgid "Unknown Partner"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_fiscalyear_close.py:103
+#, python-format
+msgid ""
+"The journal must have centralized counterpart without the Skipping draft "
+"state option checked."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:854
+#, python-format
+msgid "Some entries are already reconciled."
+msgstr ""
+
+#. module: account
+#: field:account.tax.code,sum:0
+msgid "Year Sum"
+msgstr ""
+
+#. module: account
+#: view:account.change.currency:0
+msgid "This wizard will change the currency of the invoice"
+msgstr ""
+
+#. module: account
+#: view:account.installer:0
+msgid ""
+"Select a configuration package to setup automatically your\n"
+" taxes and chart of accounts."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+msgid "Pending Accounts"
+msgstr ""
+
+#. module: account
+#: view:account.open.closed.fiscalyear:0
+msgid "Cancel Fiscal Year Opening Entries"
+msgstr ""
+
+#. module: account
+#: report:account.journal.period.print.sale.purchase:0
+#: view:account.tax.template:0
+msgid "Tax Declaration"
+msgstr ""
+
+#. module: account
+#: help:account.journal.period,active:0
+msgid ""
+"If the active field is set to False, it will allow you to hide the journal "
+"period without removing it."
+msgstr ""
+
+#. module: account
+#: field:account.report.general.ledger,sortby:0
+msgid "Sort by"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.act_account_partner_account_move_all
+msgid "Receivables & Payables"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,module_account_payment:0
+msgid "Manage payment orders"
+msgstr ""
+
+#. module: account
+#: view:account.period:0
+msgid "Duration"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: field:account.bank.statement,last_closing_balance:0
+msgid "Last Closing Balance"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_common_journal_report
+msgid "Account Common Journal Report"
+msgstr ""
+
+#. module: account
+#: selection:account.partner.balance,display_partner:0
+msgid "All Partners"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.chart:0
+msgid "Analytic Account Charts"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Customer Ref:"
+msgstr ""
+
+#. module: account
+#: help:account.tax,base_code_id:0
+#: help:account.tax,ref_base_code_id:0
+#: help:account.tax,ref_tax_code_id:0
+#: help:account.tax,tax_code_id:0
+#: help:account.tax.template,base_code_id:0
+#: help:account.tax.template,ref_base_code_id:0
+#: help:account.tax.template,ref_tax_code_id:0
+#: help:account.tax.template,tax_code_id:0
+msgid "Use this code for the tax declaration."
+msgstr ""
+
+#. module: account
+#: help:account.period,special:0
+msgid "These periods can overlap."
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_draftstatement0
+msgid "Draft statement"
+msgstr ""
+
+#. module: account
+#: model:mail.message.subtype,description:account.mt_invoice_validated
+msgid "Invoice validated"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,module_account_check_writing:0
+msgid "Pay your suppliers by check"
+msgstr ""
+
+#. module: account
+#: field:account.move.line.reconcile,credit:0
+msgid "Credit amount"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,message_ids:0
+#: field:account.invoice,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: account
+#: view:account.vat.declaration:0
+msgid ""
+"This menu prints a tax declaration based on invoices or payments. Select one "
+"or several periods of the fiscal year. The information required for a tax "
+"declaration is automatically generated by OpenERP from invoices (or "
+"payments, in some countries). This data is updated in real time. That’s very "
+"useful because it enables you to preview at any time the tax that you owe at "
+"the start and end of the month or quarter."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:409
+#: code:addons/account/account.py:414
+#: code:addons/account/account.py:431
+#: code:addons/account/account.py:634
+#: code:addons/account/account.py:636
+#: code:addons/account/account.py:930
+#: code:addons/account/account.py:1071
+#: code:addons/account/account.py:1073
+#: code:addons/account/account.py:1116
+#: code:addons/account/account.py:1319
+#: code:addons/account/account.py:1333
+#: code:addons/account/account.py:1356
+#: code:addons/account/account.py:1363
+#: code:addons/account/account.py:1587
+#: code:addons/account/account.py:1591
+#: code:addons/account/account.py:1677
+#: code:addons/account/account.py:2358
+#: code:addons/account/account.py:2678
+#: code:addons/account/account.py:3465
+#: code:addons/account/account_analytic_line.py:89
+#: code:addons/account/account_analytic_line.py:98
+#: code:addons/account/account_bank_statement.py:368
+#: code:addons/account/account_bank_statement.py:381
+#: code:addons/account/account_bank_statement.py:419
+#: code:addons/account/account_cash_statement.py:256
+#: code:addons/account/account_cash_statement.py:300
+#: code:addons/account/account_invoice.py:899
+#: code:addons/account/account_invoice.py:933
+#: code:addons/account/account_invoice.py:1124
+#: code:addons/account/account_move_line.py:579
+#: code:addons/account/account_move_line.py:828
+#: code:addons/account/account_move_line.py:851
+#: code:addons/account/account_move_line.py:854
+#: code:addons/account/account_move_line.py:1119
+#: code:addons/account/account_move_line.py:1121
+#: code:addons/account/account_move_line.py:1156
+#: code:addons/account/report/common_report_header.py:92
+#: code:addons/account/wizard/account_change_currency.py:38
+#: code:addons/account/wizard/account_change_currency.py:59
+#: code:addons/account/wizard/account_change_currency.py:64
+#: code:addons/account/wizard/account_change_currency.py:70
+#: code:addons/account/wizard/account_financial_report.py:70
+#: code:addons/account/wizard/account_invoice_refund.py:109
+#: code:addons/account/wizard/account_invoice_refund.py:111
+#: code:addons/account/wizard/account_move_bank_reconcile.py:49
+#: code:addons/account/wizard/account_open_closed_fiscalyear.py:39
+#: code:addons/account/wizard/account_report_common.py:158
+#: code:addons/account/wizard/account_report_common.py:164
+#: code:addons/account/wizard/account_use_model.py:44
+#: code:addons/account/wizard/pos_box.py:31
+#: code:addons/account/wizard/pos_box.py:35
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_invoice_tree2
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to record a new supplier invoice.\n"
+" </p><p>\n"
+" You can control the invoice from your supplier according to\n"
+" what you purchased or received. OpenERP can also generate\n"
+" draft invoices automatically from purchase orders or "
+"receipts.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.move.line:0
+msgid "Wrong credit or debit value in accounting entry !"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+#: model:ir.actions.act_window,name:account.action_account_invoice_report_all
+#: model:ir.ui.menu,name:account.menu_action_account_invoice_report_all
+msgid "Invoices Analysis"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_mail_compose_message
+msgid "Email composition wizard"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_period_close
+msgid "period close"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1058
+#, python-format
+msgid ""
+"This journal already contains items for this period, therefore you cannot "
+"modify its company field."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_project_account_analytic_line_form
+msgid "Entries By Line"
+msgstr ""
+
+#. module: account
+#: field:account.vat.declaration,based_on:0
+msgid "Based on"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_bank_statement_tree
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to register a bank statement.\n"
+" </p><p>\n"
+" A bank statement is a summary of all financial transactions\n"
+" occurring over a given period of time on a bank account. "
+"You\n"
+" should receive this periodicaly from your bank.\n"
+" </p><p>\n"
+" OpenERP allows you to reconcile a statement line directly "
+"with\n"
+" the related sale or puchase invoices.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,currency_id:0
+msgid "Default company currency"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,move_id:0
+#: field:account.invoice,move_name:0
+#: field:account.move.line,move_id:0
+msgid "Journal Entry"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Unpaid"
+msgstr ""
+
+#. module: account
+#: view:account.treasury.report:0
+#: model:ir.actions.act_window,name:account.action_account_treasury_report_all
+#: model:ir.model,name:account.model_account_treasury_report
+#: model:ir.ui.menu,name:account.menu_action_account_treasury_report_all
+msgid "Treasury Analysis"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.report.xml,name:account.account_journal_sale_purchase
+msgid "Sale/Purchase Journal"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+#: field:account.invoice.tax,account_analytic_id:0
+msgid "Analytic account"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_bank_statement.py:406
+#, python-format
+msgid "Please verify that an account is defined in the journal."
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,move_line_state:0
+msgid "Valid"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,message_follower_ids:0
+#: field:account.invoice,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_print_journal
+#: model:ir.model,name:account.model_account_print_journal
+msgid "Account Print Journal"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_product_category
+msgid "Product Category"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:656
+#, python-format
+msgid ""
+"You cannot change the type of account to '%s' type as it contains journal "
+"items!"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_aged_trial_balance
+msgid "Account Aged Trial balance Report"
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear.close.state:0
+msgid "Close Fiscal Year"
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/static/src/xml/account_move_line_quickadd.xml:14
+#, python-format
+msgid "Journal :"
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.fiscal.position.tax:0
+msgid "A tax fiscal position could be defined only once time on same taxes."
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+#: view:account.tax.template:0
+msgid "Tax Definition"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+#: model:ir.actions.act_window,name:account.action_account_config
+msgid "Configure Accounting"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.report,uom_name:0
+msgid "Reference Unit of Measure"
+msgstr ""
+
+#. module: account
+#: help:account.journal,allow_date:0
+msgid ""
+"If set to True then do not accept the entry if the entry date is not into "
+"the period dates"
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/static/src/xml/account_move_reconciliation.xml:8
+#, python-format
+msgid "Good job!"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,module_account_asset:0
+msgid "Assets management"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: view:account.account.template:0
+#: selection:account.aged.trial.balance,result_selection:0
+#: selection:account.common.partner.report,result_selection:0
+#: selection:account.partner.balance,result_selection:0
+#: selection:account.partner.ledger,result_selection:0
+#: report:account.third_party_ledger:0
+#: code:addons/account/report/account_partner_balance.py:299
+#: code:addons/account/report/account_partner_ledger.py:274
+#, python-format
+msgid "Payable Accounts"
+msgstr ""
+
+#. module: account
+#: constraint:account.move.line:0
+msgid ""
+"The selected account of your Journal Entry forces to provide a secondary "
+"currency. You should remove the secondary currency on the account or select "
+"a multi-currency view on the journal."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: view:report.invoice.created:0
+msgid "Untaxed Amount"
+msgstr ""
+
+#. module: account
+#: help:account.tax,active:0
+msgid ""
+"If the active field is set to False, it will allow you to hide the tax "
+"without removing it."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Analytic Journal Items related to a sale journal."
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,style_overwrite:0
+msgid "Italic Text (smaller)"
+msgstr ""
+
+#. module: account
+#: help:account.journal,cash_control:0
+msgid ""
+"If you want the journal should be control at opening/closing, check this "
+"option"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: view:account.invoice:0
+#: selection:account.invoice,state:0
+#: view:account.invoice.report:0
+#: selection:account.invoice.report,state:0
+#: selection:account.journal.period,state:0
+#: view:account.subscription:0
+#: selection:account.subscription,state:0
+#: selection:report.invoice.created,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: account
+#: field:account.move.reconcile,line_partial_ids:0
+msgid "Partial Entry lines"
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear:0
+#: field:account.treasury.report,fiscalyear_id:0
+msgid "Fiscalyear"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_move_bank_reconcile.py:53
+#, python-format
+msgid "Standard Encoding"
+msgstr ""
+
+#. module: account
+#: view:account.journal.select:0
+#: view:project.account.analytic.line:0
+msgid "Open Entries"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,purchase_refund_sequence_next:0
+msgid "Next supplier credit note number"
+msgstr ""
+
+#. module: account
+#: field:account.automatic.reconcile,account_ids:0
+msgid "Accounts to Reconcile"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_filestatement0
+msgid "Import of the statement in the system from an electronic file"
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_importinvoice0
+msgid "Import from invoice"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "January"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "This F.Year"
+msgstr ""
+
+#. module: account
+#: view:account.tax.chart:0
+msgid "Account tax charts"
+msgstr ""
+
+#. module: account
+#: model:account.payment.term,name:account.account_payment_term_net
+#: model:account.payment.term,note:account.account_payment_term_net
+msgid "30 Net Days"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_cash_statement.py:256
+#, python-format
+msgid "You do not have rights to open this %s journal !"
+msgstr ""
+
+#. module: account
+#: model:res.groups,name:account.group_supplier_inv_check_total
+msgid "Check Total on supplier invoices"
+msgstr ""
+
+#. module: account
+#: selection:account.invoice,state:0
+#: view:account.invoice.report:0
+#: selection:account.invoice.report,state:0
+#: selection:report.invoice.created,state:0
+msgid "Pro-forma"
+msgstr ""
+
+#. module: account
+#: help:account.account.template,type:0
+#: help:account.entries.report,type:0
+msgid ""
+"This type is used to differentiate types with special effects in OpenERP: "
+"view can not have entries, consolidation are accounts that can have children "
+"accounts for multi-company consolidations, payable/receivable are for "
+"partners accounts (for debit/credit computations), closed for depreciated "
+"accounts."
+msgstr ""
+
+#. module: account
+#: view:account.chart.template:0
+msgid "Search Chart of Account Templates"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Customer Code"
+msgstr ""
+
+#. module: account
+#: view:account.account.type:0
+#: field:account.account.type,note:0
+#: report:account.invoice:0
+#: field:account.invoice,name:0
+#: field:account.invoice.line,name:0
+#: report:account.overdue:0
+#: field:account.payment.term,note:0
+#: view:account.tax.code:0
+#: field:account.tax.code,info:0
+#: view:account.tax.code.template:0
+#: field:account.tax.code.template,info:0
+#: field:analytic.entries.report,name:0
+#: field:report.invoice.created,name:0
+msgid "Description"
+msgstr ""
+
+#. module: account
+#: field:account.tax,price_include:0
+#: field:account.tax.template,price_include:0
+msgid "Tax Included in Price"
+msgstr ""
+
+#. module: account
+#: view:account.subscription:0
+#: selection:account.subscription,state:0
+msgid "Running"
+msgstr ""
+
+#. module: account
+#: view:account.chart.template:0
+#: field:product.category,property_account_income_categ:0
+#: field:product.template,property_account_income:0
+msgid "Income Account"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,default_sale_tax:0
+msgid "This sale tax will be assigned by default on new products."
+msgstr ""
+
+#. module: account
+#: report:account.general.ledger_landscape:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+msgid "Entries Sorted By"
+msgstr ""
+
+#. module: account
+#: field:account.change.currency,currency_id:0
+msgid "Change to"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "# of Products Qty "
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_product_template
+msgid "Product Template"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: field:account.aged.trial.balance,fiscalyear_id:0
+#: field:account.balance.report,fiscalyear_id:0
+#: report:account.central.journal:0
+#: field:account.central.journal,fiscalyear_id:0
+#: field:account.common.account.report,fiscalyear_id:0
+#: field:account.common.journal.report,fiscalyear_id:0
+#: field:account.common.partner.report,fiscalyear_id:0
+#: field:account.common.report,fiscalyear_id:0
+#: view:account.config.settings:0
+#: view:account.entries.report:0
+#: field:account.entries.report,fiscalyear_id:0
+#: view:account.fiscalyear:0
+#: field:account.fiscalyear,name:0
+#: report:account.general.journal:0
+#: field:account.general.journal,fiscalyear_id:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: field:account.journal.period,fiscalyear_id:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: field:account.open.closed.fiscalyear,fyear_id:0
+#: report:account.partner.balance:0
+#: field:account.partner.balance,fiscalyear_id:0
+#: field:account.partner.ledger,fiscalyear_id:0
+#: field:account.period,fiscalyear_id:0
+#: field:account.print.journal,fiscalyear_id:0
+#: field:account.report.general.ledger,fiscalyear_id:0
+#: field:account.sequence.fiscalyear,fiscalyear_id:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: report:account.vat.declaration:0
+#: field:account.vat.declaration,fiscalyear_id:0
+#: field:accounting.report,fiscalyear_id:0
+#: field:accounting.report,fiscalyear_id_cmp:0
+#: model:ir.model,name:account.model_account_fiscalyear
+msgid "Fiscal Year"
+msgstr ""
+
+#. module: account
+#: help:account.aged.trial.balance,fiscalyear_id:0
+#: help:account.balance.report,fiscalyear_id:0
+#: help:account.central.journal,fiscalyear_id:0
+#: help:account.common.account.report,fiscalyear_id:0
+#: help:account.common.journal.report,fiscalyear_id:0
+#: help:account.common.partner.report,fiscalyear_id:0
+#: help:account.common.report,fiscalyear_id:0
+#: help:account.general.journal,fiscalyear_id:0
+#: help:account.partner.balance,fiscalyear_id:0
+#: help:account.partner.ledger,fiscalyear_id:0
+#: help:account.print.journal,fiscalyear_id:0
+#: help:account.report.general.ledger,fiscalyear_id:0
+#: help:account.vat.declaration,fiscalyear_id:0
+#: help:accounting.report,fiscalyear_id:0
+#: help:accounting.report,fiscalyear_id_cmp:0
+msgid "Keep empty for all open fiscal year"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:653
+#, python-format
+msgid ""
+"You cannot change the type of account from 'Closed' to any other type as it "
+"contains journal items!"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.report,account_line_id:0
+msgid "Account Line"
+msgstr ""
+
+#. module: account
+#: view:account.addtmpl.wizard:0
+msgid "Create an Account Based on this Template"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:933
+#, python-format
+msgid ""
+"Cannot create the invoice.\n"
+"The related payment term is probably misconfigured as it gives a computed "
+"amount greater than the total invoiced amount. In order to avoid rounding "
+"issues, the latest line of your payment term must be of type 'balance'."
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: model:ir.model,name:account.model_account_move
+msgid "Account Entry"
+msgstr ""
+
+#. module: account
+#: field:account.sequence.fiscalyear,sequence_main_id:0
+msgid "Main Sequence"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_bank_statement.py:478
+#, python-format
+msgid ""
+"In order to delete a bank statement, you must first cancel it to delete "
+"related journal items."
+msgstr ""
+
+#. module: account
+#: field:account.invoice.report,payment_term:0
+#: view:account.payment.term:0
+#: field:account.payment.term,name:0
+#: view:account.payment.term.line:0
+#: field:account.payment.term.line,payment_id:0
+#: model:ir.model,name:account.model_account_payment_term
+msgid "Payment Term"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_fiscal_position_form
+#: model:ir.ui.menu,name:account.menu_action_account_fiscal_position_form
+msgid "Fiscal Positions"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:579
+#, python-format
+msgid "You cannot create journal items on a closed account %s %s."
+msgstr ""
+
+#. module: account
+#: field:account.period.close,sure:0
+msgid "Check this box"
+msgstr ""
+
+#. module: account
+#: view:account.common.report:0
+msgid "Filters"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_draftinvoices0
+#: model:process.node,note:account.process_node_supplierdraftinvoices0
+msgid "Draft state of an invoice"
+msgstr ""
+
+#. module: account
+#: view:product.category:0
+msgid "Account Properties"
+msgstr ""
+
+#. module: account
+#: selection:account.invoice.refund,filter_refund:0
+msgid "Create a draft refund"
+msgstr ""
+
+#. module: account
+#: view:account.partner.reconcile.process:0
+msgid "Partner Reconciliation"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Fin. Account"
+msgstr ""
+
+#. module: account
+#: field:account.tax,tax_code_id:0
+#: view:account.tax.code:0
+msgid "Account Tax Code"
+msgstr ""
+
+#. module: account
+#: model:account.payment.term,name:account.account_payment_term_advance
+#: model:account.payment.term,note:account.account_payment_term_advance
+msgid "30% Advance End 30 Days"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "Unreconciled entries"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,base_code_id:0
+#: field:account.tax.template,base_code_id:0
+msgid "Base Code"
+msgstr ""
+
+#. module: account
+#: help:account.invoice.tax,sequence:0
+msgid "Gives the sequence order when displaying a list of invoice tax."
+msgstr ""
+
+#. module: account
+#: field:account.tax,base_sign:0
+#: field:account.tax,ref_base_sign:0
+#: field:account.tax.template,base_sign:0
+#: field:account.tax.template,ref_base_sign:0
+msgid "Base Code Sign"
+msgstr ""
+
+#. module: account
+#: selection:account.move.line,centralisation:0
+msgid "Debit Centralisation"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.confirm:0
+#: model:ir.actions.act_window,name:account.action_account_invoice_confirm
+msgid "Confirm Draft Invoices"
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,day:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,day:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,day:0
+msgid "Day"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.act_account_renew_view
+msgid "Accounts to Renew"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_model_line
+msgid "Account Model Entries"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3202
+#, python-format
+msgid "EXJ"
+msgstr ""
+
+#. module: account
+#: field:product.template,supplier_taxes_id:0
+msgid "Supplier Taxes"
+msgstr ""
+
+#. module: account
+#: view:res.partner:0
+msgid "Bank Details"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_move_journal_line
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a journal entry.\n"
+" </p><p>\n"
+" A journal entry consists of several journal items, each of\n"
+" which is either a debit or a credit transaction.\n"
+" </p><p>\n"
+" OpenERP automatically creates one journal entry per "
+"accounting\n"
+" document: invoice, refund, supplier payment, bank "
+"statements,\n"
+" etc. So, you should record journal entries manually "
+"only/mainly\n"
+" for miscellaneous operations.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: help:account.invoice,payment_term:0
+msgid ""
+"If you use payment terms, the due date will be computed automatically at the "
+"generation of accounting entries. If you keep the payment term and the due "
+"date empty, it means direct payment. The payment term may compute several "
+"due dates, for example 50% now, 50% in one month."
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,purchase_sequence_next:0
+msgid "Next supplier invoice number"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.cost.ledger.journal.report:0
+msgid "Select period"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_account_pp_statements
+msgid "Statements"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.journal:0
+msgid "Move Name"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_move_line_reconcile_writeoff
+msgid "Account move line reconcile (writeoff)"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.conf_account_type_tax
+#: report:account.invoice:0
+#: field:account.invoice,amount_tax:0
+#: report:account.journal.period.print.sale.purchase:0
+#: field:account.move.line,account_tax_id:0
+#: view:account.tax:0
+#: model:ir.model,name:account.model_account_tax
+msgid "Tax"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+#: view:account.analytic.line:0
+#: field:account.bank.statement.line,analytic_account_id:0
+#: field:account.entries.report,analytic_account_id:0
+#: field:account.invoice.line,account_analytic_id:0
+#: field:account.model.line,analytic_account_id:0
+#: field:account.move.line,analytic_account_id:0
+#: field:account.move.line.reconcile.writeoff,analytic_id:0
+msgid "Analytic Account"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,default_purchase_tax:0
+#: field:account.config.settings,purchase_tax:0
+msgid "Default purchase tax"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: field:account.financial.report,account_ids:0
+#: selection:account.financial.report,type:0
+#: view:account.journal:0
+#: model:ir.actions.act_window,name:account.action_account_form
+#: model:ir.ui.menu,name:account.account_account_menu
+#: model:ir.ui.menu,name:account.account_template_accounts
+#: model:ir.ui.menu,name:account.menu_action_account_form
+#: model:ir.ui.menu,name:account.menu_analytic
+msgid "Accounts"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3541
+#: code:addons/account/account_bank_statement.py:405
+#: code:addons/account/account_invoice.py:507
+#: code:addons/account/account_invoice.py:609
+#: code:addons/account/account_invoice.py:624
+#: code:addons/account/account_invoice.py:632
+#: code:addons/account/account_invoice.py:657
+#: code:addons/account/account_move_line.py:536
+#, python-format
+msgid "Configuration Error!"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_bank_statement.py:434
+#, python-format
+msgid "Statement %s confirmed, journal items were created."
+msgstr ""
+
+#. module: account
+#: field:account.invoice.report,price_average:0
+#: field:account.invoice.report,user_currency_price_average:0
+msgid "Average Price"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Date:"
+msgstr ""
+
+#. module: account
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+msgid "Label"
+msgstr ""
+
+#. module: account
+#: view:res.partner.bank:0
+msgid "Accounting Information"
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+#: view:account.tax.template:0
+msgid "Special Computation"
+msgstr ""
+
+#. module: account
+#: view:account.move.bank.reconcile:0
+#: model:ir.actions.act_window,name:account.action_account_bank_reconcile_tree
+msgid "Bank reconciliation"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Disc.(%)"
+msgstr ""
+
+#. module: account
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.overdue:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+msgid "Ref"
+msgstr ""
+
+#. module: account
+#: view:wizard.multi.charts.accounts:0
+msgid "Purchase Tax"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,tax_code_id:0
+msgid "The Account can either be a base tax code or a tax code account."
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.model.line:0
+msgid "Wrong credit or debit value in model, they must be positive!"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_reconciliation0
+#: model:process.node,note:account.process_node_supplierreconciliation0
+msgid "Comparison between accounting and payment entries"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_automatic_reconcile
+msgid "Automatic Reconciliation"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,reconciled:0
+msgid "Paid/Reconciled"
+msgstr ""
+
+#. module: account
+#: field:account.tax,ref_base_code_id:0
+#: field:account.tax.template,ref_base_code_id:0
+msgid "Refund Base Code"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_bank_statement_tree
+#: model:ir.ui.menu,name:account.menu_bank_statement_tree
+msgid "Bank Statements"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_fiscalyear
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to start a new fiscal year.\n"
+" </p><p>\n"
+" Define your company's financial year according to your "
+"needs. A\n"
+" financial year is a period at the end of which a company's\n"
+" accounts are made up (usually 12 months). The financial year "
+"is\n"
+" usually referred to by the date in which it ends. For "
+"example,\n"
+" if a company's financial year ends November 30, 2011, then\n"
+" everything between December 1, 2010 and November 30, 2011\n"
+" would be referred to as FY 2011.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: view:account.common.report:0
+#: view:account.move:0
+#: view:account.move.line:0
+#: view:accounting.report:0
+msgid "Dates"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,parent_id:0
+msgid "Parent Chart Template"
+msgstr ""
+
+#. module: account
+#: field:account.tax,parent_id:0
+#: field:account.tax.template,parent_id:0
+msgid "Parent Tax Account"
+msgstr ""
+
+#. module: account
+#: view:account.aged.trial.balance:0
+#: model:ir.actions.act_window,name:account.action_account_aged_balance_view
+#: model:ir.ui.menu,name:account.menu_aged_trial_balance
+msgid "Aged Partner Balance"
+msgstr ""
+
+#. module: account
+#: model:process.transition,name:account.process_transition_entriesreconcile0
+#: model:process.transition,name:account.process_transition_supplierentriesreconcile0
+msgid "Accounting entries"
+msgstr ""
+
+#. module: account
+#: constraint:account.move.line:0
+msgid "Account and Period must belong to the same company."
+msgstr ""
+
+#. module: account
+#: field:account.invoice.line,discount:0
+msgid "Discount (%)"
+msgstr ""
+
+#. module: account
+#: help:account.journal,entry_posted:0
+msgid ""
+"Check this box if you don't want new journal entries to pass through the "
+"'draft' state and instead goes directly to the 'posted state' without any "
+"manual validation. \n"
+"Note that journal entries that are automatically created by the system are "
+"always skipping that state."
+msgstr ""
+
+#. module: account
+#: field:account.move.line.reconcile,writeoff:0
+msgid "Write-Off amount"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,message_unread:0
+#: field:account.invoice,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_invoice_state.py:44
+#, python-format
+msgid ""
+"Selected invoice(s) cannot be confirmed as they are not in 'Draft' or 'Pro-"
+"Forma' state."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1071
+#, python-format
+msgid "You should choose the periods that belong to the same company."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_report_account_sales_tree_all
+#: view:report.account.sales:0
+#: view:report.account_type.sales:0
+msgid "Sales by Account"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1449
+#, python-format
+msgid "You cannot delete a posted journal entry \"%s\"."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Accounting Period"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,sale_journal_id:0
+msgid "Sale journal"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:2346
+#: code:addons/account/account_invoice.py:775
+#: code:addons/account/account_move_line.py:195
+#, python-format
+msgid "You have to define an analytic journal on the '%s' journal!"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:781
+#, python-format
+msgid ""
+"This journal already contains items, therefore you cannot modify its company "
+"field."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:409
+#, python-format
+msgid ""
+"You need an Opening journal with centralisation checked to set the initial "
+"balance."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_tax_code_list
+#: model:ir.ui.menu,name:account.menu_action_tax_code_list
+msgid "Tax codes"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+msgid "Unrealized Gains and losses"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_account_customer
+#: model:ir.ui.menu,name:account.menu_finance_receivables
+msgid "Customers"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.cost_ledger:0
+#: report:account.analytic.account.journal:0
+#: report:account.analytic.account.quantity_cost_ledger:0
+msgid "Period to"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "August"
+msgstr ""
+
+#. module: account
+#: field:accounting.report,debit_credit:0
+msgid "Display Debit/Credit Columns"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "October"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,quantity:0
+msgid ""
+"The optional quantity expressed by this line, eg: number of product sold. "
+"The quantity is not a legal requirement but is very useful for some reports."
+msgstr ""
+
+#. module: account
+#: view:account.unreconcile:0
+#: view:account.unreconcile.reconcile:0
+msgid "Unreconcile Transactions"
+msgstr ""
+
+#. module: account
+#: field:wizard.multi.charts.accounts,only_one_chart_template:0
+msgid "Only One Chart Template Available"
+msgstr ""
+
+#. module: account
+#: view:account.chart.template:0
+#: field:product.category,property_account_expense_categ:0
+#: field:product.template,property_account_expense:0
+msgid "Expense Account"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,message_summary:0
+#: field:account.invoice,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,period_id:0
+msgid "Keep empty to use the period of the validation(invoice) date."
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement,account_id:0
+msgid ""
+"used in statement reconciliation domain, but shouldn't be used elswhere."
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,date_stop:0
+msgid "End date"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,base_amount:0
+msgid "Base Code Amount"
+msgstr ""
+
+#. module: account
+#: field:wizard.multi.charts.accounts,sale_tax:0
+msgid "Default Sale Tax"
+msgstr ""
+
+#. module: account
+#: help:account.model.line,date_maturity:0
+msgid ""
+"The maturity date of the generated entries for this model. You can choose "
+"between the creation date or the creation date of the entries plus the "
+"partner payment terms."
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_accounting
+msgid "Financial Accounting"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_account_report_pl
+msgid "Profit And Loss"
+msgstr ""
+
+#. module: account
+#: view:account.fiscal.position:0
+#: field:account.fiscal.position,name:0
+#: field:account.fiscal.position.account,position_id:0
+#: field:account.fiscal.position.tax,position_id:0
+#: field:account.fiscal.position.tax.template,position_id:0
+#: view:account.fiscal.position.template:0
+#: field:account.invoice,fiscal_position:0
+#: field:account.invoice.report,fiscal_position:0
+#: model:ir.model,name:account.model_account_fiscal_position
+#: field:res.partner,property_account_position:0
+msgid "Fiscal Position"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:823
+#, python-format
+msgid ""
+"Tax base different!\n"
+"Click on compute to update the tax base."
+msgstr ""
+
+#. module: account
+#: field:account.partner.ledger,page_split:0
+msgid "One Partner Per Page"
+msgstr ""
+
+#. module: account
+#: field:account.account,child_parent_ids:0
+#: field:account.account.template,child_parent_ids:0
+msgid "Children"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: model:ir.actions.act_window,name:account.action_account_balance_menu
+#: model:ir.actions.report.xml,name:account.account_account_balance
+#: model:ir.ui.menu,name:account.menu_general_Balance_report
+msgid "Trial Balance"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:431
+#, python-format
+msgid "Unable to adapt the initial balance (negative value)."
+msgstr ""
+
+#. module: account
+#: selection:account.invoice,type:0
+#: selection:account.invoice.report,type:0
+#: model:process.process,name:account.process_process_invoiceprocess0
+#: selection:report.invoice.created,type:0
+msgid "Customer Invoice"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_open_closed_fiscalyear
+msgid "Choose Fiscal Year"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+#: view:account.installer:0
+msgid "Date Range"
+msgstr ""
+
+#. module: account
+#: view:account.period:0
+msgid "Search Period"
+msgstr ""
+
+#. module: account
+#: view:account.change.currency:0
+msgid "Invoice Currency"
+msgstr ""
+
+#. module: account
+#: field:accounting.report,account_report_id:0
+#: model:ir.ui.menu,name:account.menu_account_financial_reports_tree
+msgid "Account Reports"
+msgstr ""
+
+#. module: account
+#: field:account.payment.term,line_ids:0
+msgid "Terms"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,tax_template_ids:0
+msgid "Tax Template List"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_account_print_sale_purchase_journal
+msgid "Sale/Purchase Journals"
+msgstr ""
+
+#. module: account
+#: help:account.account,currency_mode:0
+msgid ""
+"This will select how the current currency rate for outgoing transactions is "
+"computed. In most countries the legal method is \"average\" but only a few "
+"software systems are able to manage this. So if you import from another "
+"software system you may have to use the rate at date. Incoming transactions "
+"always use the rate at date."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:2678
+#, python-format
+msgid "There is no parent code for the template account."
+msgstr ""
+
+#. module: account
+#: help:account.chart.template,code_digits:0
+#: help:wizard.multi.charts.accounts,code_digits:0
+msgid "No. of Digits to use for account code"
+msgstr ""
+
+#. module: account
+#: field:res.partner,property_supplier_payment_term:0
+msgid "Supplier Payment Term"
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear:0
+msgid "Search Fiscalyear"
+msgstr ""
+
+#. module: account
+#: selection:account.tax,applicable_type:0
+msgid "Always"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,module_account_accountant:0
+msgid ""
+"Full accounting features: journals, legal statements, chart of accounts, etc."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Total Quantity"
+msgstr ""
+
+#. module: account
+#: field:account.move.line.reconcile.writeoff,writeoff_acc_id:0
+msgid "Write-Off account"
+msgstr ""
+
+#. module: account
+#: field:account.model.line,model_id:0
+#: view:account.subscription:0
+#: field:account.subscription,model_id:0
+msgid "Model"
+msgstr ""
+
+#. module: account
+#: help:account.invoice.tax,base_code_id:0
+msgid "The account basis of the tax declaration."
+msgstr ""
+
+#. module: account
+#: selection:account.account,type:0
+#: selection:account.account.template,type:0
+#: selection:account.entries.report,type:0
+#: selection:account.financial.report,type:0
+msgid "View"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3460
+#: code:addons/account/account_bank.py:94
+#, python-format
+msgid "BNK"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,analytic_lines:0
+msgid "Analytic lines"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Proforma Invoices"
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_electronicfile0
+msgid "Electronic File"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,reconcile:0
+msgid "Reconcile Ref"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,has_chart_of_accounts:0
+msgid "Company has a chart of accounts"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_tax_code_template
+msgid "Tax Code Template"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_partner_ledger
+msgid "Account Partner Ledger"
+msgstr ""
+
+#. module: account
+#: model:email.template,body_html:account.email_template_edi_invoice
+msgid ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; \">\n"
+"\n"
+" <p>Hello ${object.partner_id.name},</p>\n"
+"\n"
+" <p>A new invoice is available for you: </p>\n"
+" \n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENCES</strong><br />\n"
+" &nbsp;&nbsp;Invoice number: <strong>${object.number}</strong><br />\n"
+" &nbsp;&nbsp;Invoice total: <strong>${object.amount_total} "
+"${object.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Invoice date: ${object.date_invoice}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Order reference: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" &nbsp;&nbsp;Your contact: <a href=\"mailto:${object.user_id.email or "
+"''}?subject=Invoice%20${object.number}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p> \n"
+" \n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>It is also possible to directly pay with Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+" \n"
+" <br/>\n"
+" <p>If you have any question, do not hesitate to contact us.</p>\n"
+" <p>Thank you for choosing ${object.company_id.name or 'us'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Phone:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Web :&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" %endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
+msgstr ""
+
+#. module: account
+#: view:account.period:0
+msgid "Account Period"
+msgstr ""
+
+#. module: account
+#: help:account.account,currency_id:0
+#: help:account.account.template,currency_id:0
+#: help:account.bank.accounts.wizard,currency_id:0
+msgid "Forces all moves for this account to have this secondary currency."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_validate_account_move_line
+msgid ""
+"This wizard will validate all journal entries of a particular journal and "
+"period. Once journal entries are validated, you can not update them anymore."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_chart_template_form
+#: model:ir.ui.menu,name:account.menu_action_account_chart_template_form
+msgid "Chart of Accounts Templates"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Transactions"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_unreconcile_reconcile
+msgid "Account Unreconcile Reconcile"
+msgstr ""
+
+#. module: account
+#: help:account.account.type,close_method:0
+msgid ""
+"Set here the method that will be used to generate the end of year journal "
+"entries for all the accounts of this type.\n"
+"\n"
+" 'None' means that nothing will be done.\n"
+" 'Balance' will generally be used for cash accounts.\n"
+" 'Detail' will copy each existing journal item of the previous year, even "
+"the reconciled ones.\n"
+" 'Unreconciled' will copy only the journal items that were unreconciled on "
+"the first day of the new fiscal year."
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Keep empty to use the expense account"
+msgstr ""
+
+#. module: account
+#: field:account.aged.trial.balance,journal_ids:0
+#: field:account.analytic.cost.ledger.journal.report,journal:0
+#: field:account.balance.report,journal_ids:0
+#: field:account.central.journal,journal_ids:0
+#: field:account.common.account.report,journal_ids:0
+#: field:account.common.journal.report,journal_ids:0
+#: field:account.common.partner.report,journal_ids:0
+#: view:account.common.report:0
+#: field:account.common.report,journal_ids:0
+#: report:account.general.journal:0
+#: field:account.general.journal,journal_ids:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: view:account.journal.period:0
+#: report:account.partner.balance:0
+#: field:account.partner.balance,journal_ids:0
+#: field:account.partner.ledger,journal_ids:0
+#: view:account.print.journal:0
+#: field:account.print.journal,journal_ids:0
+#: field:account.report.general.ledger,journal_ids:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: field:account.vat.declaration,journal_ids:0
+#: field:accounting.report,journal_ids:0
+#: model:ir.actions.act_window,name:account.action_account_journal_form
+#: model:ir.actions.act_window,name:account.action_account_journal_period_tree
+#: model:ir.ui.menu,name:account.menu_account_print_journal
+#: model:ir.ui.menu,name:account.menu_action_account_journal_form
+#: model:ir.ui.menu,name:account.menu_journals
+#: model:ir.ui.menu,name:account.menu_journals_report
+msgid "Journals"
+msgstr ""
+
+#. module: account
+#: field:account.partner.reconcile.process,to_reconcile:0
+msgid "Remaining Partners"
+msgstr ""
+
+#. module: account
+#: view:account.subscription:0
+#: field:account.subscription,lines_id:0
+msgid "Subscription Lines"
+msgstr ""
+
+#. module: account
+#: selection:account.analytic.journal,type:0
+#: view:account.config.settings:0
+#: view:account.journal:0
+#: selection:account.journal,type:0
+#: view:account.model:0
+#: selection:account.tax,type_tax_use:0
+#: view:account.tax.template:0
+#: selection:account.tax.template,type_tax_use:0
+msgid "Purchase"
+msgstr ""
+
+#. module: account
+#: view:account.installer:0
+#: view:wizard.multi.charts.accounts:0
+msgid "Accounting Application Configuration"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_vat_declaration
+msgid "Account Tax Declaration"
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement,name:0
+msgid ""
+"if you give the Name other then /, its created Accounting Entries Move will "
+"be with same name as statement name. This allows the statement entries to "
+"have the same references than the statement itself"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:1016
+#, python-format
+msgid ""
+"You cannot create an invoice on a centralized journal. Uncheck the "
+"centralized counterpart box in the related journal from the configuration "
+"menu."
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,balance_start:0
+#: field:account.treasury.report,starting_balance:0
+msgid "Starting Balance"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:1465
+#, python-format
+msgid "No Partner Defined !"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_period_close
+#: model:ir.actions.act_window,name:account.action_account_period_tree
+#: model:ir.ui.menu,name:account.menu_action_account_period_close_tree
+msgid "Close a Period"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: field:account.cashbox.line,subtotal_opening:0
+msgid "Opening Subtotal"
+msgstr ""
+
+#. module: account
+#: constraint:account.move.line:0
+msgid ""
+"You cannot create journal items with a secondary currency without recording "
+"both 'currency' and 'amount currency' field."
+msgstr ""
+
+#. module: account
+#: field:account.financial.report,display_detail:0
+msgid "Display details"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "VAT:"
+msgstr ""
+
+#. module: account
+#: help:account.analytic.line,amount_currency:0
+msgid ""
+"The amount expressed in the related account currency if not equal to the "
+"company one."
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,paypal_account:0
+msgid ""
+"Paypal account (email) for receiving online payments (credit card, etc.) If "
+"you set a paypal account, the customer will be able to pay your invoices or "
+"quotations with a button \"Pay with Paypal\" in automated emails or through "
+"the OpenERP portal."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:536
+#, python-format
+msgid ""
+"Cannot find any account journal of %s type for this company.\n"
+"\n"
+"You can create one in the menu: \n"
+"Configuration/Journals/Journals."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_unreconcile
+#: model:ir.actions.act_window,name:account.action_account_unreconcile_reconcile
+#: model:ir.actions.act_window,name:account.action_account_unreconcile_select
+msgid "Unreconcile Entries"
+msgstr ""
+
+#. module: account
+#: field:account.tax.code,notprintable:0
+#: field:account.tax.code.template,notprintable:0
+msgid "Not Printable in Invoice"
+msgstr ""
+
+#. module: account
+#: report:account.vat.declaration:0
+#: field:account.vat.declaration,chart_tax_id:0
+msgid "Chart of Tax"
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+msgid "Search Account Journal"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_invoice_tree_pending_invoice
+msgid "Pending Invoice"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+#: selection:account.subscription,period_type:0
+msgid "year"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,date_start:0
+msgid "Start date"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.refund:0
+msgid ""
+"You will be able to edit and validate this\n"
+" credit note directly or keep it draft,\n"
+" waiting for the document to be issued "
+"by\n"
+" your supplier/customer."
+msgstr ""
+
+#. module: account
+#: view:validate.account.move.lines:0
+msgid ""
+"All selected journal entries will be validated and posted. It means you "
+"won't be able to modify their accounting fields anymore."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:98
+#, python-format
+msgid ""
+"You have not supplied enough arguments to compute the initial balance, "
+"please select a period and a journal in the context."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.report.xml,name:account.account_transfers
+msgid "Transfers"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,expects_chart_of_accounts:0
+msgid "This company has its own chart of accounts"
+msgstr ""
+
+#. module: account
+#: view:account.chart:0
+msgid "Account charts"
+msgstr ""
+
+#. module: account
+#: view:cash.box.out:0
+#: model:ir.actions.act_window,name:account.action_cash_box_out
+msgid "Take Money Out"
+msgstr ""
+
+#. module: account
+#: report:account.vat.declaration:0
+msgid "Tax Amount"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+msgid "Search Move"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_invoice_tree1
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a customer invoice.\n"
+" </p><p>\n"
+" OpenERP's electronic invoicing allows to ease and fasten "
+"the\n"
+" collection of customer payments. Your customer receives the\n"
+" invoice by email and he can pay online and/or import it\n"
+" in his own system.\n"
+" </p><p>\n"
+" The discussions with your customer are automatically "
+"displayed at\n"
+" the bottom of each invoice.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: field:account.tax.code,name:0
+#: field:account.tax.code.template,name:0
+msgid "Tax Case Name"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: view:account.invoice:0
+#: model:process.node,name:account.process_node_draftinvoices0
+msgid "Draft Invoice"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "Options"
+msgstr ""
+
+#. module: account
+#: field:account.aged.trial.balance,period_length:0
+msgid "Period Length (days)"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1363
+#, python-format
+msgid ""
+"You cannot modify a posted entry of this journal.\n"
+"First you should set the journal to allow cancelling entries."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_print_sale_purchase_journal
+msgid "Print Sale/Purchase Journal"
+msgstr ""
+
+#. module: account
+#: view:account.installer:0
+msgid "Continue"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+#: field:account.invoice.report,categ_id:0
+msgid "Category of Product"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:930
+#, python-format
+msgid ""
+"There is no fiscal year defined for this date.\n"
+"Please create one from the configuration of the accounting menu."
+msgstr ""
+
+#. module: account
+#: view:account.addtmpl.wizard:0
+#: model:ir.actions.act_window,name:account.action_account_addtmpl_wizard_form
+msgid "Create Account"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_fiscalyear_close.py:62
+#, python-format
+msgid "The entries to reconcile should belong to the same company."
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,tax_amount:0
+msgid "Tax Code Amount"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Unreconciled Journal Items"
+msgstr ""
+
+#. module: account
+#: selection:account.account.type,close_method:0
+msgid "Detail"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,default_purchase_tax:0
+msgid "This purchase tax will be assigned by default on new products."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "VAT :"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: report:account.central.journal:0
+#: view:account.config.settings:0
+#: report:account.general.journal:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.journal.period.print:0
+#: report:account.partner.balance:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: model:ir.actions.act_window,name:account.action_account_chart
+#: model:ir.actions.act_window,name:account.action_account_tree
+#: model:ir.ui.menu,name:account.menu_action_account_tree2
+msgid "Chart of Accounts"
+msgstr ""
+
+#. module: account
+#: view:account.tax.chart:0
+msgid "(If you do not select period it will take all open periods)"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_journal_cashbox_line
+msgid "account.journal.cashbox.line"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_partner_reconcile_process
+msgid "Reconcilation Process partner by partner"
+msgstr ""
+
+#. module: account
+#: view:account.chart:0
+msgid "(If you do not select Fiscal year it will take all open fiscal years)"
+msgstr ""
+
+#. module: account
+#: selection:account.aged.trial.balance,filter:0
+#: report:account.analytic.account.journal:0
+#: view:account.analytic.line:0
+#: selection:account.balance.report,filter:0
+#: field:account.bank.statement,date:0
+#: field:account.bank.statement.line,date:0
+#: selection:account.central.journal,filter:0
+#: selection:account.common.account.report,filter:0
+#: selection:account.common.journal.report,filter:0
+#: selection:account.common.partner.report,filter:0
+#: selection:account.common.report,filter:0
+#: view:account.entries.report:0
+#: field:account.entries.report,date:0
+#: selection:account.general.journal,filter:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: field:account.invoice.refund,date:0
+#: field:account.invoice.report,date:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: view:account.move:0
+#: field:account.move,date:0
+#: field:account.move.line.reconcile.writeoff,date_p:0
+#: report:account.overdue:0
+#: selection:account.partner.balance,filter:0
+#: selection:account.partner.ledger,filter:0
+#: selection:account.print.journal,filter:0
+#: selection:account.print.journal,sort_selection:0
+#: selection:account.report.general.ledger,filter:0
+#: selection:account.report.general.ledger,sortby:0
+#: field:account.subscription.line,date:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: xsl:account.transfer:0
+#: selection:account.vat.declaration,filter:0
+#: selection:accounting.report,filter:0
+#: selection:accounting.report,filter_cmp:0
+#: field:analytic.entries.report,date:0
+msgid "Date"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+msgid "Post"
+msgstr ""
+
+#. module: account
+#: view:account.unreconcile:0
+#: view:account.unreconcile.reconcile:0
+msgid "Unreconcile"
+msgstr ""
+
+#. module: account
+#: view:account.chart.template:0
+msgid "Chart of Accounts Template"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:2358
+#, python-format
+msgid ""
+"Maturity date of entry line generated by model line '%s' of model '%s' is "
+"based on partner payment term!\n"
+"Please define partner on it!"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: selection:account.balance.report,display_account:0
+#: selection:account.common.account.report,display_account:0
+#: report:account.general.ledger_landscape:0
+#: selection:account.report.general.ledger,display_account:0
+#: selection:account.tax,type_tax_use:0
+#: selection:account.tax.template,type_tax_use:0
+msgid "All"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_reporting_budgets
+msgid "Budgets"
+msgstr ""
+
+#. module: account
+#: selection:account.aged.trial.balance,filter:0
+#: selection:account.balance.report,filter:0
+#: selection:account.central.journal,filter:0
+#: selection:account.common.account.report,filter:0
+#: selection:account.common.journal.report,filter:0
+#: selection:account.common.partner.report,filter:0
+#: selection:account.common.report,filter:0
+#: selection:account.general.journal,filter:0
+#: selection:account.partner.balance,filter:0
+#: selection:account.partner.ledger,filter:0
+#: selection:account.print.journal,filter:0
+#: selection:account.report.general.ledger,filter:0
+#: selection:account.vat.declaration,filter:0
+#: selection:accounting.report,filter:0
+#: selection:accounting.report,filter_cmp:0
+msgid "No Filters"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+#: model:res.groups,name:account.group_proforma_invoices
+msgid "Pro-forma Invoices"
+msgstr ""
+
+#. module: account
+#: view:res.partner:0
+msgid "History"
+msgstr ""
+
+#. module: account
+#: help:account.tax,applicable_type:0
+#: help:account.tax.template,applicable_type:0
+msgid ""
+"If not applicable (computed through a Python code), the tax won't appear on "
+"the invoice."
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,group_check_supplier_invoice_total:0
+msgid "Check the total of supplier invoices"
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+#: view:account.tax.template:0
+msgid "Applicable Code (if type=code)"
+msgstr ""
+
+#. module: account
+#: help:account.period,state:0
+msgid ""
+"When monthly periods are created. The status is 'Draft'. At the end of "
+"monthly period it is in 'Done' status."
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+#: field:account.invoice.report,product_qty:0
+msgid "Qty"
+msgstr ""
+
+#. module: account
+#: help:account.tax.code,sign:0
+msgid ""
+"You can specify here the coefficient that will be used when consolidating "
+"the amount of this case into its parent. For example, set 1/-1 if you want "
+"to add/substract it."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Search Analytic Lines"
+msgstr ""
+
+#. module: account
+#: field:res.partner,property_account_payable:0
+msgid "Account Payable"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_fiscalyear_close.py:88
+#, python-format
+msgid "The periods to generate opening entries cannot be found."
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_supplierpaymentorder0
+msgid "Payment Order"
+msgstr ""
+
+#. module: account
+#: help:account.account.template,reconcile:0
+msgid ""
+"Check this option if you want the user to reconcile entries in this account."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: field:account.invoice.line,price_unit:0
+msgid "Unit Price"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_tree1
+msgid "Analytic Items"
+msgstr ""
+
+#. module: account
+#: field:analytic.entries.report,nbr:0
+msgid "#Entries"
+msgstr ""
+
+#. module: account
+#: view:account.state.open:0
+msgid "Open Invoice"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,factor_tax:0
+msgid "Multipication factor Tax code"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,complete_tax_set:0
+msgid "Complete set of taxes"
+msgstr ""
+
+#. module: account
+#: field:account.account,name:0
+#: field:account.account.template,name:0
+#: report:account.analytic.account.inverted.balance:0
+#: field:account.chart.template,name:0
+#: field:account.model.line,name:0
+#: field:account.move.line,name:0
+#: field:account.move.reconcile,name:0
+#: field:account.subscription,name:0
+msgid "Name"
+msgstr ""
+
+#. module: account
+#: code:addons/account/installer.py:115
+#, python-format
+msgid "No unconfigured company !"
+msgstr ""
+
+#. module: account
+#: field:res.company,expects_chart_of_accounts:0
+msgid "Expects a Chart of Accounts"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,date:0
+msgid "Effective date"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_fiscalyear_close.py:100
+#, python-format
+msgid "The journal must have default credit and debit account."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_bank_tree
+#: model:ir.ui.menu,name:account.menu_action_bank_tree
+msgid "Setup your Bank Accounts"
+msgstr ""
+
+#. module: account
+#: xsl:account.transfer:0
+msgid "Partner ID"
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement,message_ids:0
+#: help:account.invoice,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: account
+#: help:account.journal,analytic_journal_id:0
+msgid "Journal for analytic entries"
+msgstr ""
+
+#. module: account
+#: constraint:account.aged.trial.balance:0
+#: constraint:account.balance.report:0
+#: constraint:account.central.journal:0
+#: constraint:account.common.account.report:0
+#: constraint:account.common.journal.report:0
+#: constraint:account.common.partner.report:0
+#: constraint:account.common.report:0
+#: constraint:account.general.journal:0
+#: constraint:account.partner.balance:0
+#: constraint:account.partner.ledger:0
+#: constraint:account.print.journal:0
+#: constraint:account.report.general.ledger:0
+#: constraint:account.vat.declaration:0
+#: constraint:accounting.report:0
+msgid ""
+"The fiscalyear, periods or chart of account chosen have to belong to the "
+"same company."
+msgstr ""
+
+#. module: account
+#: help:account.tax.code.template,notprintable:0
+msgid ""
+"Check this box if you don't want any tax related to this tax Code to appear "
+"on invoices."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1058
+#: code:addons/account/account_move_line.py:1143
+#, python-format
+msgid "You cannot use an inactive account."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.open_board_account
+#: model:ir.ui.menu,name:account.menu_account_config
+#: model:ir.ui.menu,name:account.menu_board_account
+#: model:ir.ui.menu,name:account.menu_finance
+#: model:ir.ui.menu,name:account.menu_finance_reporting
+#: model:process.node,name:account.process_node_accountingentries0
+#: model:process.node,name:account.process_node_supplieraccountingentries0
+#: view:product.product:0
+#: view:product.template:0
+#: view:res.partner:0
+msgid "Accounting"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "Journal Entries with period in current year"
+msgstr ""
+
+#. module: account
+#: field:account.account,child_consol_ids:0
+msgid "Consolidated Children"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:573
+#: code:addons/account/wizard/account_invoice_refund.py:146
+#, python-format
+msgid "Insufficient Data!"
+msgstr ""
+
+#. module: account
+#: help:account.account,unrealized_gain_loss:0
+msgid ""
+"Value of Loss or Gain due to changes in exchange rate when doing multi-"
+"currency transactions."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "General Accounting"
+msgstr ""
+
+#. module: account
+#: help:account.fiscalyear.close,journal_id:0
+msgid ""
+"The best practice here is to use a journal dedicated to contain the opening "
+"entries of all fiscal years. Note that you should define it with default "
+"debit/credit accounts, of type 'situation' and with a centralized "
+"counterpart."
+msgstr ""
+
+#. module: account
+#: view:account.installer:0
+msgid "title"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: view:account.subscription:0
+msgid "Set to Draft"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_subscription_form
+msgid "Recurring Lines"
+msgstr ""
+
+#. module: account
+#: field:account.partner.balance,display_partner:0
+msgid "Display Partners"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Validate"
+msgstr ""
+
+#. module: account
+#: model:account.financial.report,name:account.account_financial_report_assets0
+msgid "Assets"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "Accounting & Finance"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.confirm:0
+msgid "Confirm Invoices"
+msgstr ""
+
+#. module: account
+#: selection:account.account,currency_mode:0
+msgid "Average Rate"
+msgstr ""
+
+#. module: account
+#: field:account.balance.report,display_account:0
+#: field:account.common.account.report,display_account:0
+#: field:account.report.general.ledger,display_account:0
+msgid "Display Accounts"
+msgstr ""
+
+#. module: account
+#: view:account.state.open:0
+msgid "(Invoice should be unreconciled if you want to open it)"
+msgstr ""
+
+#. module: account
+#: field:account.tax,account_analytic_collected_id:0
+msgid "Invoice Tax Analytic Account"
+msgstr ""
+
+#. module: account
+#: field:account.chart,period_from:0
+msgid "Start period"
+msgstr ""
+
+#. module: account
+#: field:account.tax,name:0
+#: field:account.tax.template,name:0
+#: report:account.vat.declaration:0
+msgid "Tax Name"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+#: model:ir.ui.menu,name:account.menu_finance_configuration
+msgid "Configuration"
+msgstr ""
+
+#. module: account
+#: model:account.payment.term,name:account.account_payment_term
+#: model:account.payment.term,note:account.account_payment_term
+msgid "30 Days End of Month"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_analytic_balance
+#: model:ir.actions.report.xml,name:account.account_analytic_account_balance
+msgid "Analytic Balance"
+msgstr ""
+
+#. module: account
+#: help:res.partner,property_payment_term:0
+msgid ""
+"This payment term will be used instead of the default one for sale orders "
+"and customer invoices"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid ""
+"If you put \"%(year)s\" in the prefix, it will be replaced by the current "
+"year."
+msgstr ""
+
+#. module: account
+#: help:account.account,active:0
+msgid ""
+"If the active field is set to False, it will allow you to hide the account "
+"without removing it."
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Posted Journal Items"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,blocked:0
+msgid "No Follow-up"
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Search Tax Templates"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.periodical_processing_journal_entries_validation
+msgid "Draft Entries"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,decimal_precision:0
+msgid ""
+"As an example, a decimal precision of 2 will allow journal entries like: "
+"9.99 EUR, whereas a decimal precision of 4 will allow journal entries like: "
+"0.0231 EUR."
+msgstr ""
+
+#. module: account
+#: field:account.account,shortcut:0
+#: field:account.account.template,shortcut:0
+msgid "Shortcut"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: field:account.account,user_type:0
+#: view:account.account.template:0
+#: field:account.account.template,user_type:0
+#: view:account.account.type:0
+#: field:account.account.type,name:0
+#: field:account.bank.accounts.wizard,account_type:0
+#: field:account.entries.report,user_type:0
+#: selection:account.financial.report,type:0
+#: model:ir.model,name:account.model_account_account_type
+#: field:report.account.receivable,type:0
+#: field:report.account_type.sales,user_type:0
+msgid "Account Type"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Close CashBox"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_invoice_cancel
+msgid "Cancel the Selected Invoices"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_bank_statement.py:424
+#, python-format
+msgid "You have to assign an analytic journal on the '%s' journal!"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_supplieranalyticcost0
+msgid ""
+"Analytic costs (timesheets, some purchased products, ...) come from analytic "
+"accounts. These generate draft supplier invoices."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_bank_tree
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to setup a new bank account. \n"
+" </p><p>\n"
+" Configure your company's bank account and select those that "
+"must\n"
+" appear on the report footer.\n"
+" </p><p>\n"
+" If you use the accounting application of OpenERP, journals and\n"
+" accounts will be created automatically based on these data.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: constraint:account.tax.code.template:0
+msgid ""
+"Error!\n"
+"You cannot create recursive Tax Codes."
+msgstr ""
+
+#. module: account
+#: constraint:account.period:0
+msgid ""
+"Error!\n"
+"The duration of the Period(s) is/are invalid."
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,month:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,month:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,month:0
+#: field:report.account.sales,month:0
+#: field:report.account_type.sales,month:0
+msgid "Month"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:668
+#, python-format
+msgid "You cannot change the code of account which contains journal items!"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,purchase_sequence_prefix:0
+msgid "Supplier invoice sequence"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:610
+#: code:addons/account/account_invoice.py:625
+#, python-format
+msgid ""
+"Cannot find a chart of account, you should create one from Settings\\"
+"Configuration\\Accounting menu."
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,product_uom_id:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,product_uom_id:0
+msgid "Product Unit of Measure"
+msgstr ""
+
+#. module: account
+#: field:res.company,paypal_account:0
+msgid "Paypal Account"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "Acc.Type"
+msgstr ""
+
+#. module: account
+#: selection:account.journal,type:0
+msgid "Bank and Checks"
+msgstr ""
+
+#. module: account
+#: field:account.account.template,note:0
+msgid "Note"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,sign:0
+msgid "Reverse balance sign"
+msgstr ""
+
+#. module: account
+#: selection:account.account.type,report_type:0
+#: code:addons/account/account.py:191
+#, python-format
+msgid "Balance Sheet (Liability account)"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,date_invoice:0
+msgid "Keep empty to use the current date"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: field:account.cashbox.line,subtotal_closing:0
+msgid "Closing Subtotal"
+msgstr ""
+
+#. module: account
+#: field:account.tax,base_code_id:0
+msgid "Account Base Code"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:864
+#, python-format
+msgid ""
+"You have to provide an account for the write off/exchange difference entry."
+msgstr ""
+
+#. module: account
+#: help:res.company,paypal_account:0
+msgid "Paypal username (usually email) for receiving online payments."
+msgstr ""
+
+#. module: account
+#: selection:account.aged.trial.balance,target_move:0
+#: selection:account.balance.report,target_move:0
+#: selection:account.central.journal,target_move:0
+#: selection:account.chart,target_move:0
+#: selection:account.common.account.report,target_move:0
+#: selection:account.common.journal.report,target_move:0
+#: selection:account.common.partner.report,target_move:0
+#: selection:account.common.report,target_move:0
+#: selection:account.general.journal,target_move:0
+#: selection:account.partner.balance,target_move:0
+#: selection:account.partner.ledger,target_move:0
+#: selection:account.print.journal,target_move:0
+#: selection:account.report.general.ledger,target_move:0
+#: selection:account.tax.chart,target_move:0
+#: selection:account.vat.declaration,target_move:0
+#: selection:accounting.report,target_move:0
+#: code:addons/account/report/common_report_header.py:68
+#, python-format
+msgid "All Posted Entries"
+msgstr ""
+
+#. module: account
+#: field:report.aged.receivable,name:0
+msgid "Month Range"
+msgstr ""
+
+#. module: account
+#: help:account.analytic.balance,empty_acc:0
+msgid "Check if you want to display Accounts with 0 balance too."
+msgstr ""
+
+#. module: account
+#: field:account.move.reconcile,opening_reconciliation:0
+msgid "Opening Entries Reconciliation"
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/static/src/xml/account_move_reconciliation.xml:24
+#, python-format
+msgid "Last Reconciliation:"
+msgstr ""
+
+#. module: account
+#: selection:account.move.line,state:0
+msgid "Balanced"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_importinvoice0
+msgid "Statement from invoice or payment"
+msgstr ""
+
+#. module: account
+#: code:addons/account/installer.py:115
+#, python-format
+msgid ""
+"There is currently no company without chart of account. The wizard will "
+"therefore not be executed."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_wizard_multi_chart
+msgid "Set Your Accounting Options"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_chart
+msgid "Account chart"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,reference_type:0
+msgid "Payment Reference"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,style_overwrite:0
+msgid "Main Title 1 (bold, underlined)"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.balance:0
+#: report:account.central.journal:0
+msgid "Account Name"
+msgstr ""
+
+#. module: account
+#: help:account.fiscalyear.close,report_name:0
+msgid "Give name of the new entries"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_invoice_report
+msgid "Invoices Statistics"
+msgstr ""
+
+#. module: account
+#: field:account.account,exchange_rate:0
+msgid "Exchange Rate"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_paymentorderreconcilation0
+msgid "Bank statements are entered in the system."
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_reconcile.py:122
+#, python-format
+msgid "Reconcile Writeoff"
+msgstr ""
+
+#. module: account
+#: view:account.account.template:0
+#: view:account.chart.template:0
+msgid "Account Template"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Closing Balance"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,visible:0
+msgid "Can be Visible?"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_journal_select
+msgid "Account Journal Select"
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Credit Notes"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+#: model:ir.actions.act_window,name:account.action_account_manual_reconcile
+msgid "Journal Items to Reconcile"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_tax_template
+msgid "Templates for Taxes"
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.period:0
+msgid "The name of the period must be unique per company!"
+msgstr ""
+
+#. module: account
+#: help:wizard.multi.charts.accounts,currency_id:0
+msgid "Currency as per company's country."
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+msgid "Tax Computation"
+msgstr ""
+
+#. module: account
+#: view:wizard.multi.charts.accounts:0
+msgid "res_config_contents"
+msgstr ""
+
+#. module: account
+#: help:account.chart.template,visible:0
+msgid ""
+"Set this to False if you don't want this template to be used actively in the "
+"wizard that generate Chart of Accounts from templates, this is useful when "
+"you want to generate accounts of this template only when loading its child "
+"template."
+msgstr ""
+
+#. module: account
+#: view:account.use.model:0
+msgid "Create Entries From Models"
+msgstr ""
+
+#. module: account
+#: field:account.account,reconcile:0
+#: field:account.account.template,reconcile:0
+msgid "Allow Reconciliation"
+msgstr ""
+
+#. module: account
+#: constraint:account.account:0
+msgid ""
+"Error!\n"
+"You cannot create an account which has parent account of different company."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:658
+#, python-format
+msgid ""
+"Cannot find any account journal of %s type for this company.\n"
+"\n"
+"You can create one in the menu: \n"
+"Configuration\\Journals\\Journals."
+msgstr ""
+
+#. module: account
+#: report:account.vat.declaration:0
+msgid "Based On"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3204
+#, python-format
+msgid "ECNJ"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_analytic_cost_ledger_journal_report
+msgid "Account Analytic Cost Ledger For Journal Report"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_model_form
+msgid "Recurring Models"
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+msgid "Children/Sub Taxes"
+msgstr ""
+
+#. module: account
+#: xsl:account.transfer:0
+msgid "Change"
+msgstr ""
+
+#. module: account
+#: field:account.journal,type_control_ids:0
+msgid "Type Controls"
+msgstr ""
+
+#. module: account
+#: help:account.journal,default_credit_account_id:0
+msgid "It acts as a default account for credit amount"
+msgstr ""
+
+#. module: account
+#: view:cash.box.out:0
+msgid "Describe why you take money from the cash register:"
+msgstr ""
+
+#. module: account
+#: selection:account.invoice,state:0
+#: selection:account.invoice.report,state:0
+#: selection:report.invoice.created,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,group_proforma_invoices:0
+msgid "Allows you to put invoices in pro-forma state."
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+msgid "Unit Of Currency Definition"
+msgstr ""
+
+#. module: account
+#: help:account.partner.ledger,amount_currency:0
+#: help:account.report.general.ledger,amount_currency:0
+msgid ""
+"It adds the currency column on report if the currency differs from the "
+"company currency."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3394
+#, python-format
+msgid "Purchase Tax %.2f%%"
+msgstr ""
+
+#. module: account
+#: view:account.subscription.generate:0
+#: model:ir.actions.act_window,name:account.action_account_subscription_generate
+#: model:ir.ui.menu,name:account.menu_generate_subscription
+msgid "Generate Entries"
+msgstr ""
+
+#. module: account
+#: help:account.vat.declaration,chart_tax_id:0
+msgid "Select Charts of Taxes"
+msgstr ""
+
+#. module: account
+#: view:account.fiscal.position:0
+#: field:account.fiscal.position,account_ids:0
+#: field:account.fiscal.position.template,account_ids:0
+msgid "Account Mapping"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Confirmed"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Cancelled Invoice"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "My Invoices"
+msgstr ""
+
+#. module: account
+#: selection:account.bank.statement,state:0
+msgid "New"
+msgstr ""
+
+#. module: account
+#: view:wizard.multi.charts.accounts:0
+msgid "Sale Tax"
+msgstr ""
+
+#. module: account
+#: field:account.tax,ref_tax_code_id:0
+#: field:account.tax.template,ref_tax_code_id:0
+msgid "Refund Tax Code"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Invoice "
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,property_account_income:0
+msgid "Income Account on Product Template"
+msgstr ""
+
+#. module: account
+#: help:account.journal.period,state:0
+msgid ""
+"When journal period is created. The status is 'Draft'. If a report is "
+"printed it comes to 'Printed' status. When all transactions are done, it "
+"comes in 'Done' status."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3205
+#, python-format
+msgid "MISC"
+msgstr ""
+
+#. module: account
+#: field:account.fiscalyear.close,fy2_id:0
+msgid "New Fiscal Year"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: view:account.tax:0
+#: view:account.tax.template:0
+#: selection:account.vat.declaration,based_on:0
+#: model:ir.actions.act_window,name:account.act_res_partner_2_account_invoice_opened
+#: model:ir.actions.act_window,name:account.action_invoice_tree
+#: model:ir.actions.report.xml,name:account.account_invoices
+#: view:report.invoice.created:0
+#: field:res.partner,invoice_ids:0
+msgid "Invoices"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,expects_chart_of_accounts:0
+msgid "Check this box if this company is a legal entity."
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.conf_account_type_chk
+#: selection:account.bank.accounts.wizard,account_type:0
+msgid "Check"
+msgstr ""
+
+#. module: account
+#: view:account.aged.trial.balance:0
+#: view:account.analytic.balance:0
+#: view:account.analytic.chart:0
+#: view:account.analytic.cost.ledger:0
+#: view:account.analytic.cost.ledger.journal.report:0
+#: view:account.analytic.inverted.balance:0
+#: view:account.analytic.journal.report:0
+#: view:account.automatic.reconcile:0
+#: view:account.change.currency:0
+#: view:account.chart:0
+#: view:account.common.report:0
+#: view:account.config.settings:0
+#: view:account.fiscalyear.close:0
+#: view:account.fiscalyear.close.state:0
+#: view:account.invoice.cancel:0
+#: view:account.invoice.confirm:0
+#: view:account.invoice.refund:0
+#: view:account.journal.select:0
+#: view:account.move.bank.reconcile:0
+#: view:account.move.line.reconcile:0
+#: view:account.move.line.reconcile.select:0
+#: view:account.move.line.reconcile.writeoff:0
+#: view:account.move.line.unreconcile.select:0
+#: view:account.open.closed.fiscalyear:0
+#: view:account.period.close:0
+#: view:account.state.open:0
+#: view:account.subscription.generate:0
+#: view:account.tax.chart:0
+#: view:account.unreconcile:0
+#: view:account.use.model:0
+#: view:account.vat.declaration:0
+#: view:cash.box.in:0
+#: view:cash.box.out:0
+#: view:project.account.analytic.line:0
+#: view:validate.account.move:0
+#: view:validate.account.move.lines:0
+msgid "or"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Invoiced"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+msgid "Posted Journal Entries"
+msgstr ""
+
+#. module: account
+#: view:account.use.model:0
+msgid "Use Model"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,partner_bank_id:0
+msgid ""
+"Bank Account Number to which the invoice will be paid. A Company bank "
+"account if this is a Customer Invoice or Supplier Refund, otherwise a "
+"Partner bank account number."
+msgstr ""
+
+#. module: account
+#: field:account.partner.reconcile.process,today_reconciled:0
+msgid "Partners Reconciled Today"
+msgstr ""
+
+#. module: account
+#: help:account.invoice.tax,tax_code_id:0
+msgid "The tax basis of the tax declaration."
+msgstr ""
+
+#. module: account
+#: view:account.addtmpl.wizard:0
+msgid "Add"
+msgstr ""
+
+#. module: account
+#: selection:account.invoice,state:0
+#: report:account.overdue:0
+#: model:mail.message.subtype,name:account.mt_invoice_paid
+msgid "Paid"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,tax_line:0
+msgid "Tax Lines"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,statement_id:0
+msgid "The bank statement used for bank reconciliation"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_suppliercustomerinvoice0
+msgid "Draft invoices are validated. "
+msgstr ""
+
+#. module: account
+#: help:account.tax,account_collected_id:0
+msgid ""
+"Set the account that will be set by default on invoice tax lines for "
+"invoices. Leave empty to use the expense account."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:890
+#, python-format
+msgid "Opening Period"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+msgid "Journal Entries to Review"
+msgstr ""
+
+#. module: account
+#: selection:res.company,tax_calculation_rounding_method:0
+msgid "Round Globally"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: view:account.subscription:0
+msgid "Compute"
+msgstr ""
+
+#. module: account
+#: field:account.tax,type_tax_use:0
+msgid "Tax Application"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:922
+#, python-format
+msgid ""
+"Please verify the price of the invoice !\n"
+"The encoded total does not match the computed total."
+msgstr ""
+
+#. module: account
+#: field:account.account,active:0
+#: field:account.analytic.journal,active:0
+#: field:account.fiscal.position,active:0
+#: field:account.journal.period,active:0
+#: field:account.payment.term,active:0
+#: field:account.tax,active:0
+msgid "Active"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: field:account.journal,cash_control:0
+msgid "Cash Control"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.balance,date2:0
+#: field:account.analytic.cost.ledger,date2:0
+#: field:account.analytic.cost.ledger.journal.report,date2:0
+#: field:account.analytic.inverted.balance,date2:0
+#: field:account.analytic.journal.report,date2:0
+msgid "End of period"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_supplierpaymentorder0
+msgid "Payment of invoices"
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.invoice:0
+msgid "Invoice Number must be unique per Company!"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_receivable_graph
+msgid "Balance by Type of Account"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_cash_statement.py:301
+#, python-format
+msgid "There is no %s Account on the journal %s."
+msgstr ""
+
+#. module: account
+#: model:res.groups,name:account.group_account_user
+msgid "Accountant"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_treasury_report_all
+msgid ""
+"From this view, have an analysis of your treasury. It sums the balance of "
+"every accounting entries made on liquidity accounts per period."
+msgstr ""
+
+#. module: account
+#: model:res.groups,name:account.group_account_manager
+msgid "Financial Manager"
+msgstr ""
+
+#. module: account
+#: field:account.journal,group_invoice_lines:0
+msgid "Group Invoice Lines"
+msgstr ""
+
+#. module: account
+#: view:account.automatic.reconcile:0
+msgid "Close"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement.line,move_ids:0
+msgid "Moves"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,details_ids:0
+#: view:account.journal:0
+msgid "CashBox Lines"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_vat_declaration
+msgid "Account Vat Declaration"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,module_account_accountant:0
+msgid ""
+"If you do not check this box, you will be able to do invoicing & payments, "
+"but not accounting (Journal Items, Chart of Accounts, ...)"
+msgstr ""
+
+#. module: account
+#: view:account.period:0
+msgid "To Close"
+msgstr ""
+
+#. module: account
+#: field:account.treasury.report,date:0
+msgid "Beginning of Period Date"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.account_template_folder
+msgid "Templates"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,name:0
+msgid "Tax Description"
+msgstr ""
+
+#. module: account
+#: field:account.tax,child_ids:0
+msgid "Child Tax Accounts"
+msgstr ""
+
+#. module: account
+#: help:account.tax,price_include:0
+#: help:account.tax.template,price_include:0
+msgid ""
+"Check this if the price you use on the product and invoices includes this "
+"tax."
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.balance:0
+msgid "Analytic Balance -"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: field:account.aged.trial.balance,target_move:0
+#: field:account.balance.report,target_move:0
+#: report:account.central.journal:0
+#: field:account.central.journal,target_move:0
+#: field:account.chart,target_move:0
+#: field:account.common.account.report,target_move:0
+#: field:account.common.journal.report,target_move:0
+#: field:account.common.partner.report,target_move:0
+#: field:account.common.report,target_move:0
+#: report:account.general.journal:0
+#: field:account.general.journal,target_move:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: report:account.partner.balance:0
+#: field:account.partner.balance,target_move:0
+#: field:account.partner.ledger,target_move:0
+#: field:account.print.journal,target_move:0
+#: field:account.report.general.ledger,target_move:0
+#: field:account.tax.chart,target_move:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: field:account.vat.declaration,target_move:0
+#: field:accounting.report,target_move:0
+msgid "Target Moves"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1454
+#, python-format
+msgid ""
+"Move cannot be deleted if linked to an invoice. (Invoice: %s - Move ID:%s)"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: help:account.cashbox.line,number_opening:0
+msgid "Opening Unit Numbers"
+msgstr ""
+
+#. module: account
+#: field:account.subscription,period_type:0
+msgid "Period Type"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: field:account.invoice,payment_ids:0
+#: selection:account.vat.declaration,based_on:0
+msgid "Payments"
+msgstr ""
+
+#. module: account
+#: field:account.subscription.line,move_id:0
+msgid "Entry"
+msgstr ""
+
+#. module: account
+#: field:account.tax,python_compute_inv:0
+#: field:account.tax.template,python_compute_inv:0
+msgid "Python Code (reverse)"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,payment_term:0
+#: model:ir.actions.act_window,name:account.action_payment_term_form
+#: model:ir.ui.menu,name:account.menu_action_payment_term_form
+msgid "Payment Terms"
+msgstr ""
+
+#. module: account
+#: help:account.chart.template,complete_tax_set:0
+msgid ""
+"This boolean helps you to choose if you want to propose to the user to "
+"encode the sale and purchase rates or choose from list of taxes. This last "
+"choice assumes that the set of tax defined on this template is complete"
+msgstr ""
+
+#. module: account
+#: view:account.financial.report:0
+#: field:account.financial.report,children_ids:0
+#: model:ir.model,name:account.model_account_financial_report
+msgid "Account Report"
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,year:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,year:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,year:0
+#: view:report.account.sales:0
+#: field:report.account.sales,name:0
+#: view:report.account_type.sales:0
+#: field:report.account_type.sales,name:0
+msgid "Year"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,sent:0
+msgid "It indicates that the invoice has been sent."
+msgstr ""
+
+#. module: account
+#: field:account.tax.template,description:0
+msgid "Internal Name"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1185
+#, python-format
+msgid ""
+"Cannot create an automatic sequence for this piece.\n"
+"Put a sequence in the journal definition for automatic numbering or create a "
+"sequence manually for this piece."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Pro Forma Invoice "
+msgstr ""
+
+#. module: account
+#: selection:account.subscription,period_type:0
+msgid "month"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+#: field:account.partner.reconcile.process,next_partner_id:0
+msgid "Next Partner to Reconcile"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,account_id:0
+#: field:account.move.line,tax_code_id:0
+msgid "Tax Account"
+msgstr ""
+
+#. module: account
+#: model:account.financial.report,name:account.account_financial_report_balancesheet0
+#: model:ir.actions.act_window,name:account.action_account_report_bs
+#: model:ir.ui.menu,name:account.menu_account_report_bs
+msgid "Balance Sheet"
+msgstr ""
+
+#. module: account
+#: selection:account.account.type,report_type:0
+#: code:addons/account/account.py:188
+#, python-format
+msgid "Profit & Loss (Income account)"
+msgstr ""
+
+#. module: account
+#: field:account.journal,allow_date:0
+msgid "Check Date in Period"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.final_accounting_reports
+msgid "Accounting Reports"
+msgstr ""
+
+#. module: account
+#: field:account.move,line_id:0
+#: view:analytic.entries.report:0
+#: model:ir.actions.act_window,name:account.action_move_line_form
+msgid "Entries"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "This Period"
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Compute Code (if type=code)"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:508
+#, python-format
+msgid ""
+"Cannot find a chart of accounts for this company, you should create one."
+msgstr ""
+
+#. module: account
+#: selection:account.analytic.journal,type:0
+#: view:account.config.settings:0
+#: view:account.journal:0
+#: selection:account.journal,type:0
+#: view:account.model:0
+#: selection:account.tax,type_tax_use:0
+#: view:account.tax.template:0
+#: selection:account.tax.template,type_tax_use:0
+msgid "Sale"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_automatic_reconcile
+msgid "Automatic Reconcile"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+#: field:account.bank.statement.line,amount:0
+#: report:account.invoice:0
+#: field:account.invoice.line,price_subtotal:0
+#: field:account.invoice.tax,amount:0
+#: view:account.move:0
+#: field:account.move,amount:0
+#: view:account.move.line:0
+#: field:account.tax,amount:0
+#: field:account.tax.template,amount:0
+#: xsl:account.transfer:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,amount:0
+#: field:cash.box.in,amount:0
+#: field:cash.box.out,amount:0
+msgid "Amount"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_fiscalyear_close.py:41
+#, python-format
+msgid "End of Fiscal Year Entry"
+msgstr ""
+
+#. module: account
+#: model:process.transition,name:account.process_transition_customerinvoice0
+#: model:process.transition,name:account.process_transition_paymentorderreconcilation0
+#: model:process.transition,name:account.process_transition_statemententries0
+#: model:process.transition,name:account.process_transition_suppliercustomerinvoice0
+#: model:process.transition,name:account.process_transition_suppliervalidentries0
+#: model:process.transition,name:account.process_transition_validentries0
+msgid "Validation"
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement,message_summary:0
+#: help:account.invoice,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: account
+#: field:account.tax,child_depend:0
+#: field:account.tax.template,child_depend:0
+msgid "Tax on Children"
+msgstr ""
+
+#. module: account
+#: help:res.partner,last_reconciliation_date:0
+msgid ""
+"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"
+msgstr ""
+
+#. module: account
+#: field:account.journal,update_posted:0
+msgid "Allow Cancelling Entries"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_use_model.py:44
+#, python-format
+msgid ""
+"Maturity date of entry line generated by model line '%s' is based on partner "
+"payment term!\n"
+"Please define partner on it!"
+msgstr ""
+
+#. module: account
+#: field:account.tax.code,sign:0
+msgid "Coefficent for parent"
+msgstr ""
+
+#. module: account
+#: report:account.partner.balance:0
+msgid "(Account/Partner) Name"
+msgstr ""
+
+#. module: account
+#: field:account.partner.reconcile.process,progress:0
+msgid "Progress"
+msgstr ""
+
+#. module: account
+#: field:wizard.multi.charts.accounts,bank_accounts_id:0
+msgid "Cash and Banks"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_installer
+msgid "account.installer"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Recompute taxes and total"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1116
+#, python-format
+msgid "You cannot modify/delete a journal with entries for this period."
+msgstr ""
+
+#. module: account
+#: field:account.tax.template,include_base_amount:0
+msgid "Include in Base Amount"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,supplier_invoice_number:0
+msgid "Supplier Invoice Number"
+msgstr ""
+
+#. module: account
+#: help:account.payment.term.line,days:0
+msgid ""
+"Number of days to add before computation of the day of month.If Date=15/01, "
+"Number of Days=22, Day of Month=-1, then the due date is 28/02."
+msgstr ""
+
+#. module: account
+#: view:account.payment.term.line:0
+msgid "Amount Computation"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1105
+#, python-format
+msgid "You can not add/modify entries in a closed period %s of journal %s."
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+msgid "Entry Controls"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.chart:0
+#: view:project.account.analytic.line:0
+msgid "(Keep empty to open the current situation)"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.balance,date1:0
+#: field:account.analytic.cost.ledger,date1:0
+#: field:account.analytic.cost.ledger.journal.report,date1:0
+#: field:account.analytic.inverted.balance,date1:0
+#: field:account.analytic.journal.report,date1:0
+msgid "Start of period"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.account_type_asset_view1
+msgid "Asset View"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_common_account_report
+msgid "Account Common Account Report"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+#: view:account.bank.statement:0
+#: selection:account.bank.statement,state:0
+#: view:account.fiscalyear:0
+#: selection:account.fiscalyear,state:0
+#: selection:account.invoice,state:0
+#: selection:account.invoice.report,state:0
+#: selection:account.period,state:0
+#: selection:report.invoice.created,state:0
+msgid "Open"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+#: model:ir.ui.menu,name:account.menu_analytic_accounting
+msgid "Analytic Accounting"
+msgstr ""
+
+#. module: account
+#: help:account.payment.term.line,value:0
+msgid ""
+"Select here the kind of valuation related to this payment term line. Note "
+"that you should have your last line with the type 'Balance' to ensure that "
+"the whole amount will be treated."
+msgstr ""
+
+#. module: account
+#: field:account.partner.ledger,initial_balance:0
+#: field:account.report.general.ledger,initial_balance:0
+msgid "Include Initial Balances"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.tax:0
+msgid "Tax Codes"
+msgstr ""
+
+#. module: account
+#: selection:account.invoice,type:0
+#: selection:account.invoice.report,type:0
+#: selection:report.invoice.created,type:0
+msgid "Customer Refund"
+msgstr ""
+
+#. module: account
+#: field:account.tax,ref_tax_sign:0
+#: field:account.tax,tax_sign:0
+#: field:account.tax.template,ref_tax_sign:0
+#: field:account.tax.template,tax_sign:0
+msgid "Tax Code Sign"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_report_invoice_created
+msgid "Report of Invoices Created within Last 15 days"
+msgstr ""
+
+#. module: account
+#: field:account.fiscalyear,end_journal_period_id:0
+msgid "End of Year Entries Journal"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Draft Refund "
+msgstr ""
+
+#. module: account
+#: view:cash.box.in:0
+msgid "Fill in this form if you put money in the cash register:"
+msgstr ""
+
+#. module: account
+#: view:account.payment.term.line:0
+#: field:account.payment.term.line,value_amount:0
+msgid "Amount To Pay"
+msgstr ""
+
+#. module: account
+#: help:account.partner.reconcile.process,to_reconcile:0
+msgid ""
+"This is the remaining partners for who you should check if there is "
+"something to reconcile or not. This figure already count the current partner "
+"as reconciled."
+msgstr ""
+
+#. module: account
+#: view:account.subscription.line:0
+msgid "Subscription lines"
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,quantity:0
+msgid "Products Quantity"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+#: selection:account.entries.report,move_state:0
+#: view:account.move:0
+#: selection:account.move,state:0
+#: view:account.move.line:0
+msgid "Unposted"
+msgstr ""
+
+#. module: account
+#: view:account.change.currency:0
+#: model:ir.actions.act_window,name:account.action_account_change_currency
+#: model:ir.model,name:account.model_account_change_currency
+msgid "Change Currency"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_accountingentries0
+#: model:process.node,note:account.process_node_supplieraccountingentries0
+msgid "Accounting entries."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Payment Date"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: field:account.bank.statement,opening_details_ids:0
+msgid "Opening Cashbox Lines"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+#: model:ir.actions.act_window,name:account.action_account_analytic_account_form
+#: model:ir.ui.menu,name:account.account_analytic_def_account
+msgid "Analytic Accounts"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Customer Invoices And Refunds"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.line,amount_currency:0
+#: field:account.entries.report,amount_currency:0
+#: field:account.model.line,amount_currency:0
+#: field:account.move.line,amount_currency:0
+msgid "Amount Currency"
+msgstr ""
+
+#. module: account
+#: selection:res.company,tax_calculation_rounding_method:0
+msgid "Round per Line"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.balance:0
+#: report:account.analytic.account.inverted.balance:0
+#: report:account.analytic.account.quantity_cost_ledger:0
+#: report:account.invoice:0
+#: field:account.invoice.line,quantity:0
+#: field:account.model.line,quantity:0
+#: field:account.move.line,quantity:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,unit_amount:0
+#: field:report.account.sales,quantity:0
+#: field:report.account_type.sales,quantity:0
+msgid "Quantity"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Number (Move)"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,style_overwrite:0
+msgid "Normal Text"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_paymentreconcile0
+msgid "Payment entries are the second input of the reconciliation."
+msgstr ""
+
+#. module: account
+#: help:res.partner,property_supplier_payment_term:0
+msgid ""
+"This payment term will be used instead of the default one for purchase "
+"orders and supplier invoices"
+msgstr ""
+
+#. module: account
+#: help:account.automatic.reconcile,power:0
+msgid ""
+"Number of partial amounts that can be combined to find a balance point can "
+"be chosen as the power of the automatic reconciliation"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_report_aged_partner_balance.py:56
+#, python-format
+msgid "You must set a period length greater than 0."
+msgstr ""
+
+#. module: account
+#: view:account.fiscal.position.template:0
+#: field:account.fiscal.position.template,name:0
+msgid "Fiscal Position Template"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Draft Refund"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.chart:0
+#: view:account.chart:0
+#: view:account.tax.chart:0
+msgid "Open Charts"
+msgstr ""
+
+#. module: account
+#: field:account.central.journal,amount_currency:0
+#: field:account.common.journal.report,amount_currency:0
+#: field:account.general.journal,amount_currency:0
+#: field:account.partner.ledger,amount_currency:0
+#: field:account.print.journal,amount_currency:0
+#: field:account.report.general.ledger,amount_currency:0
+msgid "With Currency"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Open CashBox"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,style_overwrite:0
+msgid "Automatic formatting"
+msgstr ""
+
+#. module: account
+#: view:account.move.line.reconcile:0
+msgid "Reconcile With Write-Off"
+msgstr ""
+
+#. module: account
+#: constraint:account.move.line:0
+msgid "You cannot create journal items on an account of type view."
+msgstr ""
+
+#. module: account
+#: selection:account.payment.term.line,value:0
+#: selection:account.tax,type:0
+msgid "Fixed Amount"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1056
+#, python-format
+msgid "You cannot change the tax, you should remove and recreate lines."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_automatic_reconcile
+msgid "Account Automatic Reconcile"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: view:account.move.line:0
+msgid "Journal Item"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_fiscalyear_close
+#: model:ir.ui.menu,name:account.menu_wizard_fy_close
+msgid "Generate Opening Entries"
+msgstr ""
+
+#. module: account
+#: help:account.tax,type:0
+msgid "The computation method for the tax amount."
+msgstr ""
+
+#. module: account
+#: view:account.payment.term.line:0
+msgid "Due Date Computation"
+msgstr ""
+
+#. module: account
+#: field:report.invoice.created,create_date:0
+msgid "Create Date"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.journal:0
+#: field:account.analytic.journal.report,analytic_account_journal_id:0
+#: model:ir.actions.act_window,name:account.action_account_analytic_journal_form
+#: model:ir.ui.menu,name:account.account_def_analytic_journal
+msgid "Analytic Journals"
+msgstr ""
+
+#. module: account
+#: field:account.account,child_id:0
+msgid "Child Accounts"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1117
+#, python-format
+msgid "Move name (id): %s (%s)"
+msgstr ""
+
+#. module: account
+#: view:account.move.line.reconcile:0
+#: code:addons/account/account_move_line.py:879
+#, python-format
+msgid "Write-Off"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "entries"
+msgstr ""
+
+#. module: account
+#: field:res.partner,debit:0
+msgid "Total Payable"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.data_account_type_income
+#: model:account.financial.report,name:account.account_financial_report_income0
+msgid "Income"
+msgstr ""
+
+#. module: account
+#: selection:account.bank.statement.line,type:0
+#: view:account.config.settings:0
+#: view:account.invoice:0
+#: view:account.invoice.report:0
+#: code:addons/account/account_invoice.py:390
+#, python-format
+msgid "Supplier"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "March"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.journal:0
+msgid "Account n°"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:95
+#, python-format
+msgid "Free Reference"
+msgstr ""
+
+#. module: account
+#: selection:account.aged.trial.balance,result_selection:0
+#: selection:account.common.partner.report,result_selection:0
+#: selection:account.partner.balance,result_selection:0
+#: selection:account.partner.ledger,result_selection:0
+#: report:account.third_party_ledger:0
+#: code:addons/account/report/account_partner_balance.py:301
+#: code:addons/account/report/account_partner_ledger.py:276
+#, python-format
+msgid "Receivable and Payable Accounts"
+msgstr ""
+
+#. module: account
+#: field:account.fiscal.position.account.template,position_id:0
+msgid "Fiscal Mapping"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "Select Company"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_state_open
+#: model:ir.model,name:account.model_account_state_open
+msgid "Account State Open"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.quantity_cost_ledger:0
+msgid "Max Qty:"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: model:ir.actions.act_window,name:account.action_account_invoice_refund
+msgid "Refund Invoice"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_entries_report_all
+msgid ""
+"From this view, have an analysis of your different financial accounts. The "
+"document shows your debit and credit taking in consideration some criteria "
+"you can choose by using the search tool."
+msgstr ""
+
+#. module: account
+#: help:account.partner.reconcile.process,progress:0
+msgid ""
+"Shows you the progress made today on the reconciliation process. Given by \n"
+"Partners Reconciled Today \\ (Remaining Partners + Partners Reconciled Today)"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,period_id:0
+#: field:account.invoice.report,period_id:0
+#: field:report.account.sales,period_id:0
+#: field:report.account_type.sales,period_id:0
+msgid "Force Period"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_form
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add an account.\n"
+" </p><p>\n"
+" An account is part of a ledger allowing your company\n"
+" to register all kinds of debit and credit transactions.\n"
+" Companies present their annual accounts in two main parts: "
+"the\n"
+" balance sheet and the income statement (profit and loss\n"
+" account). The annual accounts of a company are required by "
+"law\n"
+" to disclose a certain amount of information.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+#: field:account.invoice.report,nbr:0
+msgid "# of Lines"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "(update)"
+msgstr ""
+
+#. module: account
+#: field:account.aged.trial.balance,filter:0
+#: field:account.balance.report,filter:0
+#: field:account.central.journal,filter:0
+#: field:account.common.account.report,filter:0
+#: field:account.common.journal.report,filter:0
+#: field:account.common.partner.report,filter:0
+#: field:account.common.report,filter:0
+#: field:account.general.journal,filter:0
+#: field:account.partner.balance,filter:0
+#: field:account.partner.ledger,filter:0
+#: field:account.print.journal,filter:0
+#: field:account.report.general.ledger,filter:0
+#: field:account.vat.declaration,filter:0
+#: field:accounting.report,filter:0
+#: field:accounting.report,filter_cmp:0
+msgid "Filter by"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:2334
+#, python-format
+msgid "You have a wrong expression \"%(...)s\" in your model !"
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Compute Code for Taxes Included Prices"
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement,balance_end:0
+msgid "Balance as calculated based on Starting Balance and transaction lines"
+msgstr ""
+
+#. module: account
+#: field:account.journal,loss_account_id:0
+msgid "Loss Account"
+msgstr ""
+
+#. module: account
+#: field:account.tax,account_collected_id:0
+#: field:account.tax.template,account_collected_id:0
+msgid "Invoice Tax Account"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_general_journal
+#: model:ir.model,name:account.model_account_general_journal
+msgid "Account General Journal"
+msgstr ""
+
+#. module: account
+#: help:account.move,state:0
+msgid ""
+"All manually created new journal entries are usually in the status "
+"'Unposted', but you can set the option to skip that status on the related "
+"journal. In that case, they will behave as journal entries automatically "
+"created by the system on document validation (invoices, bank statements...) "
+"and will be created in 'Posted' status."
+msgstr ""
+
+#. module: account
+#: field:account.payment.term.line,days:0
+msgid "Number of Days"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1357
+#, python-format
+msgid ""
+"You cannot validate this journal entry because account \"%s\" does not "
+"belong to chart of accounts \"%s\"."
+msgstr ""
+
+#. module: account
+#: view:account.financial.report:0
+msgid "Report"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_fiscal_position_tax_template
+msgid "Template Tax Fiscal Position"
+msgstr ""
+
+#. module: account
+#: help:account.tax,name:0
+msgid "This name will be displayed on reports"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.cost_ledger:0
+#: report:account.analytic.account.quantity_cost_ledger:0
+msgid "Printing date"
+msgstr ""
+
+#. module: account
+#: selection:account.account.type,close_method:0
+#: selection:account.tax,type:0
+#: selection:account.tax.template,type:0
+msgid "None"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_invoice_tree3
+#: model:ir.ui.menu,name:account.menu_action_invoice_tree3
+msgid "Customer Refunds"
+msgstr ""
+
+#. module: account
+#: field:account.account,foreign_balance:0
+msgid "Foreign Balance"
+msgstr ""
+
+#. module: account
+#: field:account.journal.period,name:0
+msgid "Journal-Period Name"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,factor_base:0
+msgid "Multipication factor for Base code"
+msgstr ""
+
+#. module: account
+#: help:account.journal,company_id:0
+msgid "Company related to this journal"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,group_multi_currency:0
+msgid "Allows you multi currency environment"
+msgstr ""
+
+#. module: account
+#: view:account.subscription:0
+msgid "Running Subscription"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Fiscal Position Remark :"
+msgstr ""
+
+#. module: account
+#: view:analytic.entries.report:0
+#: model:ir.actions.act_window,name:account.action_analytic_entries_report
+#: model:ir.ui.menu,name:account.menu_action_analytic_entries_report
+msgid "Analytic Entries Analysis"
+msgstr ""
+
+#. module: account
+#: selection:account.aged.trial.balance,direction_selection:0
+msgid "Past"
+msgstr ""
+
+#. module: account
+#: help:res.partner.bank,journal_id:0
+msgid ""
+"This journal will be created automatically for this bank account when you "
+"save the record"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Analytic Entry"
+msgstr ""
+
+#. module: account
+#: view:res.company:0
+#: field:res.company,overdue_msg:0
+msgid "Overdue Payments Message"
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,date_created:0
+msgid "Date Created"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_analytic_account_line_extended_form
+msgid "account.analytic.line.extended"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_supplierreconcilepaid0
+msgid ""
+"As soon as the reconciliation is done, the invoice's state turns to “done” "
+"(i.e. paid) in the system."
+msgstr ""
+
+#. module: account
+#: view:account.chart.template:0
+#: field:account.chart.template,account_root_id:0
+msgid "Root Account"
+msgstr ""
+
+#. module: account
+#: field:res.partner,last_reconciliation_date:0
+msgid "Latest Reconciliation Date"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+#: model:ir.model,name:account.model_account_analytic_line
+msgid "Analytic Line"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_action_model_form
+msgid "Models"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:1124
+#, python-format
+msgid ""
+"You cannot cancel an invoice which is partially paid. You need to "
+"unreconcile related payment entries first."
+msgstr ""
+
+#. module: account
+#: field:product.template,taxes_id:0
+msgid "Customer Taxes"
+msgstr ""
+
+#. module: account
+#: help:account.model,name:0
+msgid "This is a model for recurring accounting entries"
+msgstr ""
+
+#. module: account
+#: field:wizard.multi.charts.accounts,sale_tax_rate:0
+msgid "Sales Tax(%)"
+msgstr ""
+
+#. module: account
+#: view:account.tax.code:0
+msgid "Reporting Configuration"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_invoice_tree4
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to register a refund you received from a supplier.\n"
+" </p><p>\n"
+" Instead of creating the supplier refund manually, you can "
+"generate\n"
+" refunds and reconcile them directly from the related "
+"supplier invoice.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: field:account.tax,type:0
+#: field:account.tax.template,type:0
+msgid "Tax Type"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_template_form
+#: model:ir.ui.menu,name:account.menu_action_account_template_form
+msgid "Account Templates"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,complete_tax_set:0
+#: help:wizard.multi.charts.accounts,complete_tax_set:0
+msgid ""
+"This boolean helps you to choose if you want to propose to the user to "
+"encode the sales and purchase rates or use the usual m2o fields. This last "
+"choice assumes that the set of tax defined for the chosen template is "
+"complete"
+msgstr ""
+
+#. module: account
+#: report:account.vat.declaration:0
+msgid "Tax Statement"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Open and Paid Invoices"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,display_detail:0
+msgid "Display children flat"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "Bank & Cash"
+msgstr ""
+
+#. module: account
+#: help:account.fiscalyear.close.state,fy_id:0
+msgid "Select a fiscal year to close"
+msgstr ""
+
+#. module: account
+#: help:account.chart.template,tax_template_ids:0
+msgid "List of all the taxes that have to be installed by the wizard"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.report.xml,name:account.account_intracom
+msgid "IntraCom"
+msgstr ""
+
+#. module: account
+#: view:account.move.line.reconcile.writeoff:0
+msgid "Information addendum"
+msgstr ""
+
+#. module: account
+#: field:account.chart,fiscalyear:0
+#: view:account.fiscalyear:0
+msgid "Fiscal year"
+msgstr ""
+
+#. module: account
+#: view:account.move.reconcile:0
+msgid "Partial Reconcile Entries"
+msgstr ""
+
+#. module: account
+#: view:account.aged.trial.balance:0
+#: view:account.analytic.balance:0
+#: view:account.analytic.chart:0
+#: view:account.analytic.cost.ledger:0
+#: view:account.analytic.cost.ledger.journal.report:0
+#: view:account.analytic.inverted.balance:0
+#: view:account.analytic.journal.report:0
+#: view:account.automatic.reconcile:0
+#: view:account.change.currency:0
+#: view:account.chart:0
+#: view:account.common.report:0
+#: view:account.config.settings:0
+#: view:account.fiscalyear.close:0
+#: view:account.fiscalyear.close.state:0
+#: view:account.invoice.cancel:0
+#: view:account.invoice.confirm:0
+#: view:account.invoice.refund:0
+#: view:account.journal.select:0
+#: view:account.move.bank.reconcile:0
+#: view:account.move.line.reconcile:0
+#: view:account.move.line.reconcile.select:0
+#: view:account.move.line.reconcile.writeoff:0
+#: view:account.move.line.unreconcile.select:0
+#: view:account.period.close:0
+#: view:account.state.open:0
+#: view:account.subscription.generate:0
+#: view:account.tax.chart:0
+#: view:account.unreconcile:0
+#: view:account.use.model:0
+#: view:account.vat.declaration:0
+#: view:cash.box.in:0
+#: view:cash.box.out:0
+#: view:project.account.analytic.line:0
+#: view:validate.account.move:0
+#: view:validate.account.move.lines:0
+msgid "Cancel"
+msgstr ""
+
+#. module: account
+#: selection:account.account,type:0
+#: selection:account.account.template,type:0
+#: model:account.account.type,name:account.data_account_type_receivable
+#: selection:account.entries.report,type:0
+msgid "Receivable"
+msgstr ""
+
+#. module: account
+#: constraint:account.move.line:0
+msgid "You cannot create journal items on closed account."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:633
+#, python-format
+msgid "Invoice line account's company and invoice's compnay does not match."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Other Info"
+msgstr ""
+
+#. module: account
+#: field:account.journal,default_credit_account_id:0
+msgid "Default Credit Account"
+msgstr ""
+
+#. module: account
+#: help:account.analytic.line,currency_id:0
+msgid "The related account currency if not equal to the company one."
+msgstr ""
+
+#. module: account
+#: code:addons/account/installer.py:69
+#, python-format
+msgid "Custom"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+msgid "Current"
+msgstr ""
+
+#. module: account
+#: field:account.journal,cashbox_line_ids:0
+msgid "CashBox"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.account_type_cash_equity
+#: model:account.account.type,name:account.conf_account_type_equity
+msgid "Equity"
+msgstr ""
+
+#. module: account
+#: field:account.journal,internal_account_id:0
+msgid "Internal Transfers Account"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/pos_box.py:32
+#, python-format
+msgid "Please check that the field 'Journal' is set on the Bank Statement"
+msgstr ""
+
+#. module: account
+#: selection:account.tax,type:0
+msgid "Percentage"
+msgstr ""
+
+#. module: account
+#: selection:account.config.settings,tax_calculation_rounding_method:0
+msgid "Round globally"
+msgstr ""
+
+#. module: account
+#: selection:account.report.general.ledger,sortby:0
+msgid "Journal & Partner"
+msgstr ""
+
+#. module: account
+#: field:account.automatic.reconcile,power:0
+msgid "Power"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3465
+#, python-format
+msgid "Cannot generate an unused journal code."
+msgstr ""
+
+#. module: account
+#: view:project.account.analytic.line:0
+msgid "View Account Analytic Lines"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,internal_number:0
+#: field:report.invoice.created,number:0
+msgid "Invoice Number"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,difference:0
+msgid "Difference"
+msgstr ""
+
+#. module: account
+#: help:account.tax,include_base_amount:0
+msgid ""
+"Indicates if the amount of tax must be included in the base amount for the "
+"computation of the next taxes"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_partner_reconcile
+msgid "Reconciliation: Go to Next Partner"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_analytic_invert_balance
+#: model:ir.actions.report.xml,name:account.account_analytic_account_inverted_balance
+msgid "Inverted Analytic Balance"
+msgstr ""
+
+#. module: account
+#: field:account.tax.template,applicable_type:0
+msgid "Applicable Type"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,date_due:0
+msgid ""
+"If you use payment terms, the due date will be computed automatically at the "
+"generation of accounting entries. The payment term may compute several due "
+"dates, for example 50% now and 50% in one month, but if you want to force a "
+"due date, make sure that the payment term is not set on the invoice. If you "
+"keep the payment term and the due date empty, it means direct payment."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:414
+#, python-format
+msgid ""
+"There is no opening/closing period defined, please create one to set the "
+"initial balance."
+msgstr ""
+
+#. module: account
+#: help:account.tax.template,sequence:0
+msgid ""
+"The sequence field is used to order the taxes lines from lower sequences to "
+"higher ones. The order is important if you have a tax that has several tax "
+"children. In this case, the evaluation order is important."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1448
+#: code:addons/account/account.py:1453
+#: code:addons/account/account.py:1482
+#: code:addons/account/account.py:1489
+#: code:addons/account/account_invoice.py:1015
+#: code:addons/account/account_move_line.py:1005
+#: code:addons/account/wizard/account_automatic_reconcile.py:148
+#: code:addons/account/wizard/account_fiscalyear_close.py:88
+#: code:addons/account/wizard/account_fiscalyear_close.py:99
+#: code:addons/account/wizard/account_fiscalyear_close.py:102
+#: code:addons/account/wizard/account_report_aged_partner_balance.py:56
+#: code:addons/account/wizard/account_report_aged_partner_balance.py:58
+#, python-format
+msgid "User Error!"
+msgstr ""
+
+#. module: account
+#: view:account.open.closed.fiscalyear:0
+msgid "Discard"
+msgstr ""
+
+#. module: account
+#: selection:account.account,type:0
+#: selection:account.account.template,type:0
+#: view:account.journal:0
+msgid "Liquidity"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_analytic_journal_open_form
+#: model:ir.ui.menu,name:account.account_analytic_journal_entries
+msgid "Analytic Journal Items"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,has_default_company:0
+msgid "Has default company"
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear.close:0
+msgid ""
+"This wizard will generate the end of year journal entries of selected fiscal "
+"year. Note that you can run this wizard many times for the same fiscal year: "
+"it will simply replace the old opening entries with the new ones."
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_bank_and_cash
+msgid "Bank and Cash"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_analytic_entries_report
+msgid ""
+"From this view, have an analysis of your different analytic entries "
+"following the analytic account you defined matching your business need. Use "
+"the tool search to analyse information about analytic entries generated in "
+"the system."
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.journal:0
+msgid "The name of the journal must be unique per company !"
+msgstr ""
+
+#. module: account
+#: field:account.account.template,nocreate:0
+msgid "Optional create"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:686
+#, python-format
+msgid ""
+"You cannot change the owner company of an account that already contains "
+"journal items."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: selection:account.invoice,type:0
+#: selection:account.invoice.report,type:0
+#: code:addons/account/account_invoice.py:1160
+#: selection:report.invoice.created,type:0
+#, python-format
+msgid "Supplier Refund"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,move_line_ids:0
+msgid "Entry lines"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,centralisation:0
+msgid "Centralisation"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: view:account.account.template:0
+#: view:account.analytic.account:0
+#: view:account.analytic.journal:0
+#: view:account.analytic.line:0
+#: view:account.bank.statement:0
+#: view:account.chart.template:0
+#: view:account.entries.report:0
+#: view:account.financial.report:0
+#: view:account.fiscalyear:0
+#: view:account.invoice:0
+#: view:account.invoice.report:0
+#: view:account.journal:0
+#: view:account.model:0
+#: view:account.move:0
+#: view:account.move.line:0
+#: view:account.subscription:0
+#: view:account.tax.code.template:0
+#: view:analytic.entries.report:0
+msgid "Group By..."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1024
+#, python-format
+msgid ""
+"There is no period defined for this date: %s.\n"
+"Please create one."
+msgstr ""
+
+#. module: account
+#: field:account.analytic.line,product_uom_id:0
+#: field:account.invoice.line,uos_id:0
+#: field:account.move.line,product_uom_id:0
+msgid "Unit of Measure"
+msgstr ""
+
+#. module: account
+#: help:account.journal,group_invoice_lines:0
+msgid ""
+"If this box is checked, the system will try to group the accounting lines "
+"when generating them from invoices."
+msgstr ""
+
+#. module: account
+#: field:account.installer,has_default_company:0
+msgid "Has Default Company"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_sequence_fiscalyear
+msgid "account.sequence.fiscalyear"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.journal:0
+#: view:account.analytic.journal:0
+#: field:account.analytic.line,journal_id:0
+#: field:account.journal,analytic_journal_id:0
+#: model:ir.actions.act_window,name:account.action_account_analytic_journal
+#: model:ir.actions.report.xml,name:account.analytic_journal_print
+#: model:ir.model,name:account.model_account_analytic_journal
+#: model:ir.ui.menu,name:account.account_analytic_journal_print
+msgid "Analytic Journal"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "Reconciled"
+msgstr ""
+
+#. module: account
+#: constraint:account.payment.term.line:0
+msgid ""
+"Percentages for Payment Term Line must be between 0 and 1, Example: 0.02 for "
+"2%."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: field:account.invoice.tax,base:0
+msgid "Base"
+msgstr ""
+
+#. module: account
+#: field:account.model,name:0
+msgid "Model Name"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,property_account_expense_categ:0
+msgid "Expense Category Account"
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.tax:0
+msgid "Tax Name must be unique per company!"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Cash Transactions"
+msgstr ""
+
+#. module: account
+#: view:account.unreconcile:0
+msgid ""
+"If you unreconcile transactions, you must also verify all the actions that "
+"are linked to those transactions because they will not be disabled"
+msgstr ""
+
+#. module: account
+#: view:account.account.template:0
+#: view:account.bank.statement:0
+#: field:account.bank.statement.line,note:0
+#: view:account.fiscal.position:0
+#: field:account.fiscal.position,note:0
+#: field:account.fiscal.position.template,note:0
+msgid "Notes"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_analytic_entries_report
+msgid "Analytic Entries Statistics"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_analytic_line.py:142
+#: code:addons/account/account_move_line.py:955
+#, python-format
+msgid "Entries: "
+msgstr ""
+
+#. module: account
+#: help:res.partner.bank,currency_id:0
+msgid "Currency of the related account journal."
+msgstr ""
+
+#. module: account
+#: constraint:account.move.line:0
+msgid ""
+"You cannot provide a secondary currency if it is the same than the company "
+"one."
+msgstr ""
+
+#. module: account
+#: selection:account.tax.template,applicable_type:0
+msgid "True"
+msgstr ""
+
+#. module: account
+#: selection:account.account.type,report_type:0
+#: code:addons/account/account.py:190
+#, python-format
+msgid "Balance Sheet (Asset account)"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_draftstatement0
+msgid "State is draft"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Total debit"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Next Partner Entries to reconcile"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Fax :"
+msgstr ""
+
+#. module: account
+#: help:res.partner,property_account_receivable:0
+msgid ""
+"This account will be used instead of the default one as the receivable "
+"account for the current partner"
+msgstr ""
+
+#. module: account
+#: field:account.tax,python_applicable:0
+#: field:account.tax,python_compute:0
+#: selection:account.tax,type:0
+#: selection:account.tax.template,applicable_type:0
+#: field:account.tax.template,python_applicable:0
+#: field:account.tax.template,python_compute:0
+#: selection:account.tax.template,type:0
+msgid "Python Code"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "Journal Entries with period in current period"
+msgstr ""
+
+#. module: account
+#: help:account.journal,update_posted:0
+msgid ""
+"Check this box if you want to allow the cancellation the entries related to "
+"this journal or of the invoice related to this journal"
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear.close:0
+msgid "Create"
+msgstr ""
+
+#. module: account
+#: model:process.transition.action,name:account.process_transition_action_createentries0
+msgid "Create entry"
+msgstr ""
+
+#. module: account
+#: selection:account.account.type,report_type:0
+#: code:addons/account/account.py:189
+#, python-format
+msgid "Profit & Loss (Expense account)"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,total_entry_encoding:0
+msgid "Total Transactions"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:636
+#, python-format
+msgid "You cannot remove an account that contains journal items."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1024
+#: code:addons/account/account_move_line.py:1105
+#, python-format
+msgid "Error !"
+msgstr ""
+
+#. module: account
+#: field:account.financial.report,style_overwrite:0
+msgid "Financial Report Style"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,sign:0
+msgid "Preserve balance sign"
+msgstr ""
+
+#. module: account
+#: view:account.vat.declaration:0
+#: model:ir.actions.report.xml,name:account.account_vat_declaration
+#: model:ir.ui.menu,name:account.menu_account_vat_declaration
+msgid "Taxes Report"
+msgstr ""
+
+#. module: account
+#: selection:account.journal.period,state:0
+msgid "Printed"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Project line"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.tax,manual:0
+msgid "Manual"
+msgstr ""
+
+#. module: account
+#: selection:account.invoice.refund,filter_refund:0
+msgid "Cancel: create refund and reconcile"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_report_aged_partner_balance.py:58
+#, python-format
+msgid "You must set a start date."
+msgstr ""
+
+#. module: account
+#: view:account.automatic.reconcile:0
+msgid ""
+"For an invoice to be considered as paid, the invoice entries must be "
+"reconciled with counterparts, usually payments. With the automatic "
+"reconciliation functionality, OpenERP makes its own search for entries to "
+"reconcile in a series of accounts. It finds entries for each partner where "
+"the amounts correspond."
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: field:account.move,to_check:0
+msgid "To Review"
+msgstr ""
+
+#. module: account
+#: help:account.partner.ledger,initial_balance:0
+#: help:account.report.general.ledger,initial_balance:0
+msgid ""
+"If you selected to filter by date or period, this field allow you to add a "
+"row to display the amount of debit/credit/balance that precedes the filter "
+"you've set."
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: view:account.move:0
+#: model:ir.actions.act_window,name:account.action_move_journal_line
+#: model:ir.ui.menu,name:account.menu_action_move_journal_line_form
+#: model:ir.ui.menu,name:account.menu_finance_entries
+msgid "Journal Entries"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_invoice_refund.py:147
+#, python-format
+msgid "No period found on the invoice."
+msgstr ""
+
+#. module: account
+#: help:account.partner.ledger,page_split:0
+msgid "Display Ledger Report with One partner per page"
+msgstr ""
+
+#. module: account
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+msgid "JRNL"
+msgstr ""
+
+#. module: account
+#: view:account.state.open:0
+msgid "Yes"
+msgstr ""
+
+#. module: account
+#: selection:account.aged.trial.balance,target_move:0
+#: selection:account.balance.report,target_move:0
+#: selection:account.central.journal,target_move:0
+#: selection:account.chart,target_move:0
+#: selection:account.common.account.report,target_move:0
+#: selection:account.common.journal.report,target_move:0
+#: selection:account.common.partner.report,target_move:0
+#: selection:account.common.report,target_move:0
+#: selection:account.general.journal,target_move:0
+#: selection:account.partner.balance,target_move:0
+#: selection:account.partner.ledger,target_move:0
+#: selection:account.print.journal,target_move:0
+#: selection:account.report.general.ledger,target_move:0
+#: selection:account.tax.chart,target_move:0
+#: selection:account.vat.declaration,target_move:0
+#: selection:accounting.report,target_move:0
+#: code:addons/account/report/common_report_header.py:67
+#, python-format
+msgid "All Entries"
+msgstr ""
+
+#. module: account
+#: constraint:account.move.reconcile:0
+msgid "You can only reconcile journal items with the same partner."
+msgstr ""
+
+#. module: account
+#: view:account.journal.select:0
+msgid "Journal Select"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: code:addons/account/account.py:422
+#: code:addons/account/account.py:434
+#, python-format
+msgid "Opening Balance"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_move_reconcile
+msgid "Account Reconciliation"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_fiscal_position_tax
+msgid "Taxes Fiscal Position"
+msgstr ""
+
+#. module: account
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: model:ir.actions.act_window,name:account.action_account_general_ledger_menu
+#: model:ir.actions.report.xml,name:account.account_general_ledger
+#: model:ir.actions.report.xml,name:account.account_general_ledger_landscape
+#: model:ir.ui.menu,name:account.menu_general_ledger
+msgid "General Ledger"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_paymentorderbank0
+msgid "The payment order is sent to the bank."
+msgstr ""
+
+#. module: account
+#: help:account.move,to_check:0
+msgid ""
+"Check this box if you are unsure of that journal entry and if you want to "
+"note it as 'to be reviewed' by an accounting expert."
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,complete_tax_set:0
+#: field:wizard.multi.charts.accounts,complete_tax_set:0
+msgid "Complete Set of Taxes"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_validate_account_move.py:61
+#, python-format
+msgid ""
+"Selected Entry Lines does not have any account move enties in draft state."
+msgstr ""
+
+#. module: account
+#: view:account.chart.template:0
+msgid "Properties"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_tax_chart
+msgid "Account tax chart"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.cost_ledger:0
+#: report:account.analytic.account.quantity_cost_ledger:0
+#: report:account.central.journal:0
+#: report:account.general.journal:0
+#: report:account.invoice:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: report:account.partner.balance:0
+msgid "Total:"
+msgstr ""
+
+#. module: account
+#: constraint:account.journal:0
+msgid ""
+"Configuration error!\n"
+"The currency chosen should be shared by the default accounts too."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:2304
+#, python-format
+msgid ""
+"You can specify year, month and date in the name of the model using the "
+"following labels:\n"
+"\n"
+"%(year)s: To Specify Year \n"
+"%(month)s: To Specify Month \n"
+"%(date)s: Current Date\n"
+"\n"
+"e.g. My model on %(date)s"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,paypal_url:0
+msgid "Paypal Url"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,module_account_voucher:0
+msgid "Manage customer payments"
+msgstr ""
+
+#. module: account
+#: help:report.invoice.created,origin:0
+msgid "Reference of the document that generated this invoice report."
+msgstr ""
+
+#. module: account
+#: field:account.tax.code,child_ids:0
+#: field:account.tax.code.template,child_ids:0
+msgid "Child Codes"
+msgstr ""
+
+#. module: account
+#: constraint:account.fiscalyear:0
+msgid ""
+"Error!\n"
+"The start date of a fiscal year must precede its end date."
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Taxes used in Sales"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_invoice_tree1
+#: model:ir.ui.menu,name:account.menu_action_invoice_tree1
+msgid "Customer Invoices"
+msgstr ""
+
+#. module: account
+#: view:account.tax:0
+msgid "Misc"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Sales"
+msgstr ""
+
+#. module: account
+#: selection:account.invoice.report,state:0
+#: selection:account.journal.period,state:0
+#: selection:account.subscription,state:0
+#: selection:report.invoice.created,state:0
+msgid "Done"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1319
+#, python-format
+msgid ""
+"You cannot validate a non-balanced entry.\n"
+"Make sure you have configured payment terms properly.\n"
+"The latest payment term line should be of the \"Balance\" type."
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_invoicemanually0
+msgid "A statement with manual entries becomes a draft statement."
+msgstr ""
+
+#. module: account
+#: view:account.aged.trial.balance:0
+msgid ""
+"Aged Partner Balance is a more detailed report of your receivables by "
+"intervals. When opening that report, OpenERP asks for the name of the "
+"company, the fiscal period and the size of the interval to be analyzed (in "
+"days). OpenERP then calculates a table of credit balance by period. So if "
+"you request an interval of 30 days OpenERP generates an analysis of "
+"creditors for the past month, past two months, and so on. "
+msgstr ""
+
+#. module: account
+#: field:account.invoice,origin:0
+#: field:account.invoice.line,origin:0
+#: field:report.invoice.created,origin:0
+msgid "Source Document"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,company_footer:0
+msgid "Bank accounts as printed in the footer of each printed document"
+msgstr ""
+
+#. module: account
+#: constraint:account.account:0
+msgid ""
+"Configuration Error!\n"
+"You cannot define children to an account with internal type different of "
+"\"View\"."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_accounting_report
+msgid "Accounting Report"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.line,currency_id:0
+msgid "Account Currency"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Taxes:"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:458
+#, python-format
+msgid ""
+"You can not delete an invoice which is not cancelled. You should refund it "
+"instead."
+msgstr ""
+
+#. module: account
+#: help:account.tax,amount:0
+msgid "For taxes of type percentage, enter % ratio between 0-1."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_report_tree_hierarchy
+msgid "Financial Reports Hierarchy"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.act_account_invoice_partner_relation
+msgid "Monthly Turnover"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: view:account.move.line:0
+msgid "Analytic Lines"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.journal,line_ids:0
+#: field:account.tax.code,line_ids:0
+msgid "Lines"
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Account Tax Template"
+msgstr ""
+
+#. module: account
+#: view:account.journal.select:0
+msgid "Are you sure you want to open Journal Entries?"
+msgstr ""
+
+#. module: account
+#: view:account.state.open:0
+msgid "Are you sure you want to open this invoice ?"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,property_account_expense_opening:0
+msgid "Opening Entries Expense Account"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Customer Reference"
+msgstr ""
+
+#. module: account
+#: field:account.account.template,parent_id:0
+msgid "Parent Account Template"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Price"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: field:account.bank.statement,closing_details_ids:0
+msgid "Closing Cashbox Lines"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: field:account.bank.statement.line,statement_id:0
+#: field:account.move.line,statement_id:0
+#: model:process.process,name:account.process_process_statementprocess0
+msgid "Statement"
+msgstr ""
+
+#. module: account
+#: help:account.journal,default_debit_account_id:0
+msgid "It acts as a default account for debit amount"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "Posted entries"
+msgstr ""
+
+#. module: account
+#: help:account.payment.term.line,value_amount:0
+msgid "For percent enter a ratio between 0-1."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: view:account.invoice:0
+#: field:account.invoice,date_invoice:0
+#: field:report.invoice.created,date_invoice:0
+msgid "Invoice Date"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Group by year of Invoice Date"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,purchase_tax_rate:0
+msgid "Purchase tax (%)"
+msgstr ""
+
+#. module: account
+#: help:res.partner,credit:0
+msgid "Total amount this customer owes you."
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Unbalanced Journal Items"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.open_account_charts_modules
+msgid "Chart Templates"
+msgstr ""
+
+#. module: account
+#: field:account.journal.period,icon:0
+msgid "Icon"
+msgstr ""
+
+#. module: account
+#: view:account.use.model:0
+msgid "Ok"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,tax_code_root_id:0
+msgid "Root Tax Code"
+msgstr ""
+
+#. module: account
+#: help:account.journal,centralisation:0
+msgid ""
+"Check this box to determine that each entry of this journal won't create a "
+"new counterpart but will share the same counterpart. This is used in fiscal "
+"year closing."
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,closing_date:0
+msgid "Closed On"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_bank_statement_line
+msgid "Bank Statement Line"
+msgstr ""
+
+#. module: account
+#: field:wizard.multi.charts.accounts,purchase_tax:0
+msgid "Default Purchase Tax"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,property_account_income_opening:0
+msgid "Opening Entries Income Account"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,group_proforma_invoices:0
+msgid "Allow pro-forma invoices"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Confirm"
+msgstr ""
+
+#. module: account
+#: help:account.tax,domain:0
+#: help:account.tax.template,domain:0
+msgid ""
+"This field is only used if you develop your own module allowing developers "
+"to create specific taxes in a custom domain."
+msgstr ""
+
+#. module: account
+#: field:account.invoice,reference:0
+#: field:account.invoice.line,invoice_id:0
+msgid "Invoice Reference"
+msgstr ""
+
+#. module: account
+#: field:account.fiscalyear.close,report_name:0
+msgid "Name of new entries"
+msgstr ""
+
+#. module: account
+#: view:account.use.model:0
+msgid "Create Entries"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_cash_box_out
+msgid "cash.box.out"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,currency_id:0
+msgid "Main currency of the company."
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_reports
+msgid "Reporting"
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/account_move_line.py:780
+#: code:addons/account/static/src/js/account_move_reconciliation.js:90
+#, python-format
+msgid "Warning"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_analytic_open
+msgid "Contracts/Analytic Accounts"
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+#: field:res.partner.bank,journal_id:0
+msgid "Account Journal"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,tax_calculation_rounding_method:0
+msgid "Tax calculation rounding method"
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_paidinvoice0
+#: model:process.node,name:account.process_node_supplierpaidinvoice0
+msgid "Paid invoice"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.refund:0
+msgid ""
+"Use this option if you want to cancel an invoice you should not\n"
+" have issued. The credit note will be "
+"created, validated and reconciled\n"
+" with the invoice. You will not be able "
+"to modify the credit note."
+msgstr ""
+
+#. module: account
+#: help:account.partner.reconcile.process,next_partner_id:0
+msgid ""
+"This field shows you the next partner that will be automatically chosen by "
+"the system to go through the reconciliation process, based on the latest day "
+"it have been reconciled."
+msgstr ""
+
+#. module: account
+#: field:account.move.line.reconcile.writeoff,comment:0
+msgid "Comment"
+msgstr ""
+
+#. module: account
+#: field:account.tax,domain:0
+#: field:account.tax.template,domain:0
+msgid "Domain"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_use_model
+msgid "Use model"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1490
+#, python-format
+msgid ""
+"There is no default credit account defined \n"
+"on journal \"%s\"."
+msgstr ""
+
+#. module: account
+#: view:account.invoice.line:0
+#: field:account.invoice.tax,invoice_id:0
+#: model:ir.model,name:account.model_account_invoice_line
+msgid "Invoice Line"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Customer And Supplier Refunds"
+msgstr ""
+
+#. module: account
+#: field:account.financial.report,sign:0
+msgid "Sign on Reports"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_analytic_account_tree2
+msgid ""
+"<p>\n"
+" Click to add a new analytic account.\n"
+" </p><p>\n"
+" The normal chart of accounts has a structure defined by the\n"
+" legal requirement of the country. The analytic chart of\n"
+" accounts structure should reflect your own business needs "
+"in\n"
+" term of costs/revenues reporting.\n"
+" </p><p>\n"
+" They are usually structured by contracts, projects, products "
+"or\n"
+" departements. Most of the OpenERP operations (invoices,\n"
+" timesheets, expenses, etc) generate analytic entries on the\n"
+" related account.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.data_account_type_view
+msgid "Root/View"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3206
+#, python-format
+msgid "OPEJ"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: view:account.invoice:0
+msgid "PRO-FORMA"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,move_line_state:0
+#: view:account.move.line:0
+#: selection:account.move.line,state:0
+msgid "Unbalanced"
+msgstr ""
+
+#. module: account
+#: selection:account.move.line,centralisation:0
+msgid "Normal"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_email_templates
+#: model:ir.ui.menu,name:account.menu_email_templates
+msgid "Email Templates"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Optional Information"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+#: field:account.bank.statement,user_id:0
+#: view:account.journal:0
+#: field:account.journal,user_id:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: account
+#: selection:account.account,currency_mode:0
+msgid "At Date"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,date_maturity:0
+msgid ""
+"This field is used for payable and receivable journal entries. You can put "
+"the limit date for the payment of this line."
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_multi_currency
+msgid "Multi-Currencies"
+msgstr ""
+
+#. module: account
+#: field:account.model.line,date_maturity:0
+msgid "Maturity Date"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3193
+#, python-format
+msgid "Sales Journal"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_invoice_tax
+msgid "Invoice Tax"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1185
+#, python-format
+msgid "No piece number !"
+msgstr ""
+
+#. module: account
+#: view:account.financial.report:0
+#: model:ir.ui.menu,name:account.menu_account_report_tree_hierarchy
+msgid "Account Reports Hierarchy"
+msgstr ""
+
+#. module: account
+#: help:account.account.template,chart_template_id:0
+msgid ""
+"This optional field allow you to link an account template to a specific "
+"chart template that may differ from the one its root parent belongs to. This "
+"allow you to define chart templates that extend another and complete it with "
+"few new accounts (You don't need to define the whole structure that is "
+"common to both several times)."
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+msgid "Unposted Journal Entries"
+msgstr ""
+
+#. module: account
+#: help:account.invoice.refund,date:0
+msgid ""
+"This date will be used as the invoice date for credit note and period will "
+"be chosen accordingly!"
+msgstr ""
+
+#. module: account
+#: view:product.template:0
+msgid "Sales Properties"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3541
+#, python-format
+msgid ""
+"You have to set a code for the bank account defined on the selected chart of "
+"accounts."
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_manual_reconcile
+msgid "Manual Reconciliation"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Total amount due:"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.chart,to_date:0
+#: field:project.account.analytic.line,to_date:0
+msgid "To"
+msgstr ""
+
+#. module: account
+#: selection:account.move.line,centralisation:0
+#: code:addons/account/account.py:1541
+#, python-format
+msgid "Currency Adjustment"
+msgstr ""
+
+#. module: account
+#: field:account.fiscalyear.close,fy_id:0
+msgid "Fiscal Year to close"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.cancel:0
+#: model:ir.actions.act_window,name:account.action_account_invoice_cancel
+msgid "Cancel Selected Invoices"
+msgstr ""
+
+#. module: account
+#: help:account.account.type,report_type:0
+msgid ""
+"This field is used to generate legal reports: profit and loss, balance sheet."
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "May"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:820
+#, python-format
+msgid "Global taxes defined, but they are not in invoice lines !"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_chart_template
+msgid "Templates for Account Chart"
+msgstr ""
+
+#. module: account
+#: help:account.model.line,sequence:0
+msgid ""
+"The sequence field is used to order the resources from lower sequences to "
+"higher ones."
+msgstr ""
+
+#. module: account
+#: field:account.move.line,amount_residual_currency:0
+msgid "Residual Amount in Currency"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,sale_refund_sequence_prefix:0
+msgid "Credit note sequence"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_validate_account_move
+#: model:ir.actions.act_window,name:account.action_validate_account_move_line
+#: model:ir.ui.menu,name:account.menu_validate_account_moves
+#: view:validate.account.move:0
+#: view:validate.account.move.lines:0
+msgid "Post Journal Entries"
+msgstr ""
+
+#. module: account
+#: selection:account.bank.statement.line,type:0
+#: view:account.config.settings:0
+#: view:account.invoice:0
+#: view:account.invoice.report:0
+#: code:addons/account/account_invoice.py:388
+#, python-format
+msgid "Customer"
+msgstr ""
+
+#. module: account
+#: field:account.financial.report,name:0
+msgid "Report Name"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.data_account_type_cash
+#: selection:account.analytic.journal,type:0
+#: selection:account.bank.accounts.wizard,account_type:0
+#: selection:account.entries.report,type:0
+#: selection:account.journal,type:0
+#: code:addons/account/account.py:3092
+#, python-format
+msgid "Cash"
+msgstr ""
+
+#. module: account
+#: field:account.fiscal.position.account,account_dest_id:0
+#: field:account.fiscal.position.account.template,account_dest_id:0
+msgid "Account Destination"
+msgstr ""
+
+#. module: account
+#: help:account.invoice.refund,filter_refund:0
+msgid ""
+"Refund base on this type. You can not Modify and Cancel if the invoice is "
+"already reconciled"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement.line,sequence:0
+#: field:account.financial.report,sequence:0
+#: field:account.invoice.line,sequence:0
+#: field:account.invoice.tax,sequence:0
+#: field:account.model.line,sequence:0
+#: field:account.sequence.fiscalyear,sequence_id:0
+#: field:account.tax,sequence:0
+#: field:account.tax.code,sequence:0
+#: field:account.tax.template,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,paypal_account:0
+msgid "Paypal account"
+msgstr ""
+
+#. module: account
+#: selection:account.print.journal,sort_selection:0
+msgid "Journal Entry Number"
+msgstr ""
+
+#. module: account
+#: view:account.financial.report:0
+msgid "Parent Report"
+msgstr ""
+
+#. module: account
+#: constraint:account.account:0
+#: constraint:account.tax.code:0
+msgid ""
+"Error!\n"
+"You cannot create recursive accounts."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_cash_box_in
+msgid "cash.box.in"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,move_id:0
+msgid "Link to the automatically generated Journal Items."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_config_settings
+msgid "account.config.settings"
+msgstr ""
+
+#. module: account
+#: selection:account.config.settings,period:0
+#: selection:account.installer,period:0
+msgid "Monthly"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.data_account_type_asset
+msgid "Asset"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,balance_end:0
+msgid "Computed Balance"
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/static/src/js/account_move_reconciliation.js:89
+#, python-format
+msgid "You must choose at least one record."
+msgstr ""
+
+#. module: account
+#: field:account.account,parent_id:0
+#: field:account.financial.report,parent_id:0
+msgid "Parent"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_cash_statement.py:292
+#, python-format
+msgid "Profit"
+msgstr ""
+
+#. module: account
+#: help:account.payment.term.line,days2:0
+msgid ""
+"Day of the month, set -1 for the last day of the current month. If it's "
+"positive, it gives the day of the next month. Set 0 for net days (otherwise "
+"it's based on the beginning of the month)."
+msgstr ""
+
+#. module: account
+#: view:account.move.line.reconcile:0
+msgid "Reconciliation Transactions"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_legal_statement
+msgid "Legal Reports"
+msgstr ""
+
+#. module: account
+#: field:account.tax.code,sum_period:0
+msgid "Period Sum"
+msgstr ""
+
+#. module: account
+#: help:account.tax,sequence:0
+msgid ""
+"The sequence field is used to order the tax lines from the lowest sequences "
+"to the higher ones. The order is important if you have a tax with several "
+"tax children. In this case, the evaluation order is important."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_cashbox_line
+msgid "CashBox Line"
+msgstr ""
+
+#. module: account
+#: field:account.installer,charts:0
+msgid "Accounting Package"
+msgstr ""
+
+#. module: account
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: model:ir.actions.act_window,name:account.action_account_partner_ledger
+#: model:ir.actions.report.xml,name:account.account_3rdparty_ledger
+#: model:ir.actions.report.xml,name:account.account_3rdparty_ledger_other
+#: model:ir.ui.menu,name:account.menu_account_partner_ledger
+msgid "Partner Ledger"
+msgstr ""
+
+#. module: account
+#: selection:account.tax.template,type:0
+msgid "Fixed"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:653
+#: code:addons/account/account.py:656
+#: code:addons/account/account.py:668
+#: code:addons/account/account.py:1031
+#, python-format
+msgid "Warning !"
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement,message_unread:0
+#: help:account.invoice,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: account
+#: field:res.company,tax_calculation_rounding_method:0
+msgid "Tax Calculation Rounding Method"
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,move_line_state:0
+msgid "State of Move Line"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_move_line_reconcile
+msgid "Account move line reconcile"
+msgstr ""
+
+#. module: account
+#: view:account.subscription.generate:0
+#: model:ir.model,name:account.model_account_subscription_generate
+msgid "Subscription Compute"
+msgstr ""
+
+#. module: account
+#: view:account.move.line.unreconcile.select:0
+msgid "Open for Unreconciliation"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement.line,partner_id:0
+#: view:account.entries.report:0
+#: field:account.entries.report,partner_id:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: view:account.invoice:0
+#: field:account.invoice,partner_id:0
+#: field:account.invoice.line,partner_id:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,partner_id:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: field:account.model.line,partner_id:0
+#: view:account.move:0
+#: field:account.move,partner_id:0
+#: view:account.move.line:0
+#: field:account.move.line,partner_id:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,partner_id:0
+#: model:ir.model,name:account.model_res_partner
+#: field:report.invoice.created,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: account
+#: help:account.change.currency,currency_id:0
+msgid "Select a currency to apply on the invoice"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:901
+#, python-format
+msgid "No Invoice Lines !"
+msgstr ""
+
+#. module: account
+#: view:account.financial.report:0
+msgid "Report Type"
+msgstr ""
+
+#. module: account
+#: help:account.open.closed.fiscalyear,fyear_id:0
+msgid ""
+"Select Fiscal Year which you want to remove entries for its End of year "
+"entries journal"
+msgstr ""
+
+#. module: account
+#: field:account.tax.template,type_tax_use:0
+msgid "Tax Use In"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_bank_statement.py:382
+#, python-format
+msgid ""
+"The statement balance is incorrect !\n"
+"The expected balance (%.2f) is different than the computed one. (%.2f)"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_bank_statement.py:420
+#, python-format
+msgid "The account entries lines are not in valid state."
+msgstr ""
+
+#. module: account
+#: field:account.account.type,close_method:0
+msgid "Deferral Method"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_electronicfile0
+msgid "Automatic entry"
+msgstr ""
+
+#. module: account
+#: help:account.account,reconcile:0
+msgid ""
+"Check this box if this account allows reconciliation of journal items."
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.inverted.balance:0
+msgid "Inverted Analytic Balance -"
+msgstr ""
+
+#. module: account
+#: help:account.move.reconcile,opening_reconciliation:0
+msgid ""
+"Is this reconciliation produced by the opening of a new fiscal year ?."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+#: model:ir.actions.act_window,name:account.action_account_analytic_line_form
+msgid "Analytic Entries"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+msgid "Associated Partner"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:1465
+#, python-format
+msgid "You must first select a partner !"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,comment:0
+msgid "Additional Information"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.report,residual:0
+#: field:account.invoice.report,user_currency_residual:0
+msgid "Total Residual"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Opening Cash Control"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_invoiceinvoice0
+#: model:process.node,note:account.process_node_supplierinvoiceinvoice0
+msgid "Invoice's state is Open"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+#: view:account.bank.statement:0
+#: field:account.bank.statement,state:0
+#: field:account.entries.report,move_state:0
+#: view:account.fiscalyear:0
+#: field:account.fiscalyear,state:0
+#: view:account.invoice:0
+#: field:account.invoice,state:0
+#: view:account.invoice.report:0
+#: field:account.journal.period,state:0
+#: field:account.move,state:0
+#: view:account.move.line:0
+#: field:account.move.line,state:0
+#: field:account.period,state:0
+#: view:account.subscription:0
+#: field:account.subscription,state:0
+#: field:report.invoice.created,state:0
+msgid "Status"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.cost_ledger:0
+#: report:account.analytic.account.quantity_cost_ledger:0
+#: model:ir.actions.act_window,name:account.action_account_analytic_cost
+#: model:ir.actions.report.xml,name:account.account_analytic_account_cost_ledger
+msgid "Cost Ledger"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "No Fiscal Year Defined for This Company"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Proforma"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.cost_ledger:0
+msgid "J.C. /Move name"
+msgstr ""
+
+#. module: account
+#: help:account.tax.template,include_base_amount:0
+msgid ""
+"Set if the amount of tax must be included in the base amount before "
+"computing the next taxes."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3196
+#, python-format
+msgid "Purchase Refund Journal"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1333
+#, python-format
+msgid "Please define a sequence on the journal."
+msgstr ""
+
+#. module: account
+#: help:account.tax.template,amount:0
+msgid "For Tax Type percent enter % ratio between 0-1."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+msgid "Current Accounts"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Group by Invoice Date"
+msgstr ""
+
+#. module: account
+#: help:account.journal,user_id:0
+msgid "The user responsible for this journal"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,module_account_followup:0
+msgid ""
+"This allows to automate letters for unpaid invoices, with multi-level "
+"recalls.\n"
+" This installs the module account_followup."
+msgstr ""
+
+#. module: account
+#: field:account.automatic.reconcile,period_id:0
+#: view:account.bank.statement:0
+#: field:account.bank.statement,period_id:0
+#: view:account.entries.report:0
+#: field:account.entries.report,period_id:0
+#: view:account.fiscalyear:0
+#: report:account.general.ledger_landscape:0
+#: view:account.invoice:0
+#: view:account.invoice.report:0
+#: field:account.journal.period,period_id:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: view:account.move:0
+#: field:account.move,period_id:0
+#: view:account.move.line:0
+#: field:account.move.line,period_id:0
+#: view:account.period:0
+#: field:account.subscription,period_nbr:0
+#: field:account.tax.chart,period_id:0
+#: field:account.treasury.report,period_id:0
+#: field:validate.account.move,period_id:0
+msgid "Period"
+msgstr ""
+
+#. module: account
+#: help:account.account,adjusted_balance:0
+msgid ""
+"Total amount (in Company currency) for transactions held in secondary "
+"currency for this account."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Net Total:"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_report_common.py:158
+#, python-format
+msgid "Select a starting and an ending period."
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,sale_sequence_next:0
+msgid "Next invoice number"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_generic_reporting
+msgid "Generic Reporting"
+msgstr ""
+
+#. module: account
+#: field:account.move.line.reconcile.writeoff,journal_id:0
+msgid "Write-Off Journal"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,property_account_income_categ:0
+msgid "Income Category Account"
+msgstr ""
+
+#. module: account
+#: field:account.account,adjusted_balance:0
+msgid "Adjusted Balance"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_fiscal_position_template_form
+#: model:ir.ui.menu,name:account.menu_action_account_fiscal_position_form_template
+msgid "Fiscal Position Templates"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+msgid "Int.Type"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,tax_amount:0
+msgid "Tax/Base Amount"
+msgstr ""
+
+#. module: account
+#: view:account.open.closed.fiscalyear:0
+msgid ""
+"This wizard will remove the end of year journal entries of selected fiscal "
+"year. Note that you can run this wizard many times for the same fiscal year."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Tel. :"
+msgstr ""
+
+#. module: account
+#: field:account.account,company_currency_id:0
+msgid "Company Currency"
+msgstr ""
+
+#. module: account
+#: field:account.aged.trial.balance,chart_account_id:0
+#: field:account.balance.report,chart_account_id:0
+#: field:account.central.journal,chart_account_id:0
+#: field:account.common.account.report,chart_account_id:0
+#: field:account.common.journal.report,chart_account_id:0
+#: field:account.common.partner.report,chart_account_id:0
+#: field:account.common.report,chart_account_id:0
+#: view:account.config.settings:0
+#: field:account.general.journal,chart_account_id:0
+#: field:account.partner.balance,chart_account_id:0
+#: field:account.partner.ledger,chart_account_id:0
+#: field:account.print.journal,chart_account_id:0
+#: field:account.report.general.ledger,chart_account_id:0
+#: field:account.vat.declaration,chart_account_id:0
+#: field:accounting.report,chart_account_id:0
+msgid "Chart of Account"
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_paymententries0
+#: model:process.transition,name:account.process_transition_reconcilepaid0
+msgid "Payment"
+msgstr ""
+
+#. module: account
+#: view:account.automatic.reconcile:0
+msgid "Reconciliation Result"
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,balance_end_real:0
+#: field:account.treasury.report,ending_balance:0
+msgid "Ending Balance"
+msgstr ""
+
+#. module: account
+#: field:account.journal,centralisation:0
+msgid "Centralized Counterpart"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,blocked:0
+msgid ""
+"You can check this box to mark this journal item as a litigation with the "
+"associated partner"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,reconcile_partial_id:0
+#: view:account.move.line.reconcile:0
+msgid "Partial Reconcile"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_analytic_inverted_balance
+msgid "Account Analytic Inverted Balance"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_common_report
+msgid "Account Common Report"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.refund:0
+msgid ""
+"Use this option if you want to cancel an invoice and create a new\n"
+" one. The credit note will be created, "
+"validated and reconciled\n"
+" with the current invoice. A new, draft, "
+"invoice will be created \n"
+" so that you can edit it."
+msgstr ""
+
+#. module: account
+#: model:process.transition,name:account.process_transition_filestatement0
+msgid "Automatic import of the bank sta"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:381
+#, python-format
+msgid "Unknown Error!"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_move_bank_reconcile
+msgid "Move bank reconcile"
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "Apply"
+msgstr ""
+
+#. module: account
+#: field:account.financial.report,account_type_ids:0
+#: model:ir.actions.act_window,name:account.action_account_type_form
+#: model:ir.ui.menu,name:account.menu_action_account_type_form
+msgid "Account Types"
+msgstr ""
+
+#. module: account
+#: model:email.template,subject:account.email_template_edi_invoice
+msgid "${object.company_id.name} Invoice (Ref ${object.number or 'n/a'})"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1210
+#, python-format
+msgid ""
+"You cannot use this general account in this journal, check the tab 'Entry "
+"Controls' on the related journal."
+msgstr ""
+
+#. module: account
+#: field:account.account.type,report_type:0
+msgid "P&L / BS Category"
+msgstr ""
+
+#. module: account
+#: view:account.automatic.reconcile:0
+#: view:account.move:0
+#: view:account.move.line:0
+#: view:account.move.line.reconcile:0
+#: view:account.move.line.reconcile.select:0
+#: code:addons/account/wizard/account_move_line_reconcile_select.py:45
+#: model:ir.ui.menu,name:account.periodical_processing_reconciliation
+#: model:process.node,name:account.process_node_reconciliation0
+#: model:process.node,name:account.process_node_supplierreconciliation0
+#, python-format
+msgid "Reconciliation"
+msgstr ""
+
+#. module: account
+#: view:account.tax.template:0
+msgid "Keep empty to use the income account"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid ""
+"This button only appears when the state of the invoice is 'paid' (showing "
+"that it has been fully reconciled) and auto-computed boolean 'reconciled' is "
+"False (depicting that it's not the case anymore). In other words, the "
+"invoice has been dereconciled and it does not fit anymore the 'paid' state. "
+"You should press this button to re-open it and let it continue its normal "
+"process after having resolved the eventual exceptions it may have created."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_journal_form
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a journal.\n"
+" </p><p>\n"
+" A journal is used to record transactions of all accounting "
+"data\n"
+" related to the day-to-day business.\n"
+" </p><p>\n"
+" A typical company may use one journal per payment method "
+"(cash,\n"
+" bank accounts, checks), one purchase journal, one sale "
+"journal\n"
+" and one for miscellaneous information.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_fiscalyear_close_state
+msgid "Fiscalyear Close state"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.refund,journal_id:0
+msgid "Refund Journal"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: report:account.central.journal:0
+#: report:account.general.journal:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.partner.balance:0
+msgid "Filter By"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_period_close.py:51
+#, python-format
+msgid ""
+"In order to close a period, you must first post related journal entries."
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+#: view:board.board:0
+#: model:ir.actions.act_window,name:account.action_company_analysis_tree
+msgid "Company Analysis"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,account_id:0
+msgid "The partner account used for this invoice."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3391
+#, python-format
+msgid "Tax %.2f%%"
+msgstr ""
+
+#. module: account
+#: field:account.tax.code,parent_id:0
+#: view:account.tax.code.template:0
+#: field:account.tax.code.template,parent_id:0
+msgid "Parent Code"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_payment_term_line
+msgid "Payment Term Line"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3194
+#, python-format
+msgid "Purchase Journal"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,amount_untaxed:0
+msgid "Subtotal"
+msgstr ""
+
+#. module: account
+#: view:account.vat.declaration:0
+msgid "Print Tax Statement"
+msgstr ""
+
+#. module: account
+#: view:account.model.line:0
+msgid "Journal Entry Model Line"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: field:account.invoice,date_due:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,date_due:0
+#: field:report.invoice.created,date_due:0
+msgid "Due Date"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_account_supplier
+#: model:ir.ui.menu,name:account.menu_finance_payables
+msgid "Suppliers"
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+msgid "Accounts Type Allowed (empty for no control)"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,amount_residual:0
+msgid ""
+"The residual amount on a receivable or payable of a journal entry expressed "
+"in the company currency."
+msgstr ""
+
+#. module: account
+#: view:account.tax.code:0
+msgid "Statistics"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.chart,from_date:0
+#: field:project.account.analytic.line,from_date:0
+msgid "From"
+msgstr ""
+
+#. module: account
+#: help:accounting.report,debit_credit:0
+msgid ""
+"This option allows you to get more details about the way your balances are "
+"computed. Because it is space consuming, we do not allow to use it while "
+"doing a comparison."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_fiscalyear_close
+msgid "Fiscalyear Close"
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.account:0
+msgid "The code of the account must be unique per company !"
+msgstr ""
+
+#. module: account
+#: help:product.category,property_account_expense_categ:0
+#: help:product.template,property_account_expense:0
+msgid "This account will be used to value outgoing stock using cost price."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: model:ir.actions.act_window,name:account.act_account_journal_2_account_invoice_opened
+msgid "Unpaid Invoices"
+msgstr ""
+
+#. module: account
+#: field:account.move.line.reconcile,debit:0
+msgid "Debit amount"
+msgstr ""
+
+#. module: account
+#: view:account.aged.trial.balance:0
+#: view:account.analytic.balance:0
+#: view:account.analytic.cost.ledger:0
+#: view:account.analytic.cost.ledger.journal.report:0
+#: view:account.analytic.inverted.balance:0
+#: view:account.analytic.journal.report:0
+#: view:account.common.report:0
+#: view:account.invoice:0
+msgid "Print"
+msgstr ""
+
+#. module: account
+#: view:account.period.close:0
+msgid "Are you sure?"
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+msgid "Accounts Allowed (empty for no control)"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,sale_tax_rate:0
+msgid "Sales tax (%)"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_analytic_account_tree2
+#: model:ir.actions.act_window,name:account.action_account_analytic_chart
+#: model:ir.ui.menu,name:account.menu_action_analytic_account_tree2
+msgid "Chart of Analytic Accounts"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_subscription_form
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to define a new recurring entry.\n"
+" </p><p>\n"
+" A recurring entry occurs on a recurrent basis from a "
+"specific\n"
+" date, i.e. corresponding to the signature of a contract or "
+"an\n"
+" agreement with a customer or a supplier. You can create "
+"such\n"
+" entries to automate the postings in the system.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: view:account.journal:0
+#: model:ir.ui.menu,name:account.menu_configuration_misc
+msgid "Miscellaneous"
+msgstr ""
+
+#. module: account
+#: help:res.partner,debit:0
+msgid "Total amount you have to pay to this supplier."
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_analytic0
+#: model:process.node,name:account.process_node_analyticcost0
+msgid "Analytic Costs"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.journal,name:0
+#: report:account.general.journal:0
+#: field:account.journal,name:0
+msgid "Journal Name"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:829
+#, python-format
+msgid "Entry \"%s\" is not valid !"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,style_overwrite:0
+msgid "Smallest Text"
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,module_account_check_writing:0
+msgid ""
+"This allows you to check writing and printing.\n"
+" This installs the module account_check_writing."
+msgstr ""
+
+#. module: account
+#: model:res.groups,name:account.group_account_invoice
+msgid "Invoicing & Payments"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,internal_number:0
+msgid ""
+"Unique number of the invoice, computed automatically when the invoice is "
+"created."
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.data_account_type_expense
+#: model:account.financial.report,name:account.account_financial_report_expense0
+msgid "Expense"
+msgstr ""
+
+#. module: account
+#: help:account.chart,fiscalyear:0
+msgid "Keep empty for all open fiscal years"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,amount_currency:0
+msgid ""
+"The amount expressed in an optional other currency if it is a multi-currency "
+"entry."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1006
+#, python-format
+msgid "The account move (%s) for centralisation has been confirmed."
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.journal:0
+#: field:account.bank.statement,currency:0
+#: report:account.central.journal:0
+#: view:account.entries.report:0
+#: field:account.entries.report,currency_id:0
+#: report:account.general.journal:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: field:account.invoice,currency_id:0
+#: field:account.invoice.report,currency_id:0
+#: field:account.journal,currency:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: field:account.model.line,currency_id:0
+#: view:account.move:0
+#: view:account.move.line:0
+#: field:account.move.line,currency_id:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: field:analytic.entries.report,currency_id:0
+#: model:ir.model,name:account.model_res_currency
+#: field:report.account.sales,currency_id:0
+#: field:report.account_type.sales,currency_id:0
+#: field:report.invoice.created,currency_id:0
+#: field:res.partner.bank,currency_id:0
+#: field:wizard.multi.charts.accounts,currency_id:0
+msgid "Currency"
+msgstr ""
+
+#. module: account
+#: help:account.invoice.refund,journal_id:0
+msgid ""
+"You can select here the journal to use for the credit note that will be "
+"created. If you leave that field empty, it will use the same journal as the "
+"current invoice."
+msgstr ""
+
+#. module: account
+#: help:account.bank.statement.line,sequence:0
+msgid ""
+"Gives the sequence order when displaying a list of bank statement lines."
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_validentries0
+msgid "Accountant validates the accounting entries coming from the invoice."
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+#: model:ir.actions.act_window,name:account.act_account_acount_move_line_reconcile_open
+msgid "Reconciled entries"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:2334
+#, python-format
+msgid "Wrong model !"
+msgstr ""
+
+#. module: account
+#: view:account.tax.code.template:0
+#: view:account.tax.template:0
+msgid "Tax Template"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.refund,period:0
+msgid "Force period"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_partner_balance
+msgid "Print Account Partner Balance"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1121
+#, python-format
+msgid ""
+"You cannot do this modification on a reconciled entry. You can just change "
+"some non legal fields or you must unreconcile first.\n"
+"%s."
+msgstr ""
+
+#. module: account
+#: help:account.financial.report,sign:0
+msgid ""
+"For accounts that are typically more debited than credited and that you "
+"would like to print as negative amounts in your reports, you should reverse "
+"the sign of the balance; e.g.: Expense account. The same applies for "
+"accounts that are typically more credited than debited and that you would "
+"like to print as positive amounts in your reports; e.g.: Income account."
+msgstr ""
+
+#. module: account
+#: field:res.partner,contract_ids:0
+msgid "Contracts"
+msgstr ""
+
+#. module: account
+#: field:account.cashbox.line,bank_statement_id:0
+#: field:account.entries.report,reconcile_id:0
+#: field:account.financial.report,balance:0
+#: field:account.financial.report,credit:0
+#: field:account.financial.report,debit:0
+msgid "unknown"
+msgstr ""
+
+#. module: account
+#: field:account.fiscalyear.close,journal_id:0
+#: code:addons/account/account.py:3198
+#, python-format
+msgid "Opening Entries Journal"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_customerinvoice0
+msgid "Draft invoices are checked, validated and printed."
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement,message_is_follower:0
+#: field:account.invoice,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: field:account.move,narration:0
+#: field:account.move.line,narration:0
+msgid "Internal Note"
+msgstr ""
+
+#. module: account
+#: constraint:account.account:0
+msgid ""
+"Configuration Error!\n"
+"You cannot select an account type with a deferral method different of "
+"\"Unreconciled\" for accounts with internal type \"Payable/Receivable\"."
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,has_fiscal_year:0
+msgid "Company has a fiscal year"
+msgstr ""
+
+#. module: account
+#: help:account.tax,child_depend:0
+#: help:account.tax.template,child_depend:0
+msgid ""
+"Set if the tax computation is based on the computation of child taxes rather "
+"than on the total amount."
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:634
+#, python-format
+msgid "You cannot deactivate an account that contains journal items."
+msgstr ""
+
+#. module: account
+#: selection:account.tax,applicable_type:0
+msgid "Given by Python Code"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.journal,code:0
+msgid "Journal Code"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: field:account.move.line,amount_residual:0
+msgid "Residual Amount"
+msgstr ""
+
+#. module: account
+#: field:account.invoice,move_lines:0
+#: field:account.move.reconcile,line_id:0
+msgid "Entry Lines"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_open_journal_button
+msgid "Open Journal"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.journal:0
+msgid "KI"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.cost_ledger:0
+#: report:account.analytic.account.journal:0
+#: report:account.analytic.account.quantity_cost_ledger:0
+msgid "Period from"
+msgstr ""
+
+#. module: account
+#: field:account.cashbox.line,pieces:0
+msgid "Unit of Currency"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3195
+#, python-format
+msgid "Sales Refund Journal"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: view:account.move.line:0
+msgid "Information"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.confirm:0
+msgid ""
+"Once draft invoices are confirmed, you will not be able\n"
+" to modify them. The invoices will receive a unique\n"
+" number and journal items will be created in your "
+"chart\n"
+" of accounts."
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_bankstatement0
+msgid "Registered payment"
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear.close.state:0
+msgid "Close states of Fiscal year and periods"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,purchase_refund_journal_id:0
+msgid "Purchase refund journal"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Product Information"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.journal:0
+#: view:account.move:0
+#: view:account.move.line:0
+#: model:ir.ui.menu,name:account.next_id_40
+msgid "Analytic"
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_invoiceinvoice0
+#: model:process.node,name:account.process_node_supplierinvoiceinvoice0
+msgid "Create Invoice"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_configuration_installer
+msgid "Configure Accounting Data"
+msgstr ""
+
+#. module: account
+#: field:wizard.multi.charts.accounts,purchase_tax_rate:0
+msgid "Purchase Tax(%)"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:901
+#, python-format
+msgid "Please create some invoice lines."
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/pos_box.py:36
+#, python-format
+msgid ""
+"Please check that the field 'Internal Transfers Account' is set on the "
+"payment method '%s'."
+msgstr ""
+
+#. module: account
+#: field:account.vat.declaration,display_detail:0
+msgid "Display Detail"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:3203
+#, python-format
+msgid "SCNJ"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_analyticinvoice0
+msgid ""
+"Analytic costs (timesheets, some purchased products, ...) come from analytic "
+"accounts. These generate draft invoices."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+#: view:analytic.entries.report:0
+msgid "My Entries"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,state:0
+msgid ""
+" * The 'Draft' status is used when a user is encoding a new and unconfirmed "
+"Invoice. \n"
+"* The 'Pro-forma' when invoice is in Pro-forma status,invoice does not have "
+"an invoice number. \n"
+"* The 'Open' status is used when user create invoice,a invoice number is "
+"generated.Its in open status till user does not pay invoice. \n"
+"* The 'Paid' status is set automatically when the invoice is paid. Its "
+"related journal entries may or may not be reconciled. \n"
+"* The 'Cancelled' status is used when user cancel invoice."
+msgstr ""
+
+#. module: account
+#: field:account.period,date_stop:0
+#: model:ir.ui.menu,name:account.menu_account_end_year_treatments
+msgid "End of Period"
+msgstr ""
+
+#. module: account
+#: field:account.account,financial_report_ids:0
+#: field:account.account.template,financial_report_ids:0
+#: model:ir.actions.act_window,name:account.action_account_financial_report_tree
+#: model:ir.actions.act_window,name:account.action_account_report
+#: model:ir.ui.menu,name:account.menu_account_reports
+msgid "Financial Reports"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.account_type_liability_view1
+msgid "Liability View"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: field:account.aged.trial.balance,period_from:0
+#: field:account.balance.report,period_from:0
+#: report:account.central.journal:0
+#: field:account.central.journal,period_from:0
+#: field:account.common.account.report,period_from:0
+#: field:account.common.journal.report,period_from:0
+#: field:account.common.partner.report,period_from:0
+#: field:account.common.report,period_from:0
+#: report:account.general.journal:0
+#: field:account.general.journal,period_from:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.partner.balance:0
+#: field:account.partner.balance,period_from:0
+#: field:account.partner.ledger,period_from:0
+#: field:account.print.journal,period_from:0
+#: field:account.report.general.ledger,period_from:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: report:account.vat.declaration:0
+#: field:account.vat.declaration,period_from:0
+#: field:accounting.report,period_from:0
+#: field:accounting.report,period_from_cmp:0
+msgid "Start Period"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.report.xml,name:account.account_central_journal
+msgid "Central Journal"
+msgstr ""
+
+#. module: account
+#: field:account.aged.trial.balance,direction_selection:0
+msgid "Analysis Direction"
+msgstr ""
+
+#. module: account
+#: field:res.partner,ref_companies:0
+msgid "Companies that refers to partner"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Ask Refund"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Total credit"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_suppliervalidentries0
+msgid "Accountant validates the accounting entries coming from the invoice. "
+msgstr ""
+
+#. module: account
+#: field:account.subscription,period_total:0
+msgid "Number of Periods"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Document: Customer account statement"
+msgstr ""
+
+#. module: account
+#: view:account.account.template:0
+msgid "Receivale Accounts"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,purchase_refund_sequence_prefix:0
+msgid "Supplier credit note sequence"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_state_open.py:37
+#, python-format
+msgid "Invoice is already reconciled."
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,module_account_payment:0
+msgid ""
+"This allows you to create and manage your payment orders, with purposes to\n"
+" * serve as base for an easy plug-in of various automated "
+"payment mechanisms, and\n"
+" * provide a more efficient way to manage invoice "
+"payments.\n"
+" This installs the module account_payment."
+msgstr ""
+
+#. module: account
+#: xsl:account.transfer:0
+msgid "Document"
+msgstr ""
+
+#. module: account
+#: view:account.chart.template:0
+#: field:account.chart.template,property_account_receivable:0
+msgid "Receivable Account"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:771
+#: code:addons/account/account_move_line.py:824
+#, python-format
+msgid "To reconcile the entries company should be the same for all entries."
+msgstr ""
+
+#. module: account
+#: field:account.account,balance:0
+#: report:account.account.balance:0
+#: selection:account.account.type,close_method:0
+#: report:account.analytic.account.balance:0
+#: report:account.analytic.account.cost_ledger:0
+#: report:account.analytic.account.inverted.balance:0
+#: report:account.central.journal:0
+#: field:account.entries.report,balance:0
+#: report:account.general.journal:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: field:account.invoice,residual:0
+#: field:account.move.line,balance:0
+#: report:account.partner.balance:0
+#: selection:account.payment.term.line,value:0
+#: selection:account.tax,type:0
+#: selection:account.tax.template,type:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: field:account.treasury.report,balance:0
+#: field:report.account.receivable,balance:0
+#: field:report.aged.receivable,balance:0
+msgid "Balance"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_supplierbankstatement0
+msgid "Manually or automatically entered in the system"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: report:account.general.ledger_landscape:0
+msgid "Display Account"
+msgstr ""
+
+#. module: account
+#: selection:account.account,type:0
+#: selection:account.account.template,type:0
+#: model:account.account.type,name:account.data_account_type_payable
+#: selection:account.entries.report,type:0
+msgid "Payable"
+msgstr ""
+
+#. module: account
+#: view:board.board:0
+msgid "Account Board"
+msgstr ""
+
+#. module: account
+#: view:account.model:0
+#: field:account.model,legend:0
+msgid "Legend"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_entriesreconcile0
+msgid "Accounting entries are the first input of the reconciliation."
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear.close:0
+msgid "Generate Fiscal Year Opening Entries"
+msgstr ""
+
+#. module: account
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+msgid "Filters By"
+msgstr ""
+
+#. module: account
+#: field:account.cashbox.line,number_closing:0
+#: field:account.cashbox.line,number_opening:0
+msgid "Number of Units"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_manually0
+#: model:process.transition,name:account.process_transition_invoicemanually0
+msgid "Manual entry"
+msgstr ""
+
+#. module: account
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: view:account.move:0
+#: view:account.move.line:0
+#: field:analytic.entries.report,move_id:0
+msgid "Move"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_bank_statement.py:478
+#: code:addons/account/wizard/account_period_close.py:51
+#, python-format
+msgid "Invalid Action!"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+msgid "Date / Period"
+msgstr ""
+
+#. module: account
+#: report:account.central.journal:0
+msgid "A/C No."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.act_account_journal_2_account_bank_statement
+msgid "Bank statements"
+msgstr ""
+
+#. module: account
+#: constraint:account.period:0
+msgid ""
+"Error!\n"
+"The period is invalid. Either some periods are overlapping or the period's "
+"dates are not matching the scope of the fiscal year."
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "There is nothing due with this customer."
+msgstr ""
+
+#. module: account
+#: help:account.tax,account_paid_id:0
+msgid ""
+"Set the account that will be set by default on invoice tax lines for "
+"refunds. Leave empty to use the expense account."
+msgstr ""
+
+#. module: account
+#: help:account.addtmpl.wizard,cparent_id:0
+msgid ""
+"Creates an account with the selected template under this existing parent."
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+msgid "Source"
+msgstr ""
+
+#. module: account
+#: selection:account.model.line,date_maturity:0
+msgid "Date of the day"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_move_bank_reconcile.py:49
+#, python-format
+msgid ""
+"You have to define the bank account\n"
+"in the journal definition for reconciliation."
+msgstr ""
+
+#. module: account
+#: help:account.journal,sequence_id:0
+msgid ""
+"This field contains the information related to the numbering of the journal "
+"entries of this journal."
+msgstr ""
+
+#. module: account
+#: field:account.invoice,sent:0
+msgid "Sent"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_common_menu
+msgid "Common Report"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,default_sale_tax:0
+#: field:account.config.settings,sale_tax:0
+msgid "Default sale tax"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Balance :"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1587
+#, python-format
+msgid "Cannot create moves for different companies."
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_periodical_processing
+msgid "Periodic Processing"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Customer And Supplier Invoices"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_paymententries0
+#: model:process.transition,name:account.process_transition_paymentorderbank0
+#: model:process.transition,name:account.process_transition_paymentreconcile0
+msgid "Payment entries"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "July"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+msgid "Chart of accounts"
+msgstr ""
+
+#. module: account
+#: field:account.subscription.line,subscription_id:0
+msgid "Subscription"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_analytic_balance
+msgid "Account Analytic Balance"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: field:account.aged.trial.balance,period_to:0
+#: field:account.balance.report,period_to:0
+#: report:account.central.journal:0
+#: field:account.central.journal,period_to:0
+#: field:account.common.account.report,period_to:0
+#: field:account.common.journal.report,period_to:0
+#: field:account.common.partner.report,period_to:0
+#: field:account.common.report,period_to:0
+#: report:account.general.journal:0
+#: field:account.general.journal,period_to:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.partner.balance:0
+#: field:account.partner.balance,period_to:0
+#: field:account.partner.ledger,period_to:0
+#: field:account.print.journal,period_to:0
+#: field:account.report.general.ledger,period_to:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: report:account.vat.declaration:0
+#: field:account.vat.declaration,period_to:0
+#: field:accounting.report,period_to:0
+#: field:accounting.report,period_to_cmp:0
+msgid "End Period"
+msgstr ""
+
+#. module: account
+#: model:account.account.type,name:account.account_type_expense_view1
+msgid "Expense View"
+msgstr ""
+
+#. module: account
+#: field:account.move.line,date_maturity:0
+msgid "Due date"
+msgstr ""
+
+#. module: account
+#: model:account.payment.term,name:account.account_payment_term_immediate
+#: model:account.payment.term,note:account.account_payment_term_immediate
+msgid "Immediate Payment"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1502
+#, python-format
+msgid " Centralisation"
+msgstr ""
+
+#. module: account
+#: help:account.journal,type:0
+msgid ""
+"Select 'Sale' for customer invoices journals. Select 'Purchase' for supplier "
+"invoices journals. Select 'Cash' or 'Bank' for journals that are used in "
+"customer or supplier payments. Select 'General' for miscellaneous operations "
+"journals. Select 'Opening/Closing Situation' for entries generated for new "
+"fiscal years."
+msgstr ""
+
+#. module: account
+#: view:account.subscription:0
+#: model:ir.model,name:account.model_account_subscription
+msgid "Account Subscription"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Maturity date"
+msgstr ""
+
+#. module: account
+#: view:account.subscription:0
+msgid "Entry Subscription"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: field:account.aged.trial.balance,date_from:0
+#: field:account.balance.report,date_from:0
+#: report:account.central.journal:0
+#: field:account.central.journal,date_from:0
+#: field:account.common.account.report,date_from:0
+#: field:account.common.journal.report,date_from:0
+#: field:account.common.partner.report,date_from:0
+#: field:account.common.report,date_from:0
+#: field:account.fiscalyear,date_start:0
+#: report:account.general.journal:0
+#: field:account.general.journal,date_from:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: field:account.installer,date_start:0
+#: report:account.partner.balance:0
+#: field:account.partner.balance,date_from:0
+#: field:account.partner.ledger,date_from:0
+#: field:account.print.journal,date_from:0
+#: field:account.report.general.ledger,date_from:0
+#: field:account.subscription,date_start:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: field:account.vat.declaration,date_from:0
+#: field:accounting.report,date_from:0
+#: field:accounting.report,date_from_cmp:0
+msgid "Start Date"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,reconciled:0
+msgid ""
+"It indicates that the invoice has been paid and the journal entry of the "
+"invoice has been reconciled with one or several journal entries of payment."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: view:account.invoice.report:0
+#: model:process.node,name:account.process_node_supplierdraftinvoices0
+msgid "Draft Invoices"
+msgstr ""
+
+#. module: account
+#: view:cash.box.in:0
+#: model:ir.actions.act_window,name:account.action_cash_box_in
+msgid "Put Money In"
+msgstr ""
+
+#. module: account
+#: selection:account.account.type,close_method:0
+#: view:account.entries.report:0
+#: view:account.move.line:0
+msgid "Unreconciled"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:922
+#, python-format
+msgid "Bad total !"
+msgstr ""
+
+#. module: account
+#: field:account.journal,sequence_id:0
+msgid "Entry Sequence"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_period_tree
+msgid ""
+"A period is a fiscal period of time during which accounting entries should "
+"be recorded for accounting related activities. Monthly period is the norm "
+"but depending on your countries or company needs, you could also have "
+"quarterly periods. Closing a period will make it impossible to record new "
+"accounting entries, all new entries should then be made on the following "
+"open period. Close a period when you do not want to record new entries and "
+"want to lock this period for tax related calculation."
+msgstr ""
+
+#. module: account
+#: view:account.analytic.account:0
+msgid "Pending"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_analytic_cost_ledger_journal
+#: model:ir.actions.report.xml,name:account.account_analytic_account_quantity_cost_ledger
+msgid "Cost Ledger (Only quantities)"
+msgstr ""
+
+#. module: account
+#: model:process.transition,name:account.process_transition_analyticinvoice0
+#: model:process.transition,name:account.process_transition_supplieranalyticcost0
+msgid "From analytic accounts"
+msgstr ""
+
+#. module: account
+#: view:account.installer:0
+msgid "Configure your Fiscal Year"
+msgstr ""
+
+#. module: account
+#: field:account.period,name:0
+msgid "Period Name"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_invoice_state.py:68
+#, python-format
+msgid ""
+"Selected invoice(s) cannot be cancelled as they are already in 'Cancelled' "
+"or 'Done' state."
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.quantity_cost_ledger:0
+msgid "Code/Date"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: view:account.move:0
+#: view:account.move.line:0
+#: model:ir.actions.act_window,name:account.act_account_journal_2_account_move_line
+#: model:ir.actions.act_window,name:account.act_account_move_to_account_move_line_open
+#: model:ir.actions.act_window,name:account.act_account_partner_account_move
+#: model:ir.actions.act_window,name:account.action_account_items
+#: model:ir.actions.act_window,name:account.action_account_moves_all_a
+#: model:ir.actions.act_window,name:account.action_move_line_select
+#: model:ir.actions.act_window,name:account.action_tax_code_items
+#: model:ir.actions.act_window,name:account.action_tax_code_line_open
+#: model:ir.model,name:account.model_account_move_line
+#: model:ir.ui.menu,name:account.menu_action_account_moves_all
+msgid "Journal Items"
+msgstr ""
+
+#. module: account
+#: view:accounting.report:0
+msgid "Comparison"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1119
+#, python-format
+msgid ""
+"You cannot do this modification on a confirmed entry. You can just change "
+"some non legal fields or you must unconfirm the journal entry first.\n"
+"%s."
+msgstr ""
+
+#. module: account
+#: help:account.config.settings,module_account_budget:0
+msgid ""
+"This allows accountants to manage analytic and crossovered budgets.\n"
+" Once the master budgets and the budgets are defined,\n"
+" the project managers can set the planned amount on each "
+"analytic account.\n"
+" This installs the module account_budget."
+msgstr ""
+
+#. module: account
+#: field:account.bank.statement.line,name:0
+msgid "OBI"
+msgstr ""
+
+#. module: account
+#: help:res.partner,property_account_payable:0
+msgid ""
+"This account will be used instead of the default one as the payable account "
+"for the current partner"
+msgstr ""
+
+#. module: account
+#: field:account.period,special:0
+msgid "Opening/Closing Period"
+msgstr ""
+
+#. module: account
+#: field:account.account,currency_id:0
+#: field:account.account.template,currency_id:0
+#: field:account.bank.accounts.wizard,currency_id:0
+msgid "Secondary Currency"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_validate_account_move
+msgid "Validate Account Move"
+msgstr ""
+
+#. module: account
+#: field:account.account,credit:0
+#: report:account.account.balance:0
+#: report:account.analytic.account.balance:0
+#: report:account.analytic.account.cost_ledger:0
+#: report:account.analytic.account.inverted.balance:0
+#: report:account.central.journal:0
+#: field:account.entries.report,credit:0
+#: report:account.general.journal:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: field:account.model.line,credit:0
+#: field:account.move.line,credit:0
+#: report:account.partner.balance:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: field:account.treasury.report,credit:0
+#: report:account.vat.declaration:0
+#: field:report.account.receivable,credit:0
+msgid "Credit"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Draft Invoice "
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_account_general_journal
+msgid "General Journals"
+msgstr ""
+
+#. module: account
+#: view:account.model:0
+msgid "Journal Entry Model"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:1073
+#, python-format
+msgid "Start period should precede then end period."
+msgstr ""
+
+#. module: account
+#: field:account.invoice,number:0
+#: field:account.move,name:0
+msgid "Number"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.journal:0
+#: selection:account.analytic.journal,type:0
+#: selection:account.bank.statement.line,type:0
+#: selection:account.journal,type:0
+msgid "General"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+#: field:account.invoice.report,price_total:0
+#: field:account.invoice.report,user_currency_price_total:0
+msgid "Total Without Tax"
+msgstr ""
+
+#. module: account
+#: selection:account.aged.trial.balance,filter:0
+#: selection:account.balance.report,filter:0
+#: selection:account.central.journal,filter:0
+#: view:account.chart:0
+#: selection:account.common.account.report,filter:0
+#: selection:account.common.journal.report,filter:0
+#: selection:account.common.partner.report,filter:0
+#: view:account.common.report:0
+#: selection:account.common.report,filter:0
+#: field:account.config.settings,period:0
+#: field:account.fiscalyear,period_ids:0
+#: selection:account.general.journal,filter:0
+#: field:account.installer,period:0
+#: selection:account.partner.balance,filter:0
+#: selection:account.partner.ledger,filter:0
+#: view:account.print.journal:0
+#: selection:account.print.journal,filter:0
+#: selection:account.report.general.ledger,filter:0
+#: report:account.vat.declaration:0
+#: view:account.vat.declaration:0
+#: selection:account.vat.declaration,filter:0
+#: view:accounting.report:0
+#: selection:accounting.report,filter:0
+#: selection:accounting.report,filter_cmp:0
+#: model:ir.actions.act_window,name:account.action_account_period
+#: model:ir.ui.menu,name:account.menu_action_account_period
+#: model:ir.ui.menu,name:account.next_id_23
+msgid "Periods"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.report,currency_rate:0
+msgid "Currency Rate"
+msgstr ""
+
+#. module: account
+#: field:account.account,tax_ids:0
+#: view:account.account.template:0
+#: field:account.account.template,tax_ids:0
+#: view:account.chart.template:0
+msgid "Default Taxes"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "April"
+msgstr ""
+
+#. module: account
+#: model:account.financial.report,name:account.account_financial_report_profitloss_toreport0
+msgid "Profit (Loss) to report"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:379
+#, python-format
+msgid "There is no Sale/Purchase Journal(s) defined."
+msgstr ""
+
+#. module: account
+#: view:account.move.line.reconcile.select:0
+msgid "Open for Reconciliation"
+msgstr ""
+
+#. module: account
+#: field:account.account,parent_left:0
+msgid "Parent Left"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,style_overwrite:0
+msgid "Title 2 (bold)"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_invoice_tree2
+#: model:ir.ui.menu,name:account.menu_action_invoice_tree2
+msgid "Supplier Invoices"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+#: field:account.analytic.line,product_id:0
+#: view:account.entries.report:0
+#: field:account.entries.report,product_id:0
+#: field:account.invoice.line,product_id:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,product_id:0
+#: field:account.move.line,product_id:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,product_id:0
+#: field:report.account.sales,product_id:0
+#: field:report.account_type.sales,product_id:0
+msgid "Product"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_validate_account_move
+msgid ""
+"The validation of journal entries process is also called 'ledger posting' "
+"and is the process of transferring debit and credit amounts from a journal "
+"of original entry to a ledger book."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_period
+msgid "Account period"
+msgstr ""
+
+#. module: account
+#: view:account.subscription:0
+msgid "Remove Lines"
+msgstr ""
+
+#. module: account
+#: selection:account.account,type:0
+#: selection:account.account.template,type:0
+#: selection:account.entries.report,type:0
+msgid "Regular"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: field:account.account,type:0
+#: view:account.account.template:0
+#: field:account.account.template,type:0
+#: field:account.entries.report,type:0
+msgid "Internal Type"
+msgstr ""
+
+#. module: account
+#: field:account.subscription.generate,date:0
+msgid "Generate Entries Before"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_subscription_form_running
+msgid "Running Subscriptions"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.balance:0
+#: view:account.analytic.cost.ledger:0
+#: view:account.analytic.inverted.balance:0
+#: view:account.analytic.journal.report:0
+msgid "Select Period"
+msgstr ""
+
+#. module: account
+#: view:account.entries.report:0
+#: selection:account.entries.report,move_state:0
+#: view:account.move:0
+#: selection:account.move,state:0
+#: view:account.move.line:0
+msgid "Posted"
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: field:account.aged.trial.balance,date_to:0
+#: field:account.balance.report,date_to:0
+#: report:account.central.journal:0
+#: field:account.central.journal,date_to:0
+#: field:account.common.account.report,date_to:0
+#: field:account.common.journal.report,date_to:0
+#: field:account.common.partner.report,date_to:0
+#: field:account.common.report,date_to:0
+#: field:account.fiscalyear,date_stop:0
+#: report:account.general.journal:0
+#: field:account.general.journal,date_to:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: field:account.installer,date_stop:0
+#: report:account.partner.balance:0
+#: field:account.partner.balance,date_to:0
+#: field:account.partner.ledger,date_to:0
+#: field:account.print.journal,date_to:0
+#: field:account.report.general.ledger,date_to:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: field:account.vat.declaration,date_to:0
+#: field:accounting.report,date_to:0
+#: field:accounting.report,date_to_cmp:0
+msgid "End Date"
+msgstr ""
+
+#. module: account
+#: view:account.open.closed.fiscalyear:0
+#: model:ir.actions.act_window,name:account.action_account_open_closed_fiscalyear
+#: model:ir.ui.menu,name:account.menu_wizard_account_open_closed_fiscalyear
+msgid "Cancel Opening Entries"
+msgstr ""
+
+#. module: account
+#: field:account.payment.term.line,days2:0
+msgid "Day of the Month"
+msgstr ""
+
+#. module: account
+#: field:account.fiscal.position.tax,tax_src_id:0
+#: field:account.fiscal.position.tax.template,tax_src_id:0
+msgid "Tax Source"
+msgstr ""
+
+#. module: account
+#: view:ir.sequence:0
+msgid "Fiscal Year Sequences"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,display_detail:0
+msgid "No detail"
+msgstr ""
+
+#. module: account
+#: field:account.account,unrealized_gain_loss:0
+#: model:ir.actions.act_window,name:account.action_account_gain_loss
+#: model:ir.ui.menu,name:account.menu_unrealized_gains_losses
+msgid "Unrealized Gain or Loss"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: view:account.move.line:0
+msgid "States"
+msgstr ""
+
+#. module: account
+#: help:product.category,property_account_income_categ:0
+#: help:product.template,property_account_income:0
+msgid "This account will be used to value outgoing stock using sale price."
+msgstr ""
+
+#. module: account
+#: field:account.invoice,check_total:0
+msgid "Verification Total"
+msgstr ""
+
+#. module: account
+#: report:account.analytic.account.balance:0
+#: report:account.analytic.account.inverted.balance:0
+#: report:account.analytic.account.quantity_cost_ledger:0
+#: view:account.analytic.line:0
+#: field:account.invoice,amount_total:0
+#: field:report.account.sales,amount_total:0
+#: field:report.account_type.sales,amount_total:0
+#: field:report.invoice.created,amount_total:0
+msgid "Total"
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_invoice_refund.py:109
+#, python-format
+msgid "Cannot %s draft/proforma/cancel invoice."
+msgstr ""
+
+#. module: account
+#: field:account.tax,account_analytic_paid_id:0
+msgid "Refund Tax Analytic Account"
+msgstr ""
+
+#. module: account
+#: view:account.move.bank.reconcile:0
+msgid "Open for Bank Reconciliation"
+msgstr ""
+
+#. module: account
+#: field:account.account,company_id:0
+#: report:account.account.balance:0
+#: field:account.aged.trial.balance,company_id:0
+#: field:account.analytic.journal,company_id:0
+#: field:account.balance.report,company_id:0
+#: field:account.bank.statement,company_id:0
+#: field:account.bank.statement.line,company_id:0
+#: field:account.central.journal,company_id:0
+#: field:account.common.account.report,company_id:0
+#: field:account.common.journal.report,company_id:0
+#: field:account.common.partner.report,company_id:0
+#: field:account.common.report,company_id:0
+#: field:account.config.settings,company_id:0
+#: view:account.entries.report:0
+#: field:account.entries.report,company_id:0
+#: field:account.fiscal.position,company_id:0
+#: field:account.fiscalyear,company_id:0
+#: report:account.general.journal:0
+#: field:account.general.journal,company_id:0
+#: report:account.general.ledger_landscape:0
+#: field:account.installer,company_id:0
+#: field:account.invoice,company_id:0
+#: field:account.invoice.line,company_id:0
+#: view:account.invoice.report:0
+#: field:account.invoice.report,company_id:0
+#: field:account.invoice.tax,company_id:0
+#: field:account.journal,company_id:0
+#: field:account.journal.period,company_id:0
+#: report:account.journal.period.print:0
+#: field:account.model,company_id:0
+#: field:account.move,company_id:0
+#: field:account.move.line,company_id:0
+#: field:account.partner.balance,company_id:0
+#: field:account.partner.ledger,company_id:0
+#: field:account.period,company_id:0
+#: field:account.print.journal,company_id:0
+#: field:account.report.general.ledger,company_id:0
+#: field:account.tax,company_id:0
+#: field:account.tax.code,company_id:0
+#: field:account.treasury.report,company_id:0
+#: field:account.vat.declaration,company_id:0
+#: field:accounting.report,company_id:0
+#: view:analytic.entries.report:0
+#: field:analytic.entries.report,company_id:0
+#: field:wizard.multi.charts.accounts,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_action_subscription_form
+msgid "Define Recurring Entries"
+msgstr ""
+
+#. module: account
+#: field:account.entries.report,date_maturity:0
+msgid "Date Maturity"
+msgstr ""
+
+#. module: account
+#: field:account.invoice.refund,description:0
+#: field:cash.box.in,name:0
+#: field:cash.box.out,name:0
+msgid "Reason"
+msgstr ""
+
+#. module: account
+#: selection:account.partner.ledger,filter:0
+#: code:addons/account/report/account_partner_ledger.py:56
+#: model:ir.actions.act_window,name:account.act_account_acount_move_line_open_unreconciled
+#, python-format
+msgid "Unreconciled Entries"
+msgstr ""
+
+#. module: account
+#: help:account.partner.reconcile.process,today_reconciled:0
+msgid ""
+"This figure depicts the total number of partners that have gone throught the "
+"reconciliation process today. The current partner is counted as already "
+"processed."
+msgstr ""
+
+#. module: account
+#: view:account.fiscalyear:0
+msgid "Create Monthly Periods"
+msgstr ""
+
+#. module: account
+#: field:account.tax.code.template,sign:0
+msgid "Sign For Parent"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_balance_report
+msgid "Trial Balance Report"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_bank_statement_draft_tree
+msgid "Draft statements"
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_statemententries0
+msgid ""
+"Manual or automatic creation of payment entries according to the statements"
+msgstr ""
+
+#. module: account
+#: field:account.analytic.balance,empty_acc:0
+msgid "Empty Accounts ? "
+msgstr ""
+
+#. module: account
+#: view:account.unreconcile.reconcile:0
+msgid ""
+"If you unreconcile transactions, you must also verify all the actions that "
+"are linked to those transactions because they will not be disable"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:1056
+#, python-format
+msgid "Unable to change tax!"
+msgstr ""
+
+#. module: account
+#: constraint:account.bank.statement:0
+msgid "The journal and period chosen have to belong to the same company."
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Invoice lines"
+msgstr ""
+
+#. module: account
+#: field:account.chart,period_to:0
+msgid "End period"
+msgstr ""
+
+#. module: account
+#: sql_constraint:account.journal:0
+msgid "The code of the journal must be unique per company !"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_invoice_report_all
+msgid ""
+"From this report, you can have an overview of the amount invoiced to your "
+"customer. The tool search can also be used to personalise your Invoices "
+"reports and so, match this analysis to your needs."
+msgstr ""
+
+#. module: account
+#: view:account.partner.reconcile.process:0
+msgid "Go to Next Partner"
+msgstr ""
+
+#. module: account
+#: view:account.automatic.reconcile:0
+#: view:account.move.line.reconcile.writeoff:0
+msgid "Write-Off Move"
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_paidinvoice0
+msgid "Invoice's state is Done"
+msgstr ""
+
+#. module: account
+#: field:account.config.settings,module_account_followup:0
+msgid "Manage customer payment follow-ups"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_report_account_sales
+msgid "Report of the Sales by Account"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_fiscal_position_account
+msgid "Accounts Fiscal Position"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: view:account.invoice:0
+#: selection:account.invoice,type:0
+#: selection:account.invoice.report,type:0
+#: code:addons/account/account_invoice.py:1158
+#: model:process.process,name:account.process_process_supplierinvoiceprocess0
+#: selection:report.invoice.created,type:0
+#, python-format
+msgid "Supplier Invoice"
+msgstr ""
+
+#. module: account
+#: field:account.account,debit:0
+#: report:account.account.balance:0
+#: report:account.analytic.account.balance:0
+#: report:account.analytic.account.cost_ledger:0
+#: report:account.analytic.account.inverted.balance:0
+#: report:account.central.journal:0
+#: field:account.entries.report,debit:0
+#: report:account.general.journal:0
+#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
+#: field:account.model.line,debit:0
+#: field:account.move.line,debit:0
+#: report:account.partner.balance:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+#: field:account.treasury.report,debit:0
+#: report:account.vat.declaration:0
+#: field:report.account.receivable,debit:0
+msgid "Debit"
+msgstr ""
+
+#. module: account
+#: selection:account.financial.report,style_overwrite:0
+msgid "Title 3 (bold, smaller)"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+#: field:account.invoice,invoice_line:0
+msgid "Invoice Lines"
+msgstr ""
+
+#. module: account
+#: help:account.model.line,quantity:0
+msgid "The optional quantity on entries."
+msgstr ""
+
+#. module: account
+#: field:account.automatic.reconcile,reconciled:0
+msgid "Reconciled transactions"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_report_account_receivable
+msgid "Receivable accounts"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_move_line.py:783
+#, python-format
+msgid "Already reconciled."
+msgstr ""
+
+#. module: account
+#: selection:account.model.line,date_maturity:0
+msgid "Partner Payment Term"
+msgstr ""
+
+#. module: account
+#: field:temp.range,name:0
+msgid "Range"
+msgstr ""
+
+#. module: account
+#: view:account.analytic.line:0
+msgid "Analytic Journal Items related to a purchase journal."
+msgstr ""
+
+#. module: account
+#: help:account.account,type:0
+msgid ""
+"The 'Internal Type' is used for features available on different types of "
+"accounts: view can not have journal items, consolidation are accounts that "
+"can have children accounts for multi-company consolidations, "
+"payable/receivable are for partners accounts (for debit/credit "
+"computations), closed for depreciated accounts."
+msgstr ""
+
+#. module: account
+#: report:account.account.balance:0
+#: selection:account.balance.report,display_account:0
+#: selection:account.common.account.report,display_account:0
+#: report:account.general.ledger_landscape:0
+#: selection:account.report.general.ledger,display_account:0
+msgid "With movements"
+msgstr ""
+
+#. module: account
+#: view:account.tax.code.template:0
+msgid "Account Tax Code Template"
+msgstr ""
+
+#. module: account
+#: model:process.node,name:account.process_node_manually0
+msgid "Manually"
+msgstr ""
+
+#. module: account
+#: help:account.move,balance:0
+msgid ""
+"This is a field only used for internal purpose and shouldn't be displayed"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "December"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.report:0
+msgid "Group by month of Invoice Date"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_analytic_line.py:99
+#, python-format
+msgid "There is no income account defined for this product: \"%s\" (id:%d)."
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_aged_receivable_graph
+#: view:report.aged.receivable:0
+msgid "Aged Receivable"
+msgstr ""
+
+#. module: account
+#: field:account.tax,applicable_type:0
+msgid "Applicability"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,currency_id:0
+msgid "The optional other currency if it is a multi-currency entry."
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_invoiceimport0
+msgid ""
+"Import of the statement in the system from a supplier or customer invoice"
+msgstr ""
+
+#. module: account
+#: model:ir.ui.menu,name:account.menu_finance_periodical_processing_billing
+msgid "Billing"
+msgstr ""
+
+#. module: account
+#: view:account.account:0
+#: view:account.analytic.account:0
+msgid "Parent Account"
+msgstr ""
+
+#. module: account
+#: view:report.account.receivable:0
+msgid "Accounts by Type"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_analytic_chart
+msgid "Account Analytic Chart"
+msgstr ""
+
+#. module: account
+#: help:account.invoice,residual:0
+msgid "Remaining amount due."
+msgstr ""
+
+#. module: account
+#: field:account.print.journal,sort_selection:0
+msgid "Entries Sorted by"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:1546
+#, python-format
+msgid ""
+"The selected unit of measure is not compatible with the unit of measure of "
+"the product."
+msgstr ""
+
+#. module: account
+#: view:account.fiscal.position:0
+#: view:account.fiscal.position.template:0
+msgid "Accounts Mapping"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_tax_code_list
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to define a new tax code.\n"
+" </p><p>\n"
+" Depending on the country, a tax code is usually a cell to "
+"fill\n"
+" in your legal tax statement. OpenERP allows you to define "
+"the\n"
+" tax structure and each tax computation will be registered "
+"in\n"
+" one or several tax code.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "November"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,help:account.action_account_moves_all_a
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Select the period and the journal you want to fill.\n"
+" </p><p>\n"
+" This view can be used by accountants in order to quickly "
+"record\n"
+" entries in OpenERP. If you want to record a supplier "
+"invoice,\n"
+" start by recording the line of the expense account. OpenERP\n"
+" will propose to you automatically the Tax related to this\n"
+" account and the counterpart \"Account Payable\".\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account
+#: help:account.invoice.line,account_id:0
+msgid "The income or expense account related to the selected product."
+msgstr ""
+
+#. module: account
+#: view:account.config.settings:0
+msgid "Install more chart templates"
+msgstr ""
+
+#. module: account
+#: report:account.general.journal:0
+#: model:ir.actions.report.xml,name:account.account_general_journal
+msgid "General Journal"
+msgstr ""
+
+#. module: account
+#: view:account.invoice:0
+msgid "Search Invoice"
+msgstr ""
+
+#. module: account
+#: report:account.invoice:0
+#: view:account.invoice:0
+#: view:account.invoice.report:0
+#: code:addons/account/account_invoice.py:1159
+#, python-format
+msgid "Refund"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_res_partner_bank
+msgid "Bank Accounts"
+msgstr ""
+
+#. module: account
+#: field:res.partner,credit:0
+msgid "Total Receivable"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "General Information"
+msgstr ""
+
+#. module: account
+#: view:account.move:0
+#: view:account.move.line:0
+msgid "Accounting Documents"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account.py:641
+#, python-format
+msgid ""
+"You cannot remove/deactivate an account which is set on a customer or "
+"supplier."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_validate_account_move_lines
+msgid "Validate Account Move Lines"
+msgstr ""
+
+#. module: account
+#: help:res.partner,property_account_position:0
+msgid ""
+"The fiscal position will determine taxes and accounts used for the partner."
+msgstr ""
+
+#. module: account
+#: model:process.node,note:account.process_node_supplierpaidinvoice0
+msgid "Invoice's state is Done."
+msgstr ""
+
+#. module: account
+#: model:process.transition,note:account.process_transition_reconcilepaid0
+msgid "As soon as the reconciliation is done, the invoice can be paid."
+msgstr ""
+
+#. module: account
+#: code:addons/account/wizard/account_change_currency.py:59
+#, python-format
+msgid "New currency is not configured properly."
+msgstr ""
+
+#. module: account
+#: view:account.account.template:0
+msgid "Search Account Templates"
+msgstr ""
+
+#. module: account
+#: view:account.invoice.tax:0
+msgid "Manual Invoice Taxes"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_invoice.py:573
+#, python-format
+msgid "The payment term of supplier does not have a payment term line."
+msgstr ""
+
+#. module: account
+#: field:account.account,parent_right:0
+msgid "Parent Right"
+msgstr ""
+
+#. module: account
+#. openerp-web
+#: code:addons/account/static/src/js/account_move_reconciliation.js:74
+#: code:addons/account/static/src/js/account_move_reconciliation.js:80
+#, python-format
+msgid "Never"
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_addtmpl_wizard
+msgid "account.addtmpl.wizard"
+msgstr ""
+
+#. module: account
+#: field:account.aged.trial.balance,result_selection:0
+#: field:account.common.partner.report,result_selection:0
+#: report:account.partner.balance:0
+#: field:account.partner.balance,result_selection:0
+#: field:account.partner.ledger,result_selection:0
+#: report:account.third_party_ledger:0
+#: report:account.third_party_ledger_other:0
+msgid "Partner's"
+msgstr ""
+
+#. module: account
+#: field:account.account,note:0
+msgid "Internal Notes"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_fiscalyear
+#: view:ir.sequence:0
+#: model:ir.ui.menu,name:account.menu_action_account_fiscalyear
+msgid "Fiscal Years"
+msgstr ""
+
+#. module: account
+#: help:account.analytic.journal,active:0
+msgid ""
+"If the active field is set to False, it will allow you to hide the analytic "
+"journal without removing it."
+msgstr ""
+
+#. module: account
+#: field:account.analytic.line,ref:0
+msgid "Ref."
+msgstr ""
+
+#. module: account
+#: field:account.use.model,model:0
+#: model:ir.model,name:account.model_account_model
+msgid "Account Model"
+msgstr ""
+
+#. module: account
+#: code:addons/account/account_cash_statement.py:292
+#, python-format
+msgid "Loss"
+msgstr ""
+
+#. module: account
+#: selection:account.entries.report,month:0
+#: selection:account.invoice.report,month:0
+#: selection:analytic.entries.report,month:0
+#: selection:report.account.sales,month:0
+#: selection:report.account_type.sales,month:0
+msgid "February"
+msgstr ""
+
+#. module: account
+#: view:account.bank.statement:0
+#: help:account.cashbox.line,number_closing:0
+msgid "Closing Unit Numbers"
+msgstr ""
+
+#. module: account
+#: field:account.bank.accounts.wizard,bank_account_id:0
+#: view:account.chart.template:0
+#: field:account.chart.template,bank_account_view_id:0
+#: field:account.invoice,partner_bank_id:0
+#: field:account.invoice.report,partner_bank_id:0
+msgid "Bank Account"
+msgstr ""
+
+#. module: account
+#: model:ir.actions.act_window,name:account.action_account_central_journal
+#: model:ir.model,name:account.model_account_central_journal
+msgid "Account Central Journal"
+msgstr ""
+
+#. module: account
+#: report:account.overdue:0
+msgid "Maturity"
+msgstr ""
+
+#. module: account
+#: selection:account.aged.trial.balance,direction_selection:0
+msgid "Future"
+msgstr ""
+
+#. module: account
+#: view:account.move.line:0
+msgid "Search Journal Items"
+msgstr ""
+
+#. module: account
+#: help:account.tax,base_sign:0
+#: help:account.tax,ref_base_sign:0
+#: help:account.tax,ref_tax_sign:0
+#: help:account.tax,tax_sign:0
+#: help:account.tax.template,base_sign:0
+#: help:account.tax.template,ref_base_sign:0
+#: help:account.tax.template,ref_tax_sign:0
+#: help:account.tax.template,tax_sign:0
+msgid "Usually 1 or -1."
+msgstr ""
+
+#. module: account
+#: model:ir.model,name:account.model_account_fiscal_position_account_template
+msgid "Template Account Fiscal Mapping"
+msgstr ""
+
+#. module: account
+#: field:account.chart.template,property_account_expense:0
+msgid "Expense Account on Product Template"
+msgstr ""
+
+#. module: account
+#: field:res.partner,property_payment_term:0
+msgid "Customer Payment Term"
+msgstr ""
+
+#. module: account
+#: help:accounting.report,label_filter:0
+msgid ""
+"This label will be displayed on report to show the balance computed for the "
+"given comparison filter."
+msgstr ""
+
+#. module: account
+#: selection:account.config.settings,tax_calculation_rounding_method:0
+msgid "Round per line"
+msgstr ""
+
+#. module: account
+#: help:account.move.line,amount_residual_currency:0
+msgid ""
+"The residual amount on a receivable or payable of a journal entry expressed "
+"in its currency (maybe different of the company currency)."
+msgstr ""
diff --git a/addons/account/static/src/js/account_move_line_quickadd.js b/addons/account/static/src/js/account_move_line_quickadd.js
index 997b2b03bb6..0bbdb959d17 100644
--- a/addons/account/static/src/js/account_move_line_quickadd.js
+++ b/addons/account/static/src/js/account_move_line_quickadd.js
@@ -22,6 +22,7 @@ openerp.account.quickadd = function (instance) {
start:function(){
var tmp = this._super.apply(this, arguments);
var self = this;
+ var defs = [];
this.$el.parent().prepend(QWeb.render("AccountMoveLineQuickAdd", {widget: this}));
this.$el.parent().find('.oe_account_select_journal').change(function() {
@@ -41,11 +42,17 @@ openerp.account.quickadd = function (instance) {
self.$el.parent().find('.oe_account_select_period').removeAttr('disabled');
});
var mod = new instance.web.Model("account.move.line", self.dataset.context, self.dataset.domain);
- mod.call("default_get", [['journal_id','period_id'],self.dataset.context]).then(function(result) {
+ defs.push(mod.call("default_get", [['journal_id','period_id'],self.dataset.context]).then(function(result) {
self.current_period = result['period_id'];
self.current_journal = result['journal_id'];
- });
- return tmp;
+ }));
+ defs.push(mod.call("list_journals", []).then(function(result) {
+ self.journals = result;
+ }));
+ defs.push(mod.call("list_periods", []).then(function(result) {
+ self.periods = result;
+ }));
+ return $.when(tmp, defs);
},
do_search: function(domain, context, group_by) {
var self = this;
@@ -53,34 +60,27 @@ openerp.account.quickadd = function (instance) {
this.last_context = context;
this.last_group_by = group_by;
this.old_search = _.bind(this._super, this);
- var mod = new instance.web.Model("account.move.line", context, domain);
- return $.when(mod.call("list_journals", []).then(function(result) {
- self.journals = result;
- }),mod.call("list_periods", []).then(function(result) {
- self.periods = result;
- })).then(function () {
- var o;
- self.$el.parent().find('.oe_account_select_journal').children().remove().end();
- self.$el.parent().find('.oe_account_select_journal').append(new Option('', ''));
- for (var i = 0;i < self.journals.length;i++){
- o = new Option(self.journals[i][1], self.journals[i][0]);
- if (self.journals[i][0] === self.current_journal){
- self.current_journal_type = self.journals[i][2];
- self.current_journal_currency = self.journals[i][3];
- self.current_journal_analytic = self.journals[i][4];
- $(o).attr('selected',true);
- }
- self.$el.parent().find('.oe_account_select_journal').append(o);
+ var o;
+ self.$el.parent().find('.oe_account_select_journal').children().remove().end();
+ self.$el.parent().find('.oe_account_select_journal').append(new Option('', ''));
+ for (var i = 0;i < self.journals.length;i++){
+ o = new Option(self.journals[i][1], self.journals[i][0]);
+ if (self.journals[i][0] === self.current_journal){
+ self.current_journal_type = self.journals[i][2];
+ self.current_journal_currency = self.journals[i][3];
+ self.current_journal_analytic = self.journals[i][4];
+ $(o).attr('selected',true);
}
- self.$el.parent().find('.oe_account_select_period').children().remove().end();
- self.$el.parent().find('.oe_account_select_period').append(new Option('', ''));
- for (var i = 0;i < self.periods.length;i++){
- o = new Option(self.periods[i][1], self.periods[i][0]);
- self.$el.parent().find('.oe_account_select_period').append(o);
- }
- self.$el.parent().find('.oe_account_select_period').val(self.current_period).attr('selected',true);
- return self.search_by_journal_period();
- });
+ self.$el.parent().find('.oe_account_select_journal').append(o);
+ }
+ self.$el.parent().find('.oe_account_select_period').children().remove().end();
+ self.$el.parent().find('.oe_account_select_period').append(new Option('', ''));
+ for (var i = 0;i < self.periods.length;i++){
+ o = new Option(self.periods[i][1], self.periods[i][0]);
+ self.$el.parent().find('.oe_account_select_period').append(o);
+ }
+ self.$el.parent().find('.oe_account_select_period').val(self.current_period).attr('selected',true);
+ return self.search_by_journal_period();
},
search_by_journal_period: function() {
var self = this;
@@ -93,7 +93,9 @@ openerp.account.quickadd = function (instance) {
self.last_context["journal_type"] = self.current_journal_type;
self.last_context["currency"] = self.current_journal_currency;
self.last_context["analytic_journal_id"] = self.current_journal_analytic;
- return self.old_search(new instance.web.CompoundDomain(self.last_domain, domain), self.last_context, self.last_group_by);
+ var compound_domain = new instance.web.CompoundDomain(self.last_domain, domain);
+ self.dataset.domain = compound_domain.eval();
+ return self.old_search(compound_domain, self.last_context, self.last_group_by);
},
});
};
diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py
index faf4e29c93c..ec5e2c56e6c 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis.py
+++ b/addons/account_analytic_analysis/account_analytic_analysis.py
@@ -664,13 +664,20 @@ class account_analytic_account(osv.osv):
partner_payment_term = contract.partner_id.property_payment_term and contract.partner_id.property_payment_term.id or False
+ currency_id = False
+ if contract.pricelist_id:
+ currency_id = contract.pricelist_id.currency_id.id
+ elif contract.partner_id.property_product_pricelist:
+ currency_id = contract.partner_id.property_product_pricelist.currency_id.id
+ elif contract.company_id:
+ currency_id = contract.company_id.currency_id.id
inv_data = {
'reference': contract.code or False,
'account_id': contract.partner_id.property_account_receivable.id,
'type': 'out_invoice',
'partner_id': contract.partner_id.id,
- 'currency_id': contract.partner_id.property_product_pricelist.id or False,
+ 'currency_id': currency_id,
'journal_id': len(journal_ids) and journal_ids[0] or False,
'date_invoice': contract.recurring_next_date,
'origin': contract.name,
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index c9516b6135f..5d0ed8297c2 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -911,9 +911,10 @@ class account_voucher(osv.osv):
if context.get('payment_expected_currency') and currency_id != context.get('payment_expected_currency'):
vals['value']['amount'] = 0
amount = 0
- res = self.onchange_partner_id(cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context)
- for key in res.keys():
- vals[key].update(res[key])
+ if partner_id:
+ res = self.onchange_partner_id(cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context)
+ for key in res.keys():
+ vals[key].update(res[key])
return vals
def button_proforma_voucher(self, cr, uid, ids, context=None):
@@ -965,7 +966,7 @@ class account_voucher(osv.osv):
res = {}
if not partner_id:
return res
- res = {'account_id':False}
+ res = {}
partner_pool = self.pool.get('res.partner')
journal_pool = self.pool.get('account.journal')
if pay_now == 'pay_later':
@@ -977,7 +978,8 @@ class account_voucher(osv.osv):
account_id = partner.property_account_payable.id
else:
account_id = journal.default_credit_account_id.id or journal.default_debit_account_id.id
- res['account_id'] = account_id
+ if account_id:
+ res['account_id'] = account_id
return {'value':res}
def _sel_context(self, cr, uid, voucher_id, context=None):
@@ -1366,6 +1368,7 @@ class account_voucher(osv.osv):
move_pool = self.pool.get('account.move')
move_line_pool = self.pool.get('account.move.line')
for voucher in self.browse(cr, uid, ids, context=context):
+ local_context = dict(context, force_company=voucher.journal_id.company_id.id)
if voucher.move_id:
continue
company_currency = self._get_company_currency(cr, uid, voucher.id, context)
@@ -1380,7 +1383,7 @@ class account_voucher(osv.osv):
# Get the name of the account_move just created
name = move_pool.browse(cr, uid, move_id, context=context).name
# Create the first line of the voucher
- move_line_id = move_line_pool.create(cr, uid, self.first_move_line_get(cr,uid,voucher.id, move_id, company_currency, current_currency, context), context)
+ move_line_id = move_line_pool.create(cr, uid, self.first_move_line_get(cr,uid,voucher.id, move_id, company_currency, current_currency, local_context), local_context)
move_line_brw = move_line_pool.browse(cr, uid, move_line_id, context=context)
line_total = move_line_brw.debit - move_line_brw.credit
rec_list_ids = []
@@ -1392,9 +1395,9 @@ class account_voucher(osv.osv):
line_total, rec_list_ids = self.voucher_move_line_create(cr, uid, voucher.id, line_total, move_id, company_currency, current_currency, context)
# Create the writeoff line if needed
- ml_writeoff = self.writeoff_move_line_get(cr, uid, voucher.id, line_total, move_id, name, company_currency, current_currency, context)
+ ml_writeoff = self.writeoff_move_line_get(cr, uid, voucher.id, line_total, move_id, name, company_currency, current_currency, local_context)
if ml_writeoff:
- move_line_pool.create(cr, uid, ml_writeoff, context)
+ move_line_pool.create(cr, uid, ml_writeoff, local_context)
# We post the voucher.
self.write(cr, uid, [voucher.id], {
'move_id': move_id,
@@ -1605,7 +1608,11 @@ class account_bank_statement(osv.osv):
bank_st_line_obj = self.pool.get('account.bank.statement.line')
st_line = bank_st_line_obj.browse(cr, uid, st_line_id, context=context)
if st_line.voucher_id:
- voucher_obj.write(cr, uid, [st_line.voucher_id.id], {'number': next_number}, context=context)
+ voucher_obj.write(cr, uid, [st_line.voucher_id.id],
+ {'number': next_number,
+ 'date': st_line.date,
+ 'period_id': st_line.statement_id.period_id.id},
+ context=context)
if st_line.voucher_id.state == 'cancel':
voucher_obj.action_cancel_draft(cr, uid, [st_line.voucher_id.id], context=context)
voucher_obj.signal_proforma_voucher(cr, uid, [st_line.voucher_id.id])
diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml
index e35061e1836..97f96f75901 100644
--- a/addons/account_voucher/voucher_sales_purchase_view.xml
+++ b/addons/account_voucher/voucher_sales_purchase_view.xml
@@ -73,8 +73,14 @@
<group>
<group>
<field name="type" invisible="True"/>
- <field name="partner_id" domain="[('customer','=',True)]" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" string="Customer" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}'/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
+ <field name="partner_id" domain="[('customer','=',True)]" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" string="Customer" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}'/>
+ <field name="account_id"
+ domain="[('type','in', ['liquidity', 'receivable'])]"/>
+ <field name="pay_now" on_change="onchange_payment(pay_now, journal_id, partner_id)" required="1"/>
+ <field name="date_due" attrs="{'invisible':[('pay_now','=','pay_now')]}"/>
+ <field name="reference"
+ attrs="{'invisible':[('pay_now','!=','pay_now')]}"/>
</group>
<group>
<field name="journal_id" domain="[('type','in',['sale','sale_refund'])]" widget="selection" on_change="onchange_journal(journal_id, line_cr_ids, tax_id, partner_id, date, amount, type, company_id, context)" groups="account.group_account_user"/>
@@ -112,15 +118,6 @@
</div>
<field name="amount" class="oe_subtotal_footer_separator" nolabel="1"/>
</group>
- <group>
- <field name="pay_now" on_change="onchange_payment(pay_now, journal_id, partner_id)" required="1"/>
- <field name="date_due" attrs="{'invisible':[('pay_now','=','pay_now')]}"/>
- <field name="account_id"
- attrs="{'invisible':[('pay_now','!=','pay_now')]}"
- domain="[('type','=','liquidity')]"/>
- <field name="reference"
- attrs="{'invisible':[('pay_now','!=','pay_now')]}"/>
- </group>
</group>
</page>
<page string="Journal Items" attrs="{'invisible': [('state','!=','posted')]}">
@@ -224,11 +221,11 @@
<h1><label for="number" string="Purchase Receipt"/> <field name="number" class="oe_inline" readonly="1"/></h1>
<field name="pay_now" invisible="1"/>
- <field name="account_id" domain="[('type','=','other')]" invisible="True"/>
<field name="type" invisible="True"/>
<group>
<group>
<field name="partner_id" domain="[('supplier','=',True)]" string="Supplier" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" context="{'default_customer': 0, 'search_default_supplier': 1, 'default_supplier': 1}" />
+ <field name="account_id" domain="[('type', 'in', ['liquidity', 'payable'])]"/>
<field name="name" colspan="2"/>
<field name="reference"/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
diff --git a/addons/account_voucher/wizard/account_statement_from_invoice.py b/addons/account_voucher/wizard/account_statement_from_invoice.py
index de5121a819b..059989801d1 100644
--- a/addons/account_voucher/wizard/account_statement_from_invoice.py
+++ b/addons/account_voucher/wizard/account_statement_from_invoice.py
@@ -94,7 +94,7 @@ class account_statement_from_invoice_lines(osv.osv_memory):
'account_id': result['value'].get('account_id', statement.journal_id.default_credit_account_id.id),
'company_id': statement.company_id.id,
'currency_id': statement.currency.id,
- 'date': line.date,
+ 'date': statement.date,
'amount': sign*amount,
'payment_rate': result['value']['payment_rate'],
'payment_rate_currency_id': result['value']['payment_rate_currency_id'],
@@ -119,7 +119,7 @@ class account_statement_from_invoice_lines(osv.osv_memory):
'statement_id': statement_id,
'ref': line.ref,
'voucher_id': voucher_id,
- 'date': time.strftime('%Y-%m-%d'),
+ 'date': statement.date,
}, context=context)
return {'type': 'ir.actions.act_window_close'}
diff --git a/addons/analytic_contract_hr_expense/i18n/ja.po b/addons/analytic_contract_hr_expense/i18n/ja.po
new file mode 100644
index 00000000000..3be80b97079
--- /dev/null
+++ b/addons/analytic_contract_hr_expense/i18n/ja.po
@@ -0,0 +1,72 @@
+# Japanese translation for openobject-addons
+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2014-02-21 02:29+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Japanese <ja@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-02-22 06:39+0000\n"
+"X-Generator: Launchpad (build 16926)\n"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "or view"
+msgstr "または参照"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "Nothing to invoice, create"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "expenses"
+msgstr "経費"
+
+#. module: analytic_contract_hr_expense
+#: model:ir.model,name:analytic_contract_hr_expense.model_account_analytic_account
+msgid "Analytic Account"
+msgstr "分析勘定"
+
+#. module: analytic_contract_hr_expense
+#: code:addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py:144
+#, python-format
+msgid "Expenses to Invoice of %s"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: code:addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py:136
+#, python-format
+msgid "Expenses of %s"
+msgstr "%sの経費"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,expense_invoiced:0
+#: field:account.analytic.account,expense_to_invoice:0
+#: field:account.analytic.account,remaining_expense:0
+msgid "unknown"
+msgstr "不明"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,est_expenses:0
+msgid "Estimation of Expenses to Invoice"
+msgstr "請求対象経費見込"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,charge_expenses:0
+msgid "Charge Expenses"
+msgstr "経費請求"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "⇒ Invoice"
+msgstr "⇒ 請求"
diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py
index 159baf3a9e7..ca4a15bca6e 100644
--- a/addons/audittrail/audittrail.py
+++ b/addons/audittrail/audittrail.py
@@ -268,10 +268,14 @@ def log_fct(cr, uid_orig, model, method, fct_src, *args, **kw):
new_values = get_data(cr, uid_orig, pool, res_ids, model, method)
elif method == 'read':
res = fct_src(cr, uid_orig, model.model, method, *args, **kw)
+ if isinstance(res, dict):
+ records = [res]
+ else:
+ records = res
# build the res_ids and the old_values dict. Here we don't use get_data() to
# avoid performing an additional read()
res_ids = []
- for record in res:
+ for record in records:
res_ids.append(record['id'])
old_values[(model.id, record['id'])] = {'value': record, 'text': record}
# log only the fields read
@@ -279,7 +283,9 @@ def log_fct(cr, uid_orig, model, method, fct_src, *args, **kw):
elif method == 'unlink':
res_ids = args[0]
old_values = get_data(cr, uid_orig, pool, res_ids, model, method)
- res = fct_src(cr, uid_orig, model.model, method, *args, **kw)
+ # process_data first as fct_src will unlink the record
+ self.process_data(cr, uid_orig, pool, res_ids, model, method, old_values, new_values, field_list)
+ return fct_src(cr, uid_orig, model.model, method, *args, **kw)
else: # method is write, action or workflow action
res_ids = []
if args:
@@ -322,7 +328,7 @@ def get_data(cr, uid, pool, res_ids, model, method):
data = {}
resource_pool = pool[model.model]
# read all the fields of the given resources in super admin mode
- for resource in resource_pool.read(cr, SUPERUSER_ID, res_ids):
+ for resource in resource_pool.read(cr, SUPERUSER_ID, res_ids, resource_pool._all_columns):
values = {}
values_text = {}
resource_id = resource['id']
@@ -456,7 +462,9 @@ def process_data(cr, uid, pool, res_ids, model, method, old_values=None, new_val
# if at least one modification has been found
for model_id, resource_id in lines:
- name = pool[model.model].name_get(cr, uid, [resource_id])[0][1]
+ line_model = pool.get('ir.model').browse(cr, SUPERUSER_ID, model_id).model
+ name = pool.get(line_model).name_get(cr, uid, [resource_id])[0][1]
+
vals = {
'method': method,
'object_id': model_id,
diff --git a/addons/auth_oauth/controllers/main.py b/addons/auth_oauth/controllers/main.py
index 252afc36b30..5a22240abac 100644
--- a/addons/auth_oauth/controllers/main.py
+++ b/addons/auth_oauth/controllers/main.py
@@ -25,7 +25,7 @@ def fragment_to_query_string(func):
return """<html><head><script>
var l = window.location;
var q = l.hash.substring(1);
- var r = '/' + l.search;
+ var r = l.pathname + l.search;
if(q.length !== 0) {
var s = l.search ? (l.search === '?' ? '' : '&') : '?';
r = l.pathname + l.search + s + q;
diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py
index 499fe03f2ea..f6c466b7123 100644
--- a/addons/auth_signup/controllers/main.py
+++ b/addons/auth_signup/controllers/main.py
@@ -36,7 +36,10 @@ class AuthSignup(openerp.addons.web.controllers.main.Home):
def web_login(self, *args, **kw):
mode = request.params.get('mode')
qcontext = request.params.copy()
- super_response = super(AuthSignup, self).web_login(*args, **kw)
+ super_response = None
+ if request.httprequest.method != 'POST' or mode not in ('reset', 'signup'):
+ # Default behavior is to try to login, which in reset or signup mode in a non-sense.
+ super_response = super(AuthSignup, self).web_login(*args, **kw)
response = webmain.render_bootstrap_template('auth_signup.signup', qcontext)
if super_response.is_qweb:
response.qcontext.update(super_response.qcontext)
@@ -62,7 +65,7 @@ class AuthSignup(openerp.addons.web.controllers.main.Home):
}
qcontext.update(config)
- if 'error' in qcontext or mode not in ('reset', 'signup') or (not token and not config[mode]):
+ if 'error' in request.params or mode not in ('reset', 'signup') or (not token and not config[mode]):
if super_response.is_qweb:
super_response.qcontext.update(config)
return super_response
@@ -78,22 +81,28 @@ class AuthSignup(openerp.addons.web.controllers.main.Home):
res_users.reset_password(request.cr, openerp.SUPERUSER_ID, login)
qcontext['message'] = _("An email has been sent with credentials to reset your password")
response.params['template'] = 'web.login'
- except Exception:
- qcontext['error'] = _("Could not reset your password")
+ except Exception, e:
+ qcontext['error'] = exception_to_unicode(e) or _("Could not reset your password")
_logger.exception('error when resetting password')
else:
values = dict((key, qcontext.get(key)) for key in ('login', 'name', 'password'))
try:
self._signup_with_values(token, values)
- request.cr.commit()
+ redirect = request.params.get('redirect')
+ if not redirect:
+ redirect = '/web?' + request.httprequest.query_string
+ return http.redirect_with_hash(redirect)
except SignupError, e:
qcontext['error'] = exception_to_unicode(e)
- return super(AuthSignup, self).web_login(*args, **kw)
return response
def _signup_with_values(self, token, values):
- request.registry['res.users'].signup(request.cr, openerp.SUPERUSER_ID, values, token)
+ db, login, password = request.registry['res.users'].signup(request.cr, openerp.SUPERUSER_ID, values, token)
+ request.cr.commit() # as authenticate will use its own cursor we need to commit the current transaction
+ uid = request.session.authenticate(db, login, password)
+ if not uid:
+ raise SignupError(_('Authentification Failed.'))
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py
index 3af52017e05..e91af657cc2 100644
--- a/addons/auth_signup/res_users.py
+++ b/addons/auth_signup/res_users.py
@@ -25,7 +25,7 @@ from urlparse import urljoin
from openerp.addons.base.ir.ir_mail_server import MailDeliveryException
from openerp.osv import osv, fields
-from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
+from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT, ustr
from ast import literal_eval
from openerp.tools.translate import _
@@ -236,7 +236,12 @@ class res_users(osv.Model):
# create a copy of the template user (attached to a specific partner_id if given)
values['active'] = True
context = dict(context or {}, no_reset_password=True)
- return self.copy(cr, uid, template_user_id, values, context=context)
+ try:
+ with cr.savepoint():
+ return self.copy(cr, uid, template_user_id, values, context=context)
+ except Exception, e:
+ # copy may failed if asked login is not available.
+ raise SignupError(ustr(e))
def reset_password(self, cr, uid, login, context=None):
""" retrieve the user corresponding to login (login or email),
diff --git a/addons/auth_signup/views/auth_signup_login.xml b/addons/auth_signup/views/auth_signup_login.xml
index a279528e9ca..a9e43c86f4f 100644
--- a/addons/auth_signup/views/auth_signup_login.xml
+++ b/addons/auth_signup/views/auth_signup_login.xml
@@ -40,7 +40,7 @@
<div class="form-group field-login">
<label for="login" class="control-label">Your Email</label>
- <input type="text" name="login" t-att-value="login" id="login" class="form-control"
+ <input type="email" name="login" t-att-value="login" id="login" class="form-control"
t-att-autofocus="'autofocus' if reset_without_token else None"
required="required" t-att-disabled="'disabled' if mode == 'reset' and token else None"/>
<input type="hidden" name="login" t-att-value="login" t-if="mode == 'reset' and token"/>
diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py
index 58728a77aef..e48533ebeb4 100644
--- a/addons/base_action_rule/base_action_rule.py
+++ b/addons/base_action_rule/base_action_rule.py
@@ -275,6 +275,13 @@ class base_action_rule(osv.osv):
if action.filter_id:
domain = eval(action.filter_id.domain)
ctx.update(eval(action.filter_id.context))
+ if 'lang' not in ctx:
+ # Filters might be language-sensitive, attempt to reuse creator lang
+ # as we are usually running this as super-user in background
+ [filter_meta] = action.filter_id.perm_read()
+ user_id = filter_meta['write_uid'] and filter_meta['write_uid'][0] or \
+ filter_meta['create_uid'][0]
+ ctx['lang'] = self.pool['res.users'].browse(cr, uid, user_id).lang
record_ids = model.search(cr, uid, domain, context=ctx)
# determine when action should occur for the records
diff --git a/addons/base_setup/res_config.py b/addons/base_setup/res_config.py
index 763d0784603..955591e8824 100644
--- a/addons/base_setup/res_config.py
+++ b/addons/base_setup/res_config.py
@@ -41,7 +41,9 @@ class base_config_settings(osv.osv_memory):
help="""This installs the module google_docs."""),
'module_google_calendar': fields.boolean('Allow the users to synchronize their calendar with Google Calendar',
help="""This installs the module google_calendar."""),
- 'font': fields.many2one('res.font', string="Report Font", help="Set the font into the report header, it will be used as default font in the RML reports of the user company"),
+ 'font': fields.many2one('res.font', string="Report Font", domain=[('mode', 'in', ('Normal', 'Regular', 'all', 'Book'))],
+ help="Set the font into the report header, it will be used as default font in the RML reports of the user company"),
+
}
_defaults= {
diff --git a/addons/base_setup/res_config_view.xml b/addons/base_setup/res_config_view.xml
index 73fc9f83830..66fdcf91633 100644
--- a/addons/base_setup/res_config_view.xml
+++ b/addons/base_setup/res_config_view.xml
@@ -99,7 +99,7 @@
<label for="font" />
<div>
<div>
- <field name="font" class="oe_inline" domain="[('mode', 'in', ('normal', 'regular', 'all', 'book'))]" />
+ <field name="font" class="oe_inline" />
<button string="(reload fonts)" name="act_discover_fonts" type="object" class="oe_link"/>
</div>
</div>
diff --git a/addons/base_vat/base_vat.py b/addons/base_vat/base_vat.py
index 52db18b7307..e9ecf70b39b 100644
--- a/addons/base_vat/base_vat.py
+++ b/addons/base_vat/base_vat.py
@@ -54,7 +54,7 @@ _ref_vat = {
'gr': 'GR12345670',
'hu': 'HU12345676',
'hr': 'HR01234567896', # Croatia, contributed by Milan Tribuson
- 'ie': 'IE1234567T',
+ 'ie': 'IE1234567FA',
'it': 'IT12345670017',
'lt': 'LT123456715',
'lu': 'LU12345613',
@@ -190,6 +190,34 @@ class res_partner(osv.osv):
return check == int(num[8])
return False
+ def _ie_check_char(self, vat):
+ vat = vat.zfill(8)
+ extra = 0
+ if vat[7] not in ' W':
+ if vat[7].isalpha():
+ extra = 9 * (ord(vat[7]) - 64)
+ else:
+ # invalid
+ return -1
+ checksum = extra + sum((8-i) * int(x) for i, x in enumerate(vat[:7]))
+ return 'WABCDEFGHIJKLMNOPQRSTUV'[checksum % 23]
+
+ def check_vat_ie(self, vat):
+ """ Temporary Ireland VAT validation to support the new format
+ introduced in January 2013 in Ireland, until upstream is fixed.
+ TODO: remove when fixed upstream"""
+ if len(vat) not in (8, 9) or not vat[2:7].isdigit():
+ return False
+ if len(vat) == 8:
+ # Normalize pre-2013 numbers: final space or 'W' not significant
+ vat += ' '
+ if vat[:7].isdigit():
+ return vat[7] == self._ie_check_char(vat[:7] + vat[8])
+ elif vat[1] in (string.ascii_uppercase + '+*'):
+ # Deprecated format
+ # See http://www.revenue.ie/en/online/third-party-reporting/reporting-payment-details/faqs.html#section3
+ return vat[7] == self._ie_check_char(vat[2:7] + vat[0] + vat[8])
+ return False
# Mexican VAT verification, contributed by <moylop260@hotmail.com>
# and Panos Christeas <p_christ@hol.gr>
diff --git a/addons/calendar/calendar.py b/addons/calendar/calendar.py
index a8efc343420..ca4d00eb85e 100644
--- a/addons/calendar/calendar.py
+++ b/addons/calendar/calendar.py
@@ -19,13 +19,13 @@
#
##############################################################################
-import hashlib
import pytz
import re
import time
import openerp
import openerp.service.report
import uuid
+from werkzeug.exceptions import BadRequest
from datetime import datetime, timedelta
from dateutil import parser
from dateutil import rrule
@@ -34,10 +34,11 @@ from openerp import tools, SUPERUSER_ID
from openerp.osv import fields, osv
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
from openerp.tools.translate import _
-from openerp import http
from openerp.http import request
from operator import itemgetter
+from werkzeug.exceptions import BadRequest
+
import logging
_logger = logging.getLogger(__name__)
@@ -776,7 +777,7 @@ class calendar_event(osv.Model):
else:
result[event] = ""
return result
-
+
def _rrule_write(self, cr, uid, ids, field_name, field_value, args, context=None):
if not isinstance(ids, list):
ids = [ids]
@@ -789,7 +790,7 @@ class calendar_event(osv.Model):
data.update(update_data)
self.write(cr, uid, ids, data, context=context)
return True
-
+
def _tz_get(self, cr, uid, context=None):
return [(x.lower(), x) for x in pytz.all_timezones]
@@ -802,7 +803,7 @@ class calendar_event(osv.Model):
},
}
_columns = {
- 'id': fields.integer('ID', readonly=True),
+ 'id': fields.integer('ID', readonly=True),
'state': fields.selection([('draft', 'Unconfirmed'), ('open', 'Confirmed')], string='Status', readonly=True, track_visibility='onchange'),
'name': fields.char('Meeting Subject', required=True, states={'done': [('readonly', True)]}),
'is_attendee': fields.function(_compute, string='Attendee', type="boolean", multi='attendee'),
@@ -844,6 +845,7 @@ class calendar_event(osv.Model):
'attendee_ids': fields.one2many('calendar.attendee', 'event_id', 'Attendees', ondelete='cascade'),
'partner_ids': fields.many2many('res.partner', string='Attendees', states={'done': [('readonly', True)]}),
'alarm_ids': fields.many2many('calendar.alarm', string='Reminders', ondelete="restrict"),
+
}
_defaults = {
'end_type': 'count',
@@ -870,11 +872,9 @@ class calendar_event(osv.Model):
]
def onchange_dates(self, cr, uid, ids, start_date, duration=False, end_date=False, allday=False, context=None):
+
"""Returns duration and/or end date based on values passed
@param ids: List of calendar event's IDs.
- @param start_date: Starting date
- @param duration: Duration between start date and end date
- @param end_date: Ending Datee
"""
if context is None:
context = {}
@@ -888,14 +888,14 @@ class calendar_event(osv.Model):
value['duration'] = duration
if allday: # For all day event
- start = datetime.strptime(start_date.split(' ')[0].split('T')[0], "%Y-%m-%d")
- duration = 24.0
- value['duration'] = duration
+ start = datetime.strptime(start_date, "%Y-%m-%d %H:%M:%S")
user = self.pool['res.users'].browse(cr, uid, uid)
tz = pytz.timezone(user.tz) if user.tz else pytz.utc
start = pytz.utc.localize(start).astimezone(tz) # convert start in user's timezone
start = start.astimezone(pytz.utc) # convert start back to utc
- value['date'] = start.strftime("%Y-%m-%d") + ' 00:00:00'
+
+ value['duration'] = 24.0
+ value['date'] = datetime.strftime(start, "%Y-%m-%d %H:%M:%S")
else:
start = datetime.strptime(start_date, "%Y-%m-%d %H:%M:%S")
@@ -1353,15 +1353,55 @@ class calendar_event(osv.Model):
res = super(calendar_event, self).copy(cr, uid, calendar_id2real_id(id), default, context)
return res
+ def _detach_one_event(self, cr, uid, id, values=dict(), context=None):
+ real_event_id = calendar_id2real_id(id)
+ data = self.read(cr, uid, id, ['date', 'date_deadline', 'rrule', 'duration'])
+
+ if data.get('rrule'):
+ data.update(
+ values,
+ recurrent_id=real_event_id,
+ recurrent_id_date=data.get('date'),
+ rrule_type=False,
+ rrule='',
+ recurrency=False,
+ end_date = datetime.strptime(values.get('date', False) or data.get('date'),"%Y-%m-%d %H:%M:%S")
+ + timedelta(hours=values.get('duration', False) or data.get('duration'))
+ )
+
+ #do not copy the id
+ if data.get('id'):
+ del(data['id'])
+ new_id = self.copy(cr, uid, real_event_id, default=data, context=context)
+ return new_id
+
+ def open_after_detach_event(self, cr, uid, ids, context=None):
+ if context is None:
+ context = {}
+
+ new_id = self._detach_one_event(cr, uid, ids[0], context=context)
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'calendar.event',
+ 'view_mode': 'form',
+ 'res_id': new_id,
+ 'target': 'current',
+ 'flags': {'form': {'action_buttons': True, 'options' : { 'mode' : 'edit' } } }
+ }
+
+
+
+
def write(self, cr, uid, ids, values, context=None):
def _only_changes_to_apply_on_real_ids(field_names):
- ''' return True if changes are only to be made on the real ids'''
+ ''' return True if changes are only to be made on the real ids'''
for field in field_names:
- if field not in ['name', 'message_follower_ids','oe_update_date']:
- return False
- return True
+ if field in ['date','active']:
+ return True
+ return False
context = context or {}
+
if isinstance(ids, (str,int, long)):
if len(str(ids).split('-')) == 1:
@@ -1383,31 +1423,14 @@ class calendar_event(osv.Model):
# if we are setting the recurrency flag to False or if we are only changing fields that
# should be only updated on the real ID and not on the virtual (like message_follower_ids):
# then set real ids to be updated.
- if not values.get('recurrency', True) or _only_changes_to_apply_on_real_ids(values.keys()):
+ if not values.get('recurrency', True) or not _only_changes_to_apply_on_real_ids(values.keys()):
ids.append(real_event_id)
continue
-
- #if edit one instance of a reccurrent id
- data = self.read(cr, uid, event_id, ['date', 'date_deadline', 'rrule', 'duration'])
- if data.get('rrule'):
- data.update(
- values,
- recurrent_id=real_event_id,
- recurrent_id_date=data.get('date'),
- rrule_type=False,
- rrule='',
- recurrency=False,
- end_date = datetime.strptime(values.get('date', False) or data.get('date'),"%Y-%m-%d %H:%M:%S")
- + timedelta(hours=values.get('duration', False) or data.get('duration'))
- )
-
- #do not copy the id
- if data.get('id'):
- del(data['id'])
- new_id = self.copy(cr, uid, real_event_id, default=data, context=context)
- context.update({'active_id': new_id, 'active_ids': [new_id]})
- continue
-
+ else:
+ data = self.read(cr, uid, event_id, ['date', 'date_deadline', 'rrule', 'duration'])
+ if data.get('rrule'):
+ new_id = self._detach_one_event(cr, uid, event_id, values, context=None)
+
res = super(calendar_event, self).write(cr, uid, ids, values, context=context)
# set end_date for calendar searching
@@ -1473,7 +1496,6 @@ class calendar_event(osv.Model):
if context is None:
context = {}
fields2 = fields and fields[:] or None
-
EXTRAFIELDS = ('class', 'user_id', 'duration', 'date', 'rrule', 'vtimezone')
for f in EXTRAFIELDS:
if fields and (f not in fields):
@@ -1518,6 +1540,7 @@ class calendar_event(osv.Model):
for k in EXTRAFIELDS:
if (k in r) and (fields and (k not in fields)):
del r[k]
+
if isinstance(ids, (str, int, long)):
return result and result[0] or False
return result
@@ -1531,7 +1554,7 @@ class calendar_event(osv.Model):
ids_to_unlink = []
# One time moved to google_Calendar, we can specify, if not in google, and not rec or get_inst = 0, we delete it
- for event_id in ids:
+ for event_id in ids:
if unlink_level == 1 and len(str(event_id).split('-')) == 1: # if ID REAL
if self.browse(cr, uid, event_id).recurrent_id:
ids_to_exclure.append(event_id)
diff --git a/addons/calendar/calendar_demo.xml b/addons/calendar/calendar_demo.xml
index 6880754cc56..9e0b44c89cb 100644
--- a/addons/calendar/calendar_demo.xml
+++ b/addons/calendar/calendar_demo.xml
@@ -6,20 +6,7 @@
-->
<!--For Meetings -->
- <record id="res_partner_another" model="res.partner">
- <field name="name">Arshaw</field>
- <field name="company_id" ref="base.main_company"/>
- <field name="customer" eval="False"/>
- <field name="email">fullcalendar@example.com</field>
- </record>
- <record id="res_user_another" model="res.users">
- <field name="name" >Second Demo User</field>
- <field name="login" >Second Demo User</field>
- <field name="partner_id" ref="res_partner_another"/>
- <field name="company_id" ref="base.main_company" />
- </record>
-
- <record id="cal_contact_1" model="calendar.contacts">
+ <record id="cal_contact_1" model="calendar.contacts">
<field eval="1" name="active"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_1"/>
@@ -105,8 +92,8 @@
<record id="calendar_event_7" model="calendar.event">
<field eval="1" name="active"/>
- <field name="user_id" ref="res_user_another"/>
- <field name="partner_ids" eval="[(6,0,[ref('res_partner_another'),ref('base.res_partner_8')])]"/>
+ <field name="user_id" ref="base.user_demo"/>
+ <field name="partner_ids" eval="[(6,0,[ref('base.res_partner_7')])]"/>
<field name="name">Presentation of the new Calendar</field>
<field name="categ_ids" eval="[(6,0,[ref('categ_meet1'), ref('categ_meet2')])]"/>
<field eval="time.strftime('%Y-%m-16 6:00:00')" name="date"/>
@@ -114,18 +101,7 @@
<field eval="8.5" name="duration"/>
<field name="state">draft</field>
</record>
-
- <record id="calendar_event_8" model="calendar.event">
- <field eval="1" name="active"/>
- <field name="user_id" ref="res_user_another"/>
- <field name="partner_ids" eval="[(6,0,[ref('res_partner_another'),ref('base.partner_root')])]"/>
- <field name="name">Discuss about the module : Calendar </field>
- <field name="categ_ids" eval="[(6,0,[ref('categ_meet1'), ref('categ_meet2')])]"/>
- <field eval="time.strftime('%Y-%m-16 6:00:00')" name="date"/>
- <field eval="time.strftime('%Y-%m-16 18:30:00')" name="date_deadline"/>
- <field eval="8.5" name="duration"/>
- <field name="state">draft</field>
- </record>
+
</data>
</openerp>
diff --git a/addons/calendar/calendar_view.xml b/addons/calendar/calendar_view.xml
index ddcf41af352..7e1b6a55039 100644
--- a/addons/calendar/calendar_view.xml
+++ b/addons/calendar/calendar_view.xml
@@ -51,21 +51,26 @@
</div>
<notebook>
<page string="Meeting Details">
+ <group attrs="{'invisible': [('recurrency','==',False)]}" class="oe_edit_only ">
+ <p class='alert alert-warning'> This event is linked to a recurrence...<br/>
+ <button type="object" name="open_after_detach_event" string="Update only this instance" help="Click here to update only this instance and not all recurrences. " class="oe_link"/>
+ </p>
+ </group>
<group>
<group>
<field name="date" string="Starting at" on_change="onchange_dates(date, duration, False, allday)"/>
<label for="duration"/>
<div>
<field name="duration" widget="float_time"
- on_change="onchange_dates(date,duration,False,allday)"
+ on_change="onchange_dates(date, duration, False, allday)"
class="oe_inline" attrs="{'invisible': [('allday','=',True)]}"/>
<label string="hours" attrs="{'invisible': [('allday','=',True)]}"/>
- (<field name="allday" on_change="onchange_dates(date,False,False,allday)" class="oe_inline"/>
+ (<field name="allday" class="oe_inline"/>
<label for="allday" string="All Day?"/>)
</div>
<field name="date_deadline" groups="base.group_no_one"
attrs="{'invisible': ['|', ('allday','=',True), ('duration','&lt;', 24)]}"
- on_change="onchange_dates(date,False,date_deadline)"/>
+ />
</group>
<group>
<field name="categ_ids" widget="many2many_tags"/>
@@ -121,10 +126,10 @@
</div>
</group>
</group>
- <group>
+ <group>
<field name="class"/>
<field name="show_as"/>
- <field name="rrule" invisible="1" readonly="0" />
+ <field name="rrule" invisible="1" readonly="0" />
<field name="recurrent_id" invisible="1" />
</group>
</group>
@@ -136,7 +141,7 @@
<tree string="Invitation details" editable="top" create="false" delete="false">
<field name="partner_id" />
<field name="state" />
- <field name="email" widget="email"/>
+ <field name="email" widget="email"/>
<button name="do_tentative" states="needsAction,declined,accepted" string="Uncertain" type="object" icon="terp-crm" />
<button name="do_accept" string="Accept" states="needsAction,tentative,declined" type="object" icon="gtk-apply"/>
@@ -176,7 +181,7 @@
<field name="date" string="Start" />
<field name="duration" string="Duration" widget="float_time" attrs="{'invisible': [('allday','=',True)]}"/>
<field name="allday" class="oe_inline" attrs="{'invisible': [('allday','=',False)]}"/>
- <field name="partner_ids" widget="many2manyattendee" string="Attendees"/>
+ <field name="partner_ids" widget="many2manyattendee" string="Attendees"/>
</group>
<group>
<field name="categ_ids" widget="many2many_tags"/>
@@ -213,7 +218,7 @@
<field name="name">Meetings Calendar</field>
<field name="model">calendar.event</field>
<field name="priority" eval="2"/>
- <field name="arch" type="xml">
+ <field name="arch" type="xml">
<calendar string="Meetings" date_start="date" date_stop="date_deadline" date_delay="duration" all_day="allday"
display="[name]" color="color_partner_id" attendee="partner_ids" avatar_model="res.partner"
use_contacts="True" event_open_popup="%(calendar.view_calendar_event_form_popup)s">
@@ -248,14 +253,14 @@
<field name="user_id"/>
<field name="show_as"/>
<field name="class" string="Privacy"/>
- <filter icon="terp-go-today" string="My Events" domain="[('user_id','=',uid)]" help="My Events"/>
+ <filter icon="terp-go-today" string="My Events" domain="[('user_id','=',uid)]" help="My Events"/>
<filter string="My Meetings" help="My Meetings" name="mymeetings" context='{"mymeetings": 1}'/>
<filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
- <separator/>
+ <separator/>
<group expand="0" string="Group By...">
<filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Availability" icon="terp-camera_test" domain="[]" context="{'group_by':'show_as'}"/>
- <filter string="Privacy" icon="terp-locked" domain="[]" context="{'group_by':'class'}"/>
+ <filter string="Privacy" icon="terp-locked" domain="[]" context="{'group_by':'class'}"/>
<filter string="Event Month" icon="terp-go-month" domain="[]" context="{'group_by':'date'}" help="Start Date of Event by Month"/>
</group>
</search>
@@ -267,8 +272,7 @@
<field name="res_model">calendar.event</field>
<field name="view_mode">calendar,tree,form,gantt</field>
<field name="view_id" ref="view_calendar_event_calendar"/>
- <field name="search_view_id" ref="view_calendar_event_search"/>
- <field name="context">{"search_default_mymeetings": 1}</field>
+ <field name="search_view_id" ref="view_calendar_event_search"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to schedule a new meeting.
@@ -313,7 +317,7 @@
<field name="name">Meetings</field>
<field name="res_model">calendar.event</field>
<field name="view_mode">form,calendar,tree,gantt</field>
- <field name="view_id" ref="view_calendar_event_form"/>
+ <field name="view_id" ref="view_calendar_event_form"/>
</record>
diff --git a/addons/calendar/contacts.py b/addons/calendar/contacts.py
index 2cd42b55d37..dc964554629 100644
--- a/addons/calendar/contacts.py
+++ b/addons/calendar/contacts.py
@@ -26,7 +26,7 @@ class calendar_contacts(osv.osv):
_columns = {
'user_id': fields.many2one('res.users','Me'),
- 'partner_id': fields.many2one('res.partner','Employee',required=True, domain=[('customer','=',True)]),
+ 'partner_id': fields.many2one('res.partner','Employee',required=True, domain=[]),
'active':fields.boolean('active'),
}
_defaults = {
diff --git a/addons/calendar/contacts_view.xml b/addons/calendar/contacts_view.xml
index cf685f88d00..1d014fea1f6 100644
--- a/addons/calendar/contacts_view.xml
+++ b/addons/calendar/contacts_view.xml
@@ -16,6 +16,7 @@
<field name="res_model">calendar.contacts</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
+ <field name="domain">[('user_id','=',uid)]</field>
<field name="view_id" ref="view_calendar_contacts" />
<field name="help" type="html">
<p class="oe_view_nocontent_create">
diff --git a/addons/calendar/static/src/js/base_calendar.js b/addons/calendar/static/src/js/base_calendar.js
index 0f5693eacbc..18fd4dfa20e 100644
--- a/addons/calendar/static/src/js/base_calendar.js
+++ b/addons/calendar/static/src/js/base_calendar.js
@@ -1,7 +1,7 @@
openerp.calendar = function(instance) {
var _t = instance.web._t;
var QWeb = instance.web.qweb;
- instance.calendar = {}
+ instance.calendar = {};
instance.web.WebClient = instance.web.WebClient.extend({
@@ -11,8 +11,8 @@ openerp.calendar = function(instance) {
get_next_notif: function() {
var self= this;
this.rpc("/calendar/notify")
- .then(
- function(result) {
+ .then(
+ function(result) {
_.each(result, function(res) {
setTimeout(function() {
//If notification not already displayed, we add button and action on it
@@ -21,25 +21,25 @@ openerp.calendar = function(instance) {
res.message += QWeb.render("notify_footer");
a = self.do_notify(res.title,res.message,true);
- $(".link2event").on('click', function() {
+ $(".link2event").on('click', function() {
self.rpc("/web/action/load", {
action_id: "calendar.action_calendar_event_notify",
- }).then( function(r) {
+ }).then( function(r) {
r.res_id = res.event_id;
- return self.action_manager.do_action(r);
- });
+ return self.action_manager.do_action(r);
+ });
});
- a.element.find(".link2recall").on('click',function() {
+ a.element.find(".link2recall").on('click',function() {
self.get_notif_box(this).find('.ui-notify-close').trigger("click");
- });
- a.element.find(".link2showed").on('click',function() {
+ });
+ a.element.find(".link2showed").on('click',function() {
self.get_notif_box(this).find('.ui-notify-close').trigger("click");
self.rpc("/calendar/notify_ack");
});
}
//If notification already displayed in the past, we remove the css attribute which hide this notification
else if (self.get_notif_box($.find(".eid_"+res.event_id)).attr("style") !== ""){
- self.get_notif_box($.find(".eid_"+res.event_id)).attr("style","");
+ self.get_notif_box($.find(".eid_"+res.event_id)).attr("style","");
}
},res.timer * 1000);
});
@@ -48,7 +48,7 @@ openerp.calendar = function(instance) {
},
check_notifications: function() {
var self= this;
- self.get_next_notif();
+ self.get_next_notif();
setInterval(function(){
self.get_next_notif();
}, 5 * 60 * 1000 );
@@ -58,7 +58,7 @@ openerp.calendar = function(instance) {
show_application: function() {
this._super();
this.check_notifications();
- }
+ },
});
@@ -77,7 +77,6 @@ openerp.calendar = function(instance) {
if(instance.session.session_is_valid(self.db) && instance.session.username != "anonymous") {
self.redirect_meeting_view(self.db,self.action,self.id,self.view);
} else {
- alert('in anonymous or null ');
self.open_invitation_form(self.attendee_data);
}
},
@@ -92,9 +91,8 @@ openerp.calendar = function(instance) {
var reload_page = function(){
return location.replace(action_url);
- }
+ };
reload_page();
-
},
});
@@ -108,7 +106,7 @@ openerp.calendar = function(instance) {
});
},
map_tag: function(value){
- return _.map(value, function(el) {return {name: el[1], id:el[0], state: el[2]};})
+ return _.map(value, function(el) {return {name: el[1], id:el[0], state: el[2]};});
},
get_render_data: function(ids){
var self = this;
@@ -121,7 +119,7 @@ openerp.calendar = function(instance) {
if (! self.get("effective_readonly")) {
var tag_element = self.tags.tagElements();
_.each(data,function(value, key){
- $(tag_element[key]).find(".custom-edit").addClass(data[key][2])
+ $(tag_element[key]).find(".custom-edit").addClass(data[key][2]);
});
}
}
@@ -134,7 +132,7 @@ openerp.calendar = function(instance) {
instance.session.session_bind(instance.session.origin).done(function () {
new instance.calendar.invitation(null,db,action,id,view,attendee_data).appendTo($("body").addClass('openerp'));
});
- }
+ };
diff --git a/addons/calendar/test/calendar_test.yml b/addons/calendar/test/calendar_test.yml
index 4888c94a0c5..1454a635a4f 100644
--- a/addons/calendar/test/calendar_test.yml
+++ b/addons/calendar/test/calendar_test.yml
@@ -33,12 +33,14 @@
!python {model: calendar.event}: |
ids = self.search(cr, uid, [('date', '>=', '2011-04-30 16:00:00'), ('date', '<=', '2011-05-31 00:00:00')], context={'virtual_id': True} )
before = self.search(cr, uid, [('date', '>=', '2011-04-30 16:00:00'), ('date', '<=', '2011-05-31 00:00:00')], context={'virtual_id': False})
- self.write(cr, uid,[ids[1]], {'name':'New Name','recurrency' : True}, context={'virtual_id': True})
+ # We start by detach the event
+ newid = self._detach_one_event(cr, uid,ids[1])
+ self.write(cr, uid,[newid], {'name':'New Name','recurrency' : True}, context={'virtual_id': True})
after = self.search(cr, uid, [('date', '>=', '2011-04-30 16:00:00'), ('date', '<=', '2011-05-31 00:00:00')], context={'virtual_id': False})
assert len(after) == len(before)+1, 'Wrong number of events found, after to have moved a virtual event'
- new_id = list(set(after)-set(before))[0]
+ new_id = list(set(after)-set(before))[0]
new_event = self.browse(cr,uid,new_id,context=context)
- assert new_event.recurrent_id == before[0], 'Recurrent_id not correctly passed to the new event'
+ assert new_event.recurrent_id == before[0], 'Recurrent_id not correctly passed to the new event'
-
Now I will make All day event and test it
-
@@ -58,7 +60,6 @@
duration: 1
interval: days
type: notification
-
-
Now I will assign this reminder to all day event
-
diff --git a/addons/calendar/test/test_calendar_recurrent_event_case2.yml b/addons/calendar/test/test_calendar_recurrent_event_case2.yml
index 6aedd3d966d..0d300cf7a2a 100644
--- a/addons/calendar/test/test_calendar_recurrent_event_case2.yml
+++ b/addons/calendar/test/test_calendar_recurrent_event_case2.yml
@@ -84,9 +84,12 @@
idval = '%d-%s' % (ref('calendar_event_sprintreview0'), '20110425124700')
self.write(cr, uid, [idval], {'description': 'Review code of the module: sync_google_calendar.'})
-
- I check whether the record is edited perfectly or not.
+ I check whether that all the records of this recurrence has been edited.
-
!python {model: calendar.event}: |
- meeting_ids = self.search(cr, uid, [('recurrent_id', '=', ref('calendar_event_sprintreview0')), ('recurrent_id_date','=','2011-04-25 12:47:00')], context)
- assert meeting_ids, 'Meeting is not edited !'
+ meeting_ids = self.search(cr, uid, [('recurrent_id', '=', ref('calendar_event_sprintreview0'))], context)
+ meetings = self.browse(cr, uid, meeting_ids, context)
+ for meeting in meetings:
+ assert meeting.description == 'Review code of the module: sync_google_calendar.', 'Description not changed for id: %s' %meeting.id
+
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index 28b8469580e..20e2a6e8aff 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -120,14 +120,14 @@ class crm_case_section(osv.osv):
month_begin = date.today().replace(day=1)
section_result = [{
'value': 0,
- 'tooltip': (month_begin + relativedelta.relativedelta(months=-i)).strftime('%B'),
+ 'tooltip': (month_begin + relativedelta.relativedelta(months=-i)).strftime('%B %Y'),
} for i in range(self._period_number - 1, -1, -1)]
group_obj = obj.read_group(cr, uid, domain, read_fields, groupby_field, context=context)
pattern = tools.DEFAULT_SERVER_DATE_FORMAT if obj.fields_get(cr, uid, groupby_field)[groupby_field]['type'] == 'date' else tools.DEFAULT_SERVER_DATETIME_FORMAT
for group in group_obj:
group_begin_date = datetime.strptime(group['__domain'][0][2], pattern)
month_delta = relativedelta.relativedelta(month_begin, group_begin_date)
- section_result[self._period_number - (month_delta.months + 1)] = {'value': group.get(value_field, 0), 'tooltip': group_begin_date.strftime('%B')}
+ section_result[self._period_number - (month_delta.months + 1)] = {'value': group.get(value_field, 0), 'tooltip': group.get(groupby_field, 0)}
return section_result
def _get_opportunities_data(self, cr, uid, ids, field_name, arg, context=None):
@@ -140,13 +140,18 @@ class crm_case_section(osv.osv):
month_begin = date.today().replace(day=1)
date_begin = month_begin - relativedelta.relativedelta(months=self._period_number - 1)
date_end = month_begin.replace(day=calendar.monthrange(month_begin.year, month_begin.month)[1])
- date_domain = [('create_date', '>=', date_begin.strftime(tools.DEFAULT_SERVER_DATE_FORMAT)), ('create_date', '<=', date_end.strftime(tools.DEFAULT_SERVER_DATE_FORMAT))]
+ lead_pre_domain = [('create_date', '>=', date_begin.strftime(tools.DEFAULT_SERVER_DATE_FORMAT)),
+ ('create_date', '<=', date_end.strftime(tools.DEFAULT_SERVER_DATE_FORMAT)),
+ ('type', '=', 'lead')]
+ opp_pre_domain = [('date_deadline', '>=', date_begin.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)),
+ ('date_deadline', '<=', date_end.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)),
+ ('type', '=', 'opportunity')]
for id in ids:
res[id] = dict()
- lead_domain = date_domain + [('type', '=', 'lead'), ('section_id', '=', id)]
+ lead_domain = lead_pre_domain + [('section_id', '=', id)]
+ opp_domain = opp_pre_domain + [('section_id', '=', id)]
res[id]['monthly_open_leads'] = self.__get_bar_values(cr, uid, obj, lead_domain, ['create_date'], 'create_date_count', 'create_date', context=context)
- opp_domain = date_domain + [('type', '=', 'opportunity'), ('section_id', '=', id)]
- res[id]['monthly_planned_revenue'] = self.__get_bar_values(cr, uid, obj, opp_domain, ['planned_revenue', 'create_date'], 'planned_revenue', 'create_date', context=context)
+ res[id]['monthly_planned_revenue'] = self.__get_bar_values(cr, uid, obj, opp_domain, ['planned_revenue', 'date_deadline'], 'planned_revenue', 'date_deadline', context=context)
return res
_columns = {
diff --git a/addons/crm/crm_case_section_view.xml b/addons/crm/crm_case_section_view.xml
index 4bc74ce880a..d3ad226dbea 100644
--- a/addons/crm/crm_case_section_view.xml
+++ b/addons/crm/crm_case_section_view.xml
@@ -63,9 +63,9 @@
<record id="action_report_crm_lead_salesteam" model="ir.actions.act_window">
<field name="name">Leads Analysis</field>
<field name="res_model">crm.lead.report</field>
- <field name="view_type">form</field>
<field name="context">{"search_default_month":1}</field>
- <field name="view_mode">tree,graph</field>
+ <field name="view_mode">graph</field>
+ <field name="view_id" ref="crm.view_report_crm_lead_graph_two"/>
<field name="domain">[('type','=', 'lead'),('section_id', '=', active_id)]</field>
<field name="help">Leads Analysis allows you to check different CRM related information like the treatment delays or number of leads per state. You can sort out your leads analysis by different groups to get accurate grained analysis.</field>
</record>
@@ -73,9 +73,8 @@
<record id="action_report_crm_opportunity_salesteam" model="ir.actions.act_window">
<field name="name">Opportunities Analysis</field>
<field name="res_model">crm.lead.report</field>
- <field name="view_type">form</field>
- <field name="context">{"search_default_month":1}</field>
- <field name="view_mode">tree,graph</field>
+ <field name="view_mode">graph</field>
+ <field name="view_id" ref="crm.view_report_crm_opportunity_graph"/>
<field name="domain">[('type','=', 'opportunity'), ('section_id', '=', active_id)]</field>
<field name="help">Opportunities Analysis gives you an instant access to your opportunities with information such as the expected revenue, planned cost, missed deadlines or the number of interactions per opportunity. This report is mainly used by the sales manager in order to do the periodic review with the teams of the sales pipeline.</field>
</record>
@@ -117,14 +116,14 @@
<a name="%(crm_case_form_view_salesteams_lead)d" type="action">Leads</a>
<a name="%(action_report_crm_lead_salesteam)d" type="action" class="oe_sparkline_bar_link">
<field name="monthly_open_leads" widget="sparkline_bar"
- options="{'height': '20px', 'barWidth': 4, 'barSpacing': 1, 'delayIn': '3000', 'tooltip_suffix': 'Leads'}">Open Leads per Month<br/>Click to see a detailed analysis of leads.</field>
+ options="{'height': '20px', 'barWidth': 4, 'barSpacing': 1, 'delayIn': '3000', 'tooltip_suffix': ' Leads'}">Open Leads per Month<br/>Click to see a detailed analysis of leads.</field>
</a>
</div>
<div class="oe_salesteams_opportunities">
<a name="%(crm_case_form_view_salesteams_opportunity)d" type="action">Opportunities</a>
<a name="%(action_report_crm_opportunity_salesteam)d" type="action">
<field name="monthly_planned_revenue" widget="sparkline_bar"
- options="{'height': '20px', 'barWidth': '4', 'barSpacing': '1', 'delayIn': '3000', 'tooltip_suffix': 'Opportunities'}">Planned Revenue per Month<br/>Click to see a detailed analysis of opportunities.</field>
+ options="{'height': '20px', 'barWidth': '4', 'barSpacing': '1', 'delayIn': '3000', 'tooltip_suffix': ' (Planned Revenue)'}">Planned Revenue per Month<br/>Click to see a detailed analysis of opportunities.</field>
</a>
</div>
</div>
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index b89c04a7d36..6f522f0118f 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -330,6 +330,7 @@ class crm_lead(format_address, osv.osv):
'phone': partner.phone,
'mobile': partner.mobile,
'fax': partner.fax,
+ 'zip': partner.zip,
}
return {'value': values}
diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml
index 6bb8e2700d4..1abcdac9712 100644
--- a/addons/crm/crm_lead_data.xml
+++ b/addons/crm/crm_lead_data.xml
@@ -146,6 +146,7 @@
<!-- CRM-related subtypes for messaging / Chatter -->
<record id="mt_lead_create" model="mail.message.subtype">
<field name="name">Lead Created</field>
+ <field name="hidden" eval="True"/>
<field name="res_model">crm.lead</field>
<field name="default" eval="False"/>
<field name="description">Lead created</field>
@@ -171,6 +172,7 @@
<!-- Salesteam-related subtypes for messaging / Chatter -->
<record id="mt_salesteam_lead" model="mail.message.subtype">
<field name="name">Lead Created</field>
+ <field name="sequence">10</field>
<field name="res_model">crm.case.section</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_lead_create')"/>
@@ -178,18 +180,21 @@
</record>
<record id="mt_salesteam_lead_stage" model="mail.message.subtype">
<field name="name">Opportunity Stage Changed</field>
+ <field name="sequence">11</field>
<field name="res_model">crm.case.section</field>
<field name="parent_id" eval="ref('mt_lead_stage')"/>
<field name="relation_field">section_id</field>
</record>
<record id="mt_salesteam_lead_won" model="mail.message.subtype">
<field name="name">Opportunity Won</field>
+ <field name="sequence">12</field>
<field name="res_model">crm.case.section</field>
<field name="parent_id" eval="ref('mt_lead_won')"/>
<field name="relation_field">section_id</field>
</record>
<record id="mt_salesteam_lead_lost" model="mail.message.subtype">
<field name="name">Opportunity Lost</field>
+ <field name="sequence">13</field>
<field name="res_model">crm.case.section</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_lead_lost')"/>
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index c728404d9ce..e76a7a9124d 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -343,6 +343,7 @@
help="Leads that are assigned to any sales teams I am member of"/>
<filter string="Dead" name="dead"
domain="[('probability', '=', '0'), ('stage_id.fold', '=', True)]"/>
+ <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator />
<filter string="Available for mass mailing"
name='not_opt_out' domain="[('opt_out', '=', False)]"
@@ -562,6 +563,7 @@
<filter string="My Team(s)"
domain="[('section_id.member_ids', 'in', [uid])]" context="{'invisible_section': False}"
help="Opportunities that are assigned to any sales teams I am member of"/>
+ <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<group expand="0" string="Group By..." colspan="16">
<filter string="Salesperson" domain="[]" context="{'group_by':'user_id'}"/>
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index a027a910520..9675913a0b5 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -171,6 +171,7 @@
<filter icon="terp-gtk-go-back-rtl" string="To Do" name="current" domain="[('state','=','open')]"/>
<separator/>
<filter string="Unassigned Phonecalls" icon="terp-personal-" domain="[('user_id','=',False)]" help="Unassigned Phonecalls"/>
+ <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter string="Phone Calls Assigned to Me or My Team(s)" icon="terp-personal+" domain="['|', ('section_id.user_id','=',uid), ('user_id', '=', uid)]"
help="Phone Calls Assigned to the current user or with a team having the current user as team leader"/>
diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py
index 871bef2099d..3a0786da5c7 100644
--- a/addons/crm/report/crm_lead_report.py
+++ b/addons/crm/report/crm_lead_report.py
@@ -89,10 +89,6 @@ class crm_lead_report(osv.osv):
id,
c.date_deadline,
- to_char(c.create_date, 'YYYY') as creation_year,
- to_char(c.create_date, 'MM') as creation_month,
- to_char(c.create_date, 'YYYY-MM-DD') as creation_day,
-
to_char(c.date_open, 'YYYY-MM-DD') as opening_date,
to_char(c.date_closed, 'YYYY-mm-dd') as date_closed,
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
index f25cfa1f4b1..c4cffdc012a 100644
--- a/addons/crm/report/crm_lead_report_view.xml
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -15,6 +15,17 @@
</field>
</record>
+ <record id="view_report_crm_lead_graph_two" model="ir.ui.view">
+ <field name="name">crm.lead.report.graph.two</field>
+ <field name="model">crm.lead.report</field>
+ <field name="arch" type="xml">
+ <graph string="Leads Analysis" type="pivot" stacked="True">
+ <field name="create_date" type="row"/>
+ <field name="user_id" type="col"/>
+ </graph>
+ </field>
+ </record>
+
<record id="view_report_crm_opportunity_graph" model="ir.ui.view">
<field name="name">crm.opportunity.report.graph</field>
<field name="model">crm.lead.report</field>
@@ -23,7 +34,7 @@
<field name="date_deadline" type="row"/>
<field name="user_id" type="col"/>
<field name="stage_id" type="col"/>
- <field name="probable_revenue" type="measure"/>
+ <field name="planned_revenue" type="measure"/>
</graph>
</field>
</record>
@@ -84,7 +95,7 @@
<filter string="Creation date (week)" icon="terp-go-year"
domain="[]" context="{'group_by':'create_date:week'}"/>
<filter string="Creation date (month)" icon="terp-go-year"
- domain="[]" context="{'group_by':'create_date:month'}"/>
+ domain="[]" context="{'group_by':'create_date:month'}" name="month"/>
<filter string="Creation date (year)" icon="terp-go-year"
domain="[]" context="{'group_by':'create_date:year'}"/>
<separator orientation="vertical" />
diff --git a/addons/crm_partner_assign/crm_portal_view.xml b/addons/crm_partner_assign/crm_portal_view.xml
index 2b2b61c8425..dab831dcb4b 100644
--- a/addons/crm_partner_assign/crm_portal_view.xml
+++ b/addons/crm_partner_assign/crm_portal_view.xml
@@ -140,8 +140,8 @@
</group>
<group col="2">
<separator string="Categorization" colspan="2"/>
- <field name="type_id" widget="selection" readonly="1"/>
- <field name="channel_id" widget="selection" readonly="1"/>
+ <field name="type_id" readonly="1"/>
+ <field name="channel_id" readonly="1"/>
</group>
</group>
<separator string="Details" />
diff --git a/addons/email_template/email_template_view.xml b/addons/email_template/email_template_view.xml
index 5429341e154..4f7828cb531 100644
--- a/addons/email_template/email_template_view.xml
+++ b/addons/email_template/email_template_view.xml
@@ -60,7 +60,7 @@
<h3>Body</h3>
<field name="body_html" width="250" height="450"
placeholder="Rich-text/HTML content of the message (placeholders may be used here)"/>
- <field name="attachment_ids" nolabel="1" widget="many2many_binary"/>
+ <field name="attachment_ids" widget="many2many_binary"/>
</page>
<page string="Advanced Settings">
<group>
diff --git a/addons/event/event.py b/addons/event/event.py
index 0b10b1e51ec..d13d455bc73 100644
--- a/addons/event/event.py
+++ b/addons/event/event.py
@@ -219,6 +219,7 @@ class event_event(osv.osv):
]
def onchange_event_type(self, cr, uid, ids, type_event, context=None):
+ values = {}
if type_event:
type_info = self.pool.get('event.type').browse(cr,uid,type_event,context)
dic ={
@@ -228,7 +229,8 @@ class event_event(osv.osv):
'seats_min': type_info.default_registration_min,
'seats_max': type_info.default_registration_max,
}
- return {'value': dic}
+ values.update(dic)
+ return values
def onchange_start_date(self, cr, uid, ids, date_begin=False, date_end=False, context=None):
res = {'value':{}}
diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py
index cce1f77856e..5f6379025ae 100644
--- a/addons/fetchmail/fetchmail.py
+++ b/addons/fetchmail/fetchmail.py
@@ -187,7 +187,7 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
for server in self.browse(cr, uid, ids, context=context):
_logger.info('start checking for new emails on %s server %s', server.type, server.name)
context.update({'fetchmail_server_id': server.id, 'server_type': server.type})
- count = 0
+ count, failed = 0, 0
imap_server = False
pop_server = False
if server.type == 'imap':
@@ -196,20 +196,26 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
imap_server.select()
result, data = imap_server.search(None, '(UNSEEN)')
for num in data[0].split():
+ res_id = None
result, data = imap_server.fetch(num, '(RFC822)')
- res_id = mail_thread.message_process(cr, uid, server.object_id.model,
- data[0][1],
- save_original=server.original,
- strip_attachments=(not server.attach),
- context=context)
+ imap_server.store(num, '-FLAGS', '\\Seen')
+ try:
+ res_id = mail_thread.message_process(cr, uid, server.object_id.model,
+ data[0][1],
+ save_original=server.original,
+ strip_attachments=(not server.attach),
+ context=context)
+ except Exception:
+ _logger.exception('Failed to process mail from %s server %s.', server.type, server.name)
+ failed += 1
if res_id and server.action_id:
- action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", server.object_id.model)})
- imap_server.store(num, '+FLAGS', '\\Seen')
- cr.commit()
+ action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids': [res_id], 'active_model': context.get("thread_model", server.object_id.model)})
+ imap_server.store(num, '+FLAGS', '\\Seen')
+ cr.commit()
count += 1
- _logger.info("fetched/processed %s email(s) on %s server %s", count, server.type, server.name)
+ _logger.info("Fetched %d email(s) on %s server %s; %d succeeded, %d failed.", count, server.type, server.name, (count - failed), failed)
except Exception:
- _logger.exception("Failed to fetch mail from %s server %s.", server.type, server.name)
+ _logger.exception("General failure when trying to fetch mail from %s server %s.", server.type, server.name)
finally:
if imap_server:
imap_server.close()
@@ -222,18 +228,23 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
for num in range(1, numMsgs + 1):
(header, msges, octets) = pop_server.retr(num)
msg = '\n'.join(msges)
- res_id = mail_thread.message_process(cr, uid, server.object_id.model,
- msg,
- save_original=server.original,
- strip_attachments=(not server.attach),
- context=context)
+ res_id = None
+ try:
+ res_id = mail_thread.message_process(cr, uid, server.object_id.model,
+ msg,
+ save_original=server.original,
+ strip_attachments=(not server.attach),
+ context=context)
+ except Exception:
+ _logger.exception('Failed to process mail from %s server %s.', server.type, server.name)
+ failed += 1
if res_id and server.action_id:
- action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", server.object_id.model)})
+ action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids': [res_id], 'active_model': context.get("thread_model", server.object_id.model)})
pop_server.dele(num)
cr.commit()
- _logger.info("fetched/processed %s email(s) on %s server %s", numMsgs, server.type, server.name)
+ _logger.info("Fetched %d email(s) on %s server %s; %d succeeded, %d failed.", numMsgs, server.type, server.name, (numMsgs - failed), failed)
except Exception:
- _logger.exception("Failed to fetch mail from %s server %s.", server.type, server.name)
+ _logger.exception("General failure when trying to fetch mail from %s server %s.", server.type, server.name)
finally:
if pop_server:
pop_server.quit()
diff --git a/addons/gamification/html/index.html b/addons/gamification/html/index.html
deleted file mode 100644
index 890efa0d1ec..00000000000
--- a/addons/gamification/html/index.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<section class="oe_container">
- <div class="oe_row oe_spaced">
- <div class="oe_span12">
- <h2 class="oe_slogan">Drive Engagement with Gamification</h2>
- <h3 class="oe_slogan">Leverage natural desire for competition</h3>
- <p class="oe_mt32">
- Reinforce good habits and improve win rates with real-time recognition and rewards inspired by <a href="http://en.wikipedia.org/wiki/Gamification">game mechanics</a>. Align teams around clear business objectives with challenges, personal objectives and team leader boards.
- </p>
- <div class="oe_span4 oe_centered">
- <h3>Leaderboards</h3>
- <div class="oe_row_img oe_centered">
- <img class="oe_picture" src="crm_game_01.png">
- </div>
- <p>
- Promote leaders and competition amongst sales team with performance ratios.
- </p>
- </div>
- <div class="oe_span4 oe_centered">
- <h3>Personnal Objectives</h3>
- <div class="oe_row_img">
- <img class="oe_picture" src="crm_game_02.png">
- </div>
- <p>
- Assign clear goals to users to align them with the company objectives.
- </p>
- </div>
- <div class="oe_span4 oe_centered">
- <h3>Visual Information</h3>
- <div class="oe_row_img oe_centered">
- <img class="oe_picture" src="crm_game_03.png">
- </div>
- <p>
- See in an glance the progress of each user.
- </p>
- </div>
- </div>
-</section>
-
-
-<section class="oe_container oe_dark">
- <div class="oe_row oe_spaced">
- <h2 class="oe_slogan">Create custom Challenges</h2>
- <div class="oe_span6">
- <p class="oe_mt32">
-Use predefined goals to generate easily your own challenges. Assign it to a team or individual users. Receive feedback as often as needed: daily, weekly... Repeat it automatically to compare progresses through time.
- </p>
- </div>
- <div class="oe_span6">
- <div class="oe_row_img oe_centered">
- <img class="oe_picture oe_screenshot" src="crm_sc_05.png">
- </div>
- </div>
- </div>
-</section>
-
-<section class="oe_container">
- <div class="oe_row oe_spaced">
- <h2 class="oe_slogan">Motivate with Badges</h2>
- <div class="oe_span6">
- <div class="oe_row_img oe_centered">
- <img class="oe_picture" src="crm_linkedin.png">
- </div>
- </div>
- <div class="oe_span6">
- <p class="oe_mt32">
-Inspire achievement with recognition of coworker's good work by rewarding badges. These can be deserved manually or upon completion of challenges. Add fun to the competition with rare badges.
- </p>
- </div>
- </div>
-</section>
-
-<section class="oe_container oe_dark">
- <div class="oe_row oe_spaced">
- <h2 class="oe_slogan">Adapt to any module</h2>
- <div class="oe_span6">
- <p class="oe_mt32">
-Create goals linked to any module. The evaluation system is very flexible and can be used for many different tasks : sales evaluation, creation of events, project completion or even helping new users to complete their profile.
- </p>
- </div>
- <div class="oe_span6">
- <div class="oe_row_img oe_centered">
- <img class="oe_picture oe_screenshot" src="crm_sc_02.png">
- </div>
- </div>
- </div>
-</section>
diff --git a/addons/gamification/i18n/gamification.pot b/addons/gamification/i18n/gamification.pot
index 0ef4cdbea64..03fcc645bec 100644
--- a/addons/gamification/i18n/gamification.pot
+++ b/addons/gamification/i18n/gamification.pot
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 8.0alpha1\n"
+"Project-Id-Version: OpenERP Server 7.saas~3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-13 15:08+0000\n"
-"PO-Revision-Date: 2014-02-13 15:08+0000\n"
+"POT-Creation-Date: 2014-02-13 15:03+0000\n"
+"PO-Revision-Date: 2014-02-13 15:03+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
diff --git a/addons/gamification/models/challenge.py b/addons/gamification/models/challenge.py
index fec8e04c4b7..06d0c44baac 100644
--- a/addons/gamification/models/challenge.py
+++ b/addons/gamification/models/challenge.py
@@ -433,7 +433,7 @@ class gamification_challenge(osv.Model):
##### JS utilities #####
def _get_serialized_challenge_lines(self, cr, uid, challenge, user_id=False, restrict_goal_ids=False, restrict_top=False, context=None):
- """Return a serialised version of the goals information
+ """Return a serialised version of the goals information if the user has not completed every goal
:challenge: browse record of challenge to compute
:user_id: res.users id of the user retrieving progress (False if no distinction, only for ranking challenges)
@@ -487,6 +487,7 @@ class gamification_challenge(osv.Model):
(start_date, end_date) = start_end_date_for_period(challenge.period)
res_lines = []
+ all_reached = True
for line in challenge.line_ids:
line_data = {
'name': line.definition_id.name,
@@ -537,6 +538,8 @@ class gamification_challenge(osv.Model):
'completeness': goal.completeness,
'state': goal.state,
})
+ if goal.state != 'reached':
+ all_reached = False
else:
ranking += 1
if user_id and goal.user_id.id == user_id:
@@ -554,8 +557,12 @@ class gamification_challenge(osv.Model):
'completeness': goal.completeness,
'state': goal.state,
})
+ if goal.state != 'reached':
+ all_reached = False
if goal_ids:
res_lines.append(line_data)
+ if all_reached:
+ return []
return res_lines
##### Reporting #####
@@ -620,22 +627,28 @@ class gamification_challenge(osv.Model):
return self.write(cr, uid, challenge.id, {'last_report_date': fields.date.today()}, context=context)
##### Challenges #####
+ # TODO in trunk, remove unused parameter user_id
def accept_challenge(self, cr, uid, challenge_ids, context=None, user_id=None):
"""The user accept the suggested challenge"""
- user_id = user_id or uid
+ return self._accept_challenge(cr, uid, uid, challenge_ids, context=context)
+
+ def _accept_challenge(self, cr, uid, user_id, challenge_ids, context=None):
user = self.pool.get('res.users').browse(cr, uid, user_id, context=context)
message = "%s has joined the challenge" % user.name
- self.message_post(cr, uid, challenge_ids, body=message, context=context)
+ self.message_post(cr, SUPERUSER_ID, challenge_ids, body=message, context=context)
self.write(cr, SUPERUSER_ID, challenge_ids, {'invited_user_ids': [(3, user_id)], 'user_ids': [(4, user_id)]}, context=context)
- return self.generate_goals_from_challenge(cr, uid, challenge_ids, context=context)
+ return self.generate_goals_from_challenge(cr, SUPERUSER_ID, challenge_ids, context=context)
+ # TODO in trunk, remove unused parameter user_id
def discard_challenge(self, cr, uid, challenge_ids, context=None, user_id=None):
"""The user discard the suggested challenge"""
- user_id = user_id or uid
+ return self._discard_challenge(cr, uid, uid, challenge_ids, context=context)
+
+ def _discard_challenge(self, cr, uid, user_id, challenge_ids, context=None):
user = self.pool.get('res.users').browse(cr, uid, user_id, context=context)
message = "%s has refused the challenge" % user.name
self.message_post(cr, SUPERUSER_ID, challenge_ids, body=message, context=context)
- return self.write(cr, uid, challenge_ids, {'invited_user_ids': (3, user_id)}, context=context)
+ return self.write(cr, SUPERUSER_ID, challenge_ids, {'invited_user_ids': (3, user_id)}, context=context)
def reply_challenge_wizard(self, cr, uid, challenge_id, context=None):
result = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'gamification', 'challenge_wizard')
diff --git a/addons/gamification/models/res_users.py b/addons/gamification/models/res_users.py
index d25d725a4ac..85cc18636f0 100644
--- a/addons/gamification/models/res_users.py
+++ b/addons/gamification/models/res_users.py
@@ -19,6 +19,7 @@
#
##############################################################################
+from openerp import SUPERUSER_ID
from openerp.osv import osv
from challenge import MAX_VISIBILITY_RANKING
@@ -39,10 +40,10 @@ class res_users_gamification_group(osv.Model):
user_group_ids += [id for command in vals['groups_id'] if command[0] == 6 for id in command[2]]
challenge_obj = self.pool.get('gamification.challenge')
- challenge_ids = challenge_obj.search(cr, uid, [('autojoin_group_id', 'in', user_group_ids)], context=context)
+ challenge_ids = challenge_obj.search(cr, SUPERUSER_ID, [('autojoin_group_id', 'in', user_group_ids)], context=context)
if challenge_ids:
- challenge_obj.write(cr, uid, challenge_ids, {'user_ids': [(4, user_id) for user_id in ids]}, context=context)
- challenge_obj.generate_goals_from_challenge(cr, uid, challenge_ids, context=context)
+ challenge_obj.write(cr, SUPERUSER_ID, challenge_ids, {'user_ids': [(4, user_id) for user_id in ids]}, context=context)
+ challenge_obj.generate_goals_from_challenge(cr, SUPERUSER_ID, challenge_ids, context=context)
return write_res
def create(self, cr, uid, vals, context=None):
@@ -54,10 +55,10 @@ class res_users_gamification_group(osv.Model):
user_group_ids += [id for command in vals['groups_id'] if command[0] == 6 for id in command[2]]
challenge_obj = self.pool.get('gamification.challenge')
- challenge_ids = challenge_obj.search(cr, uid, [('autojoin_group_id', 'in', user_group_ids)], context=context)
+ challenge_ids = challenge_obj.search(cr, SUPERUSER_ID, [('autojoin_group_id', 'in', user_group_ids)], context=context)
if challenge_ids:
- challenge_obj.write(cr, uid, challenge_ids, {'user_ids': [(4, write_res)]}, context=context)
- challenge_obj.generate_goals_from_challenge(cr, uid, challenge_ids, context=context)
+ challenge_obj.write(cr, SUPERUSER_ID, challenge_ids, {'user_ids': [(4, write_res)]}, context=context)
+ challenge_obj.generate_goals_from_challenge(cr, SUPERUSER_ID, challenge_ids, context=context)
return write_res
# def get_goals_todo_info(self, cr, uid, context=None):
@@ -130,8 +131,8 @@ class res_groups_gamification_group(osv.Model):
user_ids += [id for command in vals['users'] if command[0] == 6 for id in command[2]]
challenge_obj = self.pool.get('gamification.challenge')
- challenge_ids = challenge_obj.search(cr, uid, [('autojoin_group_id', 'in', ids)], context=context)
+ challenge_ids = challenge_obj.search(cr, SUPERUSER_ID, [('autojoin_group_id', 'in', ids)], context=context)
if challenge_ids:
- challenge_obj.write(cr, uid, challenge_ids, {'user_ids': [(4, user_id) for user_id in user_ids]}, context=context)
- challenge_obj.generate_goals_from_challenge(cr, uid, challenge_ids, context=context)
+ challenge_obj.write(cr, SUPERUSER_ID, challenge_ids, {'user_ids': [(4, user_id) for user_id in user_ids]}, context=context)
+ challenge_obj.generate_goals_from_challenge(cr, SUPERUSER_ID, challenge_ids, context=context)
return write_res
diff --git a/addons/google_calendar/google_calendar.py b/addons/google_calendar/google_calendar.py
index a47fd4637ee..734710be4d0 100644
--- a/addons/google_calendar/google_calendar.py
+++ b/addons/google_calendar/google_calendar.py
@@ -7,6 +7,7 @@
# 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
@@ -36,21 +37,185 @@ from dateutil import parser
import pytz
from openerp.osv import fields, osv
from openerp.osv import osv
+from collections import namedtuple
+
+import logging
+_logger = logging.getLogger(__name__)
+
+
+class Meta(type):
+ """ This Meta class allow to define class as a structure, and so instancied variable
+ in __init__ to avoid to have side effect alike 'static' variable """
+ def __new__(typ, name, parents, attrs):
+ methods = dict((k, v) for k, v in attrs.iteritems()
+ if callable(v))
+ attrs = dict((k, v) for k, v in attrs.iteritems()
+ if not callable(v))
+
+ def init(self, **kw):
+ for k, v in attrs.iteritems():
+ setattr(self, k, v)
+ for k, v in kw.iteritems():
+ assert k in attrs
+ setattr(self, k, v)
+
+ methods['__init__'] = init
+ methods['__getitem__'] = getattr
+ return type.__new__(typ, name, parents, methods)
+
+class Struct(object):
+ __metaclass__ = Meta
+
+class OpenerpEvent(Struct):
+ event = False
+ found = False
+ event_id = False
+ isRecurrence = False
+ isInstance = False
+ update = False
+ status = False
+ attendee_id = False
+ synchro = False
+
+class GmailEvent(Struct):
+ event = False
+ found = False
+ isRecurrence = False
+ isInstance = False
+ update = False
+ status = False
+
+class SyncEvent(object):
+ def __init__(self):
+ self.OE = OpenerpEvent()
+ self.GG = GmailEvent()
+ self.OP = None
+
+ def __getitem__(self, key):
+ return getattr(self,key)
+
+ def compute_OP(self):
+ #If event are already in Gmail and in OpenERP
+ if self.OE.found and self.GG.found:
+ #If the event has been deleted from one side, we delete on other side !
+ if self.OE.status != self.GG.status:
+ self.OP = Delete((self.OE.status and "OE") or (self.GG.status and "GG"),
+ 'The event has been deleted from one side, we delete on other side !' )
+ #If event is not deleted !
+ elif self.OE.status and self.GG.status:
+ if self.OE.update.split('.')[0] != self.GG.update.split('.')[0]:
+ if self.OE.update < self.GG.update:
+ tmpSrc = 'GG'
+ elif self.OE.update > self.GG.update:
+ tmpSrc = 'OE'
+ assert tmpSrc in ['GG','OE']
+
+
+ #if self.OP.action == None:
+ if self[tmpSrc].isRecurrence:
+ if self[tmpSrc].status:
+ self.OP = Update(tmpSrc, 'Only need to update, because i\'m active')
+ else:
+ self.OP = Exclude(tmpSrc, 'Need to Exclude (Me = First event from recurrence) from recurrence')
+
+ elif self[tmpSrc].isInstance:
+ self.OP= Update(tmpSrc, 'Only need to update, because already an exclu');
+ else:
+ self.OP = Update(tmpSrc, 'Simply Update... I\'m a single event');
+ #end-if self.OP.action == None:
+
+ else:
+ if not self.OE.synchro or self.OE.synchro.split('.')[0] < self.OE.update.split('.')[0]:
+ self.OP = Update('OE','Event already updated by another user, but not synchro with my google calendar')
+ #import ipdb; ipdb.set_trace();
+ else:
+ self.OP = NothingToDo("",'Not update needed')
+ else:
+ self.OP = NothingToDo("", "Both are already deleted");
+
+ # New in openERP... Create on create_events of synchronize function
+ elif self.OE.found and not self.GG.found:
+ #Has been deleted from gmail
+ if self.OE.status:
+ self.OP = Delete('OE', 'Removed from GOOGLE')
+ else:
+ self.OP = NothingToDo("","Already Deleted in gmail and unlinked in OpenERP")
+ elif self.GG.found and not self.OE.found:
+ tmpSrc = 'GG'
+ if not self.GG.status and not self.GG.isInstance:
+ # don't need to make something... because event has been created and deleted before the synchronization
+ self.OP = NothingToDo("", 'Nothing to do... Create and Delete directly')
+ else:
+ if self.GG.isInstance:
+ if self[tmpSrc].status:
+ self.OP = Exclude(tmpSrc, 'Need to create the new exclu')
+ else:
+ self.OP = Exclude(tmpSrc, 'Need to copy and Exclude')
+ else:
+ self.OP = Create(tmpSrc, 'New EVENT CREATE from GMAIL')
+
+ def __str__(self):
+ return self.__repr__()
+
+ def __repr__(self):
+ myPrint = "---- A SYNC EVENT ---"
+ myPrint += "\n ID OE: %s " % (self.OE.event and self.OE.event.id)
+ myPrint += "\n ID GG: %s " % (self.GG.event and self.GG.event.get('id', False))
+ myPrint += "\n Name OE: %s " % (self.OE.event and self.OE.event.name)
+ myPrint += "\n Name GG: %s " % (self.GG.event and self.GG.event.get('summary', False))
+ myPrint += "\n Found OE:%5s vs GG: %5s" % (self.OE.found, self.GG.found)
+ myPrint += "\n Recurrence OE:%5s vs GG: %5s" % (self.OE.isRecurrence, self.GG.isRecurrence)
+ myPrint += "\n Instance OE:%5s vs GG: %5s" % (self.OE.isInstance, self.GG.isInstance)
+ myPrint += "\n Synchro OE: %10s " % (self.OE.synchro)
+ myPrint += "\n Update OE: %10s " % (self.OE.update)
+ myPrint += "\n Update GG: %10s " % (self.GG.update)
+ myPrint += "\n Status OE:%5s vs GG: %5s" % (self.OE.status, self.GG.status)
+ if (self.OP is None):
+ myPrint += "\n Action %s" % "---!!!---NONE---!!!---"
+ else:
+ myPrint += "\n Action %s" % type(self.OP).__name__
+ myPrint += "\n Source %s" % (self.OP.src)
+ myPrint += "\n comment %s" % (self.OP.info)
+ return myPrint
+
+
+class SyncOperation(object):
+ def __init__(self, src,info, **kw):
+ self.src = src
+ self.info = info
+ for k,v in kw.items():
+ setattr(self,k,v)
+
+ def __str__(self):
+ return 'in__STR__'
+
+class Create(SyncOperation):
+ pass
+class Update(SyncOperation):
+ pass
+class Delete(SyncOperation):
+ pass
+class NothingToDo(SyncOperation):
+ pass
+class Exclude(SyncOperation):
+ pass
class google_calendar(osv.AbstractModel):
STR_SERVICE = 'calendar'
_name = 'google.%s' % STR_SERVICE
- def generate_data(self, cr, uid, event, context=None):
+ def generate_data(self, cr, uid, event, context=None):
if event.allday:
start_date = fields.datetime.context_timestamp(cr, uid, datetime.strptime(event.date, tools.DEFAULT_SERVER_DATETIME_FORMAT) , context=context).isoformat('T').split('T')[0]
end_date = fields.datetime.context_timestamp(cr, uid, datetime.strptime(event.date, tools.DEFAULT_SERVER_DATETIME_FORMAT) + timedelta(hours=event.duration), context=context).isoformat('T').split('T')[0]
type = 'date'
+ vstype = 'dateTime'
else:
start_date = fields.datetime.context_timestamp(cr, uid, datetime.strptime(event.date, tools.DEFAULT_SERVER_DATETIME_FORMAT), context=context).isoformat('T')
end_date = fields.datetime.context_timestamp(cr, uid, datetime.strptime(event.date_deadline, tools.DEFAULT_SERVER_DATETIME_FORMAT), context=context).isoformat('T')
type = 'dateTime'
+ vstype = 'date'
attendee_list = []
for attendee in event.attendee_ids:
@@ -64,10 +229,12 @@ class google_calendar(osv.AbstractModel):
"description": event.description or '',
"start":{
type:start_date,
+ vstype:None,
'timeZone':'UTC'
},
"end":{
type:end_date,
+ vstype:None,
'timeZone':'UTC'
},
"attendees":attendee_list,
@@ -80,10 +247,13 @@ class google_calendar(osv.AbstractModel):
if not event.active:
data["state"] = "cancelled"
+ if not self.get_need_synchro_attendee(cr,uid,context=context):
+ data.pop("attendees")
+
return data
def create_an_event(self, cr, uid,event, context=None):
- gs_pool = self.pool.get('google.service')
+ gs_pool = self.pool['google.service']
data = self.generate_data(cr, uid,event, context=context)
@@ -94,7 +264,7 @@ class google_calendar(osv.AbstractModel):
return gs_pool._do_request(cr, uid, url, data_json, headers, type='POST', context=context)
def delete_an_event(self, cr, uid,event_id, context=None):
- gs_pool = self.pool.get('google.service')
+ gs_pool = self.pool['google.service']
params = {
'access_token' : self.get_token(cr,uid,context)
@@ -108,12 +278,14 @@ class google_calendar(osv.AbstractModel):
if not token:
token = self.get_token(cr,uid,context)
- gs_pool = self.pool.get('google.service')
+ gs_pool = self.pool['google.service']
params = {
'fields': 'items,nextPageToken',
'access_token' : token,
- 'maxResults':1000
+ 'maxResults':1000,
+ 'timeMin': self.get_start_time_to_synchro(cr,uid,context=context).strftime("%Y-%m-%dT%H:%M:%S.%fz"),
+
}
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
@@ -134,7 +306,7 @@ class google_calendar(osv.AbstractModel):
def update_to_google(self, cr, uid, oe_event, google_event, context):
calendar_event = self.pool['calendar.event']
- gs_pool = self.pool.get('google.service')
+ gs_pool = self.pool['google.service']
url = "/calendar/v3/calendars/%s/events/%s?fields=%s&access_token=%s" % ('primary', google_event['id'],'id,updated', self.get_token(cr,uid,context))
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
@@ -148,10 +320,10 @@ class google_calendar(osv.AbstractModel):
calendar_event.write(cr, uid, [oe_event.id], {'oe_update_date':update_date})
if context['curr_attendee']:
- self.pool.get('calendar.attendee').write(cr,uid,[context['curr_attendee']], {'oe_synchro_date':update_date},context)
+ self.pool['calendar.attendee'].write(cr,uid,[context['curr_attendee']], {'oe_synchro_date':update_date},context)
def update_an_event(self, cr, uid,event, context=None):
- gs_pool = self.pool.get('google.service')
+ gs_pool = self.pool['google.service']
data = self.generate_data(cr, uid,event, context=context)
@@ -164,7 +336,7 @@ class google_calendar(osv.AbstractModel):
return response
def update_recurrent_event_exclu(self, cr, uid,instance_id,event_ori_google_id,event_new, context=None):
- gs_pool = self.pool.get('google.service')
+ gs_pool = self.pool['google.service']
data = self.generate_data(cr, uid,event_new, context=context)
@@ -186,7 +358,7 @@ class google_calendar(osv.AbstractModel):
calendar_event = self.pool['calendar.event']
res_partner_obj = self.pool['res.partner']
calendar_attendee_obj = self.pool['calendar.attendee']
- user_obj = self.pool.get('res.users')
+ user_obj = self.pool['res.users']
myPartnerID = user_obj.browse(cr,uid,uid,context).partner_id.id
attendee_record = []
partner_record = [(4,myPartnerID)]
@@ -203,14 +375,16 @@ class google_calendar(osv.AbstractModel):
if google_attendee.get('found',False):
continue
- attendee_id = res_partner_obj.search(cr, uid,[('email', '=', google_attendee['email'])], context=context)
- if not attendee_id:
- attendee_id = [res_partner_obj.create(cr, uid,{'email': google_attendee['email'],'Customer': False, 'name': google_attendee.get("displayName",False) or google_attendee['email'] }, context=context)]
- attendee = res_partner_obj.read(cr, uid, attendee_id[0], ['email'], context=context)
- partner_record.append((4, attendee.get('id')))
- attendee['partner_id'] = attendee.pop('id')
- attendee['state'] = google_attendee['responseStatus']
- attendee_record.append((0, 0, attendee))
+ if self.get_need_synchro_attendee(cr,uid,context=context):
+ attendee_id = res_partner_obj.search(cr, uid,[('email', '=', google_attendee['email'])], context=context)
+ if not attendee_id:
+ attendee_id = [res_partner_obj.create(cr, uid,{'email': google_attendee['email'],'customer': False, 'name': google_attendee.get("displayName",False) or google_attendee['email'] }, context=context)]
+ attendee = res_partner_obj.read(cr, uid, attendee_id[0], ['email'], context=context)
+ partner_record.append((4, attendee.get('id')))
+ attendee['partner_id'] = attendee.pop('id')
+ attendee['state'] = google_attendee['responseStatus']
+ attendee_record.append((0, 0, attendee))
+
UTC = pytz.timezone('UTC')
if single_event_dict.get('start') and single_event_dict.get('end'): # If not cancelled
if single_event_dict['start'].get('dateTime',False) and single_event_dict['end'].get('dateTime',False):
@@ -244,7 +418,7 @@ class google_calendar(osv.AbstractModel):
'location':single_event_dict.get('location',False),
'class':single_event_dict.get('visibility','public'),
'oe_update_date':update_date,
-# 'google_internal_event_id': single_event_dict.get('id',False),
+ # 'google_internal_event_id': single_event_dict.get('id',False),
})
if single_event_dict.get("recurrence",False):
@@ -261,16 +435,17 @@ class google_calendar(osv.AbstractModel):
res = calendar_event.create(cr, uid, result, context=context)
if context['curr_attendee']:
- self.pool.get('calendar.attendee').write(cr,uid,[context['curr_attendee']], {'oe_synchro_date':update_date,'google_internal_event_id': single_event_dict.get('id',False)},context)
+ self.pool['calendar.attendee'].write(cr,uid,[context['curr_attendee']], {'oe_synchro_date':update_date,'google_internal_event_id': single_event_dict.get('id',False)},context)
return res
def synchronize_events(self, cr, uid, ids, context=None):
- gc_obj = self.pool.get('google.calendar')
+ gc_obj = self.pool['google.calendar']
+ # Create all new events from OpenERP into Gmail, if that is not recurrent event
self.create_new_events(cr, uid, context=context)
self.bind_recurring_events_to_google(cr, uid, context)
- cr.commit()
+
res = self.update_events(cr, uid, context)
@@ -279,10 +454,9 @@ class google_calendar(osv.AbstractModel):
"url" : ''
}
- def create_new_events(self, cr, uid, context):
- gc_pool = self.pool.get('google.calendar')
-
- calendar_event = self.pool['calendar.event']
+ def create_new_events(self, cr, uid, context=None):
+ gc_pool = self.pool['google.calendar']
+ ev_obj = self.pool['calendar.event']
att_obj = self.pool['calendar.attendee']
user_obj = self.pool['res.users']
myPartnerID = user_obj.browse(cr,uid,uid,context=context).partner_id.id
@@ -290,75 +464,73 @@ class google_calendar(osv.AbstractModel):
context_norecurrent = context.copy()
context_norecurrent['virtual_id'] = False
- my_att_ids = att_obj.search(cr, uid,[('partner_id', '=', myPartnerID),('google_internal_event_id', '=', False)], context=context_norecurrent)
+ my_att_ids = att_obj.search(cr, uid,[ ('partner_id', '=', myPartnerID),
+ ('google_internal_event_id', '=', False),
+ '|',
+ ('event_id.date_deadline','>',self.get_start_time_to_synchro(cr,uid,context).strftime("%Y-%m-%d %H:%M:%S")),
+ ('event_id.end_date','>',self.get_start_time_to_synchro(cr,uid,context).strftime("%Y-%m-%d %H:%M:%S")),
+ ], context=context_norecurrent)
+
for att in att_obj.browse(cr,uid,my_att_ids,context=context):
if not att.event_id.recurrent_id or att.event_id.recurrent_id == 0:
response = self.create_an_event(cr,uid,att.event_id,context=context)
update_date = datetime.strptime(response['updated'],"%Y-%m-%dT%H:%M:%S.%fz")
- calendar_event.write(cr, uid, att.event_id.id, {'oe_update_date':update_date})
+ ev_obj.write(cr, uid, att.event_id.id, {'oe_update_date':update_date})
att_obj.write(cr, uid, [att.id], {'google_internal_event_id': response['id'], 'oe_synchro_date':update_date})
- cr.commit()
- return True
+ cr.commit()
- def get_empty_synchro_summarize(self) :
- return {
- #OPENERP
- 'OE_event' : False,
- 'OE_found' : False,
- 'OE_event_id' : False,
- 'OE_isRecurrence':False,
- 'OE_isInstance':False,
- 'OE_update':False,
- 'OE_status':False,
- 'OE_attendee_id': False,
- 'OE_synchro':False,
-
- #GOOGLE
- 'GG_event' : False,
- 'GG_found' : False,
- 'GG_isRecurrence':False,
- 'GG_isInstance':False,
- 'GG_update':False,
- 'GG_status':False,
-
- #TO_DO_IN_GOOGLE
- 'td_action':'', # create, update, delete, None
- #If 'td_action' in (create , update),
- # If td_source == OE
- # We create in google the event based on OpenERP
- # If td_source == GG
- # We create in OpenERP the event based on Gmail
- #
- #If 'td_action' in (delete),
- # If td_source == OE
- # We delete in OpenERP the event
- # If td_source == GG
- # We delete in Gmail the event
- # If td_source == ALL
- # We delete in openERP AND in Gmail the event
- 'td_source': '', # OE, GG, ALL
- 'td_comment':''
+ def bind_recurring_events_to_google(self, cr, uid, context):
+ ev_obj = self.pool['calendar.event']
+ att_obj = self.pool['calendar.attendee']
+ user_obj = self.pool['res.users']
+ myPartnerID = user_obj.browse(cr,uid,uid,context=context).partner_id.id
- }
+ context_norecurrent = context.copy()
+ context_norecurrent['virtual_id'] = False
+ context_norecurrent['active_test'] = False
- def update_events(self, cr, uid, context):
+ my_att_ids = att_obj.search(cr, uid,[('partner_id', '=', myPartnerID),('google_internal_event_id', '=', False)], context=context_norecurrent)
+
+ for att in att_obj.browse(cr,uid,my_att_ids,context=context):
+ if att.event_id.recurrent_id and att.event_id.recurrent_id > 0:
+ new_google_internal_event_id = False
+ source_event_record = ev_obj.browse(cr, uid, att.event_id.recurrent_id, context)
+ source_attendee_record_id = att_obj.search(cr, uid, [('partner_id','=', myPartnerID), ('event_id','=',source_event_record.id)], context=context)
+ source_attendee_record = att_obj.browse(cr, uid, source_attendee_record_id, context)[0]
+
+ if att.event_id.recurrent_id_date and source_event_record.allday and source_attendee_record.google_internal_event_id:
+ new_google_internal_event_id = source_attendee_record.google_internal_event_id +'_'+ att.event_id.recurrent_id_date.split(' ')[0].replace('-','')
+ elif att.event_id.recurrent_id_date and source_attendee_record.google_internal_event_id:
+ new_google_internal_event_id = source_attendee_record.google_internal_event_id +'_'+ att.event_id.recurrent_id_date.replace('-','').replace(' ','T').replace(':','') + 'Z'
+
+ if new_google_internal_event_id:
+ #TODO WARNING, NEED TO CHECK THAT EVENT and ALL instance NOT DELETE IN GMAIL BEFORE !
+ res = self.update_recurrent_event_exclu(cr, uid,new_google_internal_event_id, source_attendee_record.google_internal_event_id,att.event_id, context=context)
+ att_obj.write(cr, uid, [att.id], {'google_internal_event_id': new_google_internal_event_id}, context=context)
+ cr.commit()
+
+ def update_events(self, cr, uid, context=None):
if context is None:
context = {}
calendar_event = self.pool['calendar.event']
user_obj = self.pool['res.users']
att_obj = self.pool['calendar.attendee']
- myPartnerID = user_obj.browse(cr,uid,uid,context=context).partner_id.id
+ myPartnerID = user_obj.browse(cr, uid, uid, context=context).partner_id.id
context_novirtual = context.copy()
context_novirtual['virtual_id'] = False
context_novirtual['active_test'] = False
- all_event_from_google = self.get_event_dict(cr,uid,context=context)
- all_new_event_from_google = all_event_from_google.copy()
-
+ all_event_from_google = self.get_event_dict(cr, uid, context=context)
+
# Select all events from OpenERP which have been already synchronized in gmail
- my_att_ids = att_obj.search(cr, uid,[('partner_id', '=', myPartnerID),('google_internal_event_id', '!=', False)], context=context_novirtual)
+ my_att_ids = att_obj.search(cr, uid,[ ('partner_id', '=', myPartnerID),
+ ('google_internal_event_id', '!=', False),
+ '|',
+ ('event_id.date_deadline','>',self.get_start_time_to_synchro(cr,uid,context).strftime("%Y-%m-%d %H:%M:%S")),
+ ('event_id.end_date','>',self.get_start_time_to_synchro(cr,uid,context).strftime("%Y-%m-%d %H:%M:%S")),
+ ], context=context_novirtual)
event_to_synchronize = {}
for att in att_obj.browse(cr,uid,my_att_ids,context=context):
event = att.event_id
@@ -369,18 +541,19 @@ class google_calendar(osv.AbstractModel):
event_to_synchronize[base_event_id] = {}
if att.google_internal_event_id not in event_to_synchronize[base_event_id]:
- event_to_synchronize[base_event_id][att.google_internal_event_id] = self.get_empty_synchro_summarize()
-
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_attendee_id'] = att.id
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_event'] = event
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_found'] = True
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_event_id'] = event.id
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_isRecurrence'] = event.recurrency
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_isInstance'] = bool(event.recurrent_id and event.recurrent_id > 0)
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_update'] = event.oe_update_date
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_status'] = event.active
- event_to_synchronize[base_event_id][att.google_internal_event_id]['OE_synchro'] = att.oe_synchro_date
-
+ event_to_synchronize[base_event_id][att.google_internal_event_id] = SyncEvent()
+
+ ev_to_sync = event_to_synchronize[base_event_id][att.google_internal_event_id]
+
+ ev_to_sync.OE.attendee_id = att.id
+ ev_to_sync.OE.event = event
+ ev_to_sync.OE.found = True
+ ev_to_sync.OE.event_id = event.id
+ ev_to_sync.OE.isRecurrence = event.recurrency
+ ev_to_sync.OE.isInstance = bool(event.recurrent_id and event.recurrent_id > 0)
+ ev_to_sync.OE.update = event.oe_update_date
+ ev_to_sync.OE.status = event.active
+ ev_to_sync.OE.synchro = att.oe_synchro_date
for event in all_event_from_google.values():
event_id = event.get('id')
@@ -390,98 +563,28 @@ class google_calendar(osv.AbstractModel):
event_to_synchronize[base_event_id] = {}
if event_id not in event_to_synchronize[base_event_id]:
- event_to_synchronize[base_event_id][event_id] = self.get_empty_synchro_summarize()
-
- event_to_synchronize[base_event_id][event_id]['GG_event'] = event
- event_to_synchronize[base_event_id][event_id]['GG_found'] = True
- event_to_synchronize[base_event_id][event_id]['GG_isRecurrence'] = bool(event.get('recurrence',''))
- event_to_synchronize[base_event_id][event_id]['GG_isInstance'] = bool(event.get('recurringEventId',0))
- event_to_synchronize[base_event_id][event_id]['GG_update'] = event.get('updated',None) # if deleted, no date without browse event
- if event_to_synchronize[base_event_id][event_id]['GG_update']:
- event_to_synchronize[base_event_id][event_id]['GG_update'] =event_to_synchronize[base_event_id][event_id]['GG_update'].replace('T',' ').replace('Z','')
- event_to_synchronize[base_event_id][event_id]['GG_status'] = (event.get('status') != 'cancelled')
-
-
+ event_to_synchronize[base_event_id][event_id] = SyncEvent()
+
+ ev_to_sync = event_to_synchronize[base_event_id][event_id]
+
+ ev_to_sync.GG.event = event
+ ev_to_sync.GG.found = True
+ ev_to_sync.GG.isRecurrence = bool(event.get('recurrence',''))
+ ev_to_sync.GG.isInstance = bool(event.get('recurringEventId',0))
+ ev_to_sync.GG.update = event.get('updated',None) # if deleted, no date without browse event
+ if ev_to_sync.GG.update:
+ ev_to_sync.GG.update = ev_to_sync.GG.update.replace('T',' ').replace('Z','')
+ ev_to_sync.GG.status = (event.get('status') != 'cancelled')
+
######################
# PRE-PROCESSING #
######################
-
for base_event in event_to_synchronize:
for current_event in event_to_synchronize[base_event]:
- event = event_to_synchronize[base_event][current_event]
-
- #If event are already in Gmail and in OpenERP
- if event['OE_found'] and event['GG_found']:
- #If the event has been deleted from one side, we delete on other side !
- if event['OE_status'] != event['GG_status']:
- event['td_action'] = "DELETE"
- event['td_source'] = (event['OE_status'] and "OE") or (event['GG_status'] and "GG")
- #If event is not deleted !
- elif event['OE_status'] and event['GG_status']:
- if event['OE_update'].split('.')[0] != event['GG_update'].split('.')[0]:
- if event['OE_update'] < event['GG_update']:
- event['td_source'] = 'GG'
- elif event['OE_update'] > event['GG_update']:
- event['td_source'] = 'OE'
-
-
- if event['td_action'] != "None":
- if event['%s_isRecurrence' % event['td_source']]:
- if event['%s_status' % event['td_source']]:
- event['td_action'] = "UPDATE"
- event['td_comment'] = 'Only need to update, because i\'m active'
- else:
- event['td_action'] = "EXCLUDE"
- event['td_comment'] = 'Need to Exclude (Me = First event from recurrence) from recurrence'
-
- elif event['%s_isInstance' % event['td_source']]:
- event['td_action'] = "UPDATE"
- event['td_comment'] = 'Only need to update, because already an exclu'
- else:
- event['td_action'] = "UPDATE"
- event['td_comment'] = 'Simply Update... I\'m a single event'
-
- else:
- if not event['OE_synchro'] or event['OE_synchro'].split('.')[0] < event['OE_update'].split('.')[0]:
- event['td_source'] = 'OE'
- event['td_action'] = "UPDATE"
- event['td_comment'] = 'Event already updated by another user, but not synchro with my google calendar'
-
- else:
- event['td_action'] = "None"
- event['td_comment'] = 'Not update needed'
- else:
- event['td_action'] = "None"
- event['td_comment'] = "Both are already deleted"
- # New in openERP... Create on create_events of synchronize function
- elif event['OE_found'] and not event['GG_found']:
- #Has been deleted from gmail
- if event['OE_status']:
- event['td_source'] = 'OE'
- event['td_action'] = 'DELETE'
- event['td_comment'] = 'Removed from GOOGLE ?'
- else:
- event['td_action'] = "None"
- event['td_comment'] = "Already Deleted in gmail and unlinked in OpenERP"
- elif event['GG_found'] and not event['OE_found']:
- event['td_source'] = 'GG'
- if not event['GG_status'] and not event['GG_isInstance']:
- # don't need to make something... because event has been created and deleted before the synchronization
- event['td_action'] = 'None'
- event['td_comment'] = 'Nothing to do... Create and Delete directly'
-
- else:
- if event['GG_isInstance']:
- if event['%s_status' % event['td_source']]:
- event['td_action'] = "EXCLUDE"
- event['td_comment'] = 'Need to create the new exclu'
- else:
- event['td_action'] = "EXCLUDE"
- event['td_comment'] = 'Need to copy and Exclude'
- else:
- event['td_action'] = "CREATE"
- event['td_comment'] = 'New EVENT CREATE from GMAIL'
-
+ event_to_synchronize[base_event][current_event].compute_OP()
+ #print event_to_synchronize[base_event]
+ #print "========================================================"
+
######################
# DO ACTION #
######################
@@ -489,105 +592,62 @@ class google_calendar(osv.AbstractModel):
event_to_synchronize[base_event] = sorted(event_to_synchronize[base_event].iteritems(),key=operator.itemgetter(0))
for current_event in event_to_synchronize[base_event]:
cr.commit()
- event = current_event[1]
- #############
- ### DEBUG ###
- #############
-# if event['td_action'] and event['td_action'] != 'None':
-# print " Real Event %s (%s)" % (current_event[0],event['OE_event_id'])
-# print " Found OE:%5s vs GG: %5s" % (event['OE_found'],event['GG_found'])
-# print " Recurrence OE:%5s vs GG: %5s" % (event['OE_isRecurrence'],event['GG_isRecurrence'])
-# print " Instance OE:%5s vs GG: %5s" % (event['OE_isInstance'],event['GG_isInstance'])
-# print " Synchro OE: %10s " % (event['OE_synchro'])
-# print " Update OE: %10s " % (event['OE_update'])
-# print " Update GG: %10s " % (event['GG_update'])
-# print " Status OE:%5s vs GG: %5s" % (event['OE_status'],event['GG_status'])
-# print " Action %s" % (event['td_action'])
-# print " Source %s" % (event['td_source'])
-# print " comment %s" % (event['td_comment'])
-
- context['curr_attendee'] = event.get('OE_attendee_id',False)
-
- actToDo = event['td_action']
- actSrc = event['td_source']
- if not actToDo:
- raise ("#!? WHAT I NEED TO DO ????")
- else:
- if actToDo == 'None':
- continue
- elif actToDo == 'CREATE':
- context_tmp = context.copy()
- context_tmp['NewMeeting'] = True
- if actSrc == 'GG':
- res = self.update_from_google(cr, uid, False, event['GG_event'], "create", context=context_tmp)
- event['OE_event_id'] = res
- meeting = calendar_event.browse(cr,uid,res,context=context)
- attendee_record_id = att_obj.search(cr, uid, [('partner_id','=', myPartnerID), ('event_id','=',res)], context=context)
- self.pool.get('calendar.attendee').write(cr,uid,attendee_record_id, {'oe_synchro_date':meeting.oe_update_date,'google_internal_event_id': event['GG_event']['id']},context=context_tmp)
- elif actSrc == 'OE':
- raise "Should be never here, creation for OE is done before update !"
- #TODO Add to batch
- elif actToDo == 'UPDATE':
- if actSrc == 'GG':
- self.update_from_google(cr, uid, event['OE_event'], event['GG_event'], 'write', context)
- elif actSrc == 'OE':
- self.update_to_google(cr, uid, event['OE_event'], event['GG_event'], context)
- elif actToDo == 'EXCLUDE' :
- if actSrc == 'OE':
- self.delete_an_event(cr,uid,current_event[0],context=context)
- elif actSrc == 'GG':
- new_google_event_id = event['GG_event']['id'].split('_')[1]
- if 'T' in new_google_event_id:
- new_google_event_id = new_google_event_id.replace('T','')[:-1]
- else:
- new_google_event_id = new_google_event_id + "000000"
-
- if event['GG_status']:
- parent_event = {}
- parent_event['id'] = "%s-%s" % (event_to_synchronize[base_event][0][1].get('OE_event_id') , new_google_event_id)
- res = self.update_from_google(cr, uid, parent_event, event['GG_event'], "copy", context)
- else:
- if event_to_synchronize[base_event][0][1].get('OE_event_id'):
- parent_oe_id = event_to_synchronize[base_event][0][1].get('OE_event_id')
- calendar_event.unlink(cr,uid,"%s-%s" % (parent_oe_id,new_google_event_id),unlink_level=1,context=context)
-
- elif actToDo == 'DELETE':
- if actSrc == 'GG':
- self.delete_an_event(cr,uid,current_event[0],context=context)
- elif actSrc == 'OE':
- calendar_event.unlink(cr,uid,event['OE_event_id'],unlink_level=0,context=context)
- return True
+ event = current_event[1] # event is an Sync Event !
+
+ actToDo = event.OP
+ actSrc = event.OP.src
- def bind_recurring_events_to_google(self, cr, uid, context):
- calendar_event = self.pool['calendar.event']
- att_obj = self.pool.get('calendar.attendee')
- user_obj = self.pool['res.users']
- myPartnerID = user_obj.browse(cr,uid,uid,context=context).partner_id.id
+ # if not isinstance(actToDo, NothingToDo):
+ # print event
+
+ context['curr_attendee'] = event.OE.attendee_id
- context_norecurrent = context.copy()
- context_norecurrent['virtual_id'] = False
- context_norecurrent['active_test'] = False
-
- my_att_ids = att_obj.search(cr, uid,[('partner_id', '=', myPartnerID),('google_internal_event_id', '=', False)], context=context_norecurrent)
- for att in att_obj.browse(cr,uid,my_att_ids,context=context):
- if att.event_id.recurrent_id and att.event_id.recurrent_id > 0:
- new_google_internal_event_id = False
- source_event_record = calendar_event.browse(cr, uid, att.event_id.recurrent_id, context)
- source_attendee_record_id = att_obj.search(cr, uid, [('partner_id','=', myPartnerID), ('event_id','=',source_event_record.id)], context=context)
- source_attendee_record = att_obj.browse(cr, uid, source_attendee_record_id, context)
- if source_attendee_record:
- source_attendee_record = source_attendee_record[0]
-
- if att.event_id.recurrent_id_date and source_event_record.allday and source_attendee_record.google_internal_event_id:
- new_google_internal_event_id = source_attendee_record.google_internal_event_id +'_'+ att.event_id.recurrent_id_date.split(' ')[0].replace('-','')
- elif event.recurrent_id_date and source_attendee_record.google_internal_event_id:
- new_google_internal_event_id = source_attendee_record.google_internal_event_id +'_'+ att.event_id.recurrent_id_date.replace('-','').replace(' ','T').replace(':','') + 'Z'
+ if isinstance(actToDo, NothingToDo):
+ continue
+ elif isinstance(actToDo, Create):
+ context_tmp = context.copy()
+ context_tmp['NewMeeting'] = True
+ if actSrc == 'GG':
+ res = self.update_from_google(cr, uid, False, event.GG.event, "create", context=context_tmp)
+ event.OE.event_id = res
+ meeting = calendar_event.browse(cr,uid,res,context=context)
+ attendee_record_id = att_obj.search(cr, uid, [('partner_id','=', myPartnerID), ('event_id','=',res)], context=context)
+ self.pool['calendar.attendee'].write(cr, uid, attendee_record_id, {'oe_synchro_date':meeting.oe_update_date, 'google_internal_event_id':event.GG.event['id']}, context=context_tmp)
+ elif actSrc == 'OE':
+ raise "Should be never here, creation for OE is done before update !"
+ #TODO Add to batch
+ elif isinstance(actToDo, Update):
+ if actSrc == 'GG':
+ self.update_from_google(cr, uid, event.OE.event, event.GG.event, 'write', context)
+ elif actSrc == 'OE':
+ self.update_to_google(cr, uid, event.OE.event, event.GG.event, context)
+ elif isinstance(actToDo, Exclude):
+ if actSrc == 'OE':
+ self.delete_an_event(cr,uid,current_event[0],context=context)
+ elif actSrc == 'GG':
+ new_google_event_id = event.GG.event['id'].split('_')[1]
+ if 'T' in new_google_event_id:
+ new_google_event_id = new_google_event_id.replace('T','')[:-1]
+ else:
+ new_google_event_id = new_google_event_id + "000000"
- if new_google_internal_event_id:
- #TODO WARNING, NEED TO CHECK THAT EVENT and ALL instance NOT DELETE IN GMAIL BEFORE !
- res = self.update_recurrent_event_exclu(cr,uid,new_google_internal_event_id,source_attendee_record.google_internal_event_id,att.event_id,context=context)
- att_obj.write(cr, uid, [att.event_id.id], {'google_internal_event_id': new_google_internal_event_id})
+ if event.GG.status:
+ parent_event = {}
+ parent_event['id'] = "%s-%s" % (event_to_synchronize[base_event][0][1].OE.event_id , new_google_event_id)
+ res = self.update_from_google(cr, uid, parent_event, event.GG.event, "copy", context)
+ else:
+ if event_to_synchronize[base_event][0][1].OE.event_id:
+ parent_oe_id = event_to_synchronize[base_event][0][1].OE.event_id
+ calendar_event.unlink(cr,uid,"%s-%s" % (parent_oe_id,new_google_event_id),unlink_level=1,context=context)
+
+ elif isinstance(actToDo, Delete):
+ if actSrc == 'GG':
+ self.delete_an_event(cr,uid,current_event[0],context=context)
+ elif actSrc == 'OE':
+ calendar_event.unlink(cr,uid,event.OE.event_id,unlink_level=0,context=context)
+ return True
+
def check_and_sync(self, cr, uid, oe_event, google_event, context):
if datetime.strptime(oe_event.oe_update_date,"%Y-%m-%d %H:%M:%S.%f") > datetime.strptime(google_event['updated'],"%Y-%m-%dT%H:%M:%S.%fz"):
self.update_to_google(cr, uid, oe_event, google_event, context)
@@ -595,7 +655,7 @@ class google_calendar(osv.AbstractModel):
self.update_from_google(cr, uid, oe_event, google_event, 'write', context)
def get_sequence(self,cr,uid,instance_id,context=None):
- gs_pool = self.pool.get('google.service')
+ gs_pool = self.pool['google.service']
params = {
'fields': 'sequence',
@@ -613,7 +673,7 @@ class google_calendar(osv.AbstractModel):
#################################
def get_token(self,cr,uid,context=None):
- current_user = self.pool.get('res.users').browse(cr,uid,uid,context=context)
+ current_user = self.pool['res.users'].browse(cr,uid,uid,context=context)
if datetime.strptime(current_user.google_calendar_token_validity.split('.')[0], "%Y-%m-%d %H:%M:%S") < (datetime.now() + timedelta(minutes=1)):
self.do_refresh_token(cr,uid,context=context)
@@ -622,20 +682,20 @@ class google_calendar(osv.AbstractModel):
return current_user.google_calendar_token
def do_refresh_token(self,cr,uid,context=None):
- current_user = self.pool.get('res.users').browse(cr,uid,uid,context=context)
- gs_pool = self.pool.get('google.service')
+ current_user = self.pool['res.users'].browse(cr,uid,uid,context=context)
+ gs_pool = self.pool['google.service']
refresh = current_user.google_calendar_rtoken
- all_token = gs_pool._refresh_google_token_json(cr, uid, current_user.google_calendar_rtoken,self.STR_SERVICE,context=context)
+ all_token = gs_pool._refresh_google_token_json(cr, uid, current_user.google_calendar_rtoken, self.STR_SERVICE, context=context)
vals = {}
vals['google_%s_token_validity' % self.STR_SERVICE] = datetime.now() + timedelta(seconds=all_token.get('expires_in'))
vals['google_%s_token' % self.STR_SERVICE] = all_token.get('access_token')
- self.pool.get('res.users').write(cr,SUPERUSER_ID,uid,vals,context=context)
+ self.pool['res.users'].write(cr,SUPERUSER_ID,uid,vals,context=context)
def need_authorize(self,cr,uid,context=None):
- current_user = self.pool.get('res.users').browse(cr,uid,uid,context=context)
+ current_user = self.pool['res.users'].browse(cr,uid,uid,context=context)
return current_user.google_calendar_rtoken == False
def get_calendar_scope(self,RO=False):
@@ -643,22 +703,30 @@ class google_calendar(osv.AbstractModel):
return 'https://www.googleapis.com/auth/calendar%s' % (readonly)
def authorize_google_uri(self,cr,uid,from_url='http://www.openerp.com',context=None):
- url = self.pool.get('google.service')._get_authorize_uri(cr,uid,from_url,self.STR_SERVICE,scope=self.get_calendar_scope(),context=context)
+ url = self.pool['google.service']._get_authorize_uri(cr,uid,from_url,self.STR_SERVICE,scope=self.get_calendar_scope(),context=context)
return url
def can_authorize_google(self,cr,uid,context=None):
return self.pool['res.users'].has_group(cr, uid, 'base.group_erp_manager')
def set_all_tokens(self,cr,uid,authorization_code,context=None):
- gs_pool = self.pool.get('google.service')
+ gs_pool = self.pool['google.service']
all_token = gs_pool._get_google_token_json(cr, uid, authorization_code,self.STR_SERVICE,context=context)
vals = {}
vals['google_%s_rtoken' % self.STR_SERVICE] = all_token.get('refresh_token')
vals['google_%s_token_validity' % self.STR_SERVICE] = datetime.now() + timedelta(seconds=all_token.get('expires_in'))
vals['google_%s_token' % self.STR_SERVICE] = all_token.get('access_token')
- self.pool.get('res.users').write(cr,SUPERUSER_ID,uid,vals,context=context)
+ self.pool['res.users'].write(cr,SUPERUSER_ID,uid,vals,context=context)
+ def get_start_time_to_synchro(self, cr, uid, context=None) :
+ # WILL BE AN IR CONFIG PARAMETER - beginning from SAAS4
+ number_of_week = 13
+ return datetime.now()-timedelta(weeks=number_of_week)
+
+ def get_need_synchro_attendee(self, cr, uid, context=None):
+ # WILL BE AN IR CONFIG PARAMETER - beginning from SAAS4
+ return True
class res_users(osv.Model):
_inherit = 'res.users'
@@ -718,7 +786,6 @@ class calendar_attendee(osv.Model):
# If attendees are updated, we need to specify that next synchro need an action
# Except if it come from an update_from_google
if not context.get('curr_attendee', False) and not context.get('NewMeeting', False):
- self.pool.get('calendar.event').write(cr, uid, ref, {'oe_update_date':datetime.now()},context)
-
- return super(calendar_attendee, self).write(cr, uid, ids, vals, context=context)
+ self.pool['calendar.event'].write(cr, uid, ref, {'oe_update_date':datetime.now()},context)
+ return super(calendar_attendee, self).write(cr, uid, ids, vals, context=context) \ No newline at end of file
diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml
index d87cc6314e9..d4b84bab012 100644
--- a/addons/hr_holidays/hr_holidays_view.xml
+++ b/addons/hr_holidays/hr_holidays_view.xml
@@ -74,8 +74,8 @@
<label for="number_of_days_temp" string="Duration"/>
<div>
<group col="3" attrs="{'invisible': [('type', '=', 'add')]}">
- <field name="date_from" nolabel="1" on_change="onchange_date_from(date_to, date_from)" required="1" class="oe_inline"/><label string="-" class="oe_inline"/>
- <field name="date_to" nolabel="1" on_change="onchange_date_to(date_to, date_from)" required="1" class="oe_inline"/>
+ <field name="date_from" nolabel="1" on_change="onchange_date_from(date_to, date_from)" attrs="{'required':[('type', '=', 'remove')]}" class="oe_inline"/><label string="-" class="oe_inline"/>
+ <field name="date_to" nolabel="1" on_change="onchange_date_to(date_to, date_from)" attrs="{'required':[('type', '=', 'remove')]}" class="oe_inline"/>
</group>
<div>
<field name="number_of_days_temp" class="oe_inline"/> days
diff --git a/addons/hr_recruitment/i18n/zh_CN.po b/addons/hr_recruitment/i18n/zh_CN.po
index 9d8dd82a732..d403b334e55 100644
--- a/addons/hr_recruitment/i18n/zh_CN.po
+++ b/addons/hr_recruitment/i18n/zh_CN.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-02-11 15:26+0000\n"
-"Last-Translator: 开阖软件 Jeff Wang <jeff@osbzr.com>\n"
+"PO-Revision-Date: 2014-02-20 15:53+0000\n"
+"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-01-28 06:29+0000\n"
-"X-Generator: Launchpad (build 16914)\n"
+"X-Launchpad-Export-Date: 2014-02-21 05:48+0000\n"
+"X-Generator: Launchpad (build 16916)\n"
#. module: hr_recruitment
#: help:hr.applicant,active:0
@@ -33,24 +33,24 @@ msgstr "必备条件"
#. module: hr_recruitment
#: view:hr.applicant:0
msgid "Application Summary"
-msgstr ""
+msgstr "申请摘要"
#. module: hr_recruitment
#: view:hr.applicant:0
msgid "Start Interview"
-msgstr ""
+msgstr "开始面试"
#. module: hr_recruitment
#: view:hr.applicant:0
msgid "Mobile:"
-msgstr ""
+msgstr "手机:"
#. module: hr_recruitment
#: help:hr.recruitment.stage,fold:0
msgid ""
"This stage is not visible, for example in status bar or kanban view, when "
"there are no records in that stage to display."
-msgstr ""
+msgstr "此阶段是不可见的。例如:状态栏或看板视图中,在该阶段中 不存在可显示的记录。"
#. module: hr_recruitment
#: model:hr.recruitment.degree,name:hr_recruitment.degree_graduate
@@ -99,7 +99,7 @@ msgstr "暂停的职位"
#: view:hr.applicant:0
#: field:hr.applicant,message_unread:0
msgid "Unread Messages"
-msgstr ""
+msgstr "未读消息"
#. module: hr_recruitment
#: field:hr.applicant,company_id:0
@@ -157,7 +157,7 @@ msgstr ""
#: model:ir.actions.act_window,name:hr_recruitment.crm_case_categ0_act_job
#: model:ir.ui.menu,name:hr_recruitment.menu_crm_case_categ0_act_job
msgid "Applications"
-msgstr ""
+msgstr "求职申请"
#. module: hr_recruitment
#: field:hr.applicant,day_open:0
@@ -167,12 +167,12 @@ msgstr "开启天数"
#. module: hr_recruitment
#: field:hr.applicant,emp_id:0
msgid "employee"
-msgstr ""
+msgstr "雇员"
#. module: hr_recruitment
#: field:hr.config.settings,fetchmail_applicants:0
msgid "Create applicants from an incoming email account"
-msgstr ""
+msgstr "从电子邮件帐号接收的邮件创建求职申请"
#. module: hr_recruitment
#: view:hr.recruitment.report:0
@@ -184,7 +184,7 @@ msgstr "天数"
#: view:hr.recruitment.partner.create:0
#: model:ir.actions.act_window,name:hr_recruitment.action_hr_recruitment_partner_create
msgid "Create Contact"
-msgstr ""
+msgstr "新建联系人"
#. module: hr_recruitment
#: view:hr.applicant:0
@@ -808,7 +808,7 @@ msgstr "生效"
#: view:hr.recruitment.report:0
#: field:hr.recruitment.report,nbr:0
msgid "# of Applications"
-msgstr ""
+msgstr "个申请"
#. module: hr_recruitment
#: model:ir.actions.act_window,help:hr_recruitment.hr_recruitment_stage_act
@@ -1251,7 +1251,7 @@ msgstr "开始"
#. module: hr_recruitment
#: view:board.board:0
msgid "Applications to be Processed"
-msgstr ""
+msgstr "待处理的申请"
#. module: hr_recruitment
#: view:hr.applicant:0
diff --git a/addons/hr_timesheet_sheet/i18n/zh_CN.po b/addons/hr_timesheet_sheet/i18n/zh_CN.po
index a5871aa0fab..532fb4af074 100644
--- a/addons/hr_timesheet_sheet/i18n/zh_CN.po
+++ b/addons/hr_timesheet_sheet/i18n/zh_CN.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:04+0000\n"
-"PO-Revision-Date: 2012-11-01 08:13+0000\n"
-"Last-Translator: 盈通 ccdos <ccdos@intoerp.com>\n"
+"PO-Revision-Date: 2014-02-20 15:57+0000\n"
+"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2014-01-28 06:13+0000\n"
-"X-Generator: Launchpad (build 16914)\n"
+"X-Launchpad-Export-Date: 2014-02-21 05:48+0000\n"
+"X-Generator: Launchpad (build 16916)\n"
#. module: hr_timesheet_sheet
#: field:hr.analytic.timesheet,sheet_id:0
@@ -33,7 +33,7 @@ msgstr "服务"
#: field:hr.timesheet.report,quantity:0
#: field:timesheet.report,quantity:0
msgid "Time"
-msgstr ""
+msgstr "时间"
#. module: hr_timesheet_sheet
#: help:hr.config.settings,timesheet_max_difference:0
@@ -92,7 +92,7 @@ msgstr "# 成本"
#. module: hr_timesheet_sheet
#: field:hr_timesheet_sheet.sheet,message_unread:0
msgid "Unread Messages"
-msgstr ""
+msgstr "未读消息"
#. module: hr_timesheet_sheet
#: view:hr.timesheet.report:0
@@ -133,7 +133,7 @@ msgstr "日期到"
#. module: hr_timesheet_sheet
#: view:hr_timesheet_sheet.sheet:0
msgid "to"
-msgstr ""
+msgstr "到"
#. module: hr_timesheet_sheet
#: model:process.node,note:hr_timesheet_sheet.process_node_invoiceonwork0
@@ -145,7 +145,7 @@ msgstr "根据计工单"
#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:398
#, python-format
msgid "You cannot modify an entry in a confirmed timesheet."
-msgstr ""
+msgstr "你不能修改已确认的时间表条目"
#. module: hr_timesheet_sheet
#: view:hr.timesheet.report:0
@@ -188,13 +188,13 @@ msgstr "拒绝"
#: view:hr_timesheet_sheet.sheet:0
#: model:ir.actions.act_window,name:hr_timesheet_sheet.act_hr_timesheet_sheet_sheet_2_hr_analytic_timesheet
msgid "Timesheet Activities"
-msgstr ""
+msgstr "时间表活动"
#. module: hr_timesheet_sheet
#: code:addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py:38
#, python-format
msgid "Please create an employee and associate it with this user."
-msgstr ""
+msgstr "请创建员工信息并关联到此用户"
#. module: hr_timesheet_sheet
#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:402
@@ -202,7 +202,7 @@ msgstr ""
#, python-format
msgid ""
"You cannot enter an attendance date outside the current timesheet dates."
-msgstr ""
+msgstr "无法录入当前时间表以外的出勤日期"
#. module: hr_timesheet_sheet
#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:205
@@ -226,7 +226,7 @@ msgstr ""
#. module: hr_timesheet_sheet
#: field:hr_timesheet_sheet.sheet,message_ids:0
msgid "Messages"
-msgstr ""
+msgstr "消息"
#. module: hr_timesheet_sheet
#: help:hr_timesheet_sheet.sheet,state:0
@@ -252,7 +252,7 @@ msgstr ""
#: code:addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py:38
#, python-format
msgid "Error!"
-msgstr ""
+msgstr "错误!"
#. module: hr_timesheet_sheet
#: field:hr.config.settings,timesheet_max_difference:0
@@ -307,7 +307,7 @@ msgstr "员工计工单"
#: code:addons/hr_timesheet_sheet/hr_timesheet_sheet.py:215
#, python-format
msgid "Invalid Action!"
-msgstr ""
+msgstr "无效的动作!"
#. module: hr_timesheet_sheet
#: view:hr.timesheet.report:0
diff --git a/addons/hw_escpos/controllers/main.py b/addons/hw_escpos/controllers/main.py
index 23195857a9c..e950950a985 100644
--- a/addons/hw_escpos/controllers/main.py
+++ b/addons/hw_escpos/controllers/main.py
@@ -95,6 +95,9 @@ class EscposDriver(Thread):
_logger.warning('ESC/POS Device Disconnected: '+message)
def run(self):
+ if not escpos:
+ _logger.error('ESC/POS cannot initialize, please verify system dependencies.')
+ return
while True:
try:
timestamp, task, data = self.queue.get(True)
diff --git a/addons/hw_proxy/doc/index.rst b/addons/hw_proxy/doc/index.rst
index b5bbf71a2ab..c1faf25961c 100644
--- a/addons/hw_proxy/doc/index.rst
+++ b/addons/hw_proxy/doc/index.rst
@@ -5,6 +5,10 @@ PosBox Documentation
Posbox Setup Guide
==================
+.. image:: _images/posbox_setup.png
+ :width: 100%
+ :align: center
+
Prerequisites
-------------
@@ -20,64 +24,64 @@ You will need :
- A local network set up with DHCP ( this is the default setting )
- A RJ45 Ethrnet Cable
- An Epson USB TM-T20 Printer or another compatible printer.
-- A Honewell Voyager USB Barcode Scanner or another compatible scanner.
+- A Honeywell Eclipse USB Barcode Scanner or another compatible scanner.
- An Epson compatible cash drawer.
-Setup
------
+Step By Step Setup Guide
+------------------------
.. image:: _images/posbox_doc_schema.png
:width: 100%
:align: center
-1) Power the PosBox.
-~~~~~~~~~~~~~~~~~~~~
+Power the PosBox.
+~~~~~~~~~~~~~~~~
Plug the PosBox to the 2A Power Adapter, a bright red status led should
light up.
-2) Connect it to the Local Network
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Connect it to the Local Network
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Connect the PosBox to the Local Network with the RJ45 Cable. Make sure
You connect the PosBox to the same Network as your POS device. Once
connected a bright yellow status led should light up, and a green status
led should flash.
-3) Connect the USB Printer
-~~~~~~~~~~~~~~~~~~~~~~~~~~
+Connect the USB Printer
+~~~~~~~~~~~~~~~~~~~~~~~
Put a paper roll in the printer, power it up, then connect it to one of
the PosBox's USB port
-4) Connect the cash drawer
-~~~~~~~~~~~~~~~~~~~~~~~~~~
+Connect the cash drawer
+~~~~~~~~~~~~~~~~~~~~~~~
The cash drawer should be connected to the printer with the RJ25 cable
-5) Connect the USB Barcode Scanner
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Connect the USB Barcode Scanner
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Connect the usb barcode scanner to one of the PosBox's USB port. The
Barcode Scanner should immediately light up and emit a loud beep.
-6) Configure the USB Barcode Scanner
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Configure the USB Barcode Scanner
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The barcode scanner should be configured in QWERTY and emit a new line /
return symbol after each scan. This is most likely the default
configuration of your barcode scanner.
-7) Make sure the PosBox is ready
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Make sure the PosBox is ready
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Once powered, The PosBox needs less than a minute to boot. Once the
PosBox is ready, it should print a status receipt with its IP Adress.
Also, the last status led, just after the red power status led, should
be permanently lit green.
-8) Set up the Point of Sale
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Setup the Point of Sale
+~~~~~~~~~~~~~~~~~~~~~~~~
Make sure to activate the 'Print via Proxy', 'Remote Scanning' or
'Cashdrawer' options in the Point of Sale configuration. If you are
@@ -87,8 +91,12 @@ was printed on the status receipt.
If you are running multiple Point of Sales on the same PosBox, make sure
that only one of them has Remote Scanning activated.
-9) Launch the Point of Sale.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+If you manually specify the PosBox's IP address, you must configure your
+network to make sure the PosBox's IP address doesn't change. Please
+refer to your Router documentation.
+
+Launch the Point of Sale.
+~~~~~~~~~~~~~~~~~~~~~~~~~
If you didn't spcecify the PosBox's IP address in the config, the POS
will need some time to perform a network scan to find the PosBox. This
@@ -97,9 +105,21 @@ is only done once.
The Point of Sale is now connected to the PosBox and your Hardware
should be ready to use.
+Multi-Pos Configuration
+-----------------------
+The advised way to setup a multi Point-of-Sale shop is to have one PosBox
+per Point-of-Sale. In this case it is mandatory to manually specify the
+IP address of each PosBox in each Point of Sale. You must also configure
+your network to make sure the PosBox's IP address doesn't change. Please
+refer to your Router documentation.
+
PosBoxless Setup Guide
======================
+.. image:: _images/posboxless_setup.png
+ :width: 100%
+ :align: center
+
If you are running your Point of Sale on a debian-based linux
distribution, you do not need the PosBox as you can run its software
locally. However the installation process is not foolproof. You'll need
@@ -111,15 +131,15 @@ Prerequisites
-------------
- A debian based linux distribution (Debian, Ubuntu, Mint, etc.)
-- A running trunk version of the OpenERP server
+- A running OpenERP server (version trunk or saas-3 or 8.0 or later)
- You must uninstall any esc-pos printer driver as it will conflict
with OpenERP's built-in driver.
-Setup
------
+Step By Step Setup Guide
+------------------------
-1) Extra dependencies
-~~~~~~~~~~~~~~~~~~~~~
+Extra dependencies
+~~~~~~~~~~~~~~~~~~
The driver modules requires the installation of new python modules:
@@ -128,14 +148,14 @@ The driver modules requires the installation of new python modules:
$ sudo pip install pyserial
$ sudo pip install --pre pyusb
-2) Database Setup
-~~~~~~~~~~~~~~~~~
+Database Setup
+~~~~~~~~~~~~~~
You must create a database called ``posbox`` with the modules
``hw_proxy``, ``hw_escpos``, and ``hw_scanner`` installed.
-3) Access Rights
-~~~~~~~~~~~~~~~~
+Access Rights
+~~~~~~~~~~~~~
The drivers need raw access to the printer and barcode scanner devices.
Doing so requires a bit system administration. First we are going to
@@ -163,8 +183,8 @@ following content:
Then you need to reboot your machine.
-4) Start the local OpenERP Installl
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Start the local OpenERP Installl
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We must launch the OpenERP server on the port ``8069`` with the correct
database settings:
@@ -174,8 +194,8 @@ database settings:
$ ./server/openerp-server --addons-path=addons,web/addons --db-filter='^posbox$' \
--xmlrpc-port=8069 -d posbox
-5) Check that everything works
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Check that everything works
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
Plug all your hardware to your machine's USB ports, and go to
``http://localhost/hw_proxy/status`` refresh the page a few times and
@@ -184,20 +204,19 @@ errors are: The paths on the distribution differ from the paths expected
by the drivers, another process has grabbed exclusive access to the
devices, the udev rules do not apply or a superceeded by others.
-5) Automatically Start OpenERP
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Automatically Start OpenERP
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
You must now make sure that this OpenERP install is automatically
started after boot. There are various ways to do so, and how to do it
depends on your particular setup. We use *systemd* on the PosBox, but
*upstart* or *sysvinit* are other options.
-6) Set up the Point of Sale
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Setup the Point of Sale
+~~~~~~~~~~~~~~~~~~~~~~~~
-Make sure that one of the posbox Make sure the IP Adress field in the
-POS Config is either ``127.0.0.1`` or ``localhost`` or simply leave it
-empty.
+The IP Adress field in the POS Config must be either ``127.0.0.1``
+or ``localhost``. You can also leave it empty.
PosBox Technical Documentation
==============================
@@ -231,7 +250,7 @@ Compatible Peripherals
- Barcode Scannners:
- Metapace S61
- - Honeywell Voyager 95x0 Series.
+ - Honeywell Eclipse or Voyager 95x0 Series.
- Most other barcode scanners should work out of the box. Some
barcode scanners need more power than the PosBox can provide and
must be plugged in a self-powered USB HUB. This is the case for
@@ -265,6 +284,9 @@ found in instead ``/var/logs/syslog``
We removed all graphical software from the default install to reduce to
image size but nothing prevents you from reinstalling them.
+Accessing the PosBox
+--------------------
+
Local Access
~~~~~~~~~~~~
@@ -284,8 +306,8 @@ Remote Access
If you have the PosBox's IP address and a SSH client you can access the
PosBox's system remotely. The login / password are ``pi``/``admin``
-Unsupported Printers
-~~~~~~~~~~~~~~~~~~~~
+Getting Unsupported Printers to Work
+------------------------------------
The PosBox should be able to print to any ESC-POS printer, not just the
Epson TM-T20. If You have such a printer, you can activate it with the
@@ -305,7 +327,7 @@ following steps:
supported devices.
Updating The PosBox Software
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+----------------------------
The best way to update the PosBox software is to download a new version
of the image and flash the SD-Card with it. This operation is described
@@ -315,10 +337,10 @@ raspberry pi image to the latest one found at
``http://nightly.openerp.com/trunk/posbox/``
Troubleshoot
-------------
+============
The POS cannot connect to the PosBox.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-------------------------------------
- The easiest way to make sure the PosBox is properly set-up is to turn
it on with the printer plugged in as it will print a receipt
@@ -346,7 +368,7 @@ The POS cannot connect to the PosBox.
the PosBox's ip address in the POS config.
The Barcode Scanner is not working
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+----------------------------------
- The PosBox needs a 2A power supply to work with some barcode
scanners. If you are not using the provided power supply, make sure
@@ -357,15 +379,17 @@ The Barcode Scanner is not working
- Some poorly built barcode scanners do not advertise themselves as
barcode scanners but as a usb keyboard instead, and will not be
recognized by the PosBox.
+- The barcode scanner must be configured in US QWERTY and emit a linefeed
+ after each codebar.
The Barcode Scanner is not working reliably
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-------------------------------------------
- Make sure that no more than one device with 'Scan via Proxy' enabled
are connected to the PosBox at the same time.
Printing the receipt takes too much time.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------------
- A small delay before the first print is expected, as the PosBox will
do some preprocessing to speed up the next printings. If you suffer
@@ -373,14 +397,14 @@ Printing the receipt takes too much time.
between the POS and the PosBox.
Some characters are not correctly printed on the receipt.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+---------------------------------------------------------
- The PosBox does not support all languages and characters. It
currently supports latin and cyrillic based scripts, with basic
japanese support.
The Printer is Offline
-~~~~~~~~~~~~~~~~~~~~~~
+----------------------
- The PosBox only supports EPSON TM-T20 printers. Make sure the printer
is connected, powered, has enough paper and has its lid closed, and
@@ -388,8 +412,41 @@ The Printer is Offline
support.
The Cashdrawer does not open.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------
- The cashdrawer should be connected to the printer and should be
activated in the POS Configuration
+Credits
+=======
+The PosBox project was developped by Frédéric van der Essen with the
+kind help of Gary Malherbe, Fabien Meghazi, Nicolas Wisniewsky,
+Dimitri Del Marmol and Antony Lesuisse.
+
+This development would not have been possible without the Indiegogo
+campaign and those who contributed to it. Special thanks goes to the
+partners who backed the campaign with founding partner bundles:
+
+- Camptocamp
+- BHC
+- openBig
+- Eeezee-IT
+- Solarsis LDA
+- ACSONE
+- Vauxoo
+- Ekomurz
+- Datalp
+- Dao Systems
+- Eggs Solutions
+- OpusVL
+
+And also the partners who've backed the development with the Founding
+PosBox Bundle:
+
+- Willow IT
+- E\. Akhalwaya & Sons
+- Multibase
+- Mindesa
+- bpso.biz
+- Shine IT.
+
diff --git a/addons/hw_proxy/doc/manual.pdf b/addons/hw_proxy/doc/manual.pdf
new file mode 100644
index 00000000000..5a55c56654d
--- /dev/null
+++ b/addons/hw_proxy/doc/manual.pdf
Binary files differ
diff --git a/addons/im/security/ir.model.access.csv b/addons/im/security/ir.model.access.csv
index 5137990498a..d35d694661a 100644
--- a/addons/im/security/ir.model.access.csv
+++ b/addons/im/security/ir.model.access.csv
@@ -1,4 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_im_message,im.message,model_im_message,,1,0,1,0
access_im_user,im.user,model_im_user,,1,1,1,0
-access_im_session,im.session,model_im_session,,1,0,0,0 \ No newline at end of file
+access_im_session,im.session,model_im_session,,1,1,1,0 \ No newline at end of file
diff --git a/addons/mail/data/mail_data.xml b/addons/mail/data/mail_data.xml
index e1ca797670b..4a2dc6d06f0 100644
--- a/addons/mail/data/mail_data.xml
+++ b/addons/mail/data/mail_data.xml
@@ -54,6 +54,7 @@
<!-- Discussion subtype for messaging / Chatter -->
<record id="mt_comment" model="mail.message.subtype">
<field name="name">Discussions</field>
+ <field name="sequence" eval="0"/>
</record>
</data>
</openerp>
diff --git a/addons/mail/mail_message_subtype.py b/addons/mail/mail_message_subtype.py
index bef6e427c3b..bae4d941a52 100644
--- a/addons/mail/mail_message_subtype.py
+++ b/addons/mail/mail_message_subtype.py
@@ -29,6 +29,8 @@ class mail_message_subtype(osv.osv):
on the Wall. """
_name = 'mail.message.subtype'
_description = 'Message subtypes'
+ _order = 'sequence, id'
+
_columns = {
'name': fields.char('Message Type', required=True, translate=True,
help='Message subtype gives a more precise type on the message, '\
@@ -50,7 +52,11 @@ class mail_message_subtype(osv.osv):
help="Model the subtype applies to. If False, this subtype applies to all models."),
'default': fields.boolean('Default',
help="Activated by default when subscribing."),
+ 'sequence': fields.integer('Sequence', help="Used to order subtypes."),
+ 'hidden': fields.boolean('Hidden', help="Hide the subtype in the follower options")
}
+
_defaults = {
'default': True,
+ 'sequence': 1,
}
diff --git a/addons/mail/mail_message_subtype.xml b/addons/mail/mail_message_subtype.xml
index a79f5815bd1..efcb81b5794 100644
--- a/addons/mail/mail_message_subtype.xml
+++ b/addons/mail/mail_message_subtype.xml
@@ -9,6 +9,7 @@
<field name="arch" type="xml">
<tree string="Subtype">
<field name="name"/>
+ <field name="sequence"/>
<field name="res_model"/>
<field name="default"/>
</tree>
@@ -22,12 +23,18 @@
<form string="Email message" version="7.0">
<sheet>
<group>
- <field name="name"/>
- <field name="res_model"/>
- <field name="default"/>
- <field name="description"/>
- <field name="parent_id"/>
- <field name="relation_field"/>
+ <group string='Description'>
+ <field name="name"/>
+ <field name="sequence"/>
+ <field name="res_model"/>
+ <field name="description"/>
+ <field name="default"/>
+ <field name="hidden"/>
+ </group>
+ <group string='Auto subscription'>
+ <field name="parent_id"/>
+ <field name="relation_field"/>
+ </group>
</group>
</sheet>
</form>
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index 9a8adee31c3..876d10d0f2c 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -20,6 +20,7 @@
##############################################################################
import base64
+from collections import OrderedDict
import datetime
import dateutil
import email
@@ -185,8 +186,17 @@ class mail_thread(osv.AbstractModel):
# find current model subtypes, add them to a dictionary
subtype_obj = self.pool.get('mail.message.subtype')
- subtype_ids = subtype_obj.search(cr, uid, ['|', ('res_model', '=', self._name), ('res_model', '=', False)], context=context)
- subtype_dict = dict((subtype.name, dict(default=subtype.default, followed=False, id=subtype.id)) for subtype in subtype_obj.browse(cr, uid, subtype_ids, context=context))
+ subtype_ids = subtype_obj.search(
+ cr, uid, [
+ '&', ('hidden', '=', False), '|', ('res_model', '=', self._name), ('res_model', '=', False)
+ ], context=context)
+ subtype_dict = OrderedDict(
+ (subtype.name, {
+ 'default': subtype.default,
+ 'followed': False,
+ 'parent_model': subtype.parent_id and subtype.parent_id.res_model or self._name,
+ 'id': subtype.id}
+ ) for subtype in subtype_obj.browse(cr, uid, subtype_ids, context=context))
for id in ids:
res[id]['message_subtype_data'] = subtype_dict.copy()
@@ -348,11 +358,7 @@ class mail_thread(osv.AbstractModel):
message_follower_ids = values.get('message_follower_ids') or [] # webclient can send None or False
message_follower_ids.append([4, pid])
values['message_follower_ids'] = message_follower_ids
- # add operation to ignore access rule checking for subscription
- context_operation = dict(context, operation='create')
- else:
- context_operation = context
- thread_id = super(mail_thread, self).create(cr, uid, values, context=context_operation)
+ thread_id = super(mail_thread, self).create(cr, uid, values, context=context)
# automatic logging unless asked not to (mainly for various testing purpose)
if not context.get('mail_create_nolog'):
@@ -369,10 +375,11 @@ class mail_thread(osv.AbstractModel):
track_ctx = dict(context)
if 'lang' not in track_ctx:
track_ctx['lang'] = self.pool.get('res.users').browse(cr, uid, uid, context=context).lang
- tracked_fields = self._get_tracked_fields(cr, uid, values.keys(), context=track_ctx)
- if tracked_fields:
- initial_values = {thread_id: dict((item, False) for item in tracked_fields)}
- self.message_track(cr, uid, [thread_id], tracked_fields, initial_values, context=track_ctx)
+ if not context.get('mail_notrack'):
+ tracked_fields = self._get_tracked_fields(cr, uid, values.keys(), context=track_ctx)
+ if tracked_fields:
+ initial_values = {thread_id: dict((item, False) for item in tracked_fields)}
+ self.message_track(cr, uid, [thread_id], tracked_fields, initial_values, context=track_ctx)
return thread_id
def write(self, cr, uid, ids, values, context=None):
@@ -396,7 +403,11 @@ class mail_thread(osv.AbstractModel):
result = super(mail_thread, self).write(cr, uid, ids, values, context=context)
self.message_auto_subscribe(cr, uid, ids, values.keys(), context=context, values=values)
- # Perform the tracking
+ if not context.get('mail_notrack'):
+ # Perform the tracking
+ tracked_fields = self._get_tracked_fields(cr, uid, values.keys(), context=context)
+ else:
+ tracked_fields = None
if tracked_fields:
self.message_track(cr, uid, ids, tracked_fields, initial_values, context=track_ctx)
return result
@@ -417,6 +428,9 @@ class mail_thread(osv.AbstractModel):
return res
def copy(self, cr, uid, id, default=None, context=None):
+ # avoid tracking multiple temporary changes during copy
+ context = dict(context or {}, mail_notrack=True)
+
default = default or {}
default['message_ids'] = []
default['message_follower_ids'] = []
@@ -728,13 +742,15 @@ class mail_thread(osv.AbstractModel):
# Private message: should not contain any thread_id
if not model and thread_id:
if assert_model:
- assert thread_id == 0, 'Routing: posting a message without model should be with a null res_id (private message), received %s.' % thread_id
- _warn('posting a message without model should be with a null res_id (private message), received %s, resetting thread_id' % thread_id)
+ if thread_id:
+ raise ValueError('Routing: posting a message without model should be with a null res_id (private message), received %s.' % thread_id)
+ _warn('posting a message without model should be with a null res_id (private message), received %s resetting thread_id' % thread_id)
thread_id = 0
# Private message: should have a parent_id (only answers)
if not model and not message_dict.get('parent_id'):
if assert_model:
- assert message_dict.get('parent_id'), 'Routing: posting a message without model should be with a parent_id (private mesage).'
+ if not message_dict.get('parent_id'):
+ raise ValueError('Routing: posting a message without model should be with a parent_id (private mesage).')
_warn('posting a message without model should be with a parent_id (private mesage), skipping')
return ()
@@ -763,7 +779,10 @@ class mail_thread(osv.AbstractModel):
# New Document: check model accepts the mailgateway
if not thread_id and model and not hasattr(model_pool, 'message_new'):
if assert_model:
- assert hasattr(model_pool, 'message_new'), 'Model %s does not accept document creation, crashing' % model
+ if not hasattr(model_pool, 'message_new'):
+ raise ValueError(
+ 'Model %s does not accept document creation, crashing' % model
+ )
_warn('model %s does not accept document creation, skipping' % model)
return ()
@@ -824,8 +843,11 @@ class mail_thread(osv.AbstractModel):
to which this mail should be attached. Only used if the message
does not reply to an existing thread and does not match any mail alias.
:return: list of [model, thread_id, custom_values, user_id, alias]
+
+ :raises: ValueError, TypeError
"""
- assert isinstance(message, Message), 'message must be an email.message.Message at this point'
+ if not isinstance(message, Message):
+ raise TypeError('message must be an email.message.Message at this point')
mail_msg_obj = self.pool['mail.message']
fallback_model = model
@@ -943,9 +965,11 @@ class mail_thread(osv.AbstractModel):
return [route]
# AssertionError if no routes found and if no bounce occured
- assert False, \
- "No possible route found for incoming message from %s to %s (Message-Id %s:)." \
- "Create an appropriate mail.alias or force the destination model." % (email_from, email_to, message_id)
+ raise ValueError(
+ 'No possible route found for incoming message from %s to %s (Message-Id %s:). '
+ 'Create an appropriate mail.alias or force the destination model.' %
+ (email_from, email_to, message_id)
+ )
def message_route_process(self, cr, uid, message, message_dict, routes, context=None):
# postpone setting message_dict.partner_ids after message_post, to avoid double notifications
@@ -956,9 +980,11 @@ class mail_thread(osv.AbstractModel):
context.update({'thread_model': model})
if model:
model_pool = self.pool[model]
- assert thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new'), \
- "Undeliverable mail with Message-Id %s, model %s does not accept incoming emails" % \
- (message_dict['message_id'], model)
+ if not (thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new')):
+ raise ValueError(
+ "Undeliverable mail with Message-Id %s, model %s does not accept incoming emails" %
+ (message_dict['message_id'], model)
+ )
# disabled subscriptions during message_new/update to avoid having the system user running the
# email gateway become a follower of all inbound messages
@@ -968,7 +994,8 @@ class mail_thread(osv.AbstractModel):
else:
thread_id = model_pool.message_new(cr, user_id, message_dict, custom_values, context=nosub_ctx)
else:
- assert thread_id == 0, "Posting a message without model should be with a null res_id, to create a private message."
+ if thread_id:
+ raise ValueError("Posting a message without model should be with a null res_id, to create a private message.")
model_pool = self.pool.get('mail.thread')
if not hasattr(model_pool, 'message_post'):
context['thread_model'] = model
@@ -1552,18 +1579,20 @@ class mail_thread(osv.AbstractModel):
""" Add partners to the records followers. """
if context is None:
context = {}
+ # not necessary for computation, but saves an access right check
+ if not partner_ids:
+ return True
mail_followers_obj = self.pool.get('mail.followers')
subtype_obj = self.pool.get('mail.message.subtype')
user_pid = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
if set(partner_ids) == set([user_pid]):
- if context.get('operation', '') != 'create':
- try:
- self.check_access_rights(cr, uid, 'read')
- self.check_access_rule(cr, uid, ids, 'read')
- except (osv.except_osv, orm.except_orm):
- return False
+ try:
+ self.check_access_rights(cr, uid, 'read')
+ self.check_access_rule(cr, uid, ids, 'read')
+ except (osv.except_osv, orm.except_orm):
+ return False
else:
self.check_access_rights(cr, uid, 'write')
self.check_access_rule(cr, uid, ids, 'write')
@@ -1608,6 +1637,9 @@ class mail_thread(osv.AbstractModel):
def message_unsubscribe(self, cr, uid, ids, partner_ids, context=None):
""" Remove partners from the records followers. """
+ # not necessary for computation, but saves an access right check
+ if not partner_ids:
+ return True
user_pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0]
if set(partner_ids) == set([user_pid]):
self.check_access_rights(cr, uid, 'read')
diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css
index bfae7571a9c..614077b65a2 100644
--- a/addons/mail/static/src/css/mail.css
+++ b/addons/mail/static/src/css/mail.css
@@ -115,6 +115,9 @@
.openerp .oe_mail .oe_msg .oe_msg_content .oe_msg_body p {
margin-bottom: 0px;
}
+.openerp .oe_mail .oe_msg .oe_msg_content .oe_msg_body pre {
+ white-space: pre-wrap;
+}
.openerp .oe_mail .oe_msg .oe_msg_content .oe_msg_body * {
text-overflow:ellipsis;
word-wrap: break-word;
@@ -757,4 +760,8 @@
.openerp .oe_sidebar_suggestion .oe_suggest_items:hover a.oe_suggestion_remove_item {
visibility: visible;
}
+.subtype-border {
+ border-bottom: 1px solid #dddddd;
+ margin-bottom: 10px;
+}
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index 58d44bab50e..b8bf703f604 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -925,20 +925,12 @@ openerp.mail = function (session) {
},
on_record_clicked: function (event) {
- event.stopPropagation();
var state = {
'model': this.model,
'id': this.res_id,
'title': this.record_name
};
session.webclient.action_manager.do_push_state(state);
- this.do_action({
- res_model: state.model,
- res_id: state.id,
- type: 'ir.actions.act_window',
- views: [[false, 'form']]
- });
- return false;
},
/* Call the on_compose_message on the thread of this message. */
diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js
index 938d6a01f6d..e7c8ede6867 100644
--- a/addons/mail/static/src/js/mail_followers.js
+++ b/addons/mail/static/src/js/mail_followers.js
@@ -197,6 +197,7 @@ openerp_mail_followers = function(session, mail) {
// clean and display title
var node_user_list = this.$('.oe_follower_list').empty();
this.$('.oe_follower_title').html(this._format_followers(this.followers.length));
+ self.message_is_follower = _.indexOf(this.followers.map(function (rec) { return rec[2]['is_uid']}), true) != -1;
// truncate number of displayed followers
var truncated = this.followers.slice(0, this.displayed_nb);
_(truncated).each(function (record) {
@@ -207,9 +208,6 @@ openerp_mail_followers = function(session, mail) {
'is_editable': record[2]['is_editable'],
'avatar_url': mail.ChatterUtils.get_image(self.session, 'res.partner', 'image_small', record[0]),
}
- if (partner.is_uid) {
- self.message_is_follower = partner.is_uid;
- }
$(session.web.qweb.render('mail.followers.partner', {'record': partner, 'widget': self})).appendTo(node_user_list);
// On mouse-enter it will show the edit_subtype pencil.
if (partner.is_editable) {
@@ -267,7 +265,15 @@ openerp_mail_followers = function(session, mail) {
var records = data[id].message_subtype_data;
this.records_length = $.map(records, function(value, index) { return index; }).length;
if (this.records_length > 1) { self.display_followers(); }
+ var old_model = '';
_(records).each(function (record, record_name) {
+ if (old_model != record.parent_model){
+ if (old_model != ''){
+ var index = $($list).find('.oe_subtype').length;
+ $($($list).find('.oe_subtype')[index-1]).addClass('subtype-border');
+ }
+ old_model = record.parent_model;
+ }
record.name = record_name;
record.followed = record.followed || undefined;
$(session.web.qweb.render('mail.followers.subtype', {'record': record})).appendTo($list);
diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml
index 3a7a5469ee1..6ce588e82a2 100644
--- a/addons/mail/static/src/xml/mail.xml
+++ b/addons/mail/static/src/xml/mail.xml
@@ -135,14 +135,14 @@
<t t-if="widget.is_private or (widget.user_pid != partner[0])">
<t t-if="!widget.is_private and inc==0"> and </t>
<span t-attf-class="oe_partner_follower #{inc>=3?'oe_hidden':''}"><t t-if="inc" t-raw="', '"/>
- <a t-if="widget.options.show_link" t-attf-href="#model=res.partner&amp;id=#{partner[0]}"><t t-raw="partner[1]"/></a>
- <t t-if="!widget.options.show_link" t-raw="partner[1]"/>
+ <a t-if="widget.options.show_link" t-attf-href="#model=res.partner&amp;id=#{partner[0]}"><t t-esc="partner[1]"/></a>
+ <t t-if="!widget.options.show_link" t-esc="partner[1]"/>
</span>
<t t-set="inc" t-value="inc+1"/>
</t>
</t>
<t t-if="widget.partner_ids.length > 3">
- <span class="oe_more">, <a><t t-raw="widget.partner_ids.length - 3"/> others...</a></span>
+ <span class="oe_more">, <a><t t-esc="widget.partner_ids.length - 3"/> others...</a></span>
<a class="oe_more_hidden">&lt;&lt;&lt;</a>
</t>
</div>
@@ -150,8 +150,8 @@
<t t-foreach='widget.recipients' t-as='recipient'>
<label t-attf-title="Add as recipient and follower (reason: #{recipient.reason})">
<input type="checkbox" t-att-checked="recipient.checked ? 'checked' : undefined" t-att-data="recipient.full_name"/>
- <t t-raw="recipient.name"/>
- <t t-if="recipient.email_address">(<t t-raw="recipient.email_address"/>)</t>
+ <t t-esc="recipient.name"/>
+ <t t-if="recipient.email_address">(<t t-esc="recipient.email_address"/>)</t>
<t t-if="!recipient.email_address">(no email address)</t>
</label>
</t>
@@ -177,7 +177,7 @@
<td colspan="2">
<h2 class="oe_view_title">
<span class="oe_view_title_text">
- <t t-raw="widget.action.name"/>
+ <t t-esc="widget.action.name"/>
</span>
</h2>
<t t-if="widget.action.params.header_description">
@@ -262,12 +262,13 @@
<!-- message itself -->
<div class="oe_msg_content">
<h1 t-if="(widget.show_record_name or widget.subject) and !widget.thread_level" class="oe_msg_title">
- <a t-if="widget.options.show_link and widget.show_record_name" class="oe_mail_action_model" t-attf-href="#model=#{widget.model}&amp;id=#{widget.res_id}">
- <t t-raw="widget.record_name"/>
+ <a t-if="widget.options.show_link and widget.show_record_name" class="oe_mail_action_model"
+ t-attf-href="#action=mail.action_mail_redirect&amp;model=#{widget.model}&amp;res_id=#{widget.res_id}">
+ <t t-esc="widget.record_name"/>
</a>
- <span t-if="!widget.options.show_link and widget.show_record_name"><t t-raw="widget.record_name"/></span>
+ <span t-if="!widget.options.show_link and widget.show_record_name"><t t-esc="widget.record_name"/></span>
<t t-if="widget.show_record_name and widget.subject">: </t>
- <t t-if="widget.subject" t-raw="widget.subject"/>
+ <t t-if="widget.subject" t-esc="widget.subject"/>
</h1>
<div class="oe_msg_body">
<t t-if="widget.body_short">
@@ -283,8 +284,8 @@
<t t-if="widget.attachment_ids.length > 0">
<div class="oe_msg_attachment_list"></div>
</t>
- <a t-if="widget.author_id and widget.options.show_link and widget.author_id[0]" t-attf-href="#model=res.partner&amp;id=#{widget.author_id[0]}"><t t-raw="widget.author_id[2]"/></a>
- <span t-if="widget.author_id and (!widget.options.show_link or !widget.author_id[0])"><t t-raw="widget.author_id[2]"/></span>
+ <a t-if="widget.author_id and widget.options.show_link and widget.author_id[0]" t-attf-href="#model=res.partner&amp;id=#{widget.author_id[0]}"><t t-esc="widget.author_id[2]"/></a>
+ <span t-if="widget.author_id and (!widget.options.show_link or !widget.author_id[0])"><t t-esc="widget.author_id[2]"/></span>
<t t-if="widget.type == 'notification'">
updated document
<t t-if="widget.partner_ids.length > 0">
@@ -303,20 +304,20 @@
<t t-if="widget.type == 'notification' or ( (widget.type == 'email' or widget.type == 'comment') and (widget.subtype or widget.partner_ids.length > 0))"
t-foreach="widget.partner_ids.slice(0, 3)" t-as="partner">
<span t-attf-class="oe_partner_follower">
- <a t-if="widget.options.show_link" t-attf-href="#model=res.partner&amp;id=#{partner[0]}"><t t-raw="partner[1]"/></a>
- <t t-if="!widget.options.show_link" t-raw="partner[1]"/>
+ <a t-if="widget.options.show_link" t-attf-href="#model=res.partner&amp;id=#{partner[0]}"><t t-esc="partner[1]"/></a>
+ <t t-if="!widget.options.show_link" t-esc="partner[1]"/>
</span>
<t t-if="!partner_last">,</t>
</t>
<t t-if="widget.partner_ids.length > 3">
- <span t-att-title="widget.extra_partners_str">and <t t-raw="widget.extra_partners_nbr"/> more</span>
+ <span t-att-title="widget.extra_partners_str">and <t t-esc="widget.extra_partners_nbr"/> more</span>
</t>
<t t-if="widget.type == 'notification' and widget.partner_ids.length > 0">
notified
</t>
<span class='oe_subtle'>•</span>
<span t-att-title="widget.date">
- <t t-if="widget.timerelative" t-raw="widget.timerelative"/>
+ <t t-if="widget.timerelative" t-esc="widget.timerelative"/>
<t t-if="!widget.timerelative" t-raw="widget.display_date"/>
</span>
<span t-if="!widget.options.readonly" class='oe_subtle'>•</span>
@@ -333,7 +334,7 @@
<div class='oe_separator'></div>
<a t-if="widget.nb_messages &lt;= 0" class="oe_msg_fetch_more">show more message</a>
<a t-if="widget.nb_messages === 1" class="oe_msg_fetch_more">show one more message</a>
- <a t-if="widget.nb_messages &gt; 1" class="oe_msg_fetch_more">show <t t-raw="widget.nb_messages" /> more messages</a>
+ <a t-if="widget.nb_messages &gt; 1" class="oe_msg_fetch_more">show <t t-esc="widget.nb_messages" /> more messages</a>
</div>
</div>
</t>
@@ -353,7 +354,7 @@
-->
<span t-name="mail.thread.message.vote">
<span class="oe_mail_vote_count" t-if='widget.vote_nb > 0'>
- <t t-raw='widget.vote_nb' />
+ <t t-esc='widget.vote_nb' />
<span class='oe_e'>8</span>
</span>
<a href='#' class="oe_msg_vote">
diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml
index a936b8237d6..6e8682cb533 100644
--- a/addons/mail/static/src/xml/mail_followers.xml
+++ b/addons/mail/static/src/xml/mail_followers.xml
@@ -43,13 +43,13 @@
<table class='oe_subtype'>
<tr>
<td width="10%"><input type="checkbox" t-att-checked="record.followed" t-att-id="'input_mail_followers_subtype_'+record.id" t-att-data-id="record.id" t-att-name="record.name" class="oe_msg_subtype_check"/></td>
- <td><label t-att-for="'input_mail_followers_subtype_'+record.id"><t t-raw="record.name"/></label></td>
+ <td><label t-att-for="'input_mail_followers_subtype_'+record.id"><t t-esc="record.name"/></label></td>
</tr>
</table>
</t>
<t t-name="mail.followers.show_more">
- <div class="oe_partner oe_show_more">And <t t-raw="number"/> more.</div>
+ <div class="oe_partner oe_show_more">And <t t-esc="number"/> more.</div>
</t>
</template>
diff --git a/addons/mail/tests/test_mail_gateway.py b/addons/mail/tests/test_mail_gateway.py
index c6fffbde9fe..cb735ec098e 100644
--- a/addons/mail/tests/test_mail_gateway.py
+++ b/addons/mail/tests/test_mail_gateway.py
@@ -394,7 +394,7 @@ class TestMailgateway(TestMail):
'message_process: after reply, group should have 2 followers')
# Do: incoming email with ref holding model / res_id but that does not match any message in the thread: must raise since OpenERP saas-3
- self.assertRaises(AssertionError,
+ self.assertRaises(ValueError,
format_and_process,
MAIL_TEMPLATE, email_from='other5@gmail.com',
to='noone@example.com', subject='spam',
@@ -490,14 +490,14 @@ class TestMailgateway(TestMail):
# --------------------------------------------------
# Do: incoming email with model that does not accepts incoming emails must raise
- self.assertRaises(AssertionError,
+ self.assertRaises(ValueError,
format_and_process,
MAIL_TEMPLATE,
to='noone@example.com', subject='spam', extra='', model='res.country',
msg_id='<1198923581.41972151344608186760.JavaMail.new4@agrolait.com>')
# Do: incoming email without model and without alias must raise
- self.assertRaises(AssertionError,
+ self.assertRaises(ValueError,
format_and_process,
MAIL_TEMPLATE,
to='noone@example.com', subject='spam', extra='',
diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index 74aea3dfc01..2d09a925ca7 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -130,7 +130,7 @@ class mail_compose_message(osv.TransientModel):
'wizard_id', 'attachment_id', 'Attachments'),
'filter_id': fields.many2one('ir.filters', 'Filters'),
}
-
+ #TODO change same_thread to False in trunk (Require view update)
_defaults = {
'composition_mode': 'comment',
'body': lambda self, cr, uid, ctx={}: '',
@@ -268,6 +268,8 @@ class mail_compose_message(osv.TransientModel):
'mail.message', 0,
context=context)
mail_values['attachment_ids'] = m2m_attachment_ids
+ if not mail_values.get('reply_to'):
+ mail_values['reply_to'] = mail_values['email_from']
self.pool.get('mail.mail').create(cr, uid, mail_values, context=context)
else:
subtype = 'mail.mt_comment'
@@ -321,10 +323,10 @@ class mail_compose_message(osv.TransientModel):
if email_dict.get('email_from'):
mail_values['email_from'] = email_dict.pop('email_from')
# replies redirection: mass mailing only
- if not wizard.same_thread:
- mail_values['reply_to'] = email_dict.pop('reply_to', None)
- else:
+ if wizard.same_thread and wizard.post:
email_dict.pop('reply_to', None)
+ else:
+ mail_values['reply_to'] = email_dict.pop('reply_to', None)
mail_values.update(email_dict)
# mass mailing without post: mail_mail values
if mass_mail_mode and not wizard.post:
diff --git a/addons/mail/wizard/mail_compose_message_view.xml b/addons/mail/wizard/mail_compose_message_view.xml
index 948d9b3832c..23931649402 100644
--- a/addons/mail/wizard/mail_compose_message_view.xml
+++ b/addons/mail/wizard/mail_compose_message_view.xml
@@ -47,10 +47,10 @@
<field name="notify"
attrs="{'invisible':['|', ('post', '!=', True), ('composition_mode', '!=', 'mass_mail')]}"/>
<field name="same_thread"
- attrs="{'invisible':[('composition_mode', '!=', 'mass_mail')]}"/>
+ attrs="{'invisible':['|', ('composition_mode', '!=', 'mass_mail'), ('post', '=', False)]}"/>
<field name="reply_to" placeholder="Email address te redirect replies..."
- attrs="{'invisible':['|', ('same_thread', '=', True), ('composition_mode', '!=', 'mass_mail')],
- 'required':[('same_thread', '!=', True)]}"/>
+ attrs="{'invisible':['|', '&amp;', ('same_thread', '=', True), ('post', '=', True), ('composition_mode', '!=', 'mass_mail')],
+ 'required':['&amp;', '|', ('post', '=', False), ('same_thread', '=', False), ('composition_mode', '=', 'mass_mail')]}"/>
</group>
<field name="body"/>
<field name="attachment_ids" widget="many2many_binary" string="Attach a file"/>
diff --git a/addons/mass_mailing/mail_thread.py b/addons/mass_mailing/mail_thread.py
index 0570596ba12..a4ff15a1a3f 100644
--- a/addons/mass_mailing/mail_thread.py
+++ b/addons/mass_mailing/mail_thread.py
@@ -48,6 +48,7 @@ class MailThread(osv.Model):
if bounce_alias in email_to:
bounce_match = tools.bounce_re.search(email_to)
if bounce_match:
+ bounced_model, bounced_thread_id = None, False
bounced_mail_id = bounce_match.group(1)
stat_ids = self.pool['mail.mail.statistics'].set_bounced(cr, uid, mail_mail_ids=[bounced_mail_id], context=context)
for stat in self.pool['mail.mail.statistics'].browse(cr, uid, stat_ids, context=context):
@@ -55,7 +56,7 @@ class MailThread(osv.Model):
bounced_thread_id = stat.res_id
_logger.info('Routing mail from %s to %s with Message-Id %s: bounced mail from mail %s, model: %s, thread_id: %s',
email_from, email_to, message_id, bounced_mail_id, bounced_model, bounced_thread_id)
- if bounced_model and bounced_model in self.pool and hasattr(self.pool[bounced_model], 'message_receive_bounce'):
+ if bounced_model and bounced_model in self.pool and hasattr(self.pool[bounced_model], 'message_receive_bounce') and bounced_thread_id:
self.pool[bounced_model].message_receive_bounce(cr, uid, [bounced_thread_id], mail_id=bounced_mail_id, context=context)
return False
diff --git a/addons/mass_mailing/mass_mailing.py b/addons/mass_mailing/mass_mailing.py
index 516e68db3d9..e7583d8e739 100644
--- a/addons/mass_mailing/mass_mailing.py
+++ b/addons/mass_mailing/mass_mailing.py
@@ -168,8 +168,10 @@ class MassMailing(osv.Model):
'tooltip': (date_begin + relativedelta.relativedelta(days=i)).strftime('%d %B %Y'),
} for i in range(0, self._period_number)]
group_obj = obj.read_group(cr, uid, domain, read_fields, groupby_field, context=context)
+ field_col_info = obj._all_columns.get(groupby_field.split(':')[0])
+ pattern = tools.DEFAULT_SERVER_DATE_FORMAT if field_col_info.column._type == 'date' else tools.DEFAULT_SERVER_DATETIME_FORMAT
for group in group_obj:
- group_begin_date = datetime.strptime(group['__domain'][0][2], tools.DEFAULT_SERVER_DATE_FORMAT).date()
+ group_begin_date = datetime.strptime(group['__domain'][0][2], pattern).date()
timedelta = relativedelta.relativedelta(group_begin_date, date_begin)
section_result[timedelta.days] = {'value': group.get(value_field, 0), 'tooltip': group.get(groupby_field)}
return section_result
diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py
index 5266147fef0..8b93e2a9bb6 100644
--- a/addons/mrp/procurement.py
+++ b/addons/mrp/procurement.py
@@ -111,9 +111,6 @@ class procurement_order(osv.osv):
bom_result = production_obj.action_compute(cr, uid,
[produce_id], properties=[x.id for x in procurement.property_ids])
production_obj.signal_button_confirm(cr, uid, [produce_id])
- if res_id:
- move_obj.write(cr, uid, [res_id],
- {'location_id': procurement.location_id.id})
self.production_order_create_note(cr, uid, ids, context=context)
return res
diff --git a/addons/note/note.py b/addons/note/note.py
index 00c67c37191..7f03f43b36a 100644
--- a/addons/note/note.py
+++ b/addons/note/note.py
@@ -72,12 +72,6 @@ class note_note(osv.osv):
def onclick_note_not_done(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'open': True}, context=context)
- #used for undisplay the follower if it's the current user
- def _get_my_current_partner(self, cr, uid, ids, name, args, context=None):
- user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
- pid = user.partner_id and user.partner_id.id or False
- return dict.fromkeys(ids, pid)
-
#return the default stage for the uid user
def _get_default_stage_id(self,cr,uid,context=None):
ids = self.pool.get('note.stage').search(cr,uid,[('user_id','=',uid)], context=context)
@@ -101,6 +95,7 @@ class note_note(osv.osv):
'name': fields.function(_get_note_first_line,
string='Note Summary',
type='text', store=True),
+ 'user_id': fields.many2one('res.users', 'Owner'),
'memo': fields.html('Note Content'),
'sequence': fields.integer('Sequence'),
'stage_id': fields.function(_get_stage_per_user,
@@ -113,9 +108,9 @@ class note_note(osv.osv):
'date_done': fields.date('Date done'),
'color': fields.integer('Color Index'),
'tag_ids' : fields.many2many('note.tag','note_tags_rel','note_id','tag_id','Tags'),
- 'current_partner_id' : fields.function(_get_my_current_partner, type="many2one", relation='res.partner', string="Owner"),
}
_defaults = {
+ 'user_id': lambda self, cr, uid, ctx=None: uid,
'open' : 1,
'stage_id' : _get_default_stage_id,
}
diff --git a/addons/note/note_view.xml b/addons/note/note_view.xml
index f3b9e4669c7..35d4ce316fc 100644
--- a/addons/note/note_view.xml
+++ b/addons/note/note_view.xml
@@ -49,7 +49,6 @@
<field name="open"/>
<field name="memo"/>
<field name="date_done"/>
- <field name="current_partner_id"/>
<field name="message_follower_ids"/>
<field name="tag_ids"/>
<templates>
@@ -82,7 +81,7 @@
<field name="tag_ids"/>
<div class="oe_right">
<t t-foreach="record.message_follower_ids.raw_value" t-as="follower">
- <img t-if="record.current_partner_id.raw_value!=follower" t-att-src="kanban_image('res.partner', 'image_small', follower)" width="24" height="24" class="oe_kanban_avatar" t-att-data-member_id="follower"/>
+ <img t-att-src="kanban_image('res.partner', 'image_small', follower)" width="24" height="24" class="oe_kanban_avatar" t-att-data-member_id="follower"/>
</t>
</div>
<div class="oe_clear"></div>
diff --git a/addons/note/security/ir.rule.xml b/addons/note/security/ir.rule.xml
index 2c6e9f3bc7f..2b9645cc9d4 100644
--- a/addons/note/security/ir.rule.xml
+++ b/addons/note/security/ir.rule.xml
@@ -1,23 +1,30 @@
<?xml version="1.0"?>
<openerp>
<data>
- <record id="note_note_rule_global" model="ir.rule">
- <field name="name">Only followers can access a sticky notes</field>
- <field ref="model_note_note" name="model_id"/>
- <field name="domain_force">[('message_follower_ids','=',user.partner_id.id)]</field>
- <field eval="True" name="global"/>
- <field eval="1" name="perm_unlink"/>
- <field eval="0" name="perm_write"/>
- <field eval="1" name="perm_read"/>
- <field eval="0" name="perm_create"/>
- </record>
+ <record id="note_note_rule_global" model="ir.rule">
+ <field name="name">Only followers can access a sticky notes</field>
+ <field name="model_id" ref="model_note_note"/>
+ <field name="domain_force">['|', ('user_id', '=', user.id), ('message_follower_ids', '=', user.partner_id.id)]</field>
+ <field name="global" eval="True"/>
+ <field name="perm_create" eval="False"/>
+ <field name="perm_unlink" eval="False"/>
+ </record>
+
+ <record id="note_note_create_unlink_global" model="ir.rule">
+ <field name="name">note: create / unlink: responsible</field>
+ <field name="model_id" ref="model_note_note"/>
+ <field name="domain_force">[('user_id', '=', user.id)]</field>
+ <field name="global" eval="True"/>
+ <field name="perm_write" eval="False"/>
+ <field name="perm_read" eval="False"/>
+ </record>
+
+ <record id="note_stage_rule_global" model="ir.rule">
+ <field name="name">Each user have his stage name</field>
+ <field name="model_id" ref="model_note_stage"/>
+ <field name="domain_force">['|',('user_id','=',False),('user_id','=',user.id)]</field>
+ <field name="global" eval="True"/>
+ </record>
- <record id="note_stage_rule_global" model="ir.rule">
- <field name="name">Each user have his stage name</field>
- <field ref="model_note_stage" name="model_id"/>
- <field name="domain_force">['|',('user_id','=',False),('user_id','=',user.id)]</field>
- <field eval="True" name="global"/>
- </record>
</data>
</openerp>
-
diff --git a/addons/pad/py_etherpad/__init__.py b/addons/pad/py_etherpad/__init__.py
index fce51d36890..0db607fe16f 100644
--- a/addons/pad/py_etherpad/__init__.py
+++ b/addons/pad/py_etherpad/__init__.py
@@ -1,7 +1,7 @@
"""Module to talk to EtherpadLite API."""
import json
-import werkzeug.urls
+import urllib
import urllib2
@@ -32,7 +32,7 @@ class EtherpadLiteClient:
params = arguments or {}
params.update({'apikey': self.apiKey})
- data = werkzeug.url_encode(params, True)
+ data = urllib.urlencode(params, True)
try:
opener = urllib2.build_opener()
diff --git a/addons/pad/static/src/css/etherpad.css b/addons/pad/static/src/css/etherpad.css
index facf15b28de..d8281ef4d48 100644
--- a/addons/pad/static/src/css/etherpad.css
+++ b/addons/pad/static/src/css/etherpad.css
@@ -13,13 +13,12 @@
border: solid 1px #ccc;
border-radius:3px;
text-align: center;
- line-height: 22px;
+ line-height: 28px;
overflow: hidden;
-webkit-box-sizing: border-box;
color: #666666;
- padding-top:-3px;
- padding-left:-1px;
cursor: pointer;
+ font-size: 14px;
}
.oe_pad_switch:hover{
diff --git a/addons/pad/static/src/js/pad.js b/addons/pad/static/src/js/pad.js
index ba5ee3a3037..2d7f2c2737f 100644
--- a/addons/pad/static/src/js/pad.js
+++ b/addons/pad/static/src/js/pad.js
@@ -13,6 +13,8 @@ openerp.pad = function(instance) {
this.switch_configured();
this.$('.oe_pad_switch').click(function() {
self.$el.toggleClass('oe_pad_fullscreen');
+ self.$el.find('.oe_pad_switch').toggleClass('fa-expand fa-compress');
+ self.view.$el.find('.oe_chatter').toggle();
});
this.render_value();
},
diff --git a/addons/pad/static/src/xml/pad.xml b/addons/pad/static/src/xml/pad.xml
index f915e867b35..5d2ab779ead 100644
--- a/addons/pad/static/src/xml/pad.xml
+++ b/addons/pad/static/src/xml/pad.xml
@@ -15,7 +15,7 @@
</t>
<t t-if="! widget.get('effective_readonly')">
<div class="oe_pad_switch_positioner oe_configured">
- <span class="oe_pad_switch oe_e">&amp;Ntilde;</span>
+ <span class="fa fa-expand oe_pad_switch"></span>
</div>
<div class="oe_pad_content oe_editing oe_configured">
</div>
diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py
index 0d97fdb1a0b..fbdf48aacf1 100644
--- a/addons/point_of_sale/point_of_sale.py
+++ b/addons/point_of_sale/point_of_sale.py
@@ -474,11 +474,12 @@ class pos_session(osv.osv):
account_move_obj = self.pool.get('account.move')
pos_order_obj = self.pool.get('pos.order')
for session in self.browse(cr, uid, ids, context=context):
+ local_context = dict(context or {}, force_company=session.config_id.journal_id.company_id.id)
order_ids = [order.id for order in session.order_ids if order.state == 'paid']
- move_id = account_move_obj.create(cr, uid, {'ref' : session.name, 'journal_id' : session.config_id.journal_id.id, }, context=context)
+ move_id = account_move_obj.create(cr, uid, {'ref' : session.name, 'journal_id' : session.config_id.journal_id.id, }, context=local_context)
- pos_order_obj._create_account_move_line(cr, uid, order_ids, session, move_id, context=context)
+ pos_order_obj._create_account_move_line(cr, uid, order_ids, session, move_id, context=local_context)
for order in session.order_ids:
if order.state not in ('paid', 'invoiced'):
@@ -948,22 +949,16 @@ class pos_order(osv.osv):
# Tricky, via the workflow, we only have one id in the ids variable
"""Create a account move line of order grouped by products or not."""
account_move_obj = self.pool.get('account.move')
- account_move_line_obj = self.pool.get('account.move.line')
account_period_obj = self.pool.get('account.period')
account_tax_obj = self.pool.get('account.tax')
- user_proxy = self.pool.get('res.users')
property_obj = self.pool.get('ir.property')
cur_obj = self.pool.get('res.currency')
- period = account_period_obj.find(cr, uid, context=context)[0]
-
#session_ids = set(order.session_id for order in self.browse(cr, uid, ids, context=context))
if session and not all(session.id == order.session_id.id for order in self.browse(cr, uid, ids, context=context)):
raise osv.except_osv(_('Error!'), _('Selected orders do not have the same session!'))
- current_company = user_proxy.browse(cr, uid, uid, context=context).company_id
-
grouped_data = {}
have_to_group_by = session and session.config_id.group_by or False
@@ -983,7 +978,7 @@ class pos_order(osv.osv):
if order.state != 'paid':
continue
- user_company = user_proxy.browse(cr, order.user_id.id, order.user_id.id).company_id
+ current_company = order.sale_journal.company_id
group_tax = {}
account_def = property_obj.get(cr, uid, 'property_account_receivable', 'res.partner', context=context)
@@ -1004,6 +999,7 @@ class pos_order(osv.osv):
# if have_to_group_by:
sale_journal_id = order.sale_journal.id
+ period = account_period_obj.find(cr, uid, context=dict(context or {}, company_id=current_company.id))[0]
# 'quantity': line.qty,
# 'product_id': line.product_id.id,
@@ -1013,7 +1009,7 @@ class pos_order(osv.osv):
'journal_id' : sale_journal_id,
'period_id' : period,
'move_id' : move_id,
- 'company_id': user_company and user_company.id or False,
+ 'company_id': current_company.id,
})
if data_type == 'product':
@@ -1054,7 +1050,10 @@ class pos_order(osv.osv):
cur = order.pricelist_id.currency_id
for line in order.lines:
tax_amount = 0
- taxes = [t for t in line.product_id.taxes_id]
+ taxes = []
+ for t in line.product_id.taxes_id:
+ if t.company_id.id == current_company.id:
+ taxes.append(t)
computed_taxes = account_tax_obj.compute_all(cr, uid, taxes, line.price_unit * (100.0-line.discount) / 100.0, line.qty)['taxes']
for tax in computed_taxes:
diff --git a/addons/point_of_sale/report/pos_details_summary.py b/addons/point_of_sale/report/pos_details_summary.py
index a4facaabcac..d6600926bd6 100644
--- a/addons/point_of_sale/report/pos_details_summary.py
+++ b/addons/point_of_sale/report/pos_details_summary.py
@@ -99,13 +99,10 @@ class pos_details_summary(report_sxw.rml_parse):
def _get_tax_amount(self, objects):
res = {}
- list_ids = []
for order in objects:
for line in order.lines:
- if len(line.product_id.taxes_id):
- tax = line.product_id.taxes_id[0]
- res[tax.name] = (line.price_unit * line.qty * (1-(line.discount or 0.0) / 100.0)) + (tax.id in list_ids and res[tax.name] or 0)
- list_ids.append(tax.id)
+ for tax in line.product_id.taxes_id:
+ res[tax.name] = res.setdefault(tax.name, 0.0) + (line.price_subtotal_incl - line.price_subtotal)
return res
def _get_sales_total(self, objects):
diff --git a/addons/point_of_sale/report/pos_details_summary.rml b/addons/point_of_sale/report/pos_details_summary.rml
index b1c71db7d40..6564f821010 100644
--- a/addons/point_of_sale/report/pos_details_summary.rml
+++ b/addons/point_of_sale/report/pos_details_summary.rml
@@ -232,7 +232,7 @@
<blockTable colWidths="255.0,255.0" style="Table11">
<tr>
<td>
- <para style="P2">[[ t[0] ]]</para>
+ <para style="P2">[[ t[0].name ]]</para>
</td>
<td>
<para style="terp_default_Right_9_Bold">[[ formatLang(t[1], currency_obj=company.currency_id) ]]</para>
diff --git a/addons/portal_project/i18n/fi.po b/addons/portal_project/i18n/fi.po
new file mode 100644
index 00000000000..3d84cb911de
--- /dev/null
+++ b/addons/portal_project/i18n/fi.po
@@ -0,0 +1,37 @@
+# Finnish translation for openobject-addons
+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2014-02-22 20:02+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Finnish <fi@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-02-23 07:07+0000\n"
+"X-Generator: Launchpad (build 16926)\n"
+
+#. module: portal_project
+#: model:ir.actions.act_window,help:portal_project.open_view_project
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to start a new project.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klikkaa aloittaaksesi uuden projektin.\n"
+" </p>\n"
+" "
+
+#. module: portal_project
+#: model:ir.actions.act_window,name:portal_project.open_view_project
+#: model:ir.ui.menu,name:portal_project.portal_services_projects
+msgid "Projects"
+msgstr "Projektit"
diff --git a/addons/portal_project_issue/i18n/fi.po b/addons/portal_project_issue/i18n/fi.po
new file mode 100644
index 00000000000..d18d7c113b2
--- /dev/null
+++ b/addons/portal_project_issue/i18n/fi.po
@@ -0,0 +1,47 @@
+# Finnish translation for openobject-addons
+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2014-02-22 20:06+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Finnish <fi@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-02-23 07:07+0000\n"
+"X-Generator: Launchpad (build 16926)\n"
+
+#. module: portal_project_issue
+#: view:project.issue:0
+msgid "Creation:"
+msgstr "Luonti:"
+
+#. module: portal_project_issue
+#: model:ir.actions.act_window,help:portal_project_issue.project_issue_categ_act0
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create an issue.\n"
+" </p><p>\n"
+" You can track your issues from this menu and the action we\n"
+" will take.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klikkaa luodaksesi palautteen.\n"
+" </p><p>\n"
+" Voit seurata palautteitasi ja niiden\n"
+" etenemistä tästä valikosta.\n"
+" </p>\n"
+" "
+
+#. module: portal_project_issue
+#: model:ir.actions.act_window,name:portal_project_issue.project_issue_categ_act0
+msgid "Issues"
+msgstr "Ilmoitukset"
diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py
index 279f921f6c9..65c4311f34a 100644
--- a/addons/product/pricelist.py
+++ b/addons/product/pricelist.py
@@ -244,13 +244,15 @@ class product_pricelist(osv.osv):
for seller in product.seller_ids:
if (not partner) or (seller.name.id<>partner):
continue
- product_default_uom = product.uom_id.id
+ qty_in_seller_uom = qty
+ from_uom = context.get('uom') or product.uom_id.id
seller_uom = seller.product_uom and seller.product_uom.id or False
- if seller_uom and product_default_uom and product_default_uom != seller_uom:
+ if seller_uom and from_uom and from_uom != seller_uom:
+ qty_in_seller_uom = product_uom_obj._compute_qty(cr, uid, from_uom, qty, to_uom_id=seller_uom)
+ else:
uom_price_already_computed = True
- qty = product_uom_obj._compute_qty(cr, uid, product_default_uom, qty, to_uom_id=seller_uom)
for line in seller.pricelist_ids:
- if line.min_quantity <= qty:
+ if line.min_quantity <= qty_in_seller_uom:
price = line.price
else:
@@ -277,7 +279,6 @@ class product_pricelist(osv.osv):
if price:
if 'uom' in context and not uom_price_already_computed:
- product = products_dict[product.id]
uom = product.uos_id or product.uom_id
price = product_uom_obj._compute_price(cr, uid, uom.id, price, context['uom'])
diff --git a/addons/product_expiry/i18n/am.po b/addons/product_expiry/i18n/am.po
new file mode 100644
index 00000000000..d165d4ba279
--- /dev/null
+++ b/addons/product_expiry/i18n/am.po
@@ -0,0 +1,149 @@
+# Amharic translation for openobject-addons
+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2014-02-21 11:53+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Amharic <am@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-02-22 06:39+0000\n"
+"X-Generator: Launchpad (build 16926)\n"
+
+#. module: product_expiry
+#: model:product.template,name:product_expiry.product_product_from_product_template
+msgid "Ham"
+msgstr ""
+
+#. module: product_expiry
+#: model:product.template,name:product_expiry.product_product_lait_product_template
+msgid "Cow milk"
+msgstr ""
+
+#. module: product_expiry
+#: field:product.product,life_time:0
+msgid "Product Life Time"
+msgstr "የእቃው የመቆያ ግዜ"
+
+#. module: product_expiry
+#: help:stock.production.lot,removal_date:0
+msgid ""
+"This is the date on which the goods with this Serial Number should be "
+"removed from the stock."
+msgstr ""
+
+#. module: product_expiry
+#: help:product.product,removal_time:0
+msgid ""
+"When a new a Serial Number is issued, this is the number of days before the "
+"goods should be removed from the stock."
+msgstr ""
+
+#. module: product_expiry
+#: field:product.product,use_time:0
+msgid "Product Use Time"
+msgstr "የእቃው መጠቀምያ ግዜ"
+
+#. module: product_expiry
+#: model:ir.model,name:product_expiry.model_product_product
+msgid "Product"
+msgstr "እቃ"
+
+#. module: product_expiry
+#: help:product.product,use_time:0
+msgid ""
+"When a new a Serial Number is issued, this is the number of days before the "
+"goods starts deteriorating, without being dangerous yet."
+msgstr ""
+
+#. module: product_expiry
+#: field:product.product,removal_time:0
+msgid "Product Removal Time"
+msgstr "የእቃው የሚወገድበት ግዜ"
+
+#. module: product_expiry
+#: help:stock.production.lot,alert_date:0
+msgid ""
+"This is the date on which an alert should be notified about the goods with "
+"this Serial Number."
+msgstr ""
+
+#. module: product_expiry
+#: model:ir.model,name:product_expiry.model_stock_production_lot
+msgid "Serial Number"
+msgstr "መለያ ቁጥር"
+
+#. module: product_expiry
+#: help:product.product,alert_time:0
+msgid ""
+"When a new a Serial Number is issued, this is the number of days before an "
+"alert should be notified."
+msgstr ""
+
+#. module: product_expiry
+#: field:stock.production.lot,removal_date:0
+msgid "Removal Date"
+msgstr "የሚወገድበት ቀን"
+
+#. module: product_expiry
+#: model:product.template,name:product_expiry.product_product_pain_product_template
+msgid "Bread"
+msgstr ""
+
+#. module: product_expiry
+#: view:product.product:0
+msgid "Dates"
+msgstr ""
+
+#. module: product_expiry
+#: field:stock.production.lot,life_date:0
+msgid "End of Life Date"
+msgstr "የመጨረሻው ቀን"
+
+#. module: product_expiry
+#: field:stock.production.lot,use_date:0
+msgid "Best before Date"
+msgstr "ያለፍ ጥሩ ቀናቶች"
+
+#. module: product_expiry
+#: model:product.template,name:product_expiry.product_product_jambon_product_template
+msgid "French cheese Camenbert"
+msgstr ""
+
+#. module: product_expiry
+#: help:product.product,life_time:0
+msgid ""
+"When a new a Serial Number is issued, this is the number of days before the "
+"goods may become dangerous and must not be consumed."
+msgstr ""
+
+#. module: product_expiry
+#: field:stock.production.lot,alert_date:0
+msgid "Alert Date"
+msgstr "ማሳወቅያ ቀን"
+
+#. module: product_expiry
+#: help:stock.production.lot,use_date:0
+msgid ""
+"This is the date on which the goods with this Serial Number start "
+"deteriorating, without being dangerous yet."
+msgstr ""
+
+#. module: product_expiry
+#: help:stock.production.lot,life_date:0
+msgid ""
+"This is the date on which the goods with this Serial Number may become "
+"dangerous and must not be consumed."
+msgstr ""
+
+#. module: product_expiry
+#: field:product.product,alert_time:0
+msgid "Product Alert Time"
+msgstr "እቃውን የማሳወቅያ ግዜ"
diff --git a/addons/project/project.py b/addons/project/project.py
index f03a4242de3..e5dcf5de2cf 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -358,6 +358,11 @@ class project(osv.osv):
default['state'] = 'open'
default['line_ids'] = []
default['tasks'] = []
+
+ # Don't prepare (expensive) data to copy children (analytic accounts),
+ # they are discarded in analytic.copy(), and handled in duplicate_template()
+ default['child_ids'] = []
+
proj = self.browse(cr, uid, id, context=context)
if not default.get('name', False):
default.update(name=_("%s (copy)") % (proj.name))
@@ -690,23 +695,13 @@ class task(osv.osv):
return {'value': vals}
def duplicate_task(self, cr, uid, map_ids, context=None):
- for new in map_ids.values():
- task = self.browse(cr, uid, new, context)
- child_ids = [ ch.id for ch in task.child_ids]
- if task.child_ids:
- for child in task.child_ids:
- if child.id in map_ids.keys():
- child_ids.remove(child.id)
- child_ids.append(map_ids[child.id])
-
- parent_ids = [ ch.id for ch in task.parent_ids]
- if task.parent_ids:
- for parent in task.parent_ids:
- if parent.id in map_ids.keys():
- parent_ids.remove(parent.id)
- parent_ids.append(map_ids[parent.id])
- #FIXME why there is already the copy and the old one
- self.write(cr, uid, new, {'parent_ids':[(6,0,set(parent_ids))], 'child_ids':[(6,0, set(child_ids))]})
+ mapper = lambda t: map_ids.get(t.id, t.id)
+ for task in self.browse(cr, uid, map_ids.values(), context):
+ new_child_ids = set(map(mapper, task.child_ids))
+ new_parent_ids = set(map(mapper, task.parent_ids))
+ if new_child_ids or new_parent_ids:
+ task.write({'parent_ids': [(6,0,list(new_parent_ids))],
+ 'child_ids': [(6,0,list(new_child_ids))]})
def copy_data(self, cr, uid, id, default=None, context=None):
if default is None:
diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml
index 7ddc983bf1c..95a76d8988e 100644
--- a/addons/project/project_data.xml
+++ b/addons/project/project_data.xml
@@ -78,6 +78,7 @@
<field name="name">Task Created</field>
<field name="res_model">project.task</field>
<field name="default" eval="False"/>
+ <field name="hidden" eval="True"/>
<field name="description">Task created</field>
</record>
<record id="mt_task_assigned" model="mail.message.subtype">
@@ -101,6 +102,7 @@
<!-- Project-related subtypes for messaging / Chatter -->
<record id="mt_project_task_new" model="mail.message.subtype">
<field name="name">Task Created</field>
+ <field name="sequence">10</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_task_new')"/>
@@ -108,6 +110,7 @@
</record>
<record id="mt_project_task_assigned" model="mail.message.subtype">
<field name="name">Task Assigned</field>
+ <field name="sequence">11</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_task_assigned')"/>
@@ -115,12 +118,14 @@
</record>
<record id="mt_project_task_blocked" model="mail.message.subtype">
<field name="name">Task Blocked</field>
+ <field name="sequence">12</field>
<field name="res_model">project.project</field>
<field name="parent_id" eval="ref('mt_task_blocked')"/>
<field name="relation_field">project_id</field>
</record>
<record id="mt_project_task_stage" model="mail.message.subtype">
<field name="name">Task Stage Changed</field>
+ <field name="sequence">13</field>
<field name="res_model">project.project</field>
<field name="parent_id" eval="ref('mt_task_stage')"/>
<field name="relation_field">project_id</field>
diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml
index 25a336d4094..d60106dffd2 100644
--- a/addons/project_issue/project_issue_data.xml
+++ b/addons/project_issue/project_issue_data.xml
@@ -33,6 +33,7 @@ Access all issues from the top Project menu, and access the issues of a specific
<field name="name">Issue Created</field>
<field name="res_model">project.issue</field>
<field name="default" eval="False"/>
+ <field name="hidden" eval="True"/>
<field name="description">Issue created</field>
</record>
<record id="mt_issue_assigned" model="mail.message.subtype">
@@ -56,6 +57,7 @@ Access all issues from the top Project menu, and access the issues of a specific
<!-- Project-related subtypes for messaging / Chatter -->
<record id="mt_project_issue_new" model="mail.message.subtype">
<field name="name">Issue Created</field>
+ <field name="sequence">20</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_issue_new')"/>
@@ -63,6 +65,7 @@ Access all issues from the top Project menu, and access the issues of a specific
</record>
<record id="mt_project_issue_assigned" model="mail.message.subtype">
<field name="name">Issue Assigned</field>
+ <field name="sequence">21</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_issue_assigned')"/>
@@ -70,12 +73,14 @@ Access all issues from the top Project menu, and access the issues of a specific
</record>
<record id="mt_project_issue_blocked" model="mail.message.subtype">
<field name="name">Issue Blocked</field>
+ <field name="sequence">22</field>
<field name="res_model">project.project</field>
<field name="parent_id" eval="ref('mt_issue_blocked')"/>
<field name="relation_field">project_id</field>
</record>
<record id="mt_project_issue_stage" model="mail.message.subtype">
<field name="name">Issue Stage Changed</field>
+ <field name="sequence">23</field>
<field name="res_model">project.project</field>
<field name="description">Stage changed</field>
<field name="parent_id" eval="ref('mt_issue_stage')"/>
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index e40d219ef10..4fa0e760df1 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -176,7 +176,7 @@
<button name="invoice_ok" states="except_invoice" string="Manually Corrected"/>
<button name="purchase_approve" states="confirmed" string="Approve Order" class="oe_highlight" groups="purchase.group_purchase_manager"/>
<button name="view_picking" string="Receive Products" type="object" attrs="{'invisible': ['|', ('shipped','=',True), ('state','!=', 'approved')]}" class="oe_highlight"/>
- <button name="view_invoice" string="Receive Invoice" type="object" attrs="{'invisible': ['|', ('invoice_method','=','picking'), '|', ('state','!=', 'approved'), ('invoiced','=',True) ]}" class="oe_highlight"/>
+ <button name="view_invoice" string="Receive Invoice" type="object" attrs="{'invisible': ['|', ('invoice_method','in', ['picking', 'manual']), '|', ('state','!=', 'approved'), ('invoiced','=',True) ]}" class="oe_highlight"/>
<button name="action_cancel_draft" states="cancel,confirmed" string="Set to Draft" type="object" />
<button name="purchase_cancel" states="draft,confirmed,sent" string="Cancel"/>
<field name="state" widget="statusbar" statusbar_visible="draft,sent,approved,done" statusbar_colors='{"except_picking":"red","except_invoice":"red","confirmed":"blue"}' readonly="1"/>
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 8848ba9df2b..a8851c654f8 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -1014,8 +1014,8 @@ class account_invoice(osv.Model):
sale_order_obj = self.pool.get('sale.order')
res = super(account_invoice, self).confirm_paid(cr, uid, ids, context=context)
so_ids = sale_order_obj.search(cr, uid, [('invoice_ids', 'in', ids)], context=context)
- if so_ids:
- sale_order_obj.message_post(cr, uid, so_ids, body=_("Invoice paid"), context=context)
+ for so_id in so_ids:
+ sale_order_obj.message_post(cr, uid, so_id, body=_("Invoice paid"), context=context)
return res
def unlink(self, cr, uid, ids, context=None):
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 04a9972b9b0..35901b0131e 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -77,9 +77,9 @@
<button name="invoice_recreate" states="invoice_except" string="Recreate Invoice" groups="base.group_user"/>
<button name="invoice_corrected" states="invoice_except" string="Ignore Exception" groups="base.group_user"/>
<button name="action_quotation_send" string="Send by Email" type="object" states="draft" class="oe_highlight" groups="base.group_user"/>
- <button name="action_quotation_send" string="Send by Email" type="object" states="sent" groups="base.group_user"/>
+ <button name="action_quotation_send" string="Send by Email" type="object" states="sent,progress,manual" groups="base.group_user"/>
<button name="print_quotation" string="Print" type="object" states="draft" class="oe_highlight" groups="base.group_user"/>
- <button name="print_quotation" string="Print" type="object" states="sent" groups="base.group_user"/>
+ <button name="print_quotation" string="Print" type="object" states="sent,progress,manual" groups="base.group_user"/>
<button name="action_button_confirm" states="draft" string="Confirm Sale" type="object" groups="base.group_user"/>
<button name="action_button_confirm" states="sent" string="Confirm Sale" class="oe_highlight" type="object" groups="base.group_user"/>
<button name="action_view_invoice" string="View Invoice" type="object" class="oe_highlight"
@@ -90,7 +90,7 @@
<button name="cancel" states="draft,sent" string="Cancel Quotation" groups="base.group_user"/>
<button name="action_cancel" states="manual,progress" string="Cancel Order" type="object" groups="base.group_user"/>
<button name="invoice_cancel" states="invoice_except" string="Cancel Order" groups="base.group_user"/>
- <field name="state" widget="statusbar" statusbar_visible="draft,sent,invoiced,done" statusbar_colors='{"invoice_except":"red","waiting_date":"blue"}'/>
+ <field name="state" widget="statusbar" statusbar_visible="draft,sent,progress,done" statusbar_colors='{"invoice_except":"red","waiting_date":"blue"}'/>
</header>
<sheet>
<h1>
@@ -231,7 +231,7 @@
<field name="name">sale.order.form.editable.list</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
- <field name="groups_id" eval="[(6, 0, [ref('product.group_uos'), ref('product.group_stock_packaging'), ref('sale.group_mrp_properties')])]"/>
+ <field name="groups_id" eval="[(4, ref('product.group_uos')), (4, ref('product.group_stock_packaging')), (4, ref('sale.group_mrp_properties'))]"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/tree" position="attributes">
<attribute name="editable"/>
diff --git a/addons/sale_crm/sale_crm_data.xml b/addons/sale_crm/sale_crm_data.xml
index 519af2a976b..1996f367202 100644
--- a/addons/sale_crm/sale_crm_data.xml
+++ b/addons/sale_crm/sale_crm_data.xml
@@ -5,12 +5,14 @@
<!-- Salesteam-related subtypes for messaging / Chatter -->
<record id="mt_salesteam_order_sent" model="mail.message.subtype">
<field name="name">Quotation Send</field>
+ <field name="sequence">20</field>
<field name="res_model">crm.case.section</field>
<field name="parent_id" eval="ref('sale.mt_order_sent')"/>
<field name="relation_field">section_id</field>
</record>
<record id="mt_salesteam_order_confirmed" model="mail.message.subtype">
<field name="name">Sales Order Confirmed</field>
+ <field name="sequence">21</field>
<field name="res_model">crm.case.section</field>
<field name="parent_id" eval="ref('sale.mt_order_confirmed')"/>
<field name="relation_field">section_id</field>
diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml
index 7ed31586c17..c1e6498b429 100644
--- a/addons/sale_crm/sale_crm_view.xml
+++ b/addons/sale_crm/sale_crm_view.xml
@@ -214,8 +214,7 @@
<record id="action_order_report_quotation_salesteam" model="ir.actions.act_window">
<field name="name">Quotations Analysis</field>
<field name="res_model">sale.report</field>
- <field name="view_type">form</field>
- <field name="view_mode">tree,graph</field>
+ <field name="view_mode">graph</field>
<field name="domain">[('state','=','draft'),('section_id', '=', active_id)]</field>
<field name="context">{'search_default_order_month':1}</field>
<field name="help">This report performs analysis on your quotations. Analysis check your sales revenues and sort it by different group criteria (salesman, partner, product, etc.) Use this report to perform analysis on sales not having invoiced yet. If you want to analyse your turnover, you should use the Invoice Analysis report in the Accounting application.</field>
@@ -224,8 +223,7 @@
<record id="action_order_report_so_salesteam" model="ir.actions.act_window">
<field name="name">Sales Analysis</field>
<field name="res_model">sale.report</field>
- <field name="view_type">form</field>
- <field name="view_mode">tree,graph</field>
+ <field name="view_mode">graph</field>
<field name="domain">[('state','not in',('draft','sent','cancel')),('section_id', '=', active_id)]</field>
<field name="context">{'search_default_order_month':1}</field>
<field name="help">This report performs analysis on your sales orders. Analysis check your sales revenues and sort it by different group criteria (salesman, partner, product, etc.) Use this report to perform analysis on sales not having invoiced yet. If you want to analyse your turnover, you should use the Invoice Analysis report in the Accounting application.</field>
@@ -234,8 +232,7 @@
<record id="action_account_invoice_report_salesteam" model="ir.actions.act_window">
<field name="name">Invoices Analysis</field>
<field name="res_model">account.invoice.report</field>
- <field name="view_type">form</field>
- <field name="view_mode">tree,graph</field>
+ <field name="view_mode">graph</field>
<field name="domain">[('section_id', '=', active_id),('state', 'not in', ['draft', 'cancel'])]</field>
<field name="context">{'search_default_month':1}</field>
<field name="help">From this report, you can have an overview of the amount invoiced to your customer. The tool search can also be used to personalise your Invoices reports and so, match this analysis to your needs.</field>
diff --git a/addons/sale_stock/sale_stock_view.xml b/addons/sale_stock/sale_stock_view.xml
index 81f16c5eb40..6d0214fba67 100644
--- a/addons/sale_stock/sale_stock_view.xml
+++ b/addons/sale_stock/sale_stock_view.xml
@@ -20,8 +20,8 @@
<xpath expr="//button[@name='action_cancel']" position="after">
<button name="ship_cancel" states="shipping_except" string="Cancel Order"/>
</xpath>
- <field name="state" position="replace">
- <field name="state" widget="statusbar" statusbar_visible="draft,sent,progress,invoiced,done" statusbar_colors='{"shipping_except":"red","invoice_except":"red","waiting_date":"blue"}'/>
+ <field name="state" position="attributes">
+ <attribute name="statusbar_colors">{"shipping_except":"red","invoice_except":"red","waiting_date":"blue"}</attribute>
</field>
<field name="company_id" position="replace">
<field name="company_id" readonly="True"/>
diff --git a/addons/stock/product.py b/addons/stock/product.py
index 8161dc3ebaa..3eddf0a1c72 100644
--- a/addons/stock/product.py
+++ b/addons/stock/product.py
@@ -379,8 +379,6 @@ class product_product(osv.osv):
"In a context with a single Warehouse, this includes "
"goods stored in the Stock Location of this Warehouse, or any "
"of its children.\n"
- "stored in the Stock Location of the Warehouse of this Shop, "
- "or any of its children.\n"
"Otherwise, this includes goods stored in any Stock Location "
"with 'internal' type."),
'incoming_qty': fields.function(_product_available, multi='qty_available',
@@ -392,9 +390,6 @@ class product_product(osv.osv):
"In a context with a single Warehouse, this includes "
"goods arriving to the Stock Location of this Warehouse, or "
"any of its children.\n"
- "In a context with a single Shop, this includes goods "
- "arriving to the Stock Location of the Warehouse of this "
- "Shop, or any of its children.\n"
"Otherwise, this includes goods arriving to any Stock "
"Location with 'internal' type."),
'outgoing_qty': fields.function(_product_available, multi='qty_available',
@@ -406,9 +401,6 @@ class product_product(osv.osv):
"In a context with a single Warehouse, this includes "
"goods leaving the Stock Location of this Warehouse, or "
"any of its children.\n"
- "In a context with a single Shop, this includes goods "
- "leaving the Stock Location of the Warehouse of this "
- "Shop, or any of its children.\n"
"Otherwise, this includes goods leaving any Stock "
"Location with 'internal' type."),
'track_production': fields.boolean('Track Manufacturing Lots', help="Forces to specify a Serial Number for all moves containing this product and generated by a Manufacturing Order"),
diff --git a/addons/web_linkedin/i18n/fi.po b/addons/web_linkedin/i18n/fi.po
new file mode 100644
index 00000000000..5b1b3039361
--- /dev/null
+++ b/addons/web_linkedin/i18n/fi.po
@@ -0,0 +1,137 @@
+# Finnish translation for openobject-addons
+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2014-02-19 10:26+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Finnish <fi@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-02-20 05:14+0000\n"
+"X-Generator: Launchpad (build 16916)\n"
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "here:"
+msgstr ""
+
+#. module: web_linkedin
+#: field:sale.config.settings,api_key:0
+msgid "API Key"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/js/linkedin.js:331
+#, python-format
+msgid "No results found"
+msgstr "Haku ei tuottanut tuloksia."
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/js/linkedin.js:62
+#, python-format
+msgid "Ok"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "Log into LinkedIn."
+msgstr "Kirjaudun LinkedIn:iin."
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/xml/linkedin.xml:13
+#, python-format
+msgid "People"
+msgstr "Henkilöt"
+
+#. module: web_linkedin
+#: model:ir.model,name:web_linkedin.model_sale_config_settings
+msgid "sale.config.settings"
+msgstr ""
+
+#. module: web_linkedin
+#: field:sale.config.settings,server_domain:0
+msgid "unknown"
+msgstr "tuntematon"
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "https://www.linkedin.com/secure/developer"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/xml/linkedin.xml:15
+#, python-format
+msgid "Companies"
+msgstr "Yritykset"
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "API key"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "Copy the"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/js/linkedin.js:263
+#, python-format
+msgid "LinkedIn search"
+msgstr "LinkedIn-haku"
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/xml/linkedin.xml:31
+#, python-format
+msgid ""
+"LinkedIn access was not enabled on this server.\n"
+" Please ask your administrator to configure it in Settings > "
+"Configuration > Sales > Social Network Integration."
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid ""
+"To use the LinkedIn module with this database, an API Key is required. "
+"Please follow this procedure:"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/js/linkedin.js:60
+#, python-format
+msgid "LinkedIn is not enabled"
+msgstr "LinkedIn ei ole vahvistettu käyttöön"
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "Add a new application and fill the form:"
+msgstr "Lisää uusi hakemus ja täytä lomake:"
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "Go to this URL:"
+msgstr "Siirry tähän URL-osoitteeseen:"
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "The programming tool is Javascript"
+msgstr "Ohjelmointityökalu on JavaScript"
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "JavaScript API Domain:"
+msgstr "JavaScript API Toimialue:"
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index eee8b9f5073..6eb9ebc591e 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -93,8 +93,15 @@ class Website(openerp.addons.web.controllers.main.Home):
# Edit
#------------------------------------------------------
@http.route('/website/add/<path:path>', type='http', auth="user", website=True)
- def pagenew(self, path, noredirect=False):
+ def pagenew(self, path, noredirect=False, add_menu=None):
xml_id = request.registry['website'].new_page(request.cr, request.uid, path, context=request.context)
+ if add_menu:
+ model, id = request.registry["ir.model.data"].get_object_reference(request.cr, request.uid, 'website', 'main_menu')
+ request.registry['website.menu'].create(request.cr, request.uid, {
+ 'name': path,
+ 'url': "/page/" + xml_id,
+ 'parent_id': id,
+ }, context=request.context)
url = "/page/" + xml_id
if noredirect:
return werkzeug.wrappers.Response(url, mimetype='text/plain')
diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py
index a789657dad3..27af03310a9 100644
--- a/addons/website/models/ir_ui_view.py
+++ b/addons/website/models/ir_ui_view.py
@@ -148,7 +148,7 @@ class view(osv.osv):
qcontext.update(values)
# in edit mode ir.ui.view will tag nodes
- context['inherit_branding'] = qcontext['editable']
+ context['inherit_branding'] = qcontext.get('editable', False)
view_obj = request.website.get_template(id_or_xml_id)
if 'main_object' not in qcontext:
diff --git a/addons/website/models/website.py b/addons/website/models/website.py
index 3af29208627..16566f5a5c3 100644
--- a/addons/website/models/website.py
+++ b/addons/website/models/website.py
@@ -178,10 +178,8 @@ class website(osv.osv):
return '%s.%s' % (module, slugify(name, max_length=50))
def page_exists(self, cr, uid, ids, name, module='website', context=None):
- page = self.page_for_name(cr, uid, ids, name, module=module, context=context)
-
try:
- self.pool["ir.model.data"].get_object_reference(cr, uid, module, name)
+ return self.pool["ir.model.data"].get_object_reference(cr, uid, module, name)
except:
return False
@@ -248,7 +246,7 @@ class website(osv.osv):
pmin = pmax - scope if pmax - scope > 0 else 1
def get_url(page):
- _url = "%spage/%s/" % (url, page)
+ _url = "%spage/%s/" % (url, page) if page > 1 else url
if url_args:
_url = "%s?%s" % (_url, werkzeug.url_encode(url_args))
return _url
@@ -348,6 +346,7 @@ class website(osv.osv):
router = request.httprequest.app.get_db_router(request.db)
# Force enumeration to be performed as public user
uid = self.get_public_user(cr, uid, context=context)
+ url_list = []
for rule in router.iter_rules():
if not self.rule_is_enumerable(rule):
continue
@@ -369,7 +368,9 @@ class website(osv.osv):
for values in generated:
domain_part, url = rule.build(values, append_unknown=False)
page = {'name': url, 'url': url}
-
+ if url in url_list:
+ continue
+ url_list.append(url)
if not filtered and query_string and not self.page_matches(cr, uid, page, query_string, context=context):
continue
yield page
@@ -494,9 +495,14 @@ class website_menu(osv.osv):
'parent_left': fields.integer('Parent Left', select=True),
'parent_right': fields.integer('Parent Right', select=True),
}
+
+ def __defaults_sequence(self, cr, uid, context):
+ menu = self.search_read(cr, uid, [(1,"=",1)], ["sequence"], limit=1, order="sequence DESC", context=context)
+ return menu and menu[0]["sequence"] or 0
+
_defaults = {
'url': '',
- 'sequence': 0,
+ 'sequence': __defaults_sequence,
'new_window': False,
}
_parent_store = True
diff --git a/addons/website/static/src/css/snippets.css b/addons/website/static/src/css/snippets.css
index 16e85850b2a..fe9c18c0081 100644
--- a/addons/website/static/src/css/snippets.css
+++ b/addons/website/static/src/css/snippets.css
@@ -270,6 +270,10 @@
-moz-box-shadow: 0 0 5px 3px rgba(255, 255, 255, 0.7);
box-shadow: 0 0 5px 3px rgba(255, 255, 255, 0.7);
}
+.oe_overlay .oe_handle.e:before, .oe_overlay .oe_handle.w:before {
+ content: "\f0d9-\f0da";
+ line-height: 16px;
+}
.oe_overlay .oe_handle.e {
left: auto;
top: 2px;
@@ -277,8 +281,17 @@
right: -6px;
cursor: w-resize;
}
-.oe_overlay .oe_handle.e:before {
- content: "\F061";
+.oe_overlay .oe_handle.w {
+ top: 2px;
+ height: 100%;
+ left: -6px;
+ cursor: e-resize;
+}
+.oe_overlay .oe_handle.s:before, .oe_overlay .oe_handle.n:before {
+ z-index: 0;
+ content: "\f07d";
+ text-align: center;
+ padding: 1px;
}
.oe_overlay .oe_handle.s {
top: auto;
@@ -287,9 +300,11 @@
bottom: -6px;
cursor: n-resize;
}
-.oe_overlay .oe_handle.s:before {
- z-index: 0;
- content: "\F063";
+.oe_overlay .oe_handle.n {
+ left: 2px;
+ width: 100%;
+ top: -6px;
+ cursor: s-resize;
}
.oe_overlay .oe_handle.size {
top: auto;
@@ -320,24 +335,6 @@
position: relative;
top: 8px;
}
-.oe_overlay .oe_handle.w {
- top: 2px;
- height: 100%;
- left: -6px;
- cursor: e-resize;
-}
-.oe_overlay .oe_handle.w:before {
- content: "\F060";
-}
-.oe_overlay .oe_handle.n {
- left: 2px;
- width: 100%;
- top: -6px;
- cursor: s-resize;
-}
-.oe_overlay .oe_handle.n:before {
- content: "\F062";
-}
.oe_overlay .icon.btn {
display: inline-block;
}
@@ -362,6 +359,36 @@
.oe_overlay .oe_overlay_options .dropdown-menu select, .oe_overlay .oe_overlay_options .dropdown-menu input {
display: block;
}
+.oe_overlay.block-w-left .w:before {
+ content: "\F061" !important;
+}
+.oe_overlay.block-w-right .w:before {
+ content: "\F060" !important;
+}
+.oe_overlay.block-w-left.block-w-right .w {
+ display: none !important;
+}
+.oe_overlay.block-e-left .e:before {
+ content: "\F061" !important;
+}
+.oe_overlay.block-e-right .e:before {
+ content: "\F060" !important;
+}
+.oe_overlay.block-e-left.block-e-right .e {
+ display: none !important;
+}
+.oe_overlay.block-s-top .s:before {
+ content: "\F063" !important;
+}
+.oe_overlay.block-s-bottom .s:before {
+ content: "\f062" !important;
+}
+.oe_overlay.block-n-top .n:before {
+ content: "\F063" !important;
+}
+.oe_overlay.block-n-bottom .n:before {
+ content: "\f062" !important;
+}
.s-resize-important, .s-resize-important * {
cursor: s-resize !important;
diff --git a/addons/website/static/src/css/snippets.sass b/addons/website/static/src/css/snippets.sass
index 7e889763572..a06bba01dba 100644
--- a/addons/website/static/src/css/snippets.sass
+++ b/addons/website/static/src/css/snippets.sass
@@ -147,6 +147,7 @@
.resize_editor_busy
background-color: rgba(0,0,0,0.3)
+
.oe_overlay
display: none
position: absolute
@@ -194,23 +195,38 @@
background: rgba(0, 0, 0, .5)
color: #fff
+box-shadow(0 0 5px 3px rgba(255,255,255,.7))
+ &.e, &.w
+ &:before
+ content: "\f0d9-\f0da"
+ line-height: 16px
&.e
left: auto
top: 2px
height: 100%
right: -6px
cursor: w-resize
+ &.w
+ top: 2px
+ height: 100%
+ left: -6px
+ cursor: e-resize
+ &.s, &.n
&:before
- content: "\F061"
+ z-index: 0
+ content: "\f07d"
+ text-align: center
+ padding: 1px
&.s
top: auto
left: 2px
width: 100%
bottom: -6px
cursor: n-resize
- &:before
- z-index: 0
- content: "\F063"
+ &.n
+ left: 2px
+ width: 100%
+ top: -6px
+ cursor: s-resize
&.size
top: auto
left: 2px
@@ -234,20 +250,6 @@
border-color: rgba(0, 0, 0, 0.5)
position: relative
top: 8px
- &.w
- top: 2px
- height: 100%
- left: -6px
- cursor: e-resize
- &:before
- content: "\F060"
- &.n
- left: 2px
- width: 100%
- top: -6px
- cursor: s-resize
- &:before
- content: "\F062"
.icon.btn
display: inline-block
@@ -269,6 +271,29 @@
.dropdown-menu select,.dropdown-menu input
display: block
+ &.block-w-left .w:before
+ content: "\F061" !important
+ &.block-w-right .w:before
+ content: "\F060" !important
+ &.block-w-left.block-w-right .w
+ display: none !important
+ &.block-e-left .e:before
+ content: "\F061" !important
+ &.block-e-right .e:before
+ content: "\F060" !important
+ &.block-e-left.block-e-right .e
+ display: none !important
+
+ &.block-s-top .s:before
+ content: "\F063" !important
+ &.block-s-bottom .s:before
+ content: "\f062" !important
+ &.block-n-top .n:before
+ content: "\F063" !important
+ &.block-n-bottom .n:before
+ content: "\f062" !important
+
+
.s-resize-important, .s-resize-important *
cursor: s-resize !important
.n-resize-important, .n-resize-important *
diff --git a/addons/website/static/src/css/website.css b/addons/website/static/src/css/website.css
index 317d9193d94..e47b7a41baa 100644
--- a/addons/website/static/src/css/website.css
+++ b/addons/website/static/src/css/website.css
@@ -298,20 +298,23 @@ ul.nav-stacked > li > a {
}
.carousel .carousel-caption {
- left: auto;
- right: auto;
- bottom: 10%;
+ position: absolute;
+ right: 50%;
+ left: 50%;
+ bottom: 20px;
+}
+.carousel .carousel-caption > div {
+ position: absolute;
text-align: left;
padding: 20px;
background: rgba(0, 0, 0, 0.4);
+ bottom: 20px;
}
.carousel .carousel-caption h1, .carousel .carousel-caption h2, .carousel .carousel-caption h3 {
margin-top: 10px;
margin-bottom: 10px;
}
.carousel .carousel-image {
- right: 50%;
- left: 50%;
top: 5%;
bottom: 5%;
position: absolute;
@@ -326,13 +329,35 @@ ul.nav-stacked > li > a {
right: 10%;
top: 10%;
bottom: auto;
+}
+.carousel .item.text_only .carousel-caption > div {
text-align: center;
background: transparent;
+ bottom: auto;
+ width: 100%;
+}
+.carousel .item.text_image .carousel-caption {
+ left: 10%;
+}
+.carousel .item.text_image .carousel-caption > div {
+ right: 50%;
+ margin-right: -20%;
+ max-width: 550px;
+}
+.carousel .item.text_image .carousel-image {
+ right: 10%;
+ left: 50%;
}
.carousel .item.image_text .carousel-caption {
right: 10%;
}
+.carousel .item.image_text .carousel-caption > div {
+ left: 50%;
+ margin-left: -20%;
+ max-width: 550px;
+}
.carousel .item.image_text .carousel-image {
+ right: 50%;
left: 10%;
}
.carousel .carousel-control {
diff --git a/addons/website/static/src/css/website.sass b/addons/website/static/src/css/website.sass
index 2390464bfa7..3cdfe37a896 100644
--- a/addons/website/static/src/css/website.sass
+++ b/addons/website/static/src/css/website.sass
@@ -244,18 +244,20 @@ ul.nav-stacked > li > a
background-size: cover
.carousel
.carousel-caption
- left: auto
- right: auto
- bottom: 10%
- text-align: left
- padding: 20px
- background: rgba(0, 0, 0, 0.4)
+ position: absolute
+ right: 50%
+ left: 50%
+ bottom: 20px
+ > div
+ position: absolute
+ text-align: left
+ padding: 20px
+ background: rgba(0, 0, 0, 0.4)
+ bottom: 20px
h1, h2, h3
margin-top: 10px
margin-bottom: 10px
.carousel-image
- right: 50%
- left: 50%
top: 5%
bottom: 5%
position: absolute
@@ -269,12 +271,30 @@ ul.nav-stacked > li > a
right: 10%
top: 10%
bottom: auto
- text-align: center
- background: transparent
+ > div
+ text-align: center
+ background: transparent
+ bottom: auto
+ width: 100%
+ .item.text_image
+ .carousel-caption
+ left: 10%
+ > div
+ right: 50%
+ margin-right: -20%
+ max-width: 550px
+ .carousel-image
+ right: 10%
+ left: 50%
.item.image_text
.carousel-caption
right: 10%
+ > div
+ left: 50%
+ margin-left: -20%
+ max-width: 550px
.carousel-image
+ right: 50%
left: 10%
.carousel-control
cursor: pointer
diff --git a/addons/website/static/src/js/website.ace.js b/addons/website/static/src/js/website.ace.js
index 514969fc4c2..ed7037e903c 100644
--- a/addons/website/static/src/js/website.ace.js
+++ b/addons/website/static/src/js/website.ace.js
@@ -41,12 +41,14 @@
isWellFormed: function () {
if (document.implementation.createDocument) {
var dom = new DOMParser().parseFromString(this.xml, "text/xml");
- return dom.getElementsByTagName("parsererror").length === 0;
+ var error = dom.getElementsByTagName("parsererror");
+ return error.length === 0 || error;
} else if (window.ActiveXObject) {
// TODO test in IE
var msDom = new ActiveXObject("Microsoft.XMLDOM");
msDom.async = false;
- return !msDom.loadXML(this.xml);
+ msDom.loadXML(this.xml);
+ return !msDom.parseError.errorCode || msDom.parseError.reason + "\nline " + msDom.parseError.line;
}
return true;
},
@@ -256,28 +258,35 @@
}), function (session) {
return session.isDirty;
});
- var requests = _.map(toSave, self.saveView);
+ this.clearError();
+ var requests = _.map(toSave, function (session) {
+ return self.saveView(session);
+ });
$.when.apply($, requests).then(function () {
self.reloadPage.call(self);
- }).fail(function (source, error) {
- var message = _.isString(error) ? error
- : (error && error.data && error.data.arguments && error.data.arguments[0] === "Access Denied") ? "Access denied: please sign in"
- : (error && error.message) ? error.message
- : "Unexpected error";
- self.displayError.call(self, message);
+ }).fail(function (source, session, error) {
+ self.displayError.call(self, source, session, error);
});
},
saveView: function (session) {
+ var self = this;
var xml = new website.ace.XmlDocument(session.text);
- if (xml.isWellFormed()) {
- return openerp.jsonRpc('/web/dataset/call', 'call', {
+ var isWellFormed = xml.isWellFormed();
+ var def = $.Deferred();
+ if (isWellFormed === true) {
+ openerp.jsonRpc('/web/dataset/call', 'call', {
model: 'ir.ui.view',
method: 'write',
args: [[session.id], { 'arch': xml.xml }, website.get_context()],
+ }).then(function () {
+ def.resolve();
+ }).fail(function (source, error) {
+ def.reject("server", session, error);
});
} else {
- return $.Deferred().reject(null, "Malformed XML document");
+ def.reject(null, session, $(isWellFormed).text());
}
+ return def;
},
updateHash: function () {
window.location.hash = hash + "?view=" + this.selectedViewId();
@@ -286,9 +295,61 @@
this.updateHash();
window.location.reload();
},
- displayError: function (error) {
- // TODO Improve feedback (e.g. update 'Save' button + tooltip)
- alert(error);
+ clearError: function () {
+ this.$(".ace_layer.ace_text-layer .ace_line").css("background", "");
+ },
+ displayError: function (source, session, error) {
+ var self = this;
+ var line, test;
+ // format error message
+ var message = _.isString(error) ? error
+ : (error && error.data && error.data.arguments && error.data.arguments[0] === "Access Denied") ? "Access denied: please sign in"
+ : (error && error.data && error.data.message) ? error.data.message
+ : (error && error.message) ? error.message
+ : "Unexpected error";
+ if (source == "server") {
+ message = eval(message.replace(/^\(/g, '([')
+ .replace(/\)$/g, '])')
+ .replace(/u'/g, "'")
+ .replace(/<([^>]+)>/g, '<b style="color:#661100;">&lt;\$1&gt;</b>'))[1];
+ line = -1;
+ } else {
+ line = message.match(/line ([0-9]+)/i);
+ line = line ? parseInt(line[1],10) : -1;
+ test = new RegExp("^\\s*"+line+"\\s*$");
+ }
+
+ function gotoline() {
+ self.aceEditor.gotoLine(line);
+ setTimeout(function () {
+ var $lines = self.$(".ace_editor .ace_gutter .ace_gutter-cell");
+ var index = $lines.filter(function () {
+ return test.test($(this).text());
+ }).index();
+ if (index>0) {
+ self.$(".ace_layer.ace_text-layer .ace_line:eq(" + index + ")").css("background", "#661100");
+ }
+ },100);
+ }
+ function onchangeSession (e) {
+ self.aceEditor.off('changeSession', onchangeSession);
+ gotoline();
+ }
+
+ var $list = this.$("#ace-view-list");
+ if (+$list.val() == session.id) {
+ if (line>-1) gotoline();
+ } else {
+ if (line) self.aceEditor.on('changeSession', onchangeSession);
+ this.$("#ace-view-list").val(session.id).change();
+ }
+
+ var $dialog = $(openerp.qweb.render('website.error_dialog', {
+ title: session.text.match(/\s+name=['"]([^'"]+)['"]/i)[1],
+ message:"<b>Malformed XML document</b>:<br/>" + message
+ }));
+ $dialog.appendTo("body");
+ $dialog.modal('show');
},
open: function () {
this.$el.removeClass('oe_ace_closed').addClass('oe_ace_open');
diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js
index 7e867dca685..dc82c0c17b9 100644
--- a/addons/website/static/src/js/website.editor.js
+++ b/addons/website/static/src/js/website.editor.js
@@ -994,6 +994,7 @@
start: function () {
var sup = this._super();
this.$el.modal({backdrop: 'static'});
+ this.$('input:first').focus();
return sup;
},
save: function () {
@@ -1033,10 +1034,13 @@
},
start: function () {
var self = this;
+ var last;
this.$('#link-page').select2({
minimumInputLength: 1,
placeholder: _t("New or existing page"),
query: function (q) {
+ if (q.term == last) return;
+ last = q.term;
$.when(
self.page_exists(q.term),
self.fetch_pages(q.term)
@@ -1667,6 +1671,8 @@
}
switch(m.type) {
case 'attributes': // ignore .cke_focus being added or removed
+ // ignore id modification
+ if (m.attributeName === 'id') { return false; }
// if attribute is not a class, can't be .cke_focus change
if (m.attributeName !== 'class') { return true; }
diff --git a/addons/website/static/src/js/website.editor.newpage.js b/addons/website/static/src/js/website.editor.newpage.js
index 8d3b3e9b6b5..b475223ecd9 100644
--- a/addons/website/static/src/js/website.editor.newpage.js
+++ b/addons/website/static/src/js/website.editor.newpage.js
@@ -13,16 +13,44 @@
this.$(".oe_content_menu li.divider").removeClass("hidden");
return res;
},
+ edit: function () {
+ this.on('rte:ready', this, function () {
+ $('a:has(span[data-oe-model="website.menu"])').tooltip({
+ title: _t('Save this page and use the top "Content" menu to edit the menu.'),
+ placement: "bottom",
+ trigger: "hover",
+ show: 50,
+ hide: 100,
+ container: 'body'
+ });
+ });
+ return this._super();
+ },
events: _.extend({}, website.EditorBar.prototype.events, {
'click a[data-action=new_page]': function (ev) {
ev.preventDefault();
website.prompt({
id: "editor_new_page",
window_title: _t("New Page"),
- input: "Page Title",
- }).then(function (val) {
+ input: _t("Page Title"),
+ init: function () {
+ var $group = this.$dialog.find("div.form-group");
+ $group.removeClass("mb0");
+
+ var $add = $(
+ '<div class="form-group mb0">'+
+ '<label class="col-sm-offset-3 col-sm-9 text-left">'+
+ ' <input type="checkbox" checked="checked" required="required"/> '+
+ '</label>'+
+ '</div>');
+ $add.find('label').append(_t("Add page in menu"));
+ $group.after($add);
+ }
+ }).then(function (val, field, $dialog) {
if (val) {
- document.location = '/website/add/' + encodeURI(val);
+ var url = '/website/add/' + encodeURI(val);
+ if ($dialog.find('input[type="checkbox"]').is(':checked')) url +="?add_menu=1";
+ document.location = url;
}
});
}
diff --git a/addons/website/static/src/js/website.js b/addons/website/static/src/js/website.js
index 6fde9495d36..671dfc14ee9 100644
--- a/addons/website/static/src/js/website.js
+++ b/addons/website/static/src/js/website.js
@@ -206,6 +206,7 @@
var def = $.Deferred();
var dialog = $(openerp.qweb.render('website.prompt', options)).appendTo("body");
+ options.$dialog = dialog;
var field = dialog.find(options.field_type).first();
field.val(options.default);
field.fillWith = function (data) {
@@ -226,7 +227,7 @@
dialog.modal('show');
field.focus();
dialog.on('click', '.btn-primary', function () {
- def.resolve(field.val(), field);
+ def.resolve(field.val(), field, dialog);
dialog.remove();
});
});
@@ -247,13 +248,13 @@
website.form = function (url, method, params) {
var form = document.createElement('form');
- form.action = url;
- form.method = method;
+ form.setAttribute('action', url);
+ form.setAttribute('method', method);
_.each(params, function (v, k) {
var param = document.createElement('input');
- param.type = 'hidden';
- param.name = k;
- param.value = v;
+ param.setAttribute('type', 'hidden');
+ param.setAttribute('name', k);
+ param.setAttribute('value', v);
form.appendChild(param);
});
document.body.appendChild(form);
diff --git a/addons/website/static/src/js/website.snippets.animation.js b/addons/website/static/src/js/website.snippets.animation.js
index 048cf20231f..bc2ea064731 100644
--- a/addons/website/static/src/js/website.snippets.animation.js
+++ b/addons/website/static/src/js/website.snippets.animation.js
@@ -2,7 +2,7 @@
'use strict';
var website = openerp.website;
- website.snippet = {};
+ if (!website.snippet) website.snippet = {};
website.snippet.readyAnimation = [];
website.snippet.start_animation = function () {
diff --git a/addons/website/static/src/js/website.snippets.editor.js b/addons/website/static/src/js/website.snippets.editor.js
index e45bee9685b..23c5956ebf4 100644
--- a/addons/website/static/src/js/website.snippets.editor.js
+++ b/addons/website/static/src/js/website.snippets.editor.js
@@ -79,6 +79,7 @@
// 'snippet-dropped' is triggered on '#oe_snippets' whith $target as attribute when a snippet is dropped
// 'snippet-activated' is triggered on '#oe_snippets' (and on snippet) when a snippet is activated
+ if (!website.snippet) website.snippet = {};
website.snippet.styles = {};
website.snippet.selector = [];
website.snippet.BuildingBlock = openerp.Widget.extend({
@@ -139,9 +140,6 @@
this.$el.addClass("hidden");
- this.$modal = $(openerp.qweb.render('website.snippets_modal'));
- this.$modal.appendTo("body");
-
$(document).on('click', '.dropdown-submenu a[tabindex]', function (e) {
e.preventDefault();
});
@@ -375,7 +373,7 @@
});
},
stop: function(ev, ui){
- if (action === 'insert' && ! dropped && $('.oe_drop_zone') && ui.position.top > 50) {
+ if (action === 'insert' && ! dropped && $('.oe_drop_zone') && ui.position.top > 3) {
var el = $('.oe_drop_zone').nearest({x: ui.position.left, y: ui.position.top}).first();
if (el.length) {
el.after($toInsert);
@@ -392,7 +390,7 @@
website.snippet.start_animation();
self.create_overlay($target);
- if ($snippet.data("snippet-editor")) {
+ if ($target.data("snippet-editor")) {
$target.data("snippet-editor").drop_and_build_snippet($target);
}
@@ -439,9 +437,6 @@
},0);
} else {
$toInsert.remove();
- if (self.$modal.find('input:not(:checked)').length) {
- self.$modal.modal('toggle');
- }
}
},
});
@@ -1126,6 +1121,38 @@
return this.grid;
},
+ onFocus : function () {
+ this._super();
+ this.change_cursor();
+ },
+
+ change_cursor : function () {
+ var _class = this.$target.attr("class") || "";
+
+ var col = _class.match(/col-md-([0-9-]+)/i);
+ col = col ? +col[1] : 0;
+
+ var offset = _class.match(/col-md-offset-([0-9-]+)/i);
+ offset = offset ? +offset[1] : 0;
+
+ var overlay_class = this.$overlay.attr("class").replace(/(^|\s+)block-[^\s]*/gi, '');
+ if (col+offset >= 12) overlay_class+= " block-e-right";
+ if (col === 1) overlay_class+= " block-w-right block-e-left";
+ if (offset === 0) overlay_class+= " block-w-left";
+
+ var mb = _class.match(/mb([0-9-]+)/i);
+ mb = mb ? +mb[1] : 0;
+ if (mb >= 128) overlay_class+= " block-s-bottom";
+ else if (!mb) overlay_class+= " block-s-top";
+
+ var mt = _class.match(/mt([0-9-]+)/i);
+ mt = mt ? +mt[1] : 0;
+ if (mt >= 128) overlay_class+= " block-n-top";
+ else if (!mt) overlay_class+= " block-n-bottom";
+
+ this.$overlay.attr("class", overlay_class);
+ },
+
/* on_resize
* called when the box is resizing and the class change, before the cover_target
* @compass: resize direction : 'n', 's', 'e', 'w'
@@ -1133,7 +1160,7 @@
* @current: curent increment in this.grid
*/
on_resize: function (compass, beginClass, current) {
-
+ this.change_cursor();
}
});
@@ -1212,27 +1239,27 @@
return false;
},
on_resize: function (compass, beginClass, current) {
- if (compass !== 'w')
- return;
-
- // don't change the right border position when we change the offset (replace col size)
- var beginCol = Number(beginClass.match(/col-md-([0-9]+)|$/)[1] || 0);
- var beginOffset = Number(beginClass.match(/col-md-offset-([0-9-]+)|$/)[1] || beginClass.match(/col-lg-offset-([0-9-]+)|$/)[1] || 0);
- var offset = Number(this.grid.w[0][current].match(/col-md-offset-([0-9-]+)|$/)[1] || 0);
- if (offset < 0) {
- offset = 0;
- }
- var colSize = beginCol - (offset - beginOffset);
- if (colSize <= 0) {
- colSize = 1;
- offset = beginOffset + beginCol - 1;
- }
- this.$target.attr("class",this.$target.attr("class").replace(/\s*(col-lg-offset-|col-md-offset-|col-md-)([0-9-]+)/g, ''));
+ if (compass === 'w') {
+ // don't change the right border position when we change the offset (replace col size)
+ var beginCol = Number(beginClass.match(/col-md-([0-9]+)|$/)[1] || 0);
+ var beginOffset = Number(beginClass.match(/col-md-offset-([0-9-]+)|$/)[1] || beginClass.match(/col-lg-offset-([0-9-]+)|$/)[1] || 0);
+ var offset = Number(this.grid.w[0][current].match(/col-md-offset-([0-9-]+)|$/)[1] || 0);
+ if (offset < 0) {
+ offset = 0;
+ }
+ var colSize = beginCol - (offset - beginOffset);
+ if (colSize <= 0) {
+ colSize = 1;
+ offset = beginOffset + beginCol - 1;
+ }
+ this.$target.attr("class",this.$target.attr("class").replace(/\s*(col-lg-offset-|col-md-offset-|col-md-)([0-9-]+)/g, ''));
- this.$target.addClass('col-md-' + (colSize > 12 ? 12 : colSize));
- if (offset > 0) {
- this.$target.addClass('col-md-offset-' + offset);
+ this.$target.addClass('col-md-' + (colSize > 12 ? 12 : colSize));
+ if (offset > 0) {
+ this.$target.addClass('col-md-offset-' + offset);
+ }
}
+ this._super(compass, beginClass, current);
},
});
@@ -1254,8 +1281,6 @@
this.$target.attr('contentEditable', 'false');
this.$target.find('.oe_structure, .content>.row').attr('contentEditable', 'true');
-
- this.$target.carousel('pause');
},
clean_for_save: function () {
this._super();
@@ -1264,14 +1289,6 @@
this.$target.find(".item:first").addClass("active");
}
},
- onFocus: function () {
- this._super();
- this.$target.carousel('pause');
- },
- onBlur: function () {
- this._super();
- this.$target.carousel('cycle');
- },
start : function () {
var self = this;
this._super();
@@ -1282,6 +1299,7 @@
this.$editor.find(".js_add").on('click', function () {self.on_add_slide(); return false;});
this.$editor.find(".js_remove").on('click', function () {self.on_remove_slide(); return false;});
+ this.$target.carousel('pause');
this.rebind_event();
},
on_add_slide: function () {
@@ -1401,7 +1419,7 @@
this.$target.find('.carousel-control').off('click').on('click', function () {
self.$target.carousel( $(this).data('slide')); });
- this.$target.find('.carousel-image, .content').attr('contentEditable', 'true');
+ this.$target.find('.carousel-inner .content > div').attr('contentEditable', 'true');
this.$target.find('.carousel-image').attr('attributeEditable', 'true');
this._super();
},
diff --git a/addons/website/static/src/js/website.tour.banner.js b/addons/website/static/src/js/website.tour.banner.js
index 7d307bd26d7..1d4a0c0f752 100644
--- a/addons/website/static/src/js/website.tour.banner.js
+++ b/addons/website/static/src/js/website.tour.banner.js
@@ -69,10 +69,10 @@
popover: { fixed: true },
},
{
- snippet: 'three-columns',
+ snippet: 'features',
placement: 'bottom',
title: _t("Drag & Drop This Block"),
- content: _t("Drag the <em>'Three Columns'</em> block and drop it below the banner."),
+ content: _t("Drag the <em>'Features'</em> block and drop it below the banner."),
popover: { fixed: true },
},
{
@@ -100,8 +100,9 @@
{
element: '.modal:has(#mobile-viewport) button[data-dismiss=modal]',
placement: 'right',
- title: _t("Close Mobile Preview"),
+ title: _t("Check Mobile Preview"),
content: _t("Scroll in the mobile preview to test the rendering. Once it's ok, close this dialog."),
+ popover: { next: _t("Continue") },
},
{
waitNot: '.modal',
diff --git a/addons/website/static/src/js/website.tour.js b/addons/website/static/src/js/website.tour.js
index f1d5ab79228..2416cb511f1 100644
--- a/addons/website/static/src/js/website.tour.js
+++ b/addons/website/static/src/js/website.tour.js
@@ -281,6 +281,14 @@ website.Tour = openerp.Class.extend({
self.nextStep(step.stepId, callback, overlaps);
}, self.defaultDelay);
} else if (!overlaps || new Date().getTime() - time < overlaps) {
+ if (self.current.element) {
+ var $popover = $(".popover.tour");
+ if(!$(self.current.element).is(":visible")) {
+ $popover.data("hide", true).fadeOut(300);
+ } else if($popover.data("hide")) {
+ $popover.data("hide", false).fadeIn(150);
+ }
+ }
self.timer = setTimeout(checkNext, self.defaultDelay);
} else {
self.reset();
diff --git a/addons/website/static/src/xml/website.snippets.xml b/addons/website/static/src/xml/website.snippets.xml
index cf3996bdba4..d73e0c3934a 100644
--- a/addons/website/static/src/xml/website.snippets.xml
+++ b/addons/website/static/src/xml/website.snippets.xml
@@ -15,43 +15,6 @@
</div>
</li>
</t>
- <t t-name="website.snippets_modal">
- <div class="modal" id="oe_droperror" tabindex="-1" role="dialog">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal">&amp;times;</button>
- <h4 class="modal-title">
- Building Block Not Inserted
- </h4>
- </div>
- <div class="modal-body">
- <p>
- Please drop building blocks in a valid zone, like
- this one:
- </p>
- <div class="row">
- <div class="col-sm-4 col-sm-offset-4 oe_drop_zone_style text-center">
- <span class="mt16">drop in this zone</span>
- </div>
- </div>
- <div class="text-muted">
- <b>Tip:</b> when your cursor is in a valid zone,
- OpenERP shows you a preview of the building block
- in the page. You must release the block when the
- preview is visible.
- </div>
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
- <div class="pull-left">
- <input type="checkbox" value="1"/> Never show this tip again
- </div>
- </div>
- </div>
- </div>
- </div>
- </t>
<t t-name="website.snippets">
<div id='oe_snippets'></div>
diff --git a/addons/website/static/src/xml/website.xml b/addons/website/static/src/xml/website.xml
index f25a491a106..4d9c9fcd73d 100644
--- a/addons/website/static/src/xml/website.xml
+++ b/addons/website/static/src/xml/website.xml
@@ -74,7 +74,7 @@
</div>
<div class="modal-body" t-if="message or backend_url">
<section>
- <t t-esc="message"/>
+ <t t-raw="message"/>
</section>
<section class="mt32" t-if="backend_url">
<p>The web site has encountered an error.</p>
diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py
index 44ab1e7992e..c9dd80ff885 100644
--- a/addons/website/tests/test_ui.py
+++ b/addons/website/tests/test_ui.py
@@ -1,22 +1,11 @@
-import os
-import openerp
-
-inject = [
- ("openerp.website.Tour", os.path.join(os.path.dirname(__file__), '../static/src/js/website.tour.js')),
- ("openerp.website.Tour.LoginEdit", os.path.join(os.path.dirname(__file__), "../static/src/js/website.tour.test.admin.js")),
-]
+import openerp.tests
class TestUi(openerp.tests.HttpCase):
- def test_01_pubic_homepage(self):
- self.phantom_js("/", "console.log('ok')", "openerp.website.snippet");
-
- def test_02_public_login_logout(self):
- # Page injection works but i suspect multiple files doesnt
- return
- self.phantom_js("/", "openerp.website.Tour.run_test('login_edit')", "openerp.website.Tour", inject=inject);
+ def test_01_public_homepage(self):
+ self.phantom_js("/", "console.log('ok')", "openerp.website.snippet")
def test_03_admin_homepage(self):
- self.phantom_js("/", "console.log('ok')", "openerp.website.editor", login='admin');
+ self.phantom_js("/", "console.log('ok')", "openerp.website.editor", login='admin')
def test_04_admin_tour_banner(self):
self.phantom_js("/", "openerp.website.Tour.run_test('banner')", "openerp.website.Tour", login='admin')
diff --git a/addons/website/views/snippets.xml b/addons/website/views/snippets.xml
index 16cbaf9d066..f43c1c1bb80 100644
--- a/addons/website/views/snippets.xml
+++ b/addons/website/views/snippets.xml
@@ -23,7 +23,7 @@
</li>
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_banner.png"/>
- <span class="oe_snippet_thumbnail_title">Banner</span>
+ <span class="oe_snippet_thumbnail_title">Banner</span>
</div>
<div id="myCarousel" class="oe_snippet_body carousel slide mb32" style="height: 320px;">
<!-- Indicators -->
@@ -34,11 +34,13 @@
<div class="item image_text active" style="background-image: url('/website/static/src/img/banner/color_splash.jpg')">
<div class="container">
<div class="carousel-caption content">
- <h2>Your Banner Title</h2>
- <h3>Click to customize this text</h3>
- <p>
- <a href="/page/website.contactus" class="btn btn-success btn-large">Contact us</a>
- </p>
+ <div>
+ <h2>Your Banner Title</h2>
+ <h3>Click to customize this text</h3>
+ <p>
+ <a href="/page/website.contactus" class="btn btn-success btn-large">Contact us</a>
+ </p>
+ </div>
</div>
<img class="carousel-image hidden-xs" src="/website/static/src/img/banner/banner_picture.png" alt="Banner OpenERP Image"/>
</div>
@@ -145,16 +147,16 @@
A great way to catch your reader's attention is to tell a story.
Everything you consider writing can be told as a story.
</p><p>
- <b>Great stories have personality</b>. Consider telling
- a great story that provides personality. Writing a story
- with personality for potential clients will asist with
+ <b>Great stories have personality</b>. Consider telling
+ a great story that provides personality. Writing a story
+ with personality for potential clients will asist with
making a relationship connection. This shows up in small
- quirks like word choices or phrases. Write from your point
+ quirks like word choices or phrases. Write from your point
of view, not from someone else's experience.
</p><p>
<b>Great stories are for everyone even when only written for
just one person</b>. If you try to write with a wide general
- audience in mind, your story will ring false and be bland.
+ audience in mind, your story will ring false and be bland.
No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.
</p>
</div>
@@ -181,20 +183,41 @@
</section>
</div>
-
- <div data-snippet-id="hr" data-selector-children=".oe_structure, [data-oe-type=html]">
+ <div data-snippet-id="features" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
- <img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_separator.png"/>
- <span class="oe_snippet_thumbnail_title">Separator</span>
+ <img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_features.png"/>
+ <span class="oe_snippet_thumbnail_title">Features</span>
</div>
- <hr class="oe_snippet_body"/>
+ <section class="oe_snippet_body mb16">
+ <div class="container">
+ <div class="row mt16 mb16">
+ <div class="col-md-4 text-center">
+ <span class="fa fa-suitcase fa-5x"></span>
+ <h3 class="mt8 mb0">First Feature</h3>
+ <div class="text-muted">Tell what's the value for the</div>
+ <div class="text-muted">customer for this feature.</div>
+ </div>
+ <div class="col-md-4 text-center">
+ <span class="fa fa-lock fa-5x"></span>
+ <h3 class="mt8 mb0">Second Feature</h3>
+ <div class="text-muted">Write what the customer would like to know,</div>
+ <div class="text-muted">not what you want to show.</div>
+ </div>
+ <div class="col-md-4 text-center">
+ <span class="fa fa-heart fa-5x"></span>
+ <h3 class="mt8 mb0">Third Feature</h3>
+ <div class="text-muted">A small explanation of this great</div>
+ <div class="text-muted">feature, in clear words.</div>
+ </div>
+ </div>
+ </div>
+ </section>
</div>
-
<div data-snippet-id="big-picture" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_big_picture.png"/>
- <span class="oe_snippet_thumbnail_title">Big Picture</span>
+ <span class="oe_snippet_thumbnail_title">Big Picture</span>
</div>
<section class="oe_snippet_body oe_dark mt16 mb16">
<div class="container">
@@ -223,11 +246,10 @@
</section>
</div>
-
<div data-snippet-id="three-columns" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_three_columns.png"/>
- <span class="oe_snippet_thumbnail_title">Three Columns</span>
+ <span class="oe_snippet_thumbnail_title">Three Columns</span>
</div>
<section class="oe_snippet_body mt16 mb16">
<div class="container">
@@ -265,66 +287,6 @@
</section>
</div>
- <div data-snippet-id="slider" data-selector-children=".oe_structure, [data-oe-type=html]">
- <li class="oe_snippet_options divider"></li>
- <li class="oe_snippet_options">
- <a href="#" class="button js_add">Add Slide</a>
- </li>
- <li class="oe_snippet_options">
- <a href="#" class="button js_remove">Remove Slide</a>
- </li>
- <div class="oe_snippet_thumbnail">
- <img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_quotes_slider.png"/>
- <span class="oe_snippet_thumbnail_title">Quotes Slider</span>
- </div>
- <div id="myQuoteCarousel" class="oe_snippet_body carousel quotecarousel slide mb0">
- <!-- Indicators -->
- <ol class="carousel-indicators mb0">
- <li data-target="#myQuoteCarousel" data-slide-to="0" class="active"></li>
- <li data-target="#myQuoteCarousel" data-slide-to="1"></li>
- </ol>
- <div class="carousel-inner">
-
- <div class="item text_only active">
- <div class="container">
- <div class="content">
-
- <div class="row">
- <blockquote class="mt48 mb16 col-md-4 col-md-offset-4">
- <p>
- Write a quote here from one of your customers. Quotes are a
- great way to build confidence in your products or services.
- </p>
- <small>Author of this quote</small>
- </blockquote>
- </div>
-
- </div>
- </div>
- </div>
-
- <div class="item text_only">
- <div class="container">
- <div class="content">
-
- <div class="row">
- <blockquote class="mt48 mb16 col-md-4 col-md-offset-4">
- <p>
- OpenERP provides essential platform for our project management.
- Things are better organized and more visible with it.
- </p>
- <small>John Doe, CEO</small>
- </blockquote>
- </div>
-
- </div>
- </div>
-
- </div>
- </div>
- </div>
- </div>
-
</div>
<div id="snippet_content" class="tab-pane fade">
@@ -342,7 +304,7 @@
<div data-snippet-id="quote" data-selector-siblings="p, h1, h2, h3, blockquote" data-selector-children=".content">
- <div class="oe_snippet_thumbnail">
+ <div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_quote.png"/>
<span class="oe_snippet_thumbnail_title">Quote</span>
</div>
@@ -372,6 +334,15 @@
</div>
</div>
+
+ <div data-snippet-id="hr" data-selector-children=".oe_structure, [data-oe-type=html]">
+ <div class="oe_snippet_thumbnail">
+ <img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_separator.png"/>
+ <span class="oe_snippet_thumbnail_title">Separator</span>
+ </div>
+ <hr class="oe_snippet_body"/>
+ </div>
+
</div>
<div id="snippet_feature" class="tab-pane fade">
@@ -412,7 +383,7 @@
<div data-snippet-id="image-gallery" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_image_gallery.png"/>
- <span class="oe_snippet_thumbnail_title">Image Gallery</span>
+ <span class="oe_snippet_thumbnail_title">Image Gallery</span>
</div>
<section class="oe_snippet_body">
<div class="container">
@@ -465,7 +436,7 @@
<div class="col-md-4">
<div class="panel panel-info">
-
+
<div class="panel-heading text-center">
<h2 style="margin: 0">Beginner</h2>
<p style="margin: 0" class="text-muted">
@@ -477,7 +448,7 @@
<div>per month</div>
</div>
-
+
<ul class="list-group">
<li class="list-group-item active">Battery: 8 hours</li>
<li class="list-group-item">Screen: 2.5 inch</li>
@@ -494,7 +465,7 @@
</div>
<div class="col-md-4">
<div class="panel panel-primary">
-
+
<div class="panel-heading text-center">
<h2 style="margin: 0">Professional</h2>
<p style="margin: 0">
@@ -506,7 +477,7 @@
<div>per month</div>
</div>
-
+
<ul class="list-group">
<li class="list-group-item active">Battery: 12 hours</li>
<li class="list-group-item">Screen: 2.8 inch</li>
@@ -523,7 +494,7 @@
</div>
<div class="col-md-4">
<div class="panel panel-info">
-
+
<div class="panel-heading text-center">
<h2 style="margin: 0">Expert</h2>
<p style="margin: 0" class="text-muted">
@@ -535,7 +506,7 @@
<div>per month</div>
</div>
-
+
<ul class="list-group">
<li class="list-group-item active">Battery: 20 hours</li>
<li class="list-group-item">Screen: 2.8 inch</li>
@@ -577,7 +548,7 @@
<div data-snippet-id="faq" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_faq.png"/>
- <span class="oe_snippet_thumbnail_title">FAQ</span>
+ <span class="oe_snippet_thumbnail_title">FAQ</span>
</div>
<section class="oe_snippet_body">
<div class="container">
@@ -624,7 +595,7 @@
<div data-snippet-id="references" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_references.png"/>
- <span class="oe_snippet_thumbnail_title">References</span>
+ <span class="oe_snippet_thumbnail_title">References</span>
</div>
<section class="oe_snippet_body mb32 mt16">
<div class="container">
@@ -675,37 +646,64 @@
</section>
</div>
- <div data-snippet-id="features" data-selector-children=".oe_structure, [data-oe-type=html]">
+ <div data-snippet-id="slider" data-selector-children=".oe_structure, [data-oe-type=html]">
+ <li class="oe_snippet_options divider"></li>
+ <li class="oe_snippet_options">
+ <a href="#" class="button js_add">Add Slide</a>
+ </li>
+ <li class="oe_snippet_options">
+ <a href="#" class="button js_remove">Remove Slide</a>
+ </li>
<div class="oe_snippet_thumbnail">
- <img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_features.png"/>
- <span class="oe_snippet_thumbnail_title">Features</span>
+ <img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_quotes_slider.png"/>
+ <span class="oe_snippet_thumbnail_title">Quotes Slider</span>
</div>
- <section class="oe_snippet_body mb16">
- <div class="container">
- <div class="row mt16 mb16">
- <div class="col-md-3 text-center">
- <span class="fa fa-suitcase fa-5x"></span>
- <h3 class="mt8 mb0">First Feature</h3>
- <p class="text-muted">Tell what's the value for the customer for this feature.</p>
- </div>
- <div class="col-md-3 text-center">
- <span class="fa fa-lock fa-5x"></span>
- <h3 class="mt8 mb0">Second Feature</h3>
- <p class="text-muted">Write what the customer would like to know, not what you want to show.</p>
- </div>
- <div class="col-md-3 text-center">
- <span class="fa fa-heart fa-5x"></span>
- <h3 class="mt8 mb0">Third Feature</h3>
- <p class="text-muted">A small explanation of this great feature, in clear words.</p>
+ <div id="myQuoteCarousel" class="oe_snippet_body carousel quotecarousel slide mb0">
+ <!-- Indicators -->
+ <ol class="carousel-indicators mb0">
+ <li data-target="#myQuoteCarousel" data-slide-to="0" class="active"></li>
+ <li data-target="#myQuoteCarousel" data-slide-to="1"></li>
+ </ol>
+ <div class="carousel-inner">
+
+ <div class="item text_only active">
+ <div class="container">
+ <div class="content">
+
+ <div class="row">
+ <blockquote class="mt48 mb16 col-md-4 col-md-offset-4">
+ <p>
+ Write a quote here from one of your customers. Quotes are a
+ great way to build confidence in your products or services.
+ </p>
+ <small>Author of this quote</small>
+ </blockquote>
+ </div>
+
+ </div>
</div>
- <div class="col-md-3 text-center">
- <span class="fa fa-credit-card fa-5x"></span>
- <h3 class="mt8 mb0">Fourth Feature</h3>
- <p class="text-muted">A small explanation of this great feature on two lines.</p>
+ </div>
+
+ <div class="item text_only">
+ <div class="container">
+ <div class="content">
+
+ <div class="row">
+ <blockquote class="mt48 mb16 col-md-4 col-md-offset-4">
+ <p>
+ OpenERP provides essential platform for our project management.
+ Things are better organized and more visible with it.
+ </p>
+ <small>John Doe, CEO</small>
+ </blockquote>
+ </div>
+
+ </div>
</div>
+
</div>
</div>
- </section>
+ </div>
</div>
<div data-snippet-id="features-list" data-selector-children=".oe_structure, [data-oe-type=html]">
@@ -771,7 +769,7 @@
<div data-snippet-id="parallax" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_parallax.png"/>
- <span class="oe_snippet_thumbnail_title">Parallax</span>
+ <span class="oe_snippet_thumbnail_title">Parallax</span>
</div>
<li class="oe_snippet_options dropdown-submenu">
<a tabindex="-1" href="#">Scroll Speed</a>
@@ -794,7 +792,7 @@
<div data-snippet-id="parallax_quote" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_quotes_slider.png"/>
- <span class="oe_snippet_thumbnail_title">Parallax Slider</span>
+ <span class="oe_snippet_thumbnail_title">Parallax Slider</span>
</div>
<section class="oe_snippet_body parallax" data-snippet-id="parallax"
style="height: 320px; background-image: url('/website/static/src/img/parallax/quote.png')"
@@ -860,7 +858,7 @@
<div data-snippet-id='colmd' data-selector-vertical-children='.row'>
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_column.png"/>
- <span class="oe_snippet_thumbnail_title">Add Column</span>
+ <span class="oe_snippet_thumbnail_title">Add Column</span>
</div>
<div class="oe_snippet_body col-md-4">
<img class="img img-rounded img-responsive" src="/website/static/src/img/china_thumb.jpg"/>
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 8beff820baf..42c0ad46dbb 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -69,7 +69,6 @@
<script type="text/javascript" src="/web/static/lib/underscore/underscore.js"></script>
<script type="text/javascript" src="/web/static/lib/underscore.string/lib/underscore.string.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery/jquery.js"></script>
- <script type="text/javascript" src="/web/static/lib/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript">
// Bootstrap and jQuery UI conflicts
$.fn.bstooltip = $.fn.tooltip;
@@ -80,6 +79,8 @@
<script type="text/javascript" src="/web/static/src/js/openerpframework.js"></script>
<script type="text/javascript" src="/website/static/src/js/website.js"></script>
+
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/bootstrap.js"></script>
<script t-if="not translatable" type="text/javascript" src="/website/static/src/js/website.snippets.animation.js"></script>
<t t-raw="head or ''" name='layout_head'/>
@@ -140,8 +141,8 @@
<li><a href="/page/website.contactus">Contact us</a></li>
</ul>
<ul class="list-unstyled">
- <li><i class="fa fa-phone"></i> <span t-field="res_company.phone"></span></li>
- <li><i class="fa fa-envelope"></i> <span t-field="res_company.email"></span></li>
+ <li t-ignore="true"><i class="fa fa-phone"></i> <span t-field="res_company.phone"></span></li>
+ <li t-ignore="true"><i class="fa fa-envelope"></i> <span t-field="res_company.email"></span></li>
</ul>
<h2>
<a t-att-href="website.social_facebook" t-if="website.social_facebook"><i class="fa fa-facebook-square"/></a>
@@ -249,7 +250,7 @@
</div>
</div>
</xpath>
- <xpath expr='//t[@name="layout_head"]' position="before">
+ <xpath expr='//script[@src="/web/static/lib/bootstrap/js/bootstrap.js"]' position="before">
<link rel='stylesheet' href='/website/static/src/css/snippets.css'/>
<link rel='stylesheet' href='/website/static/src/css/editor.css'/>
<link rel='stylesheet' href='/website/static/lib/bootstrap-tour/bootstrap-tour.css'/>
@@ -261,10 +262,10 @@
<script type="text/javascript" src="/web/static/lib/select2/select2.js"></script>
<script type="text/javascript" src="/web/static/lib/ckeditor/ckeditor.js"></script>
- <script type="text/javascript" src="/website/static/lib/bootstrap-tour/bootstrap-tour.js"></script>
<script t-if="not translatable" type="text/javascript" src="/website/static/lib/ace/ace.js"></script>
<script type="text/javascript" src="/website/static/lib/vkbeautify/vkbeautify.0.99.00.beta.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.ui/js/jquery-ui-1.9.1.custom.js"></script>
+ <script type="text/javascript" src="/website/static/lib/bootstrap-tour/bootstrap-tour.js"></script>
<!-- mutation observers shim backed by mutation events (8 < IE < 11, Safari < 6, FF < 14, Chrome < 17) -->
<script type="text/javascript" src="/website/static/lib//jquery.mjs.nestedSortable/jquery.mjs.nestedSortable.js"></script>
<script type="text/javascript" src="/website/static/lib/MutationObservers/test/sidetable.js"></script>
@@ -383,13 +384,13 @@
<template id="pager" name="Pager">
<ul t-if="pager['page_count'] > 1" t-attf-class="#{ classname or '' } pagination" t-att-style="style or ''">
<li t-att-class=" 'disabled' if pager['page']['num'] == 1 else '' ">
- <a t-att-href=" pager['page_previous']['url'] if pager['page']['num'] != 1 else '' ">Prev</a>
+ <a t-att-href=" pager['page_previous']['url'] if pager['page']['num'] != 1 else ''">Prev</a>
</li>
<t t-foreach="pager['pages']" t-as="page">
<li t-att-class=" 'active' if page['num'] == pager['page']['num'] else '' "> <a t-att-href="page['url']" t-raw="page['num']"></a></li>
</t>
<li t-att-class=" 'disabled' if pager['page']['num'] == pager['page_count'] else '' ">
- <a t-att-href=" pager['page_next']['url'] if pager['page']['num'] != pager['page_count'] else '' ">Next</a>
+ <a t-att-href="pager['page_next']['url'] if pager['page']['num'] != pager['page_count'] else ''">Next</a>
</li>
</ul>
</template>
@@ -673,10 +674,10 @@ Sitemap: <t t-esc="url_root"/>sitemap.xml
<template id="company_description" name="Company Description">
<address itemscope="itemscope" itemtype="http://schema.org/Organization">
- <div itemprop="name" t-field="res_company.name">Name</div>
- <br />
- <div><i class="fa fa-phone"/> <span itemprop="telephone" t-field="res_company.phone"/></div>
- <div><i class="fa fa-envelope"/> <span itemprop="email" t-field="res_company.email"/></div>
+ <!-- TODO widget contact must add itemprop attributes -->
+ <div t-field="res_company.partner_id" t-field-options='{
+ "widget": "contact",
+ "fields": ["name", "address", "phone", "mobile", "fax", "email"]}'/>
</address>
<a t-att-href="res_company.google_map_link()" target="_BLANK">
<img class="thumbnail img-responsive" t-att-src="res_company.google_map_img()" />
@@ -703,7 +704,7 @@ Sitemap: <t t-esc="url_root"/>sitemap.xml
</div>
<div class="col-md-4 mb32">
<div groups="base.group_website_publisher" t-ignore="true" class="pull-right css_editable_mode_hidden" t-att-style="style or ''">
- <a class="btn btn-primary" t-att-href="'/web#return_label=Website&amp;model=%s&amp;id=%s' % (res_company._name, res_company.id)" title='Edit in backend'>Edit</a>
+ <a class="btn btm-sm btn-default" t-att-href="'/web#return_label=Website&amp;model=%s&amp;id=%s' % (res_company._name, res_company.id)">Change address</a>
</div>
<t t-call="website.company_description"/>
</div>
diff --git a/addons/website_blog/static/description/index.html b/addons/website_blog/static/description/index.html
index 7ca5b48ae55..3f44eea9b4d 100644
--- a/addons/website_blog/static/description/index.html
+++ b/addons/website_blog/static/description/index.html
@@ -22,7 +22,7 @@
translated in mutiple languages in just a few clicks.
</p>
<div class="oe_centeralign oe_websiteonly">
- <a href="http://www.openerp.com/start?app=website_sale" class="oe_button oe_big oe_tacky">Start your <span class="oe_emph">free</span> online store</a>
+ <a href="http://www.openerp.com/start?app=website_blog" class="oe_button oe_big oe_tacky">Start your <span class="oe_emph">free</span> online store</a>
</div>
</div>
</div>
diff --git a/addons/website_blog/static/src/js/website.tour.blog.js b/addons/website_blog/static/src/js/website.tour.blog.js
index b6701d74634..e76e793dfda 100644
--- a/addons/website_blog/static/src/js/website.tour.blog.js
+++ b/addons/website_blog/static/src/js/website.tour.blog.js
@@ -27,7 +27,7 @@
element: '#content-menu-button',
placement: 'left',
title: _t("Add Content"),
- content: _t("Create new pages, blogs, menu items and products through the <em>'Content'</em> menu."),
+ content: _t("Use this <em>'Content'</em> menu to create a new blog post like any other document (page, menu, products, event, ...)."),
popover: { fixed: true },
},
{
@@ -59,7 +59,7 @@
{
waitNot: '#wrap h1[data-oe-model="blog.post"]:contains("Blog Post Title")',
element: 'button[data-action=snippet]',
- placement: 'bottom',
+ placement: 'left',
title: _t("Layout Your Blog Post"),
content: _t("Use well designed building blocks to structure the content of your blog. Click 'Insert Blocks' to add new content."),
popover: { fixed: true },
@@ -68,7 +68,7 @@
snippet: 'image-text',
placement: 'bottom',
title: _t("Drag & Drop a Block"),
- content: _t("Drag the <em>'Image-Text'</em> block and drop it in your page."),
+ content: _t("Drag this block and drop it in your page."),
popover: { fixed: true },
},
{
@@ -82,14 +82,14 @@
snippet: 'text-block',
placement: 'bottom',
title: _t("Drag & Drop a block"),
- content: _t("Drag the <em>'Text Block'</em> block and drop it below the image block."),
+ content: _t("Drag this block and drop it below the image block."),
popover: { fixed: true },
},
{
element: '.oe_active .oe_snippet_remove',
placement: 'top',
- title: _t("Delete the Title"),
- content: _t("From this toolbar you can move, duplicate or delete the selected zone. Click on the garbage can image to delete the title."),
+ title: _t("Delete the block"),
+ content: _t("From this toolbar you can move, duplicate or delete the selected zone. Click on the garbage can image to delete the block. Or click on the Title and delete it."),
},
{
waitNot: '.oe_active .oe_snippet_remove:visible',
diff --git a/addons/website_blog/tests/test_ui.py b/addons/website_blog/tests/test_ui.py
index 8a99cf78782..e99884ba4b1 100644
--- a/addons/website_blog/tests/test_ui.py
+++ b/addons/website_blog/tests/test_ui.py
@@ -1,4 +1,4 @@
-import openerp
+import openerp.tests
class TestUi(openerp.tests.HttpCase):
def test_admin(self):
diff --git a/addons/website_event/static/src/js/website.tour.event.js b/addons/website_event/static/src/js/website.tour.event.js
index 73510b455dd..a9e40a5f65b 100644
--- a/addons/website_event/static/src/js/website.tour.event.js
+++ b/addons/website_event/static/src/js/website.tour.event.js
@@ -21,7 +21,7 @@
{
title: _t("Create an Event"),
content: _t("Let's go through the first steps to publish a new event."),
- popover: { next: _("Start Tutorial"), end: _("Skip It") },
+ popover: { next: _t("Start Tutorial"), end: _t("Skip It") },
},
{
element: '#content-menu-button',
diff --git a/addons/website_event/tests/test_ui.py b/addons/website_event/tests/test_ui.py
index fb6825b9a56..c4e884c0325 100644
--- a/addons/website_event/tests/test_ui.py
+++ b/addons/website_event/tests/test_ui.py
@@ -1,4 +1,4 @@
-import openerp
+import openerp.tests
class TestUi(openerp.tests.HttpCase):
def test_admin(self):
diff --git a/addons/website_event_sale/models/sale_order.py b/addons/website_event_sale/models/sale_order.py
index b94111ac868..d4ea6b58d5d 100644
--- a/addons/website_event_sale/models/sale_order.py
+++ b/addons/website_event_sale/models/sale_order.py
@@ -12,7 +12,7 @@ class sale_order_line(osv.osv):
return super(sale_order_line, self)._recalculate_product_values(cr, uid, ids, product_id, context=context)
order_line = self.browse(cr, SUPERUSER_ID, ids[0], context=context)
- assert order_line.order_id.website_session_id == request.httprequest.session['website_session_id']
+ assert order_line.order_id.website_session_id == request.session['website_session_id']
product = product_id and self.pool.get('product.product').browse(cr, uid, product_id, context=context) or order_line.product_id
res = super(sale_order_line, self)._recalculate_product_values(cr, uid, ids, product.id, context=context)
diff --git a/addons/website_event_sale/tests/test_ui.py b/addons/website_event_sale/tests/test_ui.py
index f9a8ff8d4b3..6405bbd4cbf 100644
--- a/addons/website_event_sale/tests/test_ui.py
+++ b/addons/website_event_sale/tests/test_ui.py
@@ -1,4 +1,4 @@
-import openerp
+import openerp.tests
inject = [
"./../../../website/static/src/js/website.tour.test.js",
diff --git a/addons/website_livechat/__openerp__.py b/addons/website_livechat/__openerp__.py
index 0ab7781b7ab..5220fc47bb6 100644
--- a/addons/website_livechat/__openerp__.py
+++ b/addons/website_livechat/__openerp__.py
@@ -12,10 +12,7 @@ OpenERP Website LiveChat
'depends': ['website', 'im_livechat'],
'installable': True,
'data': [
- 'views/website_livechat.xml'
+ 'views/website_livechat.xml',
+ 'views/res_config.xml'
],
- 'demo': [ ],
- 'js': [],
- 'qweb': [],
- 'css': [],
}
diff --git a/addons/website_livechat/models/website.py b/addons/website_livechat/models/website.py
index 7e86042a67a..3e3df1c5bdc 100644
--- a/addons/website_livechat/models/website.py
+++ b/addons/website_livechat/models/website.py
@@ -5,4 +5,11 @@ class website(osv.osv):
_columns = {
'channel_id': fields.many2one('im_livechat.channel', string="Channel"),
- } \ No newline at end of file
+ }
+
+class website_config_settings(osv.osv_memory):
+ _inherit = 'website.config.settings'
+
+ _columns = {
+ 'channel_id': fields.related('website_id', 'channel_id', type='many2one', relation='im_livechat.channel', string='Live Chat Channel'),
+ }
diff --git a/addons/website_livechat/views/res_config.xml b/addons/website_livechat/views/res_config.xml
new file mode 100644
index 00000000000..ac69929ca63
--- /dev/null
+++ b/addons/website_livechat/views/res_config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <record id="view_website_config_settings" model="ir.ui.view">
+ <field name="name">Website livechat settings</field>
+ <field name="model">website.config.settings</field>
+ <field name="inherit_id" ref="website.view_website_config_settings"/>
+ <field name="arch" type="xml">
+ <xpath expr="//group[@string='Social Media']" position="inside">
+ <label for="channel_id"/>
+ <div name="channel_id">
+ <div class="oe_inline">
+ <field name="channel_id"/>
+ </div>
+ </div>
+ </xpath>
+ </field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/website_livechat/views/website_livechat.xml b/addons/website_livechat/views/website_livechat.xml
index d4da07f2bf0..374e0d5dd16 100644
--- a/addons/website_livechat/views/website_livechat.xml
+++ b/addons/website_livechat/views/website_livechat.xml
@@ -2,22 +2,6 @@
<openerp>
<data>
-<record id="website_settings_livechat" model="ir.ui.view">
- <field name="name">website.form</field>
- <field name="model">website</field>
- <field name="inherit_id" ref="website.view_website_form"/>
- <field name="arch" type="xml">
- <xpath expr="//div[@name='other']" position='before'>
- <div name="livechat">
- <separator string="LiveChat"/>
- <group name="livechat">
- <field name="channel_id" widget="many2one"/>
- </group>
- </div>
- </xpath>
- </field>
-</record>
-
<template id="header" inherit_id="website.layout" name="LiveChat Snippet">
<xpath expr="//body" position="inside">
<t t-if="website.channel_id">
diff --git a/addons/website_mail/models/mail_message.py b/addons/website_mail/models/mail_message.py
index 308cf9da4b8..c708d9c3e33 100644
--- a/addons/website_mail/models/mail_message.py
+++ b/addons/website_mail/models/mail_message.py
@@ -28,13 +28,21 @@ class MailMessage(osv.Model):
_columns = {
'website_published': fields.boolean(
- 'Publish', help="Publish on the website as a blog"
+ 'Published', help="Visible on the website as a comment"
),
}
- _defaults = {
- 'website_published': True,
- }
+ def default_get(self, cr, uid, fields_list, context=None):
+ defaults = super(MailMessage, self).default_get(cr, uid, fields_list, context=context)
+
+ # Note: explicitly implemented in default_get() instead of _defaults,
+ # to avoid setting to True for all existing messages during upgrades.
+ # TODO: this default should probably be dynamic according to the model
+ # on which the messages are attached, thus moved to create().
+ if 'website_published' in fields_list:
+ defaults.setdefault('website_published', True)
+
+ return defaults
def _search(self, cr, uid, args, offset=0, limit=None, order=None,
context=None, count=False, access_rights_uid=None):
diff --git a/addons/website_quote/controllers/main.py b/addons/website_quote/controllers/main.py
index 2176e81a3b0..f9010c2b7b2 100644
--- a/addons/website_quote/controllers/main.py
+++ b/addons/website_quote/controllers/main.py
@@ -22,7 +22,6 @@
from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.addons.web.http import request
-from openerp.addons.website.models import website
import werkzeug
import datetime
import time
@@ -43,8 +42,8 @@ class sale_quote(http.Controller):
if token != order.access_token:
return request.website.render('website.404')
# Log only once a day
- if request.httprequest.session.get('view_quote',False)!=now:
- request.httprequest.session['view_quote'] = now
+ if request.session.get('view_quote',False)!=now:
+ request.session['view_quote'] = now
body=_('Quotation viewed by customer')
self.__message_post(body, order_id, type='comment')
days = 0
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 5e02def1494..9fb4ce50b0e 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -7,6 +7,7 @@ from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.tools.translate import _
+from openerp.addons.website.models.website import slug
PPG = 20 # Products Per Page
PPR = 4 # Products Per Row
@@ -143,8 +144,8 @@ class Ecommerce(http.Controller):
return key_val
return False
- @http.route(['/shop/filters/'], type='http', auth="public", website=True, multilang=True)
- def filters(self, **post):
+ @http.route(['/shop/filters/'], type='http', auth="public", methods=['POST'], website=True, multilang=True)
+ def filters(self, category=None, **post):
index = []
filters = []
for key, val in post.items():
@@ -169,11 +170,16 @@ class Ecommerce(http.Controller):
filters[index.index(cat_id)].append( cat[2] )
post.pop(key)
- return request.redirect("/shop/?filters=%s%s%s" % (
- simplejson.dumps(filters),
- post.get("search") and ("&search=%s" % post.get("search")) or "",
- post.get("category") and ("&category=%s" % post.get("category")) or ""
- ))
+ url = "/shop/"
+ if category:
+ category_obj = request.registry.get('product.public.category')
+ url = "%scategory/%s/" % (url, slug(category_obj.browse(request.cr, request.uid, int(category), context=request.context)))
+ if filters:
+ url = "%s?filters=%s" % (url, simplejson.dumps(filters))
+ if post.get("search"):
+ url = "%s%ssearch=%s" % (url, filters and "&" or "?", post.get("search"))
+
+ return request.redirect(url)
def attributes_to_ids(self, attributes):
obj = request.registry.get('product.attribute.line')
@@ -209,15 +215,24 @@ class Ecommerce(http.Controller):
('name', 'ilike', search),
('description', 'ilike', search)]
if category:
- domain.append(('product_variant_ids.public_categ_id', 'child_of', category.id))
+ domain.append(('product_variant_ids.public_categ_id', 'child_of', int(category)))
+ if isinstance(category, (int,str,unicode)):
+ category = request.registry.get('product.public.category').browse(cr, uid, int(category), context=context)
if filters:
filters = simplejson.loads(filters)
if filters:
ids = self.attributes_to_ids(filters)
domain.append(('id', 'in', ids or [0]))
+ url = "/shop/"
product_count = product_obj.search_count(cr, uid, domain, context=context)
- pager = request.website.pager(url="/shop/", total=product_count, page=page, step=PPG, scope=7, url_args=post)
+ if search:
+ post["search"] = search
+ if filters:
+ post["filters"] = filters
+ if category:
+ url = "/shop/category/%s/" % slug(category)
+ pager = request.website.pager(url=url, total=product_count, page=page, step=PPG, scope=7, url_args=post)
request.context['pricelist'] = self.get_pricelist()
@@ -244,11 +259,12 @@ class Ecommerce(http.Controller):
'range': range,
'search': {
'search': search,
- 'category': category and category.id,
+ 'category': category and int(category),
'filters': filters,
},
'pager': pager,
'styles': styles,
+ 'category': category,
'categories': categs,
'Ecommerce': self, # TODO fp: Should be removed
'style_in_product': lambda style, product: style.id in [s.id for s in product.website_style_ids],
@@ -257,26 +273,20 @@ class Ecommerce(http.Controller):
@http.route(['/shop/product/<model("product.template"):product>/'], type='http', auth="public", website=True, multilang=True)
def product(self, product, search='', category='', filters='', **kwargs):
- category_obj = request.registry.get('product.public.category')
-
- category_ids = category_obj.search(request.cr, request.uid, [], context=request.context)
- category_list = category_obj.name_get(request.cr, request.uid, category_ids, context=request.context)
- category_list = sorted(category_list, key=lambda category: category[1])
-
if category:
+ category_obj = request.registry.get('product.public.category')
category = category_obj.browse(request.cr, request.uid, int(category), context=request.context)
request.context['pricelist'] = self.get_pricelist()
values = {
'Ecommerce': self,
- 'category': category,
- 'category_list': category_list,
'main_object': product,
'product': product,
+ 'category': category,
'search': {
'search': search,
- 'category': category and str(category.id),
+ 'category': category and int(category),
'filters': filters,
}
}
@@ -629,7 +639,7 @@ class Ecommerce(http.Controller):
'reference': order.name,
'sale_order_id': order.id,
}, context=context)
- request.httprequest.session['website_sale_transaction_id'] = tx_id
+ request.session['website_sale_transaction_id'] = tx_id
elif tx and tx.state == 'draft': # button cliked but no more info -> rewrite on tx or create a new one ?
tx.write({
'acquirer_id': acquirer_id,
@@ -644,7 +654,7 @@ class Ecommerce(http.Controller):
cr, uid, context = request.cr, request.uid, request.context
order = request.registry['sale.order'].browse(cr, SUPERUSER_ID, sale_order_id, context=context)
- assert order.website_session_id == request.httprequest.session['website_session_id']
+ assert order.website_session_id == request.session['website_session_id']
if not order:
return {
@@ -707,7 +717,7 @@ class Ecommerce(http.Controller):
order = self.get_order()
else:
order = request.registry['sale.order'].browse(cr, SUPERUSER_ID, sale_order_id, context=context)
- assert order.website_session_id == request.httprequest.session['website_session_id']
+ assert order.website_session_id == request.session['website_session_id']
if not tx or not order:
return request.redirect('/shop/')
@@ -741,7 +751,7 @@ class Ecommerce(http.Controller):
cr, uid, context = request.cr, request.uid, request.context
order = request.registry['sale.order'].browse(cr, SUPERUSER_ID, sale_order_id, context=context)
- assert order.website_session_id == request.httprequest.session['website_session_id']
+ assert order.website_session_id == request.session['website_session_id']
request.registry['website']._ecommerce_change_pricelist(cr, uid, None, context=context or {})
diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py
index 577005212c3..604b944969d 100644
--- a/addons/website_sale/models/sale_order.py
+++ b/addons/website_sale/models/sale_order.py
@@ -38,7 +38,7 @@ class SaleOrderLine(osv.Model):
if ids and not product_id:
order_line = self.browse(cr, SUPERUSER_ID, ids[0], context=context)
- assert order_line.order_id.website_session_id == request.httprequest.session['website_session_id']
+ assert order_line.order_id.website_session_id == request.session['website_session_id']
product_id = product_id or order_line.product_id.id
return self.product_id_change(
diff --git a/addons/website_sale/models/website.py b/addons/website_sale/models/website.py
index 14a9a5decff..91164f94e9d 100644
--- a/addons/website_sale/models/website.py
+++ b/addons/website_sale/models/website.py
@@ -22,12 +22,12 @@ class Website(orm.Model):
# ***********************************************************
def ecommerce_get_pricelist_id(self, cr, uid, ids, context=None):
- if not request.httprequest.session.get('ecommerce_pricelist'):
+ if not request.session.get('ecommerce_pricelist'):
self._ecommerce_change_pricelist(cr, uid, None, context=context)
- return request.httprequest.session.get('ecommerce_pricelist')
+ return request.session.get('ecommerce_pricelist')
def _ecommerce_change_pricelist(self, cr, uid, code=None, context=None):
- request.httprequest.session.setdefault('ecommerce_pricelist', False)
+ request.session.setdefault('ecommerce_pricelist', False)
pricelist_id = False
if code:
@@ -40,7 +40,7 @@ class Website(orm.Model):
partner_id = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context).partner_id.id
pricelist_id = self.pool.get('sale.order').onchange_partner_id(cr, SUPERUSER_ID, [], partner_id, context=context)['value']['pricelist_id']
- request.httprequest.session['ecommerce_pricelist'] = pricelist_id
+ request.session['ecommerce_pricelist'] = pricelist_id
order = self.ecommerce_get_current_order(cr, uid, context=context)
if order:
@@ -134,11 +134,11 @@ class Website(orm.Model):
SaleOrder = self.pool.get('sale.order')
fields = [k for k, v in SaleOrder._columns.items()]
values = SaleOrder.default_get(cr, SUPERUSER_ID, fields, context=context)
- if request.httprequest.session.get('ecommerce_pricelist'):
- values['pricelist_id'] = request.httprequest.session['ecommerce_pricelist']
+ if request.session.get('ecommerce_pricelist'):
+ values['pricelist_id'] = request.session['ecommerce_pricelist']
values['partner_id'] = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context).partner_id.id
values.update(SaleOrder.onchange_partner_id(cr, SUPERUSER_ID, [], values['partner_id'], context=context)['value'])
- values['website_session_id'] = request.httprequest.session['website_session_id']
+ values['website_session_id'] = request.session['website_session_id']
return values
def _ecommerce_create_quotation(self, cr, uid, context=None):
@@ -154,30 +154,30 @@ class Website(orm.Model):
SaleOrder = self.pool.get('sale.order')
# add website_session_id key for access rules
- if not request.httprequest.session.get('website_session_id'):
- request.httprequest.session['website_session_id'] = str(uuid.uuid4())
+ if not request.session.get('website_session_id'):
+ request.session['website_session_id'] = str(uuid.uuid4())
order_id = self._ecommerce_create_quotation(cr, uid, context=context)
- request.httprequest.session['ecommerce_order_id'] = order_id
+ request.session['ecommerce_order_id'] = order_id
context = dict(context or {}, pricelist=self.ecommerce_get_pricelist_id(cr, uid, None, context=context))
return SaleOrder.browse(cr, SUPERUSER_ID, order_id, context=context)
def ecommerce_get_current_order(self, cr, uid, context=None):
SaleOrder = self.pool.get('sale.order')
context = dict(context or {}, pricelist=self.ecommerce_get_pricelist_id(cr, uid, None, context=context))
- order_id = request.httprequest.session.get('ecommerce_order_id')
+ order_id = request.session.get('ecommerce_order_id')
if not order_id:
- request.httprequest.session['ecommerce_order_id'] = False
+ request.session['ecommerce_order_id'] = False
return False
if not order_id in SaleOrder.exists(cr, uid, [order_id], context=context):
- request.httprequest.session['ecommerce_order_id'] = False
+ request.session['ecommerce_order_id'] = False
return False
try:
order = SaleOrder.browse(cr, SUPERUSER_ID, order_id, context=context)
- assert order.website_session_id == request.httprequest.session['website_session_id']
+ assert order.website_session_id == request.session['website_session_id']
return order
except:
- request.httprequest.session['ecommerce_order_id'] = False
+ request.session['ecommerce_order_id'] = False
return False
# ************************************************************
@@ -193,15 +193,15 @@ class Website(orm.Model):
return False
def ecommerce_get_current_transaction(self, cr, uid, context=None):
- if request.httprequest.session.get('website_sale_transaction_id'):
- tx = self._get_transaction(cr, uid, tx_id=request.httprequest.session['website_sale_transaction_id'], context=context)
+ if request.session.get('website_sale_transaction_id'):
+ tx = self._get_transaction(cr, uid, tx_id=request.session['website_sale_transaction_id'], context=context)
if not tx:
- request.httprequest.session['website_sale_transaction_id'] = False
+ request.session['website_sale_transaction_id'] = False
return tx
return False
def ecommerce_reset(self, cr, uid, context=None):
- request.httprequest.session.update({
+ request.session.update({
'ecommerce_order_id': False,
'ecommerce_pricelist': False,
'website_sale_transaction_id': False,
diff --git a/addons/website_sale/tests/test_ui.py b/addons/website_sale/tests/test_ui.py
index 294218579cf..5216ab5fe0b 100644
--- a/addons/website_sale/tests/test_ui.py
+++ b/addons/website_sale/tests/test_ui.py
@@ -1,6 +1,8 @@
import os
-import openerp
+import unittest2
+
+import openerp.tests
inject = [
("openerp.website.Tour", os.path.join(os.path.dirname(__file__), '../../website/static/src/js/website.tour.js')),
@@ -9,20 +11,20 @@ inject = [
class TestUi(openerp.tests.HttpCase):
def test_01_admin_shop_tour(self):
- # Works locally probably due to a race condition on openerp.website.Tour.Shop
- # object should only be define once ready
- return
- self.phantom_js("/", "openerp.website.Tour.run_test('shop')", "openerp.website.Tour.Shop", login="admin")
+ #self.phantom_js("/", "openerp.website.Tour.run_test('shop')", "openerp.website.Tour.Shop", login="admin")
+ # AssertionError: Error: Time overlaps to arrive to step 5: 'New product created'
+ print 'FIXME TODO ERROR FAILED test_01_admin_shop_tour has been deactivated due to systematic errors'
def test_02_admin_checkout(self):
- return
- self.phantom_js("/", "openerp.website.Tour.run_test('shop_buy_product')", "openerp.website.Tour", login="admin")
+ # self.phantom_js("/", "openerp.website.Tour.run_test('shop_buy_product')", "openerp.website.Tour", login="admin")
+ # AssertionError: TypeError: 'undefined' is not an object (evaluating 'website.Tour.tours[id].run')
+ print 'FIXME TODO ERROR FAILED test_02_admin_checkout has been deactivated due to systematic errors'
+ @unittest2.expectedFailure
def test_03_demo_checkout(self):
- return
self.phantom_js("/", "openerp.website.Tour.run_test('shop_buy_product')", "openerp.website.Tour.ShopTest", login="demo", inject=inject)
+ @unittest2.expectedFailure
def test_04_public_checkout(self):
- return
self.phantom_js("/", "openerp.website.Tour.run_test('shop_buy_product')", "openerp.website.Tour.ShopTest", inject=inject)
diff --git a/addons/website_sale/views/website_sale.xml b/addons/website_sale/views/website_sale.xml
index 9918568a32d..abbcaa26ab9 100644
--- a/addons/website_sale/views/website_sale.xml
+++ b/addons/website_sale/views/website_sale.xml
@@ -32,10 +32,10 @@
<!-- List of categories -->
<template id="categories_recursive" name="Category list">
- <li t-att-class="category.id == search.get('category') and 'active' or ''">
- <a t-attf-href="/shop/category/#{ slug(category) }/" t-field="category.name"></a>
- <ul t-if="category.child_id" class="nav nav-pills nav-stacked nav-hierarchy">
- <t t-foreach="category.child_id" t-as="category">
+ <li t-att-class="int(categ) == int(category or 0) and 'active' or ''">
+ <a t-attf-href="/shop/category/#{ slug(categ) }/" t-field="categ.name"></a>
+ <ul t-if="categ.child_id" class="nav nav-pills nav-stacked nav-hierarchy">
+ <t t-foreach="categ.child_id" t-as="categ">
<t t-call="website_sale.categories_recursive"/>
</t>
</ul>
@@ -45,14 +45,15 @@
<!-- Product list -->
<template id="search" name="Search hidden fields">
- <input type="hidden" name="category" t-att-value="search.get('category') or ''"/>
- <input type="hidden" name="filters" t-att-value="search.get('filters') or ''"/>
- <div class="input-group">
- <input type="text" name="search" class="search-query form-control" placeholder="Search..." t-att-value="search.get('search') or ''"/>
- <span class="input-group-btn">
- <button class="btn btn-default" type="submit"><i class="fa fa-search"/></button>
- </span>
- </div>
+ <form t-attf-action="/shop/{{'category/%s/' % slug(category) if category else ''}}" method="get" t-att-class="search_class">
+ <input t-if="search.get('filters')" type="hidden" name="filters" t-att-value="search.get('filters')"/>
+ <div class="input-group">
+ <input type="text" name="search" class="search-query form-control" placeholder="Search..." t-att-value="search.get('search') or ''"/>
+ <span class="input-group-btn">
+ <button class="btn btn-default" type="submit"><i class="fa fa-search"/></button>
+ </span>
+ </div>
+ </form>
</template>
<template id="products_cart" name="Shopping cart">
@@ -61,12 +62,12 @@
<div class="ribbon btn btn-danger">Sale</div>
</div>
<div class="oe_product_image">
- <a itemprop="url" t-attf-href="/shop/product/{{ slug(product) }}/?{{ keep_query('category', 'search', 'filters') }}">
+ <a itemprop="url" t-attf-href="/shop/product/{{ slug(product) }}/?{{ keep_query('search', 'filters', category=(category and int(category)), page=(pager['page']['num'] if pager['page']['num']>1 else None)) }}">
<span itemprop="image" t-field="product.image" t-field-options='{"widget": "image"}'/>
</a>
</div>
<section>
- <h5><strong><a itemprop="name" t-attf-href="/shop/product/{{ slug(product) }}/?{{ keep_query('category', 'search', 'filters') }}" t-field="product.name"/></strong></h5>
+ <h5><strong><a itemprop="name" t-attf-href="/shop/product/{{ slug(product) }}/?{{ keep_query('search', 'filters', category=(category and int(category)), page=(pager['page']['num'] if pager['page']['num']>1 else None)) }}" t-field="product.name"/></strong></h5>
<div itemprop="offers" itemscope="itemscope" itemtype="http://schema.org/Offer" class="product_price" t-if="product.product_variant_ids">
<b>
<t t-if="abs(product.product_variant_ids[0].lst_price - product.product_variant_ids[0].price) &gt; 0.2">
@@ -104,9 +105,8 @@
<div class="container oe_website_sale">
<div class="products_pager">
<div class="row">
- <form action="/shop/" method="get" class="pagination form-inline col-md-3">
- <t t-call="website_sale.search" />
- </form>
+ <t t-set="search_class">pagination form-inline col-md-3</t>
+ <t t-call="website_sale.search"/>
<t t-call="website.pager"/>
</div>
</div>
@@ -278,15 +278,14 @@
<div class="row">
<div class="col-sm-4">
<ol class="breadcrumb">
- <li><a t-attf-href="/shop?{{ keep_query('search', 'filters') }}" onclick="history.go(-1); return false;">Products</a></li>
- <li t-if="search.get('category')"><a t-attf-href="/shop/?{{ keep_query('search', 'filters', 'category') }}" t-field="category.name"/></li>
+ <li><a t-attf-href="/shop?{{ keep_query('search', 'filters', 'page') if not category else keep_query('search', 'filters') }}">Products</a></li>
+ <li t-if="category"><a t-attf-href="/shop/category/{{ slug(category) }}/?{{ keep_query('search', 'filters', 'page') }}" t-field="category.name"/></li>
<li class="active"><span t-field="product.name"/></li>
</ol>
</div>
<div class="col-sm-3">
- <form action="/shop/" method="get" class="pull-right">
- <t t-call="website_sale.search" />
- </form>
+ <t t-set="search_class">pull-right</t>
+ <t t-call="website_sale.search"/>
</div>
<div class="col-sm-4" groups="base.group_sale_manager">
<t t-call="website.publish_management">
@@ -341,7 +340,7 @@
</div>
<button class="btn btn-primary btn-lg mt8">Add to Cart</button>
<hr t-if="product.description_sale"/>
- <p t-field="product.description_sale" class="text-muted"/>
+ <div><p t-field="product.description_sale" class="text-muted"/></div>
<hr/>
<p class="text-muted">
30-day money-back guarantee<br/>
@@ -571,8 +570,8 @@
<template id="products_categories" inherit_option_id="website_sale.products" name="Product Categories">
<xpath expr="//div[@id='products_grid_before']" position="inside">
<ul class="nav nav-pills nav-stacked mt16">
- <li t-att-class=" '' if search.get('category') else 'active' "><a href="/shop/">All Products</a></li>
- <t t-foreach="categories" t-as="category">
+ <li t-att-class=" '' if category else 'active' "><a href="/shop/">All Products</a></li>
+ <t t-foreach="categories" t-as="categ">
<t t-call="website_sale.categories_recursive"/>
</t>
</ul>
@@ -587,7 +586,7 @@
<template id="products_attributes" inherit_id="website_sale.products" inherit_option_id="website_sale.products" name="Product attribute's Filters" groups="product.group_product_attributes">
<xpath expr="//div[@id='products_grid_before']" position="inside">
- <form t-attf-action="/shop/filters/?{{ keep_query('category', 'search') }}" class="attributes" method="post">
+ <form t-attf-action="/shop/filters/?{{ keep_query('search', category=(category and int(category))) }}" class="attributes" method="post">
<ul class="nav nav-pills nav-stacked mt16">
<t t-set="attribute_ids" t-value="Ecommerce.get_attribute_ids()"/>
<t t-foreach="attribute_ids" t-as="attribute_id">