summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVidhin Mehta (OpenERP) <vme@tinyerp.com>2012-10-15 17:03:32 +0530
committerVidhin Mehta (OpenERP) <vme@tinyerp.com>2012-10-15 17:03:32 +0530
commit287b9d09eb740f6adfafdbbc65265f2aecf515ba (patch)
treed0d686830d71c964f03bc69f85c3ef26dec6f006
parent3eb5cfb61b6bbb84043f4fa6b3fdefb0fbb320c7 (diff)
parent7f23ad5de563eacfcae958d0011637800b097d4a (diff)
[MERGE]trunk.
bzr revid: vme@tinyerp.com-20121015113332-i8g3d8na27j08h3l
-rw-r--r--addons/account/account.py24
-rw-r--r--addons/account/account_bank_statement.py6
-rw-r--r--addons/account/account_invoice.py1
-rw-r--r--addons/account/account_invoice_view.xml21
-rw-r--r--addons/account/account_view.xml32
-rw-r--r--addons/account/i18n/de.po1646
-rw-r--r--addons/account/product_view.xml4
-rw-r--r--addons/account/project/report/analytic_balance.rml6
-rw-r--r--addons/account/project/report/cost_ledger.rml8
-rw-r--r--addons/account/project/report/inverted_analytic_balance.rml6
-rw-r--r--addons/account/project/wizard/account_analytic_journal_report.py6
-rw-r--r--addons/account/report/account_analytic_entries_report_view.xml2
-rw-r--r--addons/account/report/account_entries_report_view.xml2
-rw-r--r--addons/account/report/account_invoice_report_view.xml2
-rw-r--r--addons/account/report/account_print_overdue.py23
-rw-r--r--addons/account/report/account_print_overdue.rml13
-rw-r--r--addons/account/report/account_treasury_report_view.xml2
-rw-r--r--addons/account/static/src/xml/account_move_reconciliation.xml13
-rw-r--r--addons/account/test/account_supplier_invoice.yml2
-rw-r--r--addons/account/wizard/account_invoice_state_view.xml8
-rw-r--r--addons/account_analytic_default/i18n/hu.po13
-rw-r--r--addons/account_analytic_plans/i18n/de.po10
-rw-r--r--addons/account_asset/account_asset_view.xml34
-rw-r--r--addons/account_asset/report/account_asset_report_view.xml2
-rw-r--r--addons/account_budget/account_budget_view.xml9
-rw-r--r--addons/account_budget/i18n/hu.po27
-rw-r--r--addons/account_budget/i18n/lo.po32
-rw-r--r--addons/account_check_writing/report/check_print.py20
-rw-r--r--addons/account_check_writing/report/check_print_bottom.rml5
-rw-r--r--addons/account_check_writing/report/check_print_middle.rml5
-rw-r--r--addons/account_check_writing/report/check_print_top.rml4
-rw-r--r--addons/account_followup/i18n/ar.po28
-rw-r--r--addons/account_followup/report/account_followup_print.py6
-rw-r--r--addons/account_followup/report/account_followup_print.rml7
-rw-r--r--addons/account_payment/report/order.rml8
-rw-r--r--addons/account_payment/report/payment_order.py7
-rw-r--r--addons/account_payment/wizard/account_payment_populate_statement.py18
-rw-r--r--addons/account_voucher/account_voucher.py28
-rw-r--r--addons/account_voucher/account_voucher_view.xml1
-rw-r--r--addons/account_voucher/report/account_voucher_print.rml4
-rw-r--r--addons/account_voucher/report/account_voucher_sales_receipt_view.xml2
-rw-r--r--addons/account_voucher/test/account_voucher.yml6
-rw-r--r--addons/account_voucher/test/account_voucher_report.yml3
-rw-r--r--addons/account_voucher/test/case1_usd_usd.yml14
-rw-r--r--addons/account_voucher/test/case4_cad_chf.yml4
-rw-r--r--addons/account_voucher/test/sales_receipt.yml2
-rw-r--r--addons/account_voucher/voucher_payment_receipt_view.xml44
-rw-r--r--addons/account_voucher/voucher_sales_purchase_view.xml6
-rw-r--r--addons/analytic/analytic.py5
-rw-r--r--addons/analytic/analytic_view.xml1
-rw-r--r--addons/audittrail/audittrail_view.xml2
-rw-r--r--addons/auth_oauth/__openerp__.py1
-rw-r--r--addons/auth_oauth/auth_oauth_data.xml2
-rw-r--r--addons/auth_oauth/auth_oauth_data.yml6
-rw-r--r--addons/auth_oauth/controllers/main.py17
-rw-r--r--addons/auth_oauth/res_users.py30
-rw-r--r--addons/auth_openid/controllers/main.py23
-rw-r--r--addons/auth_reset_password/__init__.py24
-rw-r--r--addons/auth_reset_password/__openerp__.py29
-rw-r--r--addons/auth_reset_password/auth_reset_password.py130
-rw-r--r--addons/auth_reset_password/auth_reset_password.xml47
-rw-r--r--addons/auth_reset_password/controllers/__init__.py24
-rw-r--r--addons/auth_reset_password/controllers/main.py52
-rw-r--r--addons/auth_reset_password/res_users.py59
-rw-r--r--addons/auth_reset_password/res_users_view.xml19
-rw-r--r--addons/auth_reset_password/static/src/css/reset_password.css12
-rw-r--r--addons/auth_reset_password/static/src/js/reset_password.js74
-rw-r--r--addons/auth_reset_password/static/src/xml/reset_password.xml21
-rw-r--r--addons/auth_signup/__openerp__.py2
-rw-r--r--addons/auth_signup/controllers/main.py57
-rw-r--r--addons/auth_signup/res_config.py11
-rw-r--r--addons/auth_signup/res_config.xml4
-rw-r--r--addons/auth_signup/res_users.py234
-rw-r--r--addons/auth_signup/res_users_view.xml19
-rw-r--r--addons/auth_signup/static/src/css/Makefile3
-rw-r--r--addons/auth_signup/static/src/css/base.css10
-rw-r--r--addons/auth_signup/static/src/css/base.sass13
-rw-r--r--addons/auth_signup/static/src/js/auth_signup.js122
-rw-r--r--addons/auth_signup/static/src/xml/auth_signup.xml44
-rw-r--r--addons/base_calendar/base_calendar.py375
-rw-r--r--addons/base_calendar/base_calendar_view.xml39
-rw-r--r--addons/base_calendar/crm_meeting.py6
-rw-r--r--addons/base_calendar/crm_meeting_view.xml121
-rw-r--r--addons/base_calendar/test/base_calendar_test.yml6
-rw-r--r--addons/base_import/__openerp__.py3
-rw-r--r--addons/base_import/controllers.py9
-rw-r--r--addons/base_import/models.py40
-rw-r--r--addons/base_import/static/lib/javascript-state-machine/LICENSE20
-rw-r--r--addons/base_import/static/lib/javascript-state-machine/README.md327
-rw-r--r--addons/base_import/static/lib/javascript-state-machine/RELEASE_NOTES.md32
-rw-r--r--addons/base_import/static/lib/javascript-state-machine/Rakefile8
-rw-r--r--addons/base_import/static/lib/javascript-state-machine/index.html39
-rw-r--r--addons/base_import/static/lib/javascript-state-machine/state-machine.js155
-rw-r--r--addons/base_import/static/src/css/import.css11
-rw-r--r--addons/base_import/static/src/js/import.js271
-rw-r--r--addons/base_import/static/src/xml/import.xml76
-rw-r--r--addons/board/controllers.py15
-rw-r--r--addons/board/static/src/js/dashboard.js8
-rw-r--r--addons/crm/crm_lead.py6
-rw-r--r--addons/crm/crm_lead_view.xml23
-rw-r--r--addons/crm/crm_phonecall_view.xml1
-rw-r--r--addons/crm/crm_view.xml18
-rw-r--r--addons/crm/report/crm_lead_report_view.xml4
-rw-r--r--addons/crm/report/crm_phonecall_report_view.xml2
-rw-r--r--addons/crm/res_config.py7
-rw-r--r--addons/crm/res_config_view.xml16
-rw-r--r--addons/crm/res_partner_view.xml19
-rw-r--r--addons/crm_claim/__openerp__.py4
-rw-r--r--addons/crm_claim/crm_claim.py4
-rw-r--r--addons/crm_claim/report/crm_claim_report_view.xml2
-rw-r--r--addons/crm_helpdesk/crm_helpdesk.py4
-rw-r--r--addons/crm_helpdesk/report/crm_helpdesk_report_view.xml2
-rw-r--r--addons/crm_partner_assign/crm_lead_view.xml2
-rw-r--r--addons/crm_partner_assign/report/crm_lead_report_view.xml2
-rw-r--r--addons/crm_partner_assign/report/crm_partner_report_view.xml2
-rw-r--r--addons/document/document.py52
-rw-r--r--addons/document/document_view.xml12
-rw-r--r--addons/document_page/document_page_view.xml2
-rw-r--r--addons/document_page/wizard/document_page_show_diff_view.xml2
-rw-r--r--addons/edi/controllers/main.py10
-rw-r--r--addons/email_template/email_template.py2
-rw-r--r--addons/email_template/wizard/email_template_preview_view.xml2
-rw-r--r--addons/email_template/wizard/mail_compose_message_view.xml2
-rw-r--r--addons/event/event.py47
-rw-r--r--addons/event/event_view.xml66
-rw-r--r--addons/event/report/report_event_registration.py46
-rw-r--r--addons/event/report/report_event_registration_view.xml26
-rw-r--r--addons/event/static/src/css/event.css6
-rw-r--r--addons/event_sale/event_sale_view.xml4
-rw-r--r--addons/google_docs/__openerp__.py1
-rw-r--r--addons/google_docs/google_docs.py5
-rw-r--r--addons/google_docs/res_config_user_view.xml29
-rw-r--r--addons/hr/hr_view.xml23
-rw-r--r--addons/hr_contract/i18n/mk.po271
-rw-r--r--addons/hr_evaluation/report/hr_evaluation_report_view.xml2
-rw-r--r--addons/hr_expense/hr_expense.py2
-rw-r--r--addons/hr_expense/hr_expense_view.xml11
-rw-r--r--addons/hr_expense/report/expense.rml4
-rw-r--r--addons/hr_expense/report/hr_expense_report_view.xml2
-rw-r--r--addons/hr_expense/security/ir.model.access.csv1
-rw-r--r--addons/hr_holidays/hr_holidays.py7
-rw-r--r--addons/hr_holidays/hr_holidays_view.xml30
-rw-r--r--addons/hr_holidays/i18n/mk.po864
-rw-r--r--addons/hr_payroll/i18n/es_MX.po1956
-rw-r--r--addons/hr_payroll/report/report_contribution_register.rml4
-rw-r--r--addons/hr_payroll/report/report_payslip.rml5
-rw-r--r--addons/hr_payroll/report/report_payslip_details.rml7
-rw-r--r--addons/hr_payroll_account/hr_payroll_account.py4
-rw-r--r--addons/hr_recruitment/hr_recruitment.py5
-rw-r--r--addons/hr_recruitment/hr_recruitment_view.xml9
-rw-r--r--addons/hr_recruitment/report/hr_recruitment_report_view.xml2
-rw-r--r--addons/hr_timesheet_invoice/hr_timesheet_invoice.py2
-rw-r--r--addons/hr_timesheet_invoice/i18n/de.po10
-rw-r--r--addons/hr_timesheet_sheet/__openerp__.py3
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet.py163
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml1
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml21
-rw-r--r--addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml2
-rw-r--r--addons/hr_timesheet_sheet/report/timesheet_report.py18
-rw-r--r--addons/hr_timesheet_sheet/report/timesheet_report_view.xml2
-rw-r--r--addons/hr_timesheet_sheet/static/src/css/timesheet.css79
-rw-r--r--addons/hr_timesheet_sheet/static/src/js/timesheet.js299
-rw-r--r--addons/hr_timesheet_sheet/static/src/xml/timesheet.xml56
-rw-r--r--addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml25
-rw-r--r--addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py3
-rw-r--r--addons/l10n_be/wizard/l10n_be_vat_intra_print.rml4
-rw-r--r--addons/l10n_fr_hr_payroll/report/fiche_paye.rml4
-rw-r--r--addons/l10n_in_hr_payroll/i18n/bn.po926
-rw-r--r--addons/l10n_in_hr_payroll/i18n/gu.po926
-rw-r--r--addons/l10n_in_hr_payroll/i18n/hi.po926
-rw-r--r--addons/l10n_in_hr_payroll/i18n/ta.po926
-rw-r--r--addons/l10n_in_hr_payroll/i18n/te.po926
-rw-r--r--addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml2
-rw-r--r--addons/l10n_in_hr_payroll/report/payslip_report_view.xml2
-rw-r--r--addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.rml28
-rw-r--r--addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.rml4
-rw-r--r--addons/l10n_in_hr_payroll/report/report_payroll_advice.rml8
-rw-r--r--addons/l10n_in_hr_payroll/report/report_payslip_details.rml4
-rw-r--r--addons/l10n_uk/data/account.account.type.csv2
-rw-r--r--addons/lunch/report/order.rml6
-rw-r--r--addons/mail/__init__.py1
-rw-r--r--addons/mail/data/mail_data.xml14
-rw-r--r--addons/mail/data/mail_demo.xml5
-rw-r--r--addons/mail/mail_mail.py10
-rw-r--r--addons/mail/mail_message.py203
-rw-r--r--addons/mail/mail_message_view.xml6
-rw-r--r--addons/mail/mail_thread.py155
-rw-r--r--addons/mail/mail_thread_view.xml4
-rw-r--r--addons/mail/res_config.py13
-rw-r--r--addons/mail/res_users.py16
-rw-r--r--addons/mail/security/mail_security.xml2
-rw-r--r--addons/mail/static/src/css/mail.css150
-rw-r--r--addons/mail/static/src/css/mail_compose_message.css166
-rw-r--r--addons/mail/static/src/js/mail.js790
-rw-r--r--addons/mail/static/src/js/mail_followers.js48
-rw-r--r--addons/mail/static/src/xml/mail.xml201
-rw-r--r--addons/mail/static/src/xml/mail_followers.xml6
-rw-r--r--addons/mail/tests/test_mail.py105
-rw-r--r--addons/mail/update.py112
-rw-r--r--addons/mail/wizard/mail_compose_message.py9
-rw-r--r--addons/mail/wizard/mail_compose_message_view.xml11
-rw-r--r--addons/marketing_campaign/i18n/ar.po80
-rw-r--r--addons/marketing_campaign/report/campaign_analysis_view.xml2
-rw-r--r--addons/membership/report/report_membership_view.xml2
-rw-r--r--addons/mrp/__openerp__.py2
-rw-r--r--addons/mrp/i18n/de.po8
-rw-r--r--addons/mrp/mrp.py9
-rw-r--r--addons/mrp/mrp_view.xml12
-rw-r--r--addons/mrp/procurement.py11
-rw-r--r--addons/mrp_operations/report/mrp_workorder_analysis_view.xml2
-rw-r--r--addons/mrp_repair/report/order.rml10
-rw-r--r--addons/note/note_view.xml1
-rw-r--r--addons/point_of_sale/controllers/main.py48
-rw-r--r--addons/point_of_sale/point_of_sale.py2
-rw-r--r--addons/point_of_sale/report/account_statement.rml8
-rw-r--r--addons/point_of_sale/report/all_closed_cashbox_of_the_day.py2
-rw-r--r--addons/point_of_sale/report/all_closed_cashbox_of_the_day.rml10
-rw-r--r--addons/point_of_sale/report/pos_details.rml16
-rw-r--r--addons/point_of_sale/report/pos_details_summary.rml12
-rw-r--r--addons/point_of_sale/report/pos_lines.rml8
-rw-r--r--addons/point_of_sale/report/pos_order_report_view.xml2
-rw-r--r--addons/point_of_sale/report/pos_payment_report.rml4
-rw-r--r--addons/point_of_sale/report/pos_payment_report_user.rml4
-rw-r--r--addons/point_of_sale/report/pos_receipt.rml11
-rw-r--r--addons/point_of_sale/report/pos_users_product.rml4
-rw-r--r--addons/point_of_sale/res_users_view.xml2
-rw-r--r--addons/portal/__openerp__.py1
-rw-r--r--addons/portal/mail_mail.py34
-rw-r--r--addons/portal/portal_view.xml2
-rw-r--r--addons/portal/tests/test_portal.py76
-rw-r--r--addons/portal/wizard/portal_wizard.py60
-rw-r--r--addons/portal/wizard/portal_wizard_view.xml2
-rw-r--r--addons/portal_crm/wizard/contact_view.xml4
-rw-r--r--addons/process/static/src/js/process.js5
-rw-r--r--addons/procurement/__openerp__.py2
-rw-r--r--addons/procurement/procurement.py29
-rw-r--r--addons/procurement/procurement_demo.xml204
-rw-r--r--addons/procurement/procurement_view.xml50
-rw-r--r--addons/product/product.py37
-rw-r--r--addons/product/product_data.xml7
-rw-r--r--addons/product/product_demo.xml107
-rw-r--r--addons/product/product_view.xml86
-rw-r--r--addons/product_expiry/product_expiry_view.xml4
-rw-r--r--addons/project/project.py58
-rw-r--r--addons/project/project_data.xml2
-rw-r--r--addons/project/project_view.xml10
-rw-r--r--addons/project/report/project_cumulative.xml54
-rw-r--r--addons/project/report/project_report_view.xml2
-rw-r--r--addons/project_gtd/project_gtd_view.xml4
-rw-r--r--addons/project_gtd/wizard/project_gtd_fill_view.xml2
-rw-r--r--addons/project_issue/project_issue.py8
-rw-r--r--addons/project_issue/project_issue_view.xml2
-rw-r--r--addons/project_issue/report/project_issue_report_view.xml2
-rw-r--r--addons/project_long_term/project_long_term_demo.xml1
-rw-r--r--addons/project_mrp/project_mrp_view.xml6
-rw-r--r--addons/project_mrp/project_procurement.py10
-rw-r--r--addons/project_timesheet/project_timesheet.py69
-rw-r--r--addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml1
-rw-r--r--addons/purchase/i18n/ar.po52
-rw-r--r--addons/purchase/purchase.py25
-rw-r--r--addons/purchase/purchase_demo.xml3
-rw-r--r--addons/purchase/purchase_view.xml72
-rw-r--r--addons/purchase/report/purchase_report_view.xml2
-rw-r--r--addons/purchase_requisition/purchase_requisition_view.xml2
-rw-r--r--addons/report_intrastat/report/invoice.rml12
-rw-r--r--addons/report_intrastat/report_intrastat_view.xml2
-rw-r--r--addons/sale/report/sale_report_view.xml2
-rw-r--r--addons/sale/res_config.py5
-rw-r--r--addons/sale/res_config_view.xml8
-rw-r--r--addons/sale/sale.py30
-rw-r--r--addons/sale/sale_view.xml23
-rw-r--r--addons/sale/test/sale_order_demo.yml14
-rw-r--r--addons/sale_analytic_plans/sale_analytic_plans.py10
-rw-r--r--addons/sale_crm/sale_crm_view.xml4
-rw-r--r--addons/sale_margin/__openerp__.py2
-rw-r--r--addons/sale_margin/sale_margin_demo.xml46
-rw-r--r--addons/sale_margin/sale_margin_view.xml2
-rw-r--r--addons/sale_mrp/test/sale_mrp.yml25
-rw-r--r--addons/sale_stock/__openerp__.py1
-rw-r--r--addons/sale_stock/res_config.py3
-rw-r--r--addons/sale_stock/res_config_view.xml10
-rw-r--r--addons/sale_stock/sale_stock.py24
-rw-r--r--addons/sale_stock/sale_stock_view.xml9
-rw-r--r--addons/sale_stock/stock.py33
-rw-r--r--addons/sale_stock/test/sale_order_onchange.yml22
-rw-r--r--addons/share/i18n/ar.po78
-rw-r--r--addons/stock/i18n/de.po705
-rw-r--r--addons/stock/product.py7
-rw-r--r--addons/stock/product_view.xml83
-rw-r--r--addons/stock/report/lot_overview.rml6
-rw-r--r--addons/stock/report/lot_overview_all.rml6
-rw-r--r--addons/stock/report/report_stock_move_view.xml4
-rw-r--r--addons/stock/report/report_stock_view.xml2
-rw-r--r--addons/stock/stock.py22
-rw-r--r--addons/stock/stock_demo.yml1
-rw-r--r--addons/stock/stock_view.xml6
-rw-r--r--addons/stock/wizard/stock_return_picking.py6
-rw-r--r--addons/stock_location/procurement_pull.py6
-rw-r--r--addons/stock_no_autopicking/stock_no_autopicking_view.xml2
-rw-r--r--addons/survey/survey_view.xml4
-rw-r--r--addons/warning/warning_view.xml2
-rw-r--r--addons/web_linkedin/web_linkedin.py13
-rw-r--r--addons/web_shortcuts/controllers/main.py13
-rw-r--r--addons/web_shortcuts/static/src/js/web_shortcuts.js2
304 files changed, 8292 insertions, 10212 deletions
diff --git a/addons/account/account.py b/addons/account/account.py
index bf072507aa0..46cfaf645a8 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -155,6 +155,7 @@ class account_account_type(osv.osv):
return res
def _save_report_type(self, cr, uid, account_type_id, field_name, field_value, arg, context=None):
+ field_value = field_value or 'none'
obj_data = self.pool.get('ir.model.data')
obj_financial_report = self.pool.get('account.financial.report')
#unlink if it exists somewhere in the financial reports related to BS or PL
@@ -299,7 +300,6 @@ class account_account(osv.osv):
if aml_query.strip():
wheres.append(aml_query.strip())
filters = " AND ".join(wheres)
- _logger.debug('Filters: %s',(filters))
# IN might not work ideally in case there are too many
# children_and_consolidated, in that case join on a
# values() e.g.:
@@ -315,7 +315,6 @@ class account_account(osv.osv):
" GROUP BY l.account_id")
params = (tuple(children_and_consolidated),) + query_params
cr.execute(request, params)
- _logger.debug('Status: %s',(cr.statusmessage))
for row in cr.dictfetchall():
accounts[row['id']] = row
@@ -596,10 +595,7 @@ class account_account(osv.osv):
return res
def copy(self, cr, uid, id, default=None, context=None, done_list=None, local=False):
- if default is None:
- default = {}
- else:
- default = default.copy()
+ default = {} if default is None else default.copy()
if done_list is None:
done_list = []
account = self.browse(cr, uid, id, context=context)
@@ -781,10 +777,7 @@ class account_journal(osv.osv):
]
def copy(self, cr, uid, id, default=None, context=None, done_list=None, local=False):
- if default is None:
- default = {}
- else:
- default = default.copy()
+ default = {} if default is None else default.copy()
if done_list is None:
done_list = []
journal = self.browse(cr, uid, id, context=context)
@@ -1185,6 +1178,7 @@ class account_fiscalyear(osv.osv):
}
def copy(self, cr, uid, id, default=None, context=None):
+ default = {} if default is None else default.copy()
default.update({
'period_ids': [],
'end_journal_period_id': False
@@ -1444,14 +1438,8 @@ class account_move(osv.osv):
return result
def copy(self, cr, uid, id, default=None, context=None):
- if context is None:
- default = {}
- else:
- default = default.copy()
- if context is None:
- context = {}
- else:
- context = context.copy()
+ default = {} if default is None else default.copy()
+ context = {} if context is None else context.copy()
default.update({
'state':'draft',
'name':'/',
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index b4fc2388a68..549363ce269 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -461,10 +461,10 @@ class account_bank_statement(osv.osv):
return {}
balance_start = self._compute_balance_end_real(cr, uid, journal_id, context=context)
- journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['default_debit_account_id', 'company_id'], context=context)
- account_id = journal_data['default_debit_account_id']
+ journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['company_id', 'currency'], context=context)
company_id = journal_data['company_id']
- return {'value': {'balance_start': balance_start, 'account_id': account_id, 'company_id': company_id}}
+ currency_id = journal_data['currency'] or self.pool.get('res.company').browse(cr, uid, company_id[0], context=context).currency_id.id
+ return {'value': {'balance_start': balance_start, 'company_id': company_id, 'currency': currency_id}}
def unlink(self, cr, uid, ids, context=None):
stat = self.read(cr, uid, ids, ['state'], context=context)
diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py
index c543b493831..57f16473b82 100644
--- a/addons/account/account_invoice.py
+++ b/addons/account/account_invoice.py
@@ -1360,6 +1360,7 @@ class account_invoice_line(osv.osv):
_columns = {
'name': fields.text('Description', required=True),
'origin': fields.char('Source', size=256, help="Reference of the document that produced this invoice."),
+ 'sequence': fields.integer('Sequence', help="Gives the sequence of this line when displaying the invoice."),
'invoice_id': fields.many2one('account.invoice', 'Invoice Reference', ondelete='cascade', select=True),
'uos_id': fields.many2one('product.uom', 'Unit of Measure', ondelete='set null'),
'product_id': fields.many2one('product.product', 'Product', ondelete='set null'),
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml
index 17ebfe1f744..8516fcd96ae 100644
--- a/addons/account/account_invoice_view.xml
+++ b/addons/account/account_invoice_view.xml
@@ -189,7 +189,7 @@
</group>
<notebook>
<page string="Invoice">
- <field context="{'partner_id': partner_id, 'price_type': 'price_type' in dir() and price_type or False, 'type': type}" name="invoice_line">
+ <field context="{'partner_id': partner_id, 'price_type': context.get('price_type') or False, 'type': type}" name="invoice_line">
<tree string="Invoice lines" editable="bottom">
<field name="product_id"
on_change="product_id_change(product_id, uos_id, quantity, name, parent.type, parent.partner_id, parent.fiscal_position, price_unit, parent.currency_id, context, parent.company_id)"/>
@@ -211,17 +211,17 @@
</tree>
</field>
<group class="oe_subtotal_footer oe_right">
- <field name="amount_untaxed"/>
+ <field name="amount_untaxed" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<div>
<label for="amount_tax"/>
<button name="button_reset_taxes" states="draft,proforma2"
string="(update)" class="oe_link oe_edit_only"
type="object" help="Recompute taxes and total"/>
</div>
- <field name="amount_tax" nolabel="1"/>
- <field name="amount_total" class="oe_subtotal_footer_separator"/>
+ <field name="amount_tax" nolabel="1" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="amount_total" class="oe_subtotal_footer_separator" widget="monetary" options="{'currency_field': 'currency_id'}"/>
- <field name="residual"/>
+ <field name="residual" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="reconciled" invisible="1"/>
</group>
<div style="width: 50%%">
@@ -322,7 +322,7 @@
<field string="Customer" name="partner_id"
on_change="onchange_partner_id(type,partner_id,date_invoice,payment_term, partner_bank_id,company_id)"
groups="base.group_user" context="{'search_default_customer':1, 'show_address': 1}"
- options='{"always_reload": true}'/>
+ options='{"always_reload": True}'/>
<field name="fiscal_position" widget="selection" />
</group>
<group>
@@ -368,16 +368,16 @@
</tree>
</field>
<group class="oe_subtotal_footer oe_right">
- <field name="amount_untaxed"/>
+ <field name="amount_untaxed" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<div>
<label for="amount_tax"/>
<button name="button_reset_taxes" states="draft,proforma2"
string="(update)" class="oe_link oe_edit_only"
type="object" help="Recompute taxes and total"/>
</div>
- <field name="amount_tax" nolabel="1"/>
- <field name="amount_total" class="oe_subtotal_footer_separator"/>
- <field name="residual" groups="account.group_account_user"/>
+ <field name="amount_tax" nolabel="1" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="amount_total" class="oe_subtotal_footer_separator" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="residual" groups="account.group_account_user" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="reconciled" invisible="1"/>
</group>
<group>
@@ -458,7 +458,6 @@
<filter domain="[('user_id','=',uid)]" help="My Invoices" icon="terp-personal"/>
<field name="partner_id"/>
<field name="user_id" string="Salesperson"/>
- <field name="journal_id"/>
<field name="period_id" string="Period"/>
<group expand="0" string="Group By...">
<filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 1fbda80a0fe..d98b53ebbbd 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -633,13 +633,10 @@
<field name="period_id" class="oe_inline"/>
</div>
<field name='company_id' widget="selection" groups="base.group_multi_company" />
+ <field name="currency" invisible="1"/>
</group><group>
- <label for="balance_start"/>
- <div>
- <field name="balance_start" class="oe_inline"/>
- <field name="currency" class="oe_inline"/>
- </div>
- <field name="balance_end_real"/>
+ <field name="balance_start" widget="monetary" options='{"currency_field" : "currency"}'/>
+ <field name="balance_end_real" widget="monetary" options='{"currency_field" : "currency"}'/>
</group>
</group>
@@ -1130,8 +1127,8 @@
<field name="account_tax_id" domain="[('parent_id','=',False)]"/>
</group>
<group attrs="{'readonly':[('state','=','valid')]}" string="Currency" groups="base.group_multi_currency">
- <field name="currency_id"/>
- <field name="amount_currency"/>
+ <field name="currency_id" invisible="1"/>
+ <field name="amount_currency" widget="monetary" options="{'currency_field': 'currency_id'}"/>
</group>
<group string="Reconciliation">
<field name="reconcile_id"/>
@@ -1177,8 +1174,8 @@
<field name="credit"/>
<separator colspan="4" string="Optional Information"/>
- <field name="currency_id" groups="base.group_multi_currency"/>
- <field name="amount_currency" groups="base.group_multi_currency"/>
+ <field name="currency_id" invisible="1"/>
+ <field name="amount_currency" groups="base.group_multi_currency" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="quantity"/>
<field name="move_id" required="False"/>
<newline/>
@@ -1549,10 +1546,7 @@
<field name="view_mode">account_reconciliation_list</field>
<field name="help" type="html">
<p>
- Good job!
- </p><p>
- There is nothing to reconcile. All invoices and payments
- have been reconciled, your partner balance is clean.
+ No journal items found.
</p>
</field>
</record>
@@ -2570,7 +2564,7 @@ action = pool.get('res.config').next(cr, uid, [], context)
<field name="date" attrs="{'readonly':[('state','!=','draft')]}" on_change="onchange_date(date, company_id)"/>
<field name="closing_date" readonly="1"/>
<field name="period_id" class="oe_inline"/>
- <field name="currency" invisible="1" groups="base.group_multi_currency"/>
+ <field name="currency" invisible="1"/>
</group>
</group>
<notebook>
@@ -2632,12 +2626,12 @@ action = pool.get('res.config').next(cr, uid, [], context)
<group col="6" colspan="4">
<group col="2" colspan="2">
<separator string="Opening Balance" colspan="4"/>
- <field name="balance_start" readonly="1" string="Opening Cash Control"/>
- <field name="last_closing_balance" readonly="1" string="Last Closing Balance" />
- <field name="total_entry_encoding" />
+ <field name="balance_start" readonly="1" string="Opening Cash Control" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="last_closing_balance" readonly="1" string="Last Closing Balance" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="total_entry_encoding" widget="monetary" options="{'currency_field': 'currency_id'}"/>
</group>
<group string="Closing Balance">
- <field name="balance_end"/>
+ <field name="balance_end" widget="monetary" options="{'currency_field': 'currency_id'}"/>
</group>
</group>
</sheet>
diff --git a/addons/account/i18n/de.po b/addons/account/i18n/de.po
index 38e567be40d..ee0edf06553 100644
--- a/addons/account/i18n/de.po
+++ b/addons/account/i18n/de.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-02-08 00:35+0000\n"
-"PO-Revision-Date: 2012-06-25 09:07+0000\n"
+"PO-Revision-Date: 2012-10-12 23:18+0000\n"
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:10+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-14 04:39+0000\n"
+"X-Generator: Launchpad (build 16137)\n"
#. module: account
#: view:account.invoice.report:0
@@ -25,7 +25,7 @@ msgstr "letzten Monat"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
msgid "System payment"
-msgstr "Zahlungssystematik"
+msgstr "Zahlungsmothode"
#. module: account
#: view:account.journal:0
@@ -39,7 +39,7 @@ msgid ""
"Generic Reporting \\ Taxes \\ Taxes Report'"
msgstr ""
"Legen Sie die Reihenfolge der Anzeige im Report 'Finanz \\ Berichte \\ "
-"generische Reports \\ Steuern \\ Steuererklärung' fest"
+"Allgemeine Berichte \\ Steuern \\ Steuererklärung' fest"
#. module: account
#: view:account.move.reconcile:0
@@ -57,12 +57,12 @@ msgstr "Statistische Auswertungen"
#. module: account
#: view:account.invoice:0
msgid "Proforma/Open/Paid Invoices"
-msgstr "Proforoma/Offene/Bezahlte Rechnungen"
+msgstr "Proforma / offene bzw. bezahlte Rechnungen"
#. module: account
#: field:report.invoice.created,residual:0
msgid "Residual"
-msgstr "Restwert"
+msgstr "Verbleibend"
#. module: account
#: constraint:account.period:0
@@ -72,7 +72,7 @@ msgstr "Fehler! Die Dauer der Periode(n) ist ungültig "
#. module: account
#: field:account.analytic.line,currency_id:0
msgid "Account currency"
-msgstr "Währung"
+msgstr "Währung des Kontos"
#. module: account
#: view:account.tax:0
@@ -83,7 +83,7 @@ msgstr "Definition untergeordneter Steuern"
#: code:addons/account/account_bank_statement.py:302
#, python-format
msgid "Journal item \"%s\" is not valid."
-msgstr "Journalzeile \"%s\" ist ungültig"
+msgstr "Buchung \"%s\" ist ungültig"
#. module: account
#: model:ir.model,name:account.model_report_aged_receivable
@@ -103,7 +103,7 @@ msgstr "wizard.multi.charts.accounts"
#. module: account
#: view:account.move:0
msgid "Total Debit"
-msgstr "Summe Soll"
+msgstr "Forderungsgesamtsumme"
#. module: account
#: view:account.unreconcile:0
@@ -111,7 +111,7 @@ msgid ""
"If you unreconciliate transactions, you must also verify all the actions "
"that are linked to those transactions because they will not be disabled"
msgstr ""
-"Wenn Sie Zahlungen stornieren, sollten Sie alle zugehörigen Belege und "
+"Wenn Sie Zahlungen stornieren, müssen Sie alle zugehörigen Belege und "
"Buchungen prüfen, da diese nicht automatisch mit gelöscht oder deaktiviert "
"werden."
@@ -122,13 +122,13 @@ msgid ""
"accounts too."
msgstr ""
"Konfigurationsfehler! Die gewählte Währung muss auch bei den Standardkonten "
-"verwendet werden"
+"verwendet werden."
#. module: account
#: report:account.invoice:0
#: field:account.invoice.line,origin:0
msgid "Origin"
-msgstr "Bezug"
+msgstr "Herkunft"
#. module: account
#: view:account.account:0
@@ -137,7 +137,7 @@ msgstr "Bezug"
#: view:account.move.line.reconcile:0
#: view:account.move.line.reconcile.writeoff:0
msgid "Reconcile"
-msgstr "Ausgleich Nummer"
+msgstr "Ausgleich von Offenen Posten"
#. module: account
#: field:account.bank.statement.line,ref:0
@@ -146,6 +146,7 @@ msgstr "Ausgleich Nummer"
#: field:account.move,ref:0
#: field:account.move.line,ref:0
#: field:account.subscription,ref:0
+#: xsl:account.transfer:0
msgid "Reference"
msgstr "Referenz"
@@ -164,13 +165,13 @@ msgstr ""
"angezeigt."
#. module: account
-#: code:addons/account/account_invoice.py:1428
+#: code:addons/account/account_invoice.py:1430
#, python-format
msgid "Warning!"
msgstr "Achtung!"
#. module: account
-#: code:addons/account/account.py:3112
+#: code:addons/account/account.py:3129
#, python-format
msgid "Miscellaneous Journal"
msgstr "\"verschiedenes\" Journal"
@@ -195,7 +196,7 @@ msgstr "Spaltenbeschriftung"
#: code:addons/account/wizard/account_move_journal.py:95
#, python-format
msgid "Journal: %s"
-msgstr "Journal: %s"
+msgstr "Journal %s"
#. module: account
#: help:account.analytic.journal,type:0
@@ -204,16 +205,16 @@ msgid ""
"invoice) to create analytic entries, OpenERP will look for a matching "
"journal of the same type."
msgstr ""
-"Definiert Typ für das analytische Journal. Wenn ein Beleg (z.B. eine "
-"Rechnung) dann zusätzlich zu den Finanzbuchungen weitere analytische "
-"Buchungen erzeugen soll , prüft OpenERP inwieweit ein analytisches Journal "
-"mit dem identischem Typ (z.B. Verkauf) existiert."
+"Definiert die Art des analytischen Journals. Wenn ein Beleg (z. B. eine "
+"Rechnung), zusätzlich zu den Finanzbuchungen, weitere analytische Buchungen "
+"erzeugen soll, prüft OpenERP ob ein analytischer Bericht der gleichen Art "
+"(z.B. Verkauf) vorliegt."
#. 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 "Umsatzsteuer Vorlagen"
+msgstr "-Vorlagen für Steuerkonten"
#. module: account
#: model:ir.model,name:account.model_account_tax
@@ -232,16 +233,14 @@ msgid ""
"Check this box if you don't want any VAT related to this Tax Code to appear "
"on invoices"
msgstr ""
-"Aktivieren, wenn KEINE umsatzsteuerlich relevanten Bezeichnungen auf der "
-"Rechnung erscheinen sollen"
+"Aktivieren, wenn etwaige, in diesen Steuerschlüssel einbezogene, "
+"Steuerbeträge auf der Rechnung nicht erscheinen sollen"
#. module: account
-#: code:addons/account/account_invoice.py:1241
+#: code:addons/account/account_invoice.py:1254
#, python-format
msgid "Invoice '%s' is paid partially: %s%s of %s%s (%s%s remaining)"
-msgstr ""
-"Rechnung '%s' ist teilweise bezahlt: %s%s von %s%s (%s%s verbleiben als "
-"offen)"
+msgstr "Rechnung '%s' ist teilweise bezahlt: %s%s von %s%s (%s%s verbleiben)"
#. module: account
#: model:process.transition,note:account.process_transition_supplierentriesreconcile0
@@ -254,12 +253,12 @@ msgid "Belgian Reports"
msgstr "Auswertungen für Belgien"
#. module: account
-#: code:addons/account/account_move_line.py:1200
+#: code:addons/account/account_move_line.py:1215
#, python-format
msgid "You can not add/modify entries in a closed journal."
msgstr ""
"Sie können in einem abgeschlossenen Journal keine Buchung vornehmen oder "
-"ändern ."
+"ändern."
#. module: account
#: help:account.account,user_type:0
@@ -269,13 +268,13 @@ msgid ""
"entries."
msgstr ""
"Der Kontentyp hat Informationscharakter und wird verwendet, um "
-"länderspezifsche Reports zu generieren sowie um den Jahresabschluss zu "
-"steuern und Eröffnungsbilanzbuchungen zu generieren"
+"länderspezifsche Berichte zu generieren sowie den Jahresabschluss zu steuern "
+"und Eröffnungsbilanzbuchungen zu generieren"
#. module: account
#: report:account.overdue:0
msgid "Sub-Total :"
-msgstr "Zwischensumme"
+msgstr "Zwischensumme:"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_use_model_create_entry
@@ -287,7 +286,7 @@ msgstr "Wiederkehrende Buchungen (Manuell)"
#. module: account
#: view:account.fiscalyear.close.state:0
msgid "Close Fiscalyear"
-msgstr "Beende Geschäftsjahr"
+msgstr "Geschäftsjahr abschließen"
#. module: account
#: field:account.automatic.reconcile,allow_write_off:0
@@ -297,7 +296,7 @@ msgstr "Erlaube Abschreibung"
#. module: account
#: view:account.analytic.chart:0
msgid "Select the Period for Analysis"
-msgstr "Auswahl Periode"
+msgstr "Periode zur Analyse auswählen"
#. module: account
#: view:account.move.line:0
@@ -305,16 +304,17 @@ msgid "St."
msgstr "Beleg"
#. module: account
-#: code:addons/account/account_invoice.py:551
+#: code:addons/account/account_invoice.py:560
#, python-format
msgid "Invoice line account company does not match with invoice company."
msgstr ""
-"Unternehmen (Mandant) ist bei Rechnung und Rechnungszeile nicht identisch."
+"Das Kundenkonto ist einem anderen Unternehmen (Mandant) zugewiesen als der "
+"Rechnungssteller."
#. module: account
#: field:account.journal.column,field:0
msgid "Field Name"
-msgstr "Bezeichnung Feld"
+msgstr "Feldname"
#. module: account
#: help:account.installer,charts:0
@@ -322,8 +322,8 @@ msgid ""
"Installs localized accounting charts to match as closely as possible the "
"accounting needs of your company based on your country."
msgstr ""
-"Installiert Kontenplan für Ihr Land, um soweit wie möglich eine Vorlage für "
-"Ihr Unternehmen zu bieten."
+"Installiert landesspezifische Kontenpläne, um soweit wie möglich den Bedarf "
+"Ihres Unternehmens abzudecken."
#. module: account
#: code:addons/account/wizard/account_move_journal.py:63
@@ -334,10 +334,10 @@ msgid ""
"You can create one in the menu: \n"
"Configuration/Financial Accounting/Accounts/Journals."
msgstr ""
-"Konnte kein Journal mit dem Typ %s für Unternehmen finden.\n"
+"Konnte kein Journal mit dem Typ %s für dieses Unternehmen finden.\n"
"\n"
-"Sie können ein Journal definieren:\n"
-"Konfiguration/Finanzbuchhaltung/Finanzkonten/Journale"
+"Hier können Sie einen Bericht anlegen:\n"
+"Finanzen / Konfiguration / Finanzen / Buchungsjournale"
#. module: account
#: model:ir.model,name:account.model_account_unreconcile
@@ -364,7 +364,7 @@ msgstr ""
#. module: account
#: view:account.installer:0
msgid "Configure"
-msgstr "Konfigurieren"
+msgstr "Einrichten"
#. module: account
#: selection:account.entries.report,month:0
@@ -389,7 +389,7 @@ msgstr ""
#. module: account
#: constraint:account.move.line:0
msgid "You can not create journal items on an account of type view."
-msgstr "You can not create journal items on an account of type view."
+msgstr "Sie können keine Buchungen in einem Ansichtskonto vornehmen."
#. module: account
#: model:ir.model,name:account.model_account_tax_template
@@ -405,7 +405,7 @@ msgstr "account.bank.accounts.wizard"
#: field:account.move.line,date_created:0
#: field:account.move.reconcile,create_date:0
msgid "Creation date"
-msgstr "Erzeugt am"
+msgstr "Erstellungsdatum"
#. module: account
#: selection:account.journal,type:0
@@ -433,19 +433,19 @@ msgid ""
"This field contains the informatin related to the numbering of the journal "
"entries of this journal."
msgstr ""
-"Dieses Feld enthält die Sequenz für die Buchungen in diesem Journal. "
-"Hierdurch kann dann die chronologische Reihenfolge der Buchungen "
-"nachvollzogen werden."
+"Dieses Feld enthält beschreibt die Nummerierung für die Buchungen in diesem "
+"Journal. Hierdurch kann dann die chronologische Reihenfolge der Buchungen "
+"sichergestellt werden."
#. module: account
#: field:account.journal,default_debit_account_id:0
msgid "Default Debit Account"
-msgstr "Standard Sollkonto"
+msgstr "Standard Debitorenkonto"
#. module: account
#: view:account.move:0
msgid "Total Credit"
-msgstr "Summe Haben"
+msgstr "Habensumme"
#. module: account
#: view:account.move.line.unreconcile.select:0
@@ -463,7 +463,7 @@ msgstr "Kontenplan Vorlage"
#. module: account
#: help:account.model.line,amount_currency:0
msgid "The amount expressed in an optional other currency."
-msgstr "Der optionale Betrag in anderer Währung"
+msgstr "In alternativer Währung dargestellter Betrag"
#. module: account
#: field:accounting.report,enable_filter:0
@@ -477,10 +477,10 @@ msgid ""
"it comes to 'Printed' state. When all transactions are done, it comes in "
"'Done' state."
msgstr ""
-"Bei Erstellung einer Periode für das Journal ist der Status 'Entwurf'. Wenn "
-"dann ein Report für das Journal ausgedruckt wird, wechselt der Status auf "
-"'Gedruckt'. Auf 'Fertig' wechselt dann der Status, wenn alle erforderlichen "
-"Transaktionen hierzu erledigt sind."
+"Bei Erstellung einer Periode für den Bericht ist dieser im Zustand "
+"'Entwurf'. Wenn der Bericht ausgedruckt wird, wechselt der Status auf "
+"\"Gedruckt\". Auf 'Fertig' wechselt dann der Status, wenn alle Transaktionen "
+"hierzu abgschlossen sind."
#. module: account
#: model:ir.actions.act_window,help:account.action_account_tax_chart
@@ -490,11 +490,11 @@ msgid ""
"amount of each area of the tax declaration for your country. It’s presented "
"in a hierarchical structure, which can be modified to fit your needs."
msgstr ""
-"Der Kontenplan Umsatzsteuer ist eine hierachische Ansicht der Steuern über "
-"mehrere Dimensionen. Angezeigt wird nicht nur die Struktur der Steuern, "
-"sondern auch die aktuellen Verkehrszahlen der jeweiligen Steuern für den "
-"Monat und kummuliert für das Jahr. Die hierachische Struktur kann für Ihren "
-"Bedarf angepasst werden."
+"Der Steuer-Kontenplan ist eine hierachische Ansicht der Steuern über mehrere "
+"Ebenen. Angezeigt werden nicht nur die Struktur der Steuern, sondern auch "
+"die aktuellen Verkehrszahlen der jeweiligen Steuern für den Monat und "
+"kummuliert für das Jahr. Die hierachische Struktur kann Ihrem Bedarf "
+"angepasst werden."
#. module: account
#: view:account.analytic.line:0
@@ -529,7 +529,7 @@ msgstr "Journal"
#. module: account
#: model:ir.model,name:account.model_account_invoice_confirm
msgid "Confirm the selected invoices"
-msgstr "Bestätige die ausgewählten Rechnungen"
+msgstr "Ausgewählte Rechnungen bestätigen"
#. module: account
#: field:account.addtmpl.wizard,cparent_id:0
@@ -557,12 +557,12 @@ msgstr "Finanzkonto für dieses Journal"
#: help:account.vat.declaration,chart_account_id:0
#: help:accounting.report,chart_account_id:0
msgid "Select Charts of Accounts"
-msgstr "Wähle Kontenplan"
+msgstr "Kontenplan wählen"
#. module: account
#: sql_constraint:res.company:0
msgid "The company name must be unique !"
-msgstr "Der Name der Firma darf nur einmal vorkommen!"
+msgstr "Der Unternehmensname muss eindeutig sein!"
#. module: account
#: model:ir.model,name:account.model_account_invoice_refund
@@ -577,7 +577,7 @@ msgstr "Limit"
#. module: account
#: field:account.automatic.reconcile,unreconciled:0
msgid "Not reconciled transactions"
-msgstr "Nicht ausgeglichene Posten"
+msgstr "Unausgeglichener Geschäftsvorgang"
#. module: account
#: report:account.general.ledger:0
@@ -590,13 +590,13 @@ msgstr "Gegenbuchung"
#: field:account.fiscal.position,tax_ids:0
#: field:account.fiscal.position.template,tax_ids:0
msgid "Tax Mapping"
-msgstr "Steuer Zuordnung"
+msgstr "Steuerzuordnung"
#. 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 "Beende Geschäftsjahr"
+msgstr "Geschäftsjahr abschließen"
#. module: account
#: model:process.transition,note:account.process_transition_confirmstatementfromdraft0
@@ -604,8 +604,10 @@ msgid "The accountant confirms the statement."
msgstr "Der Buchhalter bestätigt den Bankauszug."
#. 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
@@ -646,12 +648,12 @@ msgstr "Sequenzen"
#: field:account.financial.report,account_report_id:0
#: selection:account.financial.report,type:0
msgid "Report Value"
-msgstr "Bericht Wert"
+msgstr "Berichtswert"
#. module: account
#: view:account.fiscal.position.template:0
msgid "Taxes Mapping"
-msgstr "Steuern Zuordnung"
+msgstr "Steuerzuordnung"
#. module: account
#: report:account.central.journal:0
@@ -661,10 +663,11 @@ msgstr "Zentraljournal"
#. module: account
#: sql_constraint:account.sequence.fiscalyear:0
msgid "Main Sequence must be different from current !"
-msgstr "Die Hauptsequenz sollte sich von der derzeitigen unterscheiden !"
+msgstr ""
+"Die übergeordnete Nummerierung muss sich von der derzeitigen unterscheiden!"
#. module: account
-#: code:addons/account/account_move_line.py:1251
+#: code:addons/account/account_move_line.py:1266
#, python-format
msgid "No period found or more than one period found for the given date."
msgstr "Keine oder meherere Perioden für dieses Datum gefunden."
@@ -675,7 +678,7 @@ msgid "Tax Code Amount"
msgstr "Steuerbetrag"
#. module: account
-#: code:addons/account/account.py:3116
+#: code:addons/account/account.py:3133
#, python-format
msgid "SAJ"
msgstr "VK"
@@ -684,26 +687,26 @@ msgstr "VK"
#: view:account.period:0
#: view:account.period.close:0
msgid "Close Period"
-msgstr "Periode beenden"
+msgstr "Periode abschließen"
#. module: account
#: model:ir.model,name:account.model_account_common_partner_report
msgid "Account Common Partner Report"
-msgstr "Auswertung Partnerkonto"
+msgstr "Auswertung Partnerkonto (Sammelkonto)"
#. module: account
#: field:account.fiscalyear.close,period_id:0
msgid "Opening Entries Period"
-msgstr "Start Periode im neuen Geschäftsjahr"
+msgstr "Startbuchungen der Periode"
#. module: account
#: model:ir.model,name:account.model_account_journal_period
msgid "Journal Period"
-msgstr "Journal Periode"
+msgstr "Berichtsperiode"
#. module: account
-#: code:addons/account/account_move_line.py:750
-#: code:addons/account/account_move_line.py:803
+#: code:addons/account/account_move_line.py:766
+#: code:addons/account/account_move_line.py:819
#, python-format
msgid "To reconcile the entries company should be the same for all entries"
msgstr ""
@@ -716,18 +719,18 @@ 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 ""
-"The date of your Journal Entry is not in the defined period! You should "
-"change the date or remove this constraint from the journal."
+"Das Datum Ihrer Buchung fällt nicht in die festgelegte Periode. Sie müssen "
+"das Datum anpassen, oder diese Einschränkung vom Bericht entfernen."
#. module: account
#: model:ir.model,name:account.model_account_report_general_ledger
msgid "General Ledger Report"
-msgstr "Kontoauszug und Saldenliste"
+msgstr "Umsätze nach Konten und Perioden"
#. module: account
#: view:account.invoice:0
msgid "Re-Open"
-msgstr "Wiederöffnen"
+msgstr "Wiedereröffnen"
#. module: account
#: view:account.use.model:0
@@ -747,16 +750,15 @@ msgstr "Heute ausgeglichene Partner"
#. module: account
#: view:report.hr.timesheet.invoice.journal:0
msgid "Sale journal in this year"
-msgstr "Verkaufsjournal dieses Jshres"
+msgstr "Verkaufsbericht dieses Jahres"
#. module: account
#: selection:account.financial.report,display_detail:0
msgid "Display children with hierarchy"
-msgstr "Zeige Kinder abhängige in der Hierarchie"
+msgstr "Zeige Hierarchie der Kinder"
#. module: account
#: selection:account.payment.term.line,value:0
-#: selection:account.tax.template,type:0
msgid "Percent"
msgstr "Prozent"
@@ -781,9 +783,10 @@ msgstr "Gutschriftmethode"
#: code:addons/account/wizard/account_change_currency.py:38
#, python-format
msgid "You can only change currency for Draft Invoice !"
-msgstr "Sie können die Währung nur bei Rechnungen"
+msgstr "Sie können die Währung nur bei Rechnungsentwürfen ändern"
#. module: account
+#: model:ir.actions.report.xml,name:account.account_financial_report
#: model:ir.ui.menu,name:account.menu_account_report
msgid "Financial Report"
msgstr "Finanzbericht"
@@ -799,12 +802,13 @@ msgstr "Finanzbericht"
#: 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 "Typ"
#. module: account
-#: code:addons/account/account_invoice.py:738
+#: code:addons/account/account_invoice.py:747
#, python-format
msgid ""
"Taxes are missing!\n"
@@ -826,7 +830,7 @@ msgstr "Referenz des Partners für diese Rechnung."
#. module: account
#: view:account.invoice.report:0
msgid "Supplier Invoices And Refunds"
-msgstr "Lieferanten Rechnungen und Gutschriften"
+msgstr "Lieferantenrechnungen und -gutschriften"
#. module: account
#: view:account.move.line.unreconcile.select:0
@@ -834,7 +838,7 @@ msgstr "Lieferanten Rechnungen und Gutschriften"
#: view:account.unreconcile.reconcile:0
#: model:ir.model,name:account.model_account_move_line_unreconcile_select
msgid "Unreconciliation"
-msgstr "Storno Ausgleich Offene Posten"
+msgstr "Stornierung des OP-Ausgleichs"
#. module: account
#: view:account.payment.term.line:0
@@ -864,10 +868,10 @@ msgid ""
"or Loss you'd realized if those transactions were ended today. Only for "
"accounts having a secondary currency set."
msgstr ""
-"Bei Transaktionen mit mehreren Währungen fallen ggf. Währungsgewinne oder "
-"Verluste an. Dieses Menü gibt Ihnen einen Überblick über Gewinne und "
-"Verluste, wenn diese heute realisiert würden. Nur für Konten mit definierter "
-"2.Währung."
+"Bei Geschäftsvorfällen mit mehreren Währungen fallen ggf. Währungsgewinne "
+"oder -verluste an. Dieses Menü gibt Ihnen einen Überblick über Gewinne und "
+"Verluste, wenn diese heute realisiert würden. Betrifft nur Konten mit "
+"Alternativwährung."
#. module: account
#: selection:account.entries.report,month:0
@@ -887,7 +891,7 @@ msgstr "Tage"
#: help:account.account.template,nocreate:0
msgid ""
"If checked, the new chart of accounts will not contain this by default."
-msgstr "Bei Aktivierung, ist dieses nicht im neuen Kontenplan beiinhaltet."
+msgstr "Bei Aktivierung, ist dieses nicht im neuen Kontenplan enthalten."
#. module: account
#: code:addons/account/wizard/account_invoice_refund.py:110
@@ -896,9 +900,8 @@ msgid ""
"Can not %s invoice which is already reconciled, invoice should be "
"unreconciled first. You can only Refund this invoice"
msgstr ""
-"Kann keine Rechnung %s erzeugen, die bereits ausgeglichen wurde, hierzu muss "
-"die Zahlung zuerst storniert werden. Sie können lediglich diese Rechnung "
-"ausgleichen."
+"Kann eine bereits beglichene Rechnung nicht %s, dazu muss die Zahlung "
+"zunächst storniert werden. Sie können diese Rechnung lediglich rückerstatten."
#. module: account
#: model:ir.actions.act_window,name:account.action_subscription_form_new
@@ -924,7 +927,7 @@ msgstr "Werte"
#: view:account.invoice.report:0
#: field:account.invoice.report,delay_to_pay:0
msgid "Avg. Delay To Pay"
-msgstr "Durch. Zahlungsdauer"
+msgstr "Mittlerer Zahlungsverzug"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_tax_chart
@@ -936,15 +939,16 @@ msgstr "Kontenplan Umsatzsteuer"
#. module: account
#: view:account.fiscalyear:0
msgid "Create 3 Months Periods"
-msgstr "Erzeuge 3 Monats Periode"
+msgstr "Lege Quartal an"
#. module: account
+#: report:account.aged_trial_balance:0
#: report:account.overdue:0
msgid "Due"
msgstr "Fällig"
#. module: account
-#: code:addons/account/account.py:1345
+#: code:addons/account/account.py:1353
#, python-format
msgid ""
"You cannot validate this journal entry because account \"%s\" does not "
@@ -960,8 +964,8 @@ msgid ""
"This account does not allow reconciliation! You should update the account "
"definition to change this."
msgstr ""
-"Dieses Konto kann nicht ausgeziffert werden. Sie können dies jedoch om Konto "
-"einstellen."
+"Dieses Konto erlaubt keinen Ausgleich. Sie können jedoch die Konto-"
+"Einstellungen diesbezüglich ändern."
#. module: account
#: view:account.invoice:0
@@ -995,7 +999,7 @@ msgstr "Verbindlichkeit"
#. module: account
#: view:account.entries.report:0
msgid "Extended Filters..."
-msgstr "Erweiterter Filter..."
+msgstr "Erweiterte Filter..."
#. module: account
#: model:ir.ui.menu,name:account.menu_account_central_journal
@@ -1005,12 +1009,12 @@ msgstr "Zentrales Buchungsjournal"
#. module: account
#: selection:account.journal,type:0
msgid "Sale Refund"
-msgstr "Gutschrift Verkauf"
+msgstr "Rückerstattung aus Verkauf"
#. module: account
#: model:process.node,note:account.process_node_accountingstatemententries0
msgid "Bank statement"
-msgstr "Bank Auszug"
+msgstr "Bankauszug"
#. module: account
#: field:account.analytic.line,move_id:0
@@ -1030,7 +1034,7 @@ msgstr ""
"dann die Basis für die Steuerberechnung ist."
#. module: account
-#: code:addons/account/account.py:2596
+#: code:addons/account/account.py:2613
#, python-format
msgid "I can not locate a parent code for the template account!"
msgstr "Finde keinen Code für das übergeordnete Vorlagekonto"
@@ -1060,17 +1064,17 @@ msgstr "Buchungsvorlage"
#: report:account.partner.balance:0
#: field:account.period,code:0
msgid "Code"
-msgstr "Kurzbezeichnung"
+msgstr "Kurzbez."
#. module: account
-#: code:addons/account/account.py:2268
+#: code:addons/account/account.py:2285
#: code:addons/account/account_bank_statement.py:357
#: code:addons/account/account_invoice.py:73
-#: code:addons/account/account_invoice.py:688
+#: code:addons/account/account_invoice.py:697
#: code:addons/account/account_move_line.py:173
#, python-format
msgid "No Analytic Journal !"
-msgstr "Kein Analytisches Journal!"
+msgstr "Kein Analytischer Bericht!"
#. module: account
#: report:account.partner.balance:0
@@ -1084,23 +1088,23 @@ msgstr "Partner Saldenliste"
#. module: account
#: field:account.bank.accounts.wizard,acc_name:0
msgid "Account Name."
-msgstr "Konto Bezeichnung"
+msgstr "Kontobezeichnung"
#. module: account
#: field:account.chart.template,property_reserve_and_surplus_account:0
#: field:res.company,property_reserve_and_surplus_account:0
msgid "Reserve and Profit/Loss Account"
-msgstr "Konto für vorläufigen Gewinn / Verlust"
+msgstr "Konto für Rücklagen und vorläufigen Gewinn / Verlust"
#. module: account
#: field:report.account.receivable,name:0
msgid "Week of Year"
-msgstr "Woche eines Jahres"
+msgstr "Kalenderwoche (KW)"
#. module: account
#: field:account.report.general.ledger,landscape:0
msgid "Landscape Mode"
-msgstr "Überblick"
+msgstr "Querformat"
#. module: account
#: code:addons/account/account.py:645
@@ -1109,17 +1113,18 @@ msgid ""
"You cannot change the type of account from '%s' to '%s' type as it contains "
"journal items!"
msgstr ""
-"Sie können den Typ des Kontos mit Buchungen nicht von '%s' auf '%s' ändern."
+"Sie können den Typ des Kontos nicht von '%s' auf '%s' ändern, da es "
+"Buchungen enthält."
#. module: account
#: field:account.report.general.ledger,sortby:0
msgid "Sort by"
-msgstr "Sortiere nach"
+msgstr "Sortieren nach"
#. module: account
#: help:account.fiscalyear.close,fy_id:0
msgid "Select a Fiscal year to close"
-msgstr "Wähle zu beendendes Geschäftsjahr"
+msgstr "Wählen Sie das abzuschließende Geschäftsjahr"
#. module: account
#: help:account.account.template,user_type:0
@@ -1128,11 +1133,11 @@ msgid ""
"information about the account and its specificities."
msgstr ""
"Die Kontotypen wurden für die Abbildung von regionalen Besonderheiten "
-"definiert. Hierdurch können Sie Ihre landestypischen Konto(art)typen "
+"definiert. Hierdurch können Sie Ihre landestypischen Kontoarten/-typen "
"definieren."
#. module: account
-#: code:addons/account/account_move_line.py:842
+#: code:addons/account/account_move_line.py:856
#, python-format
msgid ""
"You have to provide an account for the write off/exchange difference entry !"
@@ -1147,7 +1152,7 @@ msgstr "Anwendbare Optionen"
#. module: account
#: report:account.partner.balance:0
msgid "In dispute"
-msgstr "Nn Vollstreckung"
+msgstr "In Anfechtung"
#. module: account
#: model:ir.actions.act_window,name:account.action_view_bank_statement_tree
@@ -1171,17 +1176,17 @@ msgstr "Verantwortl. Mitarbeiter"
#. module: account
#: view:account.subscription.generate:0
msgid "Generate Entries before:"
-msgstr "Buche alle wiederkehrenden Buchungen vor dem:"
+msgstr "Anlegen der wiederkehrenden Buchungen vor dem:"
#. module: account
#: view:account.move.line:0
msgid "Unbalanced Journal Items"
-msgstr "OP Buchungen"
+msgstr "Unausgeglichene Buchungen"
#. 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:3003
+#: code:addons/account/account.py:3020
#, python-format
msgid "Bank"
msgstr "Bank"
@@ -1189,7 +1194,7 @@ msgstr "Bank"
#. module: account
#: field:account.period,date_start:0
msgid "Start of Period"
-msgstr "Beginn der Periode"
+msgstr "Periodenbeginn"
#. module: account
#: model:process.transition,name:account.process_transition_confirmstatementfromdraft0
@@ -1202,13 +1207,14 @@ msgid ""
"Total amount (in Secondary currency) for transactions held in secondary "
"currency for this account."
msgstr ""
-"Gesamtbetrag der Buchungen dieses Kontos in der definierten 2.Währung"
+"Gesamtbetrag der Buchungen in Alternativwährung in der Alternativwährung "
+"dieses Kontos ausgegeben."
#. 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 "Steuer Zuordnung"
+msgstr "Steuerzuordnung"
#. module: account
#: selection:account.move.line,centralisation:0
@@ -1218,7 +1224,7 @@ msgstr "Haben Zentralisierung"
#. module: account
#: view:report.account_type.sales:0
msgid "All Months Sales by type"
-msgstr "Alle Verkäufe nach Typ"
+msgstr "Alle Verkäufe des Monats nach Typ"
#. module: account
#: model:ir.actions.act_window,help:account.action_invoice_tree2
@@ -1230,15 +1236,15 @@ msgid ""
msgstr ""
"Über das Menü Eingangsrechnungen können Sie Rechnungen Ihrer Lieferanten "
"eingeben und verwalten. OpenERP kann ausserdem automatisch Rechnungsentwürfe "
-"aus Beschaffungsaufträgen erzeugen. Über diesen Weg können Sie nicht nur den "
-"Zeitpunkt der Rechnungserstellung steuern, sondern auch ob bestellte oder "
-"gelieferte Mengen beim Rechnungsentwurf berücksichtigt werden sollen."
+"aus Beschaffungsaufträgen oder Lieferscheinen erzeugen. Somit können Sie die "
+"Eingangsrechnung mit Ihrem Bestellauftrag und der tatsächlichen Lieferung "
+"überprüfen."
#. 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 "Steuerausweis Vorlagen"
+msgstr "Steuerausweis-Vorlagen"
#. module: account
#: view:account.invoice.cancel:0
@@ -1253,7 +1259,7 @@ msgstr "Dieser Code wird auf Berichten angezeigt"
#. module: account
#: view:account.tax.template:0
msgid "Taxes used in Purchases"
-msgstr "Steuern für Einkäufe"
+msgstr "Steuern aus Einkäufen (Vorsteuern)"
#. module: account
#: field:account.invoice.tax,tax_code_id:0
@@ -1261,12 +1267,12 @@ msgstr "Steuern für Einkäufe"
#: field:account.tax.template,tax_code_id:0
#: model:ir.model,name:account.model_account_tax_code
msgid "Tax Code"
-msgstr "Steuer"
+msgstr "Steuerschlüssel"
#. module: account
#: field:account.account,currency_mode:0
msgid "Outgoing Currencies Rate"
-msgstr "Wechselkurse"
+msgstr "Wechselkurs (Verkauf)"
#. module: account
#: selection:account.analytic.journal,type:0
@@ -1276,10 +1282,10 @@ msgstr "Situation"
#. module: account
#: help:account.move.line,move_id:0
msgid "The move of this entry line."
-msgstr "Der Buchungssatz dieser Buchungszeile."
+msgstr "Der Buchungssatz dieser Buchungs."
#. module: account
-#: code:addons/account/account_move_line.py:1302
+#: code:addons/account/account_move_line.py:1317
#, python-format
msgid ""
"You can not use this general account in this journal, check the tab 'Entry "
@@ -1291,7 +1297,7 @@ msgstr ""
#. module: account
#: field:account.move.line.reconcile,trans_nbr:0
msgid "# of Transaction"
-msgstr "# Transaktionen"
+msgstr "Transaktionsnummer"
#. module: account
#: report:account.general.ledger:0
@@ -1302,18 +1308,18 @@ msgid "Entry Label"
msgstr "Buchungstext"
#. module: account
-#: code:addons/account/account.py:1129
+#: code:addons/account/account.py:1136
#, python-format
msgid "You can not modify/delete a journal with entries for this period !"
msgstr ""
-"Sie können kein Journal beenden ohne Buchungseintrag für diese Peridode! (-> "
-"Wirtschaftsperiode)"
+"Sie können ein Journal (Buch) mit Buchungen in dieser Periode nicht "
+"verändern / löschen!"
#. module: account
#: help:account.invoice,origin:0
#: help:account.invoice.line,origin:0
msgid "Reference of the document that produced this invoice."
-msgstr "Referenz des Rechnungsdokuments"
+msgstr "Referenz zum Ursprungsdokuments dieser Rechnung."
#. module: account
#: view:account.analytic.line:0
@@ -1324,7 +1330,7 @@ msgstr "Sonstige"
#. module: account
#: view:account.subscription:0
msgid "Draft Subscription"
-msgstr "Entwurf Abonnement"
+msgstr "Abonnement im Entwurf"
#. module: account
#: view:account.account:0
@@ -1358,7 +1364,7 @@ msgstr "Konto"
#. module: account
#: field:account.tax,include_base_amount:0
msgid "Included in base amount"
-msgstr "Inbegriffen in Steuergrundlage"
+msgstr "Im Grundbetrag enthalten"
#. module: account
#: view:account.entries.report:0
@@ -1386,42 +1392,43 @@ msgstr "Ebene"
#: model:ir.ui.menu,name:account.menu_tax_report
#: model:ir.ui.menu,name:account.next_id_27
msgid "Taxes"
-msgstr "Umsatzsteuer"
+msgstr "Steuern"
#. module: account
-#: code:addons/account/wizard/account_financial_report.py:69
-#: code:addons/account/wizard/account_report_common.py:144
+#: code:addons/account/wizard/account_financial_report.py:70
+#: code:addons/account/wizard/account_report_common.py:145
#, python-format
msgid "Select a starting and an ending period"
-msgstr "Wähle eine Start und Ende Periode"
+msgstr "Wähle eine Start- und eine End-Periode"
#. 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 "GuV"
+msgstr "Gewinn und Verlust"
#. module: account
#: model:ir.model,name:account.model_account_account_template
msgid "Templates for Accounts"
-msgstr "Vorlage Finanzkonten"
+msgstr "Finanzkontenvorlagen"
#. module: account
#: view:account.tax.code.template:0
msgid "Search tax template"
-msgstr "Suche Kontenplan Umsatzsteuer"
+msgstr "Durchsuche Steuerkontenvorlagen"
#. 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 "Buchen OP Ausgleich"
+msgstr "OP-Ausgleich buchen"
#. module: account
#: model:ir.actions.report.xml,name:account.account_overdue
#: view:res.company:0
msgid "Overdue Payments"
-msgstr "Fällige Rechnungen"
+msgstr "Fällige Zahlungen"
#. module: account
#: report:account.third_party_ledger:0
@@ -1437,20 +1444,21 @@ msgstr "Zurücksetzen auf Entwurf"
#. module: account
#: view:wizard.multi.charts.accounts:0
msgid "Bank Information"
-msgstr "Bank Informationen"
+msgstr "Bankinformationen"
#. module: account
#: view:account.aged.trial.balance:0
#: view:account.common.report:0
msgid "Report Options"
-msgstr "Report Optionen"
+msgstr "Berichtsoptionen"
#. module: account
#: model:ir.model,name:account.model_account_entries_report
msgid "Journal Items Analysis"
-msgstr "Analyse der Journaleinträge"
+msgstr "Analyse der Buchungen"
#. module: account
+#: report:account.aged_trial_balance:0
#: model:ir.ui.menu,name:account.next_id_22
msgid "Partners"
msgstr "Partner"
@@ -1475,12 +1483,14 @@ msgid "Central Journal"
msgstr "Zentrales Journal"
#. 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 "Konten mit Saldo"
+msgstr "Konten mit Saldo ungeleich 0"
#. module: account
#: view:account.tax:0
@@ -1495,17 +1505,17 @@ msgstr "Analytisches Konto f. Kosten"
#. module: account
#: view:account.model:0
msgid "Create entries"
-msgstr "Erzeuge Buchungen"
+msgstr "Buchungen anlegen"
#. module: account
#: field:account.entries.report,nbr:0
msgid "# of Items"
-msgstr "# Buchungen"
+msgstr "Buchungsanzahl"
#. module: account
#: field:account.automatic.reconcile,max_amount:0
msgid "Maximum write-off amount"
-msgstr "Max. Abschreibung"
+msgstr "Höchstbetrag f. Abschreibungen"
#. module: account
#: view:account.invoice:0
@@ -1516,7 +1526,7 @@ msgstr "Berechne Steuern"
#: field:account.chart.template,code_digits:0
#: field:wizard.multi.charts.accounts,code_digits:0
msgid "# of Digits"
-msgstr "# Stellenanzahl"
+msgstr "Stellenanzahl"
#. module: account
#: field:account.journal,entry_posted:0
@@ -1545,7 +1555,7 @@ msgstr ""
#. module: account
#: view:account.entries.report:0
msgid "# of Entries "
-msgstr "# Einzelposten "
+msgstr "Anz. Positionen "
#. module: account
#: help:account.fiscal.position,active:0
@@ -1553,13 +1563,13 @@ msgid ""
"By unchecking the active field, you may hide a fiscal position without "
"deleting it."
msgstr ""
-"Durch Deaktivierung des Aktive Feldes können Sie die Finanzposition "
-"deaktivieren ohne diese zu löschen.."
+"Durch Deaktivierung des Feldes \"Aktiv\" können Sie die Finanzposition "
+"verbergen ohne diese zu löschen."
#. module: account
#: model:ir.model,name:account.model_temp_range
msgid "A Temporary table used for Dashboard view"
-msgstr "Eine temporäre Tabelle für Pinnwand Ansichten etc."
+msgstr "Eine temporäre Tabelle für Pinnwand-Ansichten"
#. module: account
#: model:ir.actions.act_window,name:account.action_invoice_tree4
@@ -1576,7 +1586,7 @@ msgstr "Lieferantengutschriften"
#: selection:account.fiscalyear,state:0
#: selection:account.period,state:0
msgid "Closed"
-msgstr "Beendet"
+msgstr "Abgeschlossen"
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_recurrent_entries
@@ -1586,12 +1596,12 @@ msgstr "Wiederkehrende Buchungen"
#. module: account
#: model:ir.model,name:account.model_account_fiscal_position_template
msgid "Template for Fiscal Position"
-msgstr "Steuerzuordnung Vorlage"
+msgstr "Vorlagen für die Bilanz"
#. module: account
#: field:account.automatic.reconcile,reconciled:0
msgid "Reconciled transactions"
-msgstr "Buchungen OP Ausgleich"
+msgstr "Ausgeglichene Geschäftsvorfälle"
#. module: account
#: field:account.journal.view,columns_id:0
@@ -1617,7 +1627,7 @@ msgstr "Gruppen"
#: field:account.invoice,amount_untaxed:0
#: field:report.invoice.created,amount_untaxed:0
msgid "Untaxed"
-msgstr "Nettobetrag"
+msgstr "Nicht versteuert"
#. module: account
#: view:account.partner.reconcile.process:0
@@ -1627,7 +1637,7 @@ msgstr "Gehe zu nächstem Partner"
#. module: account
#: view:account.bank.statement:0
msgid "Search Bank Statements"
-msgstr "Suche Bankauszug"
+msgstr "Bankauszüge durchsuchen"
#. module: account
#: view:account.move.line:0
@@ -1644,13 +1654,13 @@ msgstr "Kreditorenkonto"
#: field:account.tax,account_paid_id:0
#: field:account.tax.template,account_paid_id:0
msgid "Refund Tax Account"
-msgstr "Gutschrift Steuerkonto"
+msgstr "Rückvergütung vom Steuerkonto"
#. module: account
#: view:account.bank.statement:0
#: field:account.bank.statement,line_ids:0
msgid "Statement lines"
-msgstr "Belegzeilen"
+msgstr "Belegpositionen"
#. module: account
#: model:ir.actions.act_window,help:account.action_bank_statement_tree
@@ -1662,13 +1672,14 @@ msgid ""
"the Payment column of a line, you can press F1 to open the reconciliation "
"form."
msgstr ""
-"Ein Bankauszug beinhaltet alle Zahlungsvorgänge einer bestimmten Periode auf "
-"einem Bankkonto, einer Kreditkarte oder anderen Konten für finanzielle "
-"Transaktionen. Der Eröffnungssaldo sowie der Endsaldo wird für jeden Auszug "
-"automatisch errechnet aus dem Kontosaldo zu Beginn der Buchung eines Auszugs "
-"und den gebuchten finanziellen Transaktionen. Wenn Sie sich in der Spalte "
-"Zahlungsausgleich einer Position in einem Bankauszugs befinden, können Sie "
-"über F1 in das Fenster für den Ausgleich von offenen Posten kommen."
+"Ein Bankauszug (Kontoauszug) beinhaltet alle Zahlungsvorgänge eines "
+"gegebenen Zeitraumes auf einem Bankkonto, einer Kreditkarte oder anderen "
+"Konten für finanzielle Transaktionen. Der Eröffnungssaldo sowie der Endsaldo "
+"wird für jeden Auszug automatisch errechnet aus dem Kontosaldo zu Beginn der "
+"Buchung eines Auszugs und den gebuchten finanziellen Transaktionen. Wenn Sie "
+"sich in der Spalte Zahlungsausgleich einer Position in einem Bankauszugs "
+"befinden, können Sie über F1 in das Fenster für den Ausgleich von offenen "
+"Posten kommen."
#. module: account
#: report:account.analytic.account.cost_ledger:0
@@ -1701,7 +1712,7 @@ msgstr "Rechnung"
#: model:process.node,note:account.process_node_analytic0
#: model:process.node,note:account.process_node_analyticcost0
msgid "Analytic costs to invoice"
-msgstr "Abrechenbare Analytische Kosten"
+msgstr "Anrechenbare Analytische Kosten"
#. module: account
#: view:ir.sequence:0
@@ -1711,12 +1722,12 @@ msgstr "Geschäftsjahr Sequenz"
#. module: account
#: field:wizard.multi.charts.accounts,seq_journal:0
msgid "Separated Journal Sequences"
-msgstr "Unterschiedliche Journal Sequenzen"
+msgstr "Unterteilte Folge von Journalen"
#. module: account
#: view:account.invoice:0
msgid "Responsible"
-msgstr "Mitarbeiter"
+msgstr "Verantwortlicher"
#. module: account
#: view:account.invoice.refund:0
@@ -1724,9 +1735,9 @@ msgid ""
"Cancel Invoice: Creates the refund invoice, validate and reconcile it to "
"cancel the current invoice."
msgstr ""
-"Storno der Rechnung: Erzeugt eine Gutschrift, bestätige diese und erzeuge "
-"einen Ausgleichsbuchung gegen die Ursprungsrechnung für den Ausgleich des "
-"existierenden offenen Postens."
+"Storno der Rechnung: Erzeugt eine Gutschrift, Sie bestätigen diese und "
+"erzeugen eine Ausgleichsbuchung gegen die Ursprungsrechnung für den "
+"Ausgleich des existierenden offenen Postens."
#. module: account
#: model:ir.ui.menu,name:account.periodical_processing_invoicing
@@ -1742,10 +1753,10 @@ msgstr "Unbekannter Partner"
#. module: account
#: field:account.tax.code,sum:0
msgid "Year Sum"
-msgstr "Summe Jahr"
+msgstr "Jahressumme"
#. module: account
-#: code:addons/account/account_invoice.py:1429
+#: code:addons/account/account_invoice.py:1431
#, python-format
msgid ""
"You selected an Unit of Measure which is not compatible with the product."
@@ -1801,7 +1812,7 @@ msgstr "Debitoren & Kreditoren"
#. module: account
#: model:ir.model,name:account.model_account_common_journal_report
msgid "Account Common Journal Report"
-msgstr "Standardauswertung von Journalen"
+msgstr "Auswertung von Sammel-Journalen"
#. module: account
#: selection:account.partner.balance,display_partner:0
@@ -1817,7 +1828,7 @@ msgstr "Analytischer Kontenplan"
#: view:account.analytic.line:0
#: view:analytic.entries.report:0
msgid "My Entries"
-msgstr "Meine Buchungen"
+msgstr "Eigene Buchungen"
#. module: account
#: report:account.overdue:0
@@ -1825,10 +1836,10 @@ msgid "Customer Ref:"
msgstr "Kundenreferenz:"
#. module: account
-#: code:addons/account/account_cash_statement.py:292
+#: code:addons/account/account_cash_statement.py:293
#, python-format
msgid "User %s does not have rights to access %s journal !"
-msgstr "Benutzer %s hat keinen Zugriff auf das %s Journal!"
+msgstr "Benutzer %s hat keinen Zugriff auf das Journal %s!"
#. module: account
#: help:account.period,special:0
@@ -1838,7 +1849,7 @@ msgstr "Diese Perioden können sich überschneiden"
#. module: account
#: model:process.node,name:account.process_node_draftstatement0
msgid "Draft statement"
-msgstr "Beleg Entwurf"
+msgstr "Belegentwurf"
#. module: account
#: view:account.tax:0
@@ -1873,7 +1884,7 @@ msgstr "Statistik Rechnungen"
#. module: account
#: model:ir.model,name:account.model_account_period_close
msgid "period close"
-msgstr "beende Periode"
+msgstr "Periodenabschluss"
#. module: account
#: view:account.installer:0
@@ -1923,7 +1934,7 @@ msgstr "Fehler! Sie können keine rekursiven Unternehmen erzeugen."
#. module: account
#: model:ir.actions.report.xml,name:account.account_journal_sale_purchase
msgid "Sale/Purchase Journal"
-msgstr "Verkauf/Einkauf Journal"
+msgstr "Verkaufs-/Einkaufsbericht"
#. module: account
#: view:account.analytic.account:0
@@ -1935,7 +1946,7 @@ msgstr "Analytisches Konto"
#, python-format
msgid "Please verify that an account is defined in the journal."
msgstr ""
-"Bitte stellen Sie sicher dass ein Konto für das Journal definiert und "
+"Bitte stellen Sie sicher, dass ein Konto für das Journal definiert und "
"hinterlegt wurde."
#. module: account
@@ -1953,7 +1964,7 @@ msgstr "Druck Finanzjournal"
#. module: account
#: model:ir.model,name:account.model_product_category
msgid "Product Category"
-msgstr "Produkt Kategorie"
+msgstr "Produktkategorie"
#. module: account
#: selection:account.account.type,report_type:0
@@ -1967,20 +1978,21 @@ msgid ""
"will be added, Loss : Amount will be deducted.), as calculated in Profit & "
"Loss Report"
msgstr ""
-"Dieses Konto wird automatisch als Saldo der G&V errechnet und in der Bilanz "
-"dargestellt."
+"Dieses Konto wird automatisch als Saldo der GuV errechnet und in der Bilanz "
+"dargestellt (Bei Gewinn wird hinzugerechnet, bei Verlust entsprechend "
+"abgezogen)."
#. 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 "Abgleich Fibukonten mit Zahlungseingängen"
+msgstr "Vergleich zwischen Fibu-Konten und Zahlungseingängen"
#. module: account
#: view:account.tax:0
#: view:account.tax.template:0
msgid "Tax Definition"
-msgstr "Steuer Definition"
+msgstr "Steuerdefinition"
#. module: account
#: help:wizard.multi.charts.accounts,seq_journal:0
@@ -1988,8 +2000,9 @@ msgid ""
"Check this box if you want to use a different sequence for each created "
"journal. Otherwise, all will use the same sequence."
msgstr ""
-"Hake diese Box an falls Sie unterschiedliche Sequenzen für jedes neue "
-"Journal haben möchten. Ansonsten wird immer das gleiche Journal verwendet."
+"Diese Box anwählen, falls Sie unterschiedliche Sequenzen für jedes neue "
+"Journal verwenden möchten. Ansonsten wird immer die gleiche Folgen-"
+"Nummerierung verwendet."
#. module: account
#: help:account.partner.ledger,amount_currency:0
@@ -1998,8 +2011,8 @@ msgid ""
"It adds the currency column if the currency is different then the company "
"currency"
msgstr ""
-"Zusätzliche Anzeige der Währung, wenn die Währung anders ist als die "
-"eingestellte Währung des Unternehmens"
+"Zusätzliche Anzeige der Währung, wenn die Währung sich von der eingestellten "
+"Währung des Unternehmens unterscheidet"
#. module: account
#: help:account.journal,allow_date:0
@@ -2014,7 +2027,7 @@ msgstr ""
#: code:addons/account/account_invoice.py:73
#, python-format
msgid "You must define an analytic journal of type '%s'!"
-msgstr "Sie müssen eine Analyse Journal vom Typ '%s' definieren"
+msgstr "Sie müssen eine Analysebericht vom Typ '%s' definieren!"
#. module: account
#: field:account.installer,config_logo:0
@@ -2029,9 +2042,10 @@ msgid ""
"currency. You should remove the secondary currency on the account or select "
"a multi-currency view on the journal."
msgstr ""
-"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."
+"Das ausgewählte Konto Ihrer Buchung erzwingt die Angabe einer "
+"Alternativwährung. Sie müssen die Verwendung einer Alternativwährung in den "
+"Einstellungen des Kontos ausschalten oder aber Mehrwährungsfähigkeit im "
+"Bericht einschalten."
#. module: account
#: model:ir.actions.act_window,help:account.action_account_financial_report_tree
@@ -2124,7 +2138,7 @@ msgstr "Januar"
#. module: account
#: view:account.journal:0
msgid "Validations"
-msgstr "Prüfvorgänge"
+msgstr "Prüfungen"
#. module: account
#: view:account.entries.report:0
@@ -2142,7 +2156,7 @@ msgid ""
"Invalid period ! Some periods overlap or the date period is not in the scope "
"of the fiscal year. "
msgstr ""
-"Ungültige Periode! Diese überlappen oder liegen außerhalb des "
+"Ungültige Periode! Manche überlappen sich oder liegen außerhalb des "
"Geschäftsjahres "
#. module: account
@@ -2157,10 +2171,10 @@ msgstr "Sie müssen ein Analyse-Journal für das Journal '%s' deinieren!"
#: selection:account.invoice.report,state:0
#: selection:report.invoice.created,state:0
msgid "Pro-forma"
-msgstr "Pro-Forma"
+msgstr "Proforma"
#. module: account
-#: code:addons/account/account.py:1461
+#: code:addons/account/account.py:1478
#, python-format
msgid ""
"There is no default default debit account defined \n"
@@ -2189,10 +2203,10 @@ msgstr ""
#. module: account
#: view:account.chart.template:0
msgid "Search Chart of Account Templates"
-msgstr "Suche Kontenplan Vorlage"
+msgstr "Durchsuche Kontenplan-Vorlagen"
#. module: account
-#: code:addons/account/account_move_line.py:1277
+#: code:addons/account/account_move_line.py:1292
#, python-format
msgid ""
"Can not create an automatic sequence for this piece!\n"
@@ -2249,7 +2263,7 @@ msgid "Description"
msgstr "Buchungstext"
#. module: account
-#: code:addons/account/account.py:3119
+#: code:addons/account/account.py:3136
#, python-format
msgid "ECNJ"
msgstr "GSE"
@@ -2258,7 +2272,7 @@ msgstr "GSE"
#: view:account.subscription:0
#: selection:account.subscription,state:0
msgid "Running"
-msgstr "In Weiterbearbeitung"
+msgstr "Laufend"
#. module: account
#: view:account.chart.template:0
@@ -2268,7 +2282,7 @@ msgid "Income Account"
msgstr "Erlöskonto"
#. module: account
-#: code:addons/account/account_invoice.py:370
+#: code:addons/account/account_invoice.py:379
#, python-format
msgid "There is no Accounting Journal of type Sale/Purchase defined!"
msgstr ""
@@ -2300,16 +2314,17 @@ msgstr "Änderung zu"
#. module: account
#: view:account.entries.report:0
msgid "# of Products Qty "
-msgstr "# Menge v. Produkt "
+msgstr "Menge des Produkts Anz. "
#. module: account
#: model:ir.model,name:account.model_product_template
msgid "Product Template"
-msgstr "Vorlage f. Produkte"
+msgstr "Produktvorlage"
#. module: account
#: report:account.account.balance:0
#: field:account.aged.trial.balance,fiscalyear_id:0
+#: report:account.aged_trial_balance:0
#: field:account.balance.report,fiscalyear_id:0
#: report:account.central.journal:0
#: field:account.central.journal,fiscalyear_id:0
@@ -2319,6 +2334,7 @@ msgstr "Vorlage f. Produkte"
#: field:account.common.report,fiscalyear_id:0
#: view:account.entries.report:0
#: field:account.entries.report,fiscalyear_id:0
+#: report:account.financial.report:0
#: field:account.fiscalyear,name:0
#: report:account.general.journal:0
#: field:account.general.journal,fiscalyear_id:0
@@ -2366,10 +2382,10 @@ msgstr "Lasse leer für alle offenen Geschäftsjahre"
#. module: account
#: field:account.invoice.report,account_line_id:0
msgid "Account Line"
-msgstr "Buchungszeile"
+msgstr "Kontobuchung"
#. module: account
-#: code:addons/account/account.py:1468
+#: code:addons/account/account.py:1485
#, python-format
msgid ""
"There is no default default credit account defined \n"
@@ -2405,7 +2421,7 @@ msgid "Main Sequence"
msgstr "Haupt Sequenz"
#. module: account
-#: code:addons/account/account_bank_statement.py:402
+#: code:addons/account/account_bank_statement.py:403
#, python-format
msgid ""
"In order to delete a bank statement, you must first cancel it to delete "
@@ -2430,7 +2446,7 @@ msgstr "Zahlungsbedingung"
#: 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 "Steuerzuordnung"
+msgstr "Bilanzpositionen"
#. module: account
#: constraint:account.account:0
@@ -2467,7 +2483,7 @@ msgstr "Offen"
#: model:process.node,note:account.process_node_draftinvoices0
#: model:process.node,note:account.process_node_supplierdraftinvoices0
msgid "Draft state of an invoice"
-msgstr "Entwurf Status bei Rechnung"
+msgstr "Entwurfsstatus einer Rechnung"
#. module: account
#: view:account.partner.reconcile.process:0
@@ -2478,10 +2494,10 @@ msgstr "Offene Posten Ausgleich bei Partnern"
#: field:account.tax,tax_code_id:0
#: view:account.tax.code:0
msgid "Account Tax Code"
-msgstr "Umsatzsteuer"
+msgstr "Steuerschlüssel"
#. module: account
-#: code:addons/account/account_invoice.py:572
+#: code:addons/account/account_invoice.py:581
#, python-format
msgid ""
"Can't find any account journal of %s type for this company.\n"
@@ -2498,7 +2514,7 @@ msgstr ""
#: 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 "30% Anzahlung, Rest in 30 Tagen"
+msgstr "30% Anzahlung, Rest innerhalb von 30 Tagen"
#. module: account
#: view:account.entries.report:0
@@ -2546,13 +2562,13 @@ msgstr ""
#. module: account
#: selection:account.move.line,centralisation:0
msgid "Debit Centralisation"
-msgstr "Zentrales Gegenkonto"
+msgstr "Zentrales Soll-Gegenkonto"
#. module: account
#: view:account.invoice.confirm:0
#: model:ir.actions.act_window,name:account.action_account_invoice_confirm
msgid "Confirm Draft Invoices"
-msgstr "Bestätige Rechnung"
+msgstr "Bestätige Rechnungsentwurf"
#. module: account
#: field:account.entries.report,day:0
@@ -2574,7 +2590,7 @@ msgid "Account Model Entries"
msgstr "Buchungsvorlage"
#. module: account
-#: code:addons/account/account.py:3117
+#: code:addons/account/account.py:3134
#, python-format
msgid "EXJ"
msgstr "EK"
@@ -2582,7 +2598,7 @@ msgstr "EK"
#. module: account
#: field:product.template,supplier_taxes_id:0
msgid "Supplier Taxes"
-msgstr "Steuern Einkauf"
+msgstr "Steuern des Einkaufs (Vorsteuer)"
#. module: account
#: view:account.entries.report:0
@@ -2611,7 +2627,7 @@ msgstr "Periode auswählen"
#. module: account
#: model:ir.ui.menu,name:account.menu_account_pp_statements
msgid "Statements"
-msgstr "Abstimmung von Konten"
+msgstr "Abstimmung von Konten (Ausweis)"
#. module: account
#: report:account.analytic.account.journal:0
@@ -2632,13 +2648,13 @@ msgstr ""
msgid ""
"This report gives you an overview of the situation of a specific journal"
msgstr ""
-"Diese Auswertung ermöglicht einen Überblick über den Saldo das spezifizierte "
+"Diese Auswertung ermöglicht einen Überblick über den Saldo des angegebenen "
"Journals."
#. module: account
#: model:ir.model,name:account.model_account_move_line_reconcile_writeoff
msgid "Account move line reconcile (writeoff)"
-msgstr "OP-Ausgleich (mit Differenz)"
+msgstr "OP-Ausgleich (Abschreibung)"
#. module: account
#: model:account.account.type,name:account.account_type_tax
@@ -2673,10 +2689,10 @@ msgid "Accounts"
msgstr "Finanzkonten"
#. module: account
-#: code:addons/account/account_invoice.py:369
+#: code:addons/account/account_invoice.py:378
#, python-format
msgid "Configuration Error!"
-msgstr "Konfigurationsfehler !"
+msgstr "Konfigurationsfehler!"
#. module: account
#: field:account.invoice.report,price_average:0
@@ -2692,7 +2708,7 @@ msgstr "Datum:"
#: report:account.journal.period.print:0
#: report:account.journal.period.print.sale.purchase:0
msgid "Label"
-msgstr "Produktbeschriftung"
+msgstr "Etikett"
#. module: account
#: view:account.tax:0
@@ -2746,7 +2762,7 @@ msgstr "Automatischer Kontenausgleich"
#. module: account
#: field:account.invoice,reconciled:0
msgid "Paid/Reconciled"
-msgstr "Bezahlt / OP Ausgleich"
+msgstr "Bezahlt/Beglichen"
#. module: account
#: field:account.tax,ref_base_code_id:0
@@ -2777,7 +2793,7 @@ msgstr "Übergeordnete Kontenplan Vorlage"
#: field:account.tax,parent_id:0
#: field:account.tax.template,parent_id:0
msgid "Parent Tax Account"
-msgstr "Oberkonto Steuer"
+msgstr "Übergeordnetes Steuerkonto"
#. module: account
#: code:addons/account/wizard/account_change_currency.py:59
@@ -2796,6 +2812,7 @@ msgstr ""
#. module: account
#: view:account.aged.trial.balance:0
#: model:ir.actions.act_window,name:account.action_account_aged_balance_view
+#: model:ir.actions.report.xml,name:account.account_aged_partner_balance
#: model:ir.ui.menu,name:account.menu_aged_trial_balance
msgid "Aged Partner Balance"
msgstr "Saldo Partner nach Alter"
@@ -2845,21 +2862,21 @@ msgstr "Konfigurieren Sie Ihren Kontenplan"
#. module: account
#: view:account.use.model:0
msgid "This wizard will create recurring accounting entries"
-msgstr "Diese Assistent erzeugt wiederkehrende Buchungen."
+msgstr "Dieser Assistent erzeugt wiederkehrende Buchungen."
#. module: account
-#: code:addons/account/account.py:1321
+#: code:addons/account/account.py:1329
#, python-format
msgid "No sequence defined on the journal !"
-msgstr "Keine Sequenz für dieses Journal definiert !"
+msgstr "Keine Sequenz für dieses Journal definiert!"
#. module: account
-#: code:addons/account/account.py:2268
-#: code:addons/account/account_invoice.py:688
+#: code:addons/account/account.py:2285
+#: code:addons/account/account_invoice.py:697
#: code:addons/account/account_move_line.py:173
#, python-format
msgid "You have to define an analytic journal on the '%s' journal!"
-msgstr "Sie sollten ein analytisches Journal im '%s' Journal definieren!"
+msgstr "Sie müssen ein analytisches Journal im '%s' Journal definieren!"
#. module: account
#: code:addons/account/account.py:407
@@ -2868,7 +2885,7 @@ msgid ""
"You need an Opening journal with centralisation checked to set the initial "
"balance!"
msgstr ""
-"Für die Eröffnungsbilanz benötigen sie ein Eröffnungsjournal mit "
+"Für die Eröffnungsbilanz benötigen Sie ein Eröffnungsjournal mit "
"Zentralisierung."
#. module: account
@@ -2964,10 +2981,10 @@ msgstr ""
#. module: account
#: field:account.invoice.tax,base_amount:0
msgid "Base Code Amount"
-msgstr "Steuergrundlage Betrag"
+msgstr "Bemessungsgrundlage Betrag"
#. module: account
-#: code:addons/account/account_invoice.py:392
+#: code:addons/account/account_invoice.py:401
#, python-format
msgid ""
"You can not delete an invoice which is open or paid. We suggest you to "
@@ -2982,7 +2999,7 @@ msgid "Default Sale Tax"
msgstr "Standard Steuer Verkauf"
#. module: account
-#: code:addons/account/account_invoice.py:1013
+#: code:addons/account/account_invoice.py:1025
#, python-format
msgid "Invoice '%s' is validated."
msgstr "Rechnung '%s' ist validiert."
@@ -3001,7 +3018,7 @@ msgstr ""
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_accounting
msgid "Financial Accounting"
-msgstr "Finanzen"
+msgstr "Finanzbuchhaltung"
#. module: account
#: model:ir.ui.menu,name:account.menu_account_report_pl
@@ -3020,16 +3037,16 @@ msgstr "Gewinn und Verlust"
#: model:ir.model,name:account.model_account_fiscal_position
#: field:res.partner,property_account_position:0
msgid "Fiscal Position"
-msgstr "Steuerzuordnung"
+msgstr "Bilanz"
#. module: account
-#: code:addons/account/account_invoice.py:735
+#: code:addons/account/account_invoice.py:744
#, python-format
msgid ""
"Tax base different!\n"
"Click on compute to update the tax base."
msgstr ""
-"Die Steuerbasis stimmt nicht!\n"
+"Die Steuergrundlage ist geändert!\n"
"Drücken Sie Berechnen!"
#. module: account
@@ -3068,12 +3085,12 @@ msgstr "Verantwortlicher Mitarbeiter für dieses Journal"
#. module: account
#: view:account.period:0
msgid "Search Period"
-msgstr "Suche Periode"
+msgstr "Durchsuche Periode"
#. module: account
#: view:account.change.currency:0
msgid "Invoice Currency"
-msgstr "Währung"
+msgstr "Rechnungswährung"
#. module: account
#: field:accounting.report,account_report_id:0
@@ -3089,7 +3106,7 @@ msgstr "Vereinbarungen"
#. module: account
#: field:account.bank.statement,total_entry_encoding:0
msgid "Cash Transaction"
-msgstr "Barkasse Transaktionen"
+msgstr "Bar-Geschäftsvorfälle"
#. module: account
#: view:res.partner:0
@@ -3099,7 +3116,7 @@ msgstr "Bankkonto"
#. module: account
#: field:account.chart.template,tax_template_ids:0
msgid "Tax Template List"
-msgstr "Umsatzsteuer Vorlagenliste"
+msgstr "Steuer-Vorlagenliste"
#. module: account
#: model:ir.ui.menu,name:account.menu_account_print_sale_purchase_journal
@@ -3119,7 +3136,7 @@ msgstr ""
"wird. In den meisten Ländern ist \"Durchhschnitt\" die legale Methode, aber "
"nur wenige Systeme können dies. Für Importe von anderen Systemen muss daher "
"ggf. der Tageskurs verwendet werden. Eingehende Transkationen verwenden "
-"jedenfalls den Tageskurs."
+"grundsätzlich den Tageskurs."
#. module: account
#: help:account.chart.template,code_digits:0
@@ -3130,12 +3147,12 @@ msgstr "Anzahl Stellen für Konto"
#. module: account
#: field:account.payment.term.line,name:0
msgid "Line Name"
-msgstr "Zeile Bezeichnung"
+msgstr "Zeilenbezeichnung"
#. module: account
#: view:account.fiscalyear:0
msgid "Search Fiscalyear"
-msgstr "Suche Geschäftsjahr"
+msgstr "Durchsuche Geschäftsjahr"
#. module: account
#: selection:account.tax,applicable_type:0
@@ -3163,7 +3180,7 @@ msgstr "Abschreibungskonto"
#: view:account.subscription:0
#: field:account.subscription,model_id:0
msgid "Model"
-msgstr "Standard"
+msgstr "Modell"
#. module: account
#: help:account.invoice.tax,base_code_id:0
@@ -3179,7 +3196,7 @@ msgid "View"
msgstr "Ansicht"
#. module: account
-#: code:addons/account/account.py:3363
+#: code:addons/account/account.py:3380
#: code:addons/account/account_bank.py:90
#, python-format
msgid "BNK"
@@ -3241,7 +3258,7 @@ msgid ""
msgstr ""
"Der Assistent wird alle Buchungen für eine bestimmtes Journal innerhalb "
"einer bestimmten Periode buchen. Sobald die Buchungen erzeugt wurden, können "
-"Sie nicht mehr vorher abgeändert werden."
+"Sie nicht mehr abgeändert werden."
#. module: account
#: model:ir.actions.act_window,name:account.action_account_chart_template_form
@@ -3388,17 +3405,17 @@ msgid "Starting Balance"
msgstr "Anfangssaldo"
#. module: account
-#: code:addons/account/account_invoice.py:1332
+#: code:addons/account/account_invoice.py:1345
#, python-format
msgid "No Partner Defined !"
-msgstr "Kein Partner definiert!"
+msgstr "Kein Partner festgelegt!"
#. 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 "Beende Periode"
+msgstr "Periode abschließen"
#. module: account
#: field:account.financial.report,display_detail:0
@@ -3421,15 +3438,15 @@ msgid ""
"The amount expressed in the related account currency if not equal to the "
"company one."
msgstr ""
-"Der Betrag in einer anderen Währung, insofern normalerweise die "
-"Unternehmenswährung eine andere ist."
+"Der Betrag in der Währung des Kontos angegeben, sofern diese sich von der "
+"Unternehmenswährung unterscheidet."
#. 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 "Ausgleich Offene Posten zurücksetzen"
+msgstr "OP-Ausgleich stornieren"
#. module: account
#: field:account.tax.code,notprintable:0
@@ -3444,7 +3461,7 @@ msgid "Chart of Tax"
msgstr "Steuerkontenplan"
#. module: account
-#: code:addons/account/account_cash_statement.py:314
+#: code:addons/account/account_cash_statement.py:315
#, python-format
msgid "The closing balance should be the same than the computed balance!"
msgstr "Der Endsaldo muss mit dem errechneten übereinstimmen!"
@@ -3452,7 +3469,7 @@ msgstr "Der Endsaldo muss mit dem errechneten übereinstimmen!"
#. module: account
#: view:account.journal:0
msgid "Search Account Journal"
-msgstr "Suche Buchungsjournal"
+msgstr "Durchsuche Buchungsjournal"
#. module: account
#: model:ir.actions.act_window,name:account.action_invoice_tree_pending_invoice
@@ -3504,13 +3521,13 @@ msgstr "Suche Buchung"
#: field:account.tax.code,name:0
#: field:account.tax.code.template,name:0
msgid "Tax Case Name"
-msgstr "Umsatzsteuervorgang"
+msgstr "Versteuerungsbezeichnung"
#. module: account
#: report:account.invoice:0
#: model:process.node,name:account.process_node_draftinvoices0
msgid "Draft Invoice"
-msgstr "Entwurf Rechnung"
+msgstr "Rechnungsentwurf"
#. module: account
#: code:addons/account/wizard/account_invoice_state.py:68
@@ -3519,8 +3536,8 @@ msgid ""
"Selected Invoice(s) cannot be cancelled as they are already in 'Cancelled' "
"or 'Done' state!"
msgstr ""
-"Ausgewählte Rechnung(en) kann nicht geändert, das Sie bereits im "
-"'Abgebrochen' oder 'Erledigt' Status ist."
+"Ausgewählte Rechnung(en) kann/können nicht geändert, das Sie bereits im "
+"'Abgebrochen' oder 'Erledigt' Status ist/sind."
#. module: account
#: view:account.invoice.line:0
@@ -3529,8 +3546,9 @@ msgstr "Menge:"
#. module: account
#: field:account.aged.trial.balance,period_length:0
+#: report:account.aged_trial_balance:0
msgid "Period Length (days)"
-msgstr "Perioden Länge (Tage)"
+msgstr "Periodendauer (Tage)"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_print_sale_purchase_journal
@@ -3546,28 +3564,28 @@ msgstr "Rechnungsstatus"
#: view:account.invoice.report:0
#: field:account.invoice.report,categ_id:0
msgid "Category of Product"
-msgstr "Produktkategorien"
+msgstr "Produktkategorie"
#. module: account
#: view:account.addtmpl.wizard:0
#: model:ir.actions.act_window,name:account.action_account_addtmpl_wizard_form
msgid "Create Account"
-msgstr "Erstelle Konto"
+msgstr "Konto anlegen"
#. module: account
#: model:ir.model,name:account.model_report_account_type_sales
msgid "Report of the Sales by Account Type"
-msgstr "Auswertung Verkauf nach Kontentyp"
+msgstr "Verkaufsauswertung nach Kontentyp"
#. module: account
#: view:account.move.line:0
msgid "Unreconciled Journal Items"
-msgstr "Nicht ausgeglichen Buchungen"
+msgstr "Nicht ausgeglichene Buchungen"
#. module: account
#: sql_constraint:res.currency:0
msgid "The currency code must be unique per company!"
-msgstr "Der Währungscode muss je Unternehmen eindeutig sein"
+msgstr "Der Währungsschlüssel muss je Unternehmen eindeutig sein"
#. module: account
#: selection:account.account.type,close_method:0
@@ -3575,7 +3593,7 @@ msgid "Detail"
msgstr "Details"
#. module: account
-#: code:addons/account/account_invoice.py:839
+#: code:addons/account/account_invoice.py:850
#, python-format
msgid ""
"Can not create the invoice !\n"
@@ -3592,12 +3610,19 @@ msgstr ""
#. module: account
#: report:account.invoice:0
msgid "VAT :"
-msgstr "UST:"
+msgstr "USt.:"
#. module: account
+#: report:account.account.balance:0
+#: report:account.aged_trial_balance:0
#: report:account.central.journal:0
+#: report:account.financial.report:0
+#: report:account.general.journal:0
#: report:account.general.ledger:0
+#: report:account.general.ledger_landscape:0
#: field:account.installer,charts:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
#: report:account.partner.balance:0
#: report:account.third_party_ledger:0
#: report:account.third_party_ledger_other:0
@@ -3620,11 +3645,11 @@ msgid "Centralised counterpart"
msgstr "Zentralisierung Gegenkonto"
#. module: account
-#: code:addons/account/account_move_line.py:584
+#: code:addons/account/account_move_line.py:575
#, python-format
msgid "You can not create journal items on a \"view\" account %s %s"
msgstr ""
-"Sie dürfen keine Buchungen vom Typ \"Sicht\" für das Konto erzeugen %s %s"
+"Konten vom Typ \"Sicht\" %s %s können für Buchungen nicht verwendet werden"
#. module: account
#: model:ir.model,name:account.model_account_partner_reconcile_process
@@ -3639,7 +3664,8 @@ msgstr "2"
#. module: account
#: view:account.chart:0
msgid "(If you do not select Fiscal year it will take all open fiscal years)"
-msgstr "(Wenn kein Geschäftsjahr ausgewählt wird, werden alle genommen)"
+msgstr ""
+"(Wenn kein Geschäftsjahr ausgewählt wird, werden alle laufenden genommen)"
#. module: account
#: selection:account.aged.trial.balance,filter:0
@@ -3673,10 +3699,15 @@ msgstr "(Wenn kein Geschäftsjahr ausgewählt wird, werden alle genommen)"
#: 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
+#: code:addons/account/report/account_journal.py:195
+#: code:addons/account/report/account_journal.py:198
+#: code:addons/account/report/common_report_header.py:97
#: field:analytic.entries.report,date:0
+#, python-format
msgid "Date"
msgstr "Datum"
@@ -3707,7 +3738,7 @@ msgid "Chart of Accounts Template"
msgstr "Vorlage Kontenplan"
#. module: account
-#: code:addons/account/account.py:2280
+#: code:addons/account/account.py:2297
#, python-format
msgid ""
"Maturity date of entry line generated by model line '%s' of model '%s' is "
@@ -3719,7 +3750,7 @@ msgstr ""
"Bitte ordnen Sie dem Partner eine Zahlungsbedingungen zu."
#. module: account
-#: code:addons/account/account_move_line.py:837
+#: code:addons/account/account_move_line.py:846
#, python-format
msgid "Some entries are already reconciled !"
msgstr "Einige Einträge wurden bereits ausgeglichen!"
@@ -3750,6 +3781,8 @@ msgstr "Finanzbudgets"
#: selection:account.vat.declaration,filter:0
#: selection:accounting.report,filter:0
#: selection:accounting.report,filter_cmp:0
+#: code:addons/account/report/common_report_header.py:100
+#, python-format
msgid "No Filters"
msgstr "Keine Filter"
@@ -3783,12 +3816,12 @@ msgstr "Anzuwendender Typ (if type=code)"
#: view:account.invoice.report:0
#: field:account.invoice.report,product_qty:0
msgid "Qty"
-msgstr "Menge"
+msgstr "Anz"
#. module: account
#: field:account.invoice.report,address_contact_id:0
msgid "Contact Address Name"
-msgstr "Partner Kontakt Name"
+msgstr "Partner Kontaktperson"
#. module: account
#: field:account.move.line,blocked:0
@@ -3798,7 +3831,7 @@ msgstr "Rechtsstreit"
#. module: account
#: view:account.analytic.line:0
msgid "Search Analytic Lines"
-msgstr "Suche Analytische Buchungen"
+msgstr "Durchsuche Analytische Buchungen"
#. module: account
#: field:res.partner,property_account_payable:0
@@ -3835,7 +3868,7 @@ msgid "Analytic Items"
msgstr "Analytische Buchungen"
#. module: account
-#: code:addons/account/account_move_line.py:1153
+#: code:addons/account/account_move_line.py:1168
#, python-format
msgid "Unable to change tax !"
msgstr "Die Steuer kann nicht geändert werden!"
@@ -3843,12 +3876,12 @@ msgstr "Die Steuer kann nicht geändert werden!"
#. module: account
#: field:analytic.entries.report,nbr:0
msgid "#Entries"
-msgstr "# Buchungen"
+msgstr "Anz. Buchungen"
#. module: account
#: selection:account.invoice.refund,filter_refund:0
msgid "Create a draft Refund"
-msgstr "Erzeuge Gutschrift Entwurf"
+msgstr "Erzeuge Gutschriftsentwurf"
#. module: account
#: view:account.state.open:0
@@ -3858,7 +3891,7 @@ msgstr "Offene Rechnung"
#. module: account
#: field:account.invoice.tax,factor_tax:0
msgid "Multipication factor Tax code"
-msgstr "Faktor Steuerberechnung"
+msgstr "Faktor für Steuerberechnung"
#. module: account
#: view:account.fiscal.position:0
@@ -3866,7 +3899,7 @@ msgid "Mapping"
msgstr "Steuer Umschlüsselung"
#. module: account
-#: code:addons/account/account_invoice.py:921
+#: code:addons/account/account_invoice.py:932
#, python-format
msgid ""
"You cannot create an invoice on a centralised journal. Uncheck the "
@@ -3882,6 +3915,7 @@ msgstr ""
#: report:account.analytic.account.inverted.balance:0
#: field:account.bank.statement,name:0
#: field:account.chart.template,name:0
+#: report:account.financial.report:0
#: field:account.model.line,name:0
#: field:account.move.line,name:0
#: field:account.move.reconcile,name:0
@@ -3895,7 +3929,7 @@ msgid "Account Aged Trial balance Report"
msgstr "Auswertung Altersstruktur Forderungen"
#. module: account
-#: code:addons/account/account_move_line.py:591
+#: code:addons/account/account_move_line.py:582
#, python-format
msgid "You can not create journal items on a closed account %s %s"
msgstr ""
@@ -3943,7 +3977,7 @@ msgid ""
"same company."
msgstr ""
"Das gewählte Geschäftsjahr, die Periode und das Konto müssen zum selben "
-"UNternehmen gehören."
+"Unternehmen gehören."
#. module: account
#: model:ir.actions.todo.category,name:account.category_accounting_configuration
@@ -3959,7 +3993,7 @@ msgstr "Finanzen"
#. module: account
#: view:account.entries.report:0
msgid "Journal Entries with period in current year"
-msgstr "Jaurnalbuchungen des laufenden Jahres"
+msgstr "Journalbuchungen des laufenden Jahres"
#. module: account
#: help:account.central.journal,amount_currency:0
@@ -3970,7 +4004,7 @@ msgid ""
"Print Report with the currency column if the currency is different then the "
"company currency"
msgstr ""
-"Drucke Auswertung / Report mit der Spalte Währung für den Fall dass sich die "
+"Drucke Auswertung/Bericht mit der Spalte Währung für den Fall, dass sich die "
"Währung der Rechnung von der Standardwährung des Unternehmens unterscheidet"
#. module: account
@@ -3979,7 +4013,7 @@ msgid ""
"Value of Loss or Gain due to changes in exchange rate when doing multi-"
"currency transactions."
msgstr ""
-"Währungsgewinne oder Verluste im Zuge von Transaktionen mit mehreren "
+"Währungsgewinne oder Verluste im Zuge von Geschäftsvorfällen mit mehreren "
"Währungen"
#. module: account
@@ -4071,7 +4105,7 @@ msgstr ""
#. module: account
#: field:account.chart,period_from:0
msgid "Start period"
-msgstr "Beginn der Periode"
+msgstr "Periodenbeginn"
#. module: account
#: field:account.tax,name:0
@@ -4098,23 +4132,23 @@ msgid ""
"If the active field is set to False, it will allow you to hide the account "
"without removing it."
msgstr ""
-"Falls dieses Feld aktiviert wird, kann die Anzeige für das Finanzkonto "
-"versteckt werden."
+"Mit Aktivierung wird die Anzeige für das Finanzkonto verborgen werden. ohne "
+"es löschen zu müssen."
#. module: account
#: view:account.move.line:0
msgid "Posted Journal Items"
-msgstr "Verbuchte Buchungen"
+msgstr "Quittierte Buchungen"
#. module: account
#: view:account.tax.template:0
msgid "Search Tax Templates"
-msgstr "Suche Steuervorlage"
+msgstr "Durchsuche Steuervorlagen"
#. module: account
#: model:ir.ui.menu,name:account.periodical_processing_journal_entries_validation
msgid "Draft Entries"
-msgstr "Buchungen im Entwurf"
+msgstr "Buchungsentwürfe"
#. module: account
#: view:account.payment.term.line:0
@@ -4135,7 +4169,7 @@ msgstr "Tastenkombination (Shortcut)"
#. module: account
#: constraint:account.fiscalyear:0
msgid "Error! The start date of the fiscal year must be before his end date."
-msgstr "Fehler! Der Beginn des Jahres muss vor dem Ende liegen."
+msgstr "Fehler! Der Beginn des Geschäftsjahres muss vor dem Ende liegen."
#. module: account
#: view:account.account:0
@@ -4156,7 +4190,7 @@ msgstr "Kontoart"
#. module: account
#: view:res.partner:0
msgid "Bank Account Owner"
-msgstr "Bankkonto Eigentümer"
+msgstr "Bankkonto-Eigentümer"
#. module: account
#: report:account.account.balance:0
@@ -4194,8 +4228,8 @@ msgid ""
"You haven't supplied enough argument to compute the initial balance, please "
"select a period and journal in the context."
msgstr ""
-"Sie haben nicht genug Angaben für die Berrechnung des Anfangssaldos gemacht. "
-"Wählen Sie bitte eine Periode und ein Journal!"
+"Sie haben unzureichende Angaben für die Berechnung des Anfangssaldos "
+"gemacht. Wählen Sie bitte eine Periode und ein Journal!"
#. module: account
#: model:process.transition,note:account.process_transition_supplieranalyticcost0
@@ -4216,12 +4250,12 @@ msgstr "Kassenabschluss"
#: view:account.invoice.report:0
#: field:account.invoice.report,due_delay:0
msgid "Avg. Due Delay"
-msgstr "Durch. Zahlungsverzug"
+msgstr "Durchschnittl. Zahlungsverzug"
#. module: account
#: view:account.entries.report:0
msgid "Acc.Type"
-msgstr "Kontotyp"
+msgstr "Kontoart"
#. module: account
#: field:account.entries.report,month:0
@@ -4235,16 +4269,16 @@ msgid "Month"
msgstr "Monat"
#. module: account
-#: code:addons/account/account_move_line.py:1216
+#: code:addons/account/account_move_line.py:1231
#, python-format
msgid ""
"You can not 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 ""
-"Sie dürfen diese Änderung nicht in verbuchten Buchungenmachen! \n"
+"Sie dürfen diese Änderung nicht in quittierten Buchungen machen! \n"
"Sei können nur einige buchungstechnisch nicht relevante Felder ändern oder "
-"Sie müssen die Buchung vorher auf unbestätigt setzen.\n"
+"Sie müssen die Buchung vorher auf unquittiert zurücksetzen.\n"
"%s"
#. module: account
@@ -4255,7 +4289,7 @@ msgstr "PayPal Konto"
#. module: account
#: field:account.invoice.report,uom_name:0
msgid "Reference UoM"
-msgstr "Referenz ME"
+msgstr "Bezugs-ME"
#. module: account
#: field:account.account,note:0
@@ -4278,7 +4312,7 @@ msgstr "Fällige Analytische Konten"
#: code:addons/account/account.py:184
#, python-format
msgid "Balance Sheet (Liability account)"
-msgstr "Bilanz (Verbindlichkeit)"
+msgstr "Bilanz (Verbindlichkeiten)"
#. module: account
#: help:account.invoice,date_invoice:0
@@ -4293,10 +4327,10 @@ msgstr "Steuerbuchungen"
#. module: account
#: field:account.tax,base_code_id:0
msgid "Account Base Code"
-msgstr "Steuergrundlage"
+msgstr "Bemessungsgrundlage (Steuern & Gebühren)"
#. module: account
-#: code:addons/account/account_analytic_line.py:93
+#: code:addons/account/account_analytic_line.py:91
#, python-format
msgid "There is no expense account defined for this product: \"%s\" (id:%d)"
msgstr ""
@@ -4306,7 +4340,7 @@ msgstr ""
#. module: account
#: view:res.partner:0
msgid "Customer Accounting Properties"
-msgstr "Debitoren Eigenschaften"
+msgstr "Debitoren-Eigenschaften"
#. module: account
#: help:res.company,paypal_account:0
@@ -4381,7 +4415,8 @@ msgstr "Periodische Buchungen"
#. module: account
#: constraint:account.analytic.line:0
msgid "You can not create analytic line on view account."
-msgstr "Für Sichten dürfen keine Analysezeilen erzeugt werden"
+msgstr ""
+"Sicht-Konten dürfen (auch für) Analysebuchungen nicht bebucht werden."
#. module: account
#: help:account.move.line,state:0
@@ -4389,8 +4424,8 @@ msgid ""
"When new move line is created the state will be 'Draft'.\n"
"* When all the payments are done it will be in 'Valid' state."
msgstr ""
-"Wenn die Buchung erzeugt wird, ist der Status 'Entwurf'.\n"
-"* Wenn alle Zahlungen erfolgt sind, wechselt der Status direkt zu 'Gebucht'."
+"Wenn die Buchung angelegt wird, ist der Status 'Entwurf'.\n"
+"* Wenn alle Zahlungen erfolgt sind, wechselt der Status auf 'Gebucht'."
#. module: account
#: field:account.journal,view_id:0
@@ -4516,7 +4551,7 @@ msgid "Allow Reconciliation"
msgstr "Erlaube Ausgleich"
#. module: account
-#: code:addons/account/account.py:1077
+#: code:addons/account/account.py:1082
#, python-format
msgid ""
"You can not modify company of this period as some journal items exists."
@@ -4532,27 +4567,27 @@ msgstr "Auswertungen Analytisches Konto"
#. module: account
#: report:account.vat.declaration:0
msgid "Based On"
-msgstr "Basiert auf"
+msgstr "Basierend auf"
#. module: account
#: field:account.tax,price_include:0
#: field:account.tax.template,price_include:0
msgid "Tax Included in Price"
-msgstr "Steuer Inklusive"
+msgstr "Preis inklusive Steuer"
#. module: account
#: model:ir.model,name:account.model_account_analytic_cost_ledger_journal_report
msgid "Account Analytic Cost Ledger For Journal Report"
-msgstr "Analytisches Journal für Kosten"
+msgstr "Sammelkonto der Journale analytischer Kosten"
#. module: account
#: model:ir.actions.act_window,name:account.action_model_form
#: model:ir.ui.menu,name:account.menu_action_model_form
msgid "Recurring Models"
-msgstr "Wiederkehrende Buchungen"
+msgstr "Wiederkehrende Modelle"
#. module: account
-#: code:addons/account/account_move_line.py:1251
+#: code:addons/account/account_move_line.py:1266
#, python-format
msgid "Encoding error"
msgstr "Kodierungsfehler"
@@ -4564,8 +4599,9 @@ msgstr "4"
#. module: account
#: view:account.invoice:0
+#: xsl:account.transfer:0
msgid "Change"
-msgstr "Ändere Währung"
+msgstr "Wechselgeld"
#. module: account
#: selection:account.journal,type:0
@@ -4580,7 +4616,7 @@ msgstr "Kontoarten Auswahl"
#. module: account
#: help:account.journal,default_credit_account_id:0
msgid "It acts as a default account for credit amount"
-msgstr "Fungiert als Standard Konto für die Haben Buchung in diesem Journal"
+msgstr "Fungiert als Standardkonto für die Haben Buchung in diesem Journal"
#. module: account
#: model:ir.actions.act_window,name:account.action_validate_account_move_line
@@ -4588,7 +4624,7 @@ msgstr "Fungiert als Standard Konto für die Haben Buchung in diesem Journal"
#: view:validate.account.move:0
#: view:validate.account.move.lines:0
msgid "Post Journal Entries"
-msgstr "Buche Journaleinträge"
+msgstr "Quittiere Buchungen"
#. module: account
#: selection:account.invoice,state:0
@@ -4608,14 +4644,14 @@ msgid "Example"
msgstr "Beispiel"
#. module: account
-#: code:addons/account/account_invoice.py:828
+#: code:addons/account/account_invoice.py:839
#, python-format
msgid ""
"Please verify the price of the invoice !\n"
"The real total does not match the computed total."
msgstr ""
-"Bitte überprüfen Sie den Rechnungspreis !\n"
-"Dieser Wert entspricht nicht dem Gesamtbetrag der Rechnung."
+"Bitte überprüfen Sie die Rechnungssumme!\n"
+"Dieser Wert entspricht nicht dem errechneten Gesamtbetrag der Rechnung."
#. module: account
#: view:account.tax:0
@@ -4624,17 +4660,17 @@ msgid "Keep empty to use the income account"
msgstr "Leer lassen um das Erlöskonto zu nutzen"
#. module: account
-#: code:addons/account/account.py:3299
+#: code:addons/account/account.py:3316
#, python-format
msgid "Purchase Tax %.2f%%"
-msgstr "Einkauf Steuer %.2f%%"
+msgstr "Vorsteuer %.2f%%"
#. 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 "Wiederkehrende Buchungen (Automatisch)"
+msgstr "Buchungen (Automatisch)"
#. module: account
#: help:account.vat.declaration,chart_tax_id:0
@@ -4646,13 +4682,13 @@ msgstr "Wähle Steuerkontenplan"
#: field:account.fiscal.position,account_ids:0
#: field:account.fiscal.position.template,account_ids:0
msgid "Account Mapping"
-msgstr "Konten Zuordnung"
+msgstr "Kontenzuordnung"
#. module: account
#: selection:account.bank.statement.line,type:0
#: view:account.invoice:0
#: view:account.invoice.report:0
-#: code:addons/account/account_invoice.py:337
+#: code:addons/account/account_invoice.py:346
#, python-format
msgid "Customer"
msgstr "Kunde"
@@ -4668,7 +4704,7 @@ msgid "Cancelled Invoice"
msgstr "Stornierte Rechnung"
#. module: account
-#: code:addons/account/account.py:1567
+#: code:addons/account/account.py:1584
#, python-format
msgid ""
"Couldn't create move with currency different from the secondary currency of "
@@ -4707,7 +4743,7 @@ msgid ""
"means you won't be able to modify their accounting fields anymore."
msgstr ""
"Alle Buchungen dieses Journals im Status 'Entwurf' werden gebucht. Hierdurch "
-"können Sie dann keine Buchungen mehr vorher abändern."
+"können Sie dann keine Buchungen mehr abändern."
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_configuration
@@ -4725,7 +4761,7 @@ msgid "Income Account on Product Template"
msgstr "Erlöskonto für Produktvorlage"
#. module: account
-#: code:addons/account/account.py:3120
+#: code:addons/account/account.py:3137
#, python-format
msgid "MISC"
msgstr "DIV"
@@ -4752,11 +4788,13 @@ msgstr "Neues Geschäftsjahr"
#: view:account.invoice:0
#: view:account.tax.template:0
#: selection:account.vat.declaration,based_on:0
+#: code:addons/account/report/account_tax_report.py:68
#: 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
+#, python-format
msgid "Invoices"
msgstr "Rechnung"
@@ -4776,7 +4814,7 @@ msgstr "Schecks"
#: view:account.invoice.report:0
#: field:account.invoice.report,user_id:0
msgid "Salesman"
-msgstr "Mitarbeiter"
+msgstr "Verkäufer"
#. module: account
#: view:account.invoice.report:0
@@ -4786,12 +4824,12 @@ msgstr "Abgerechnet"
#. module: account
#: view:account.move:0
msgid "Posted Journal Entries"
-msgstr "Verbuchte Buchungen"
+msgstr "Quittierte Buchungen"
#. module: account
#: view:account.use.model:0
msgid "Use Model"
-msgstr "Benutze Buchungsvorlage"
+msgstr "Benutze Modellvorlage"
#. module: account
#: help:account.invoice,partner_bank_id:0
@@ -4801,9 +4839,9 @@ msgid ""
"Partner bank account number."
msgstr ""
"Bankkonto für die Zahlung\r\n"
-"* Kundenrechnungen und Lieferantengutschriften: Ein Bankkonto des "
+"* Bei Kundenrechnungen und Lieferantengutschriften ein Bankkonto des "
"Unternehmens\r\n"
-"* sonst: ein Bankkonto des Partners"
+"* ansonsten ein Bankkonto des Partners"
#. module: account
#: view:account.state.open:0
@@ -4813,7 +4851,7 @@ msgstr "Nein"
#. module: account
#: help:account.invoice.tax,tax_code_id:0
msgid "The tax basis of the tax declaration."
-msgstr "Die Steuerbasis in der Steuererklärung"
+msgstr "Die Steuergrundlage in der Steuererklärung"
#. module: account
#: view:account.addtmpl.wizard:0
@@ -4824,7 +4862,7 @@ msgstr "Hinzufügen"
#: selection:account.invoice,state:0
#: report:account.overdue:0
msgid "Paid"
-msgstr "bezahlt"
+msgstr "Bezahlt"
#. module: account
#: view:account.period.close:0
@@ -4839,7 +4877,7 @@ msgstr "Der Bankauszug für den Bankausgleich"
#. module: account
#: model:process.transition,note:account.process_transition_suppliercustomerinvoice0
msgid "Draft invoices are validated. "
-msgstr "Rechnungen im Entwurf wurden gebucht. "
+msgstr "Rechnungentwürfe wurden genehmigt. "
#. module: account
#: constraint:account.account.template:0
@@ -4860,7 +4898,7 @@ msgstr "Eröffnungsperiode"
#. module: account
#: view:account.move:0
msgid "Journal Entries to Review"
-msgstr "Buchungen zu überprüfen"
+msgstr "Zu prüfende Buchungen"
#. module: account
#: view:account.bank.statement:0
@@ -4896,29 +4934,27 @@ msgstr "Steuer Anwendung"
#: model:ir.ui.menu,name:account.menu_eaction_account_moves_sale
#, python-format
msgid "Journal Items"
-msgstr "Journal Zeilen"
+msgstr "Buchungen"
#. module: account
-#: code:addons/account/account.py:1088
-#: code:addons/account/account.py:1090
-#: code:addons/account/account.py:1321
-#: code:addons/account/account.py:1563
-#: code:addons/account/account.py:1567
-#: code:addons/account/account.py:3368
-#: code:addons/account/account_move_line.py:807
-#: code:addons/account/account_move_line.py:830
-#: code:addons/account/account_move_line.py:832
-#: code:addons/account/account_move_line.py:835
-#: code:addons/account/account_move_line.py:837
+#: code:addons/account/account.py:1095
+#: code:addons/account/account.py:1097
+#: code:addons/account/account.py:1329
+#: code:addons/account/account.py:1580
+#: code:addons/account/account.py:1584
+#: code:addons/account/account.py:3385
+#: code:addons/account/account_move_line.py:823
+#: code:addons/account/account_move_line.py:843
+#: code:addons/account/account_move_line.py:846
#: 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:69
+#: code:addons/account/wizard/account_financial_report.py:70
#: code:addons/account/wizard/account_move_bank_reconcile.py:49
-#: code:addons/account/wizard/account_report_common.py:144
-#: code:addons/account/wizard/account_report_common.py:150
+#: code:addons/account/wizard/account_report_common.py:145
+#: code:addons/account/wizard/account_report_common.py:151
#, python-format
msgid "Error"
msgstr "Fehler"
@@ -4930,7 +4966,7 @@ msgstr "Fehler"
#: field:account.analytic.inverted.balance,date2:0
#: field:account.analytic.journal.report,date2:0
msgid "End of period"
-msgstr "Ende Periode"
+msgstr "Periodenende"
#. module: account
#: view:res.partner:0
@@ -4943,8 +4979,8 @@ msgid ""
"This report is analysis by partner. It is a PDF report containing one line "
"per partner representing the cumulative credit balance."
msgstr ""
-"Der Report erzeugt Analysen nach Partner. Es handelt sich dabei um einen pdf "
-"Report mit jeweils einer Zeile für den Partner"
+"Der Report erzeugt Analysen nach Partner. Es handelt sich dabei um einen PDF-"
+"Report mit jeweils einer Zeile pro Partner"
#. module: account
#: model:ir.actions.act_window,help:account.action_account_analytic_journal_tree
@@ -5010,7 +5046,7 @@ msgstr "Verkaufsjournal in diesem Monat"
#: model:ir.actions.act_window,name:account.action_account_vat_declaration
#: model:ir.model,name:account.model_account_vat_declaration
msgid "Account Vat Declaration"
-msgstr "Auswertung Umsatzsteuer"
+msgstr "Umsatzsteuererklärung (-voranmeldung)"
#. module: account
#: report:account.invoice:0
@@ -5020,15 +5056,15 @@ msgstr "Preis"
#. module: account
#: view:account.period:0
msgid "To Close"
-msgstr "Zu Beendigen"
+msgstr "Abzuschließen"
#. module: account
#: field:account.treasury.report,date:0
msgid "Beginning of Period Date"
-msgstr "Beginn Periode"
+msgstr "Datum des Periodebeginns"
#. module: account
-#: code:addons/account/account.py:1351
+#: code:addons/account/account.py:1361
#, python-format
msgid ""
"You can not modify a posted entry of this journal !\n"
@@ -5047,18 +5083,18 @@ msgstr "Vorlagen"
#. module: account
#: field:account.invoice.tax,name:0
msgid "Tax Description"
-msgstr "Steuer Beschreibung"
+msgstr "Steuerbezeichnung"
#. module: account
#: field:account.tax,child_ids:0
msgid "Child Tax Accounts"
-msgstr "untergeordnete Steuerkonten"
+msgstr "Untergeordnete Steuerkonten"
#. module: account
-#: code:addons/account/account.py:1090
+#: code:addons/account/account.py:1097
#, python-format
msgid "Start period should be smaller then End period"
-msgstr "Beginn der Periode sollte kleiner sein als Ende der Periode"
+msgstr "Periodenbeginn muss vor dem Periodenende liegen"
#. module: account
#: help:account.tax,price_include:0
@@ -5067,7 +5103,7 @@ msgid ""
"Check this if the price you use on the product and invoices includes this "
"tax."
msgstr ""
-"Aktivieren, wenn der Preis bei Produkt und Rechnung die Steuer beinhaltet"
+"Aktivieren, wenn der Preis bei Produkt und Rechnung diese Steuer beinhaltet"
#. module: account
#: report:account.analytic.account.balance:0
@@ -5077,6 +5113,7 @@ msgstr "Saldo (Anal.)"
#. module: account
#: report:account.account.balance:0
#: field:account.aged.trial.balance,target_move:0
+#: report:account.aged_trial_balance:0
#: field:account.balance.report,target_move:0
#: report:account.central.journal:0
#: field:account.central.journal,target_move:0
@@ -5120,8 +5157,10 @@ msgstr "Periodentyp"
#: view:account.invoice:0
#: field:account.invoice,payment_ids:0
#: selection:account.vat.declaration,based_on:0
+#: code:addons/account/report/account_tax_report.py:70
+#, python-format
msgid "Payments"
-msgstr "Anzeige Zahlungen"
+msgstr "Zahlungen"
#. module: account
#: view:account.tax:0
@@ -5198,7 +5237,7 @@ msgid "Line 1:"
msgstr "Zeile 1:"
#. module: account
-#: code:addons/account/account.py:1307
+#: code:addons/account/account.py:1315
#, python-format
msgid "Integrity Error !"
msgstr "Integritätsfehler!"
@@ -5216,7 +5255,7 @@ msgstr "Monat"
#. module: account
#: field:account.partner.reconcile.process,next_partner_id:0
msgid "Next Partner to Reconcile"
-msgstr "Nächster Partner für Offene Posten Ausgleich"
+msgstr "Nächster Partner zum Ausgleich offener Posten"
#. module: account
#: field:account.invoice.tax,account_id:0
@@ -5231,6 +5270,7 @@ msgstr "Ergebnis Kontoabstimmung"
#. 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 "Bilanz"
@@ -5295,7 +5335,7 @@ msgstr "Verkauf"
#. module: account
#: view:account.financial.report:0
msgid "Report"
-msgstr "Report"
+msgstr "Bericht"
#. module: account
#: view:account.analytic.line:0
@@ -5307,6 +5347,7 @@ msgstr "Report"
#: 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
msgid "Amount"
@@ -5320,7 +5361,7 @@ msgstr "Betrag"
#: model:process.transition,name:account.process_transition_suppliervalidentries0
#: model:process.transition,name:account.process_transition_validentries0
msgid "Validation"
-msgstr "Buchung"
+msgstr "Prüfung"
#. module: account
#: field:account.tax,child_depend:0
@@ -5331,7 +5372,7 @@ msgstr "Steuer auf untergeordnete Datensätze"
#. module: account
#: model:ir.model,name:account.model_account_fiscal_position_tax_template
msgid "Template Tax Fiscal Position"
-msgstr "Steuer Zuordnung Vorlage"
+msgstr "Vorlage zur Steuerzuordnung in der Bilanz"
#. module: account
#: field:account.journal,update_posted:0
@@ -5356,7 +5397,7 @@ msgstr "Personenkonto"
#. module: account
#: view:account.bank.statement:0
msgid "Transaction"
-msgstr "Transaktion"
+msgstr "Geschäftsvorfall"
#. module: account
#: help:account.tax,base_code_id:0
@@ -5368,7 +5409,7 @@ msgstr "Transaktion"
#: help:account.tax.template,ref_tax_code_id:0
#: help:account.tax.template,tax_code_id:0
msgid "Use this code for the VAT declaration."
-msgstr "Benutze diese ID für die Ust. - Voranmeldung"
+msgstr "Benutze diese ID für die Umsatzsteuervoranmeldung"
#. module: account
#: field:account.partner.reconcile.process,progress:0
@@ -5383,7 +5424,7 @@ msgstr "Analyt. Buchungen Statistik"
#. module: account
#: field:wizard.multi.charts.accounts,bank_accounts_id:0
msgid "Cash and Banks"
-msgstr "Geld und Banken"
+msgstr "Bargeld und Banken"
#. module: account
#: model:ir.model,name:account.model_account_installer
@@ -5393,7 +5434,7 @@ msgstr "account.installer"
#. module: account
#: field:account.tax.template,include_base_amount:0
msgid "Include in Base Amount"
-msgstr "In Basis Betrag inkludieren"
+msgstr "In Grundbetrag einbeziehen"
#. module: account
#: help:account.payment.term.line,days:0
@@ -5401,7 +5442,7 @@ 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 ""
-"Anzahl der Tage befor das Monatsende berechnet wird. \r\n"
+"Anzahl der zu addierenden Tage bevor das Monatsende berechnet wird. \r\n"
"Datum = 15.1\r\n"
"Anzahl Tage = 22\r\n"
"Tag des Monats = -1\r\n"
@@ -5492,22 +5533,22 @@ msgid "End of Year Entries Journal"
msgstr "Journal Eröffnungsbuchungen"
#. module: account
-#: code:addons/account/account.py:3446
+#: code:addons/account/account.py:3463
#: code:addons/account/account_bank_statement.py:338
-#: code:addons/account/account_invoice.py:427
-#: code:addons/account/account_invoice.py:527
-#: code:addons/account/account_invoice.py:542
-#: code:addons/account/account_invoice.py:550
-#: code:addons/account/account_invoice.py:572
+#: code:addons/account/account_invoice.py:436
+#: code:addons/account/account_invoice.py:536
+#: code:addons/account/account_invoice.py:551
+#: code:addons/account/account_invoice.py:559
+#: code:addons/account/account_invoice.py:581
#: code:addons/account/wizard/account_move_journal.py:63
#, python-format
msgid "Configuration Error !"
-msgstr "Fehler Konfiguration !"
+msgstr "Konfigurationsfehler!"
#. module: account
#: field:account.payment.term.line,value_amount:0
msgid "Amount To Pay"
-msgstr "Zahlungsbetrag"
+msgstr "Zahlbetrag"
#. module: account
#: help:account.partner.reconcile.process,to_reconcile:0
@@ -5522,12 +5563,12 @@ msgstr ""
#. module: account
#: view:account.subscription.line:0
msgid "Subscription lines"
-msgstr "Automatische Buchungen"
+msgstr "Automatische Wiederholungs-Buchungen"
#. module: account
#: field:account.entries.report,quantity:0
msgid "Products Quantity"
-msgstr "Produkt Menge"
+msgstr "Produktmenge"
#. module: account
#: view:account.entries.report:0
@@ -5536,7 +5577,7 @@ msgstr "Produkt Menge"
#: selection:account.move,state:0
#: view:account.move.line:0
msgid "Unposted"
-msgstr "Nicht gebucht"
+msgstr "Nicht quittiert"
#. module: account
#: view:account.change.currency:0
@@ -5559,7 +5600,7 @@ msgstr "Buchungen"
#. module: account
#: view:account.invoice:0
msgid "Payment Date"
-msgstr "Datum Zahlung"
+msgstr "Zahlungsdatum"
#. module: account
#: view:account.analytic.account:0
@@ -5588,13 +5629,13 @@ msgid ""
"Specified Journal does not have any account move entries in draft state for "
"this period"
msgstr ""
-"Spezielles Journal hat keine Buchungspositionen im Entwurfsstadium für diese "
-"Periode."
+"Angegebenes Journal enthält keine Buchungspositionen im Entwurfsstadium für "
+"diese Periode."
#. module: account
#: model:ir.actions.act_window,name:account.action_view_move_line
msgid "Lines to reconcile"
-msgstr "Auszugleichende Buchungen"
+msgstr "Zu begleichende Buchungen"
#. module: account
#: report:account.analytic.account.balance:0
@@ -5604,6 +5645,8 @@ msgstr "Auszugleichende Buchungen"
#: field:account.invoice.line,quantity:0
#: field:account.model.line,quantity:0
#: field:account.move.line,quantity:0
+#: selection:account.tax,type:0
+#: selection:account.tax.template,type:0
#: view:analytic.entries.report:0
#: field:analytic.entries.report,unit_amount:0
#: field:report.account.sales,quantity:0
@@ -5637,9 +5680,9 @@ 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 ""
-"Anzahl der maximalen Teilbeträge die für einen gegenseitigen Ausgleich von "
-"Rechnungen und Zahlungen kombiniert werden dürfen, um automatisch eine "
-"Saldenausgleich für das ausgewählte Konto herbeizuführen."
+"Anzahl der gleichen Teilbeträge die, in der Summe, zum Ausgleich von "
+"Rechnungen aufgebracht werden müssen, um die Stärke des automatischen "
+"Saldenausgleichs für das ausgewählte Konto zu nutzen."
#. module: account
#: help:account.payment.term.line,sequence:0
@@ -5647,14 +5690,14 @@ msgid ""
"The sequence field is used to order the payment term lines from the lowest "
"sequences to the higher ones"
msgstr ""
-"Die Sequenz Feld wird benutzt, um in diesem Fall die Zahlungsbedingungen von "
-"der geringsten Sequenz zu höheren Sequenzen sukzessiv durchzuführen."
+"Die Sequenz Feld wird benutzt, um die Zahlungsbedingungen von der geringsten "
+"Sequenz- bzw. Folgennummer beginnend zu sortieren."
#. module: account
#: view:account.fiscal.position.template:0
#: field:account.fiscal.position.template,name:0
msgid "Fiscal Position Template"
-msgstr "Steuerzuordnung Vorlage"
+msgstr "Bilanz-Vorlage"
#. module: account
#: view:account.analytic.chart:0
@@ -5672,10 +5715,10 @@ msgid ""
"finalize your end of year results definitive "
msgstr ""
"Wenn keine weiteren Buchungen für dieses Geschäftsjahr generiert werden "
-"sollen können Sie das Jahr abschliessen. Hierdurch werden alle noch offenen "
-"Perioden beendet, wodurch weitere Buchungen in diesem Jahr nicht mehr "
-"möglich sind. Beenden Sie das Jahr erst, wenn Sie definitv keine weiteren "
-"Buchungen mehr tätigen müssen. "
+"sollen, können Sie das Jahr abschliessen. Hierdurch werden alle noch offenen "
+"Perioden beendet. Weitere Buchungen in diesem Jahr sind nicht mehr möglich. "
+"Beenden Sie das Jahr erst, wenn Sie definitv keine weiteren Buchungen mehr "
+"tätigen müssen. "
#. module: account
#: field:account.central.journal,amount_currency:0
@@ -5704,18 +5747,19 @@ msgid ""
"No fiscal year defined for this date !\n"
"Please create one from the configuration of the accounting menu."
msgstr ""
-"Es gibt kein Geschäftsjahr für dieses Datum !\n"
+"Es ist kein Geschäftsjahr für dieses Datum angelegt!\n"
"Bitte legen Sie ein Geschäftsjahr im Konfigurationsmenü des Finanzbereiches "
"an."
#. module: account
#: view:account.move.line.reconcile:0
msgid "Reconcile With Write-Off"
-msgstr "Ausgleichen mit Abschreibung"
+msgstr "Ausgleichen durch Abschreibung"
#. module: account
#: selection:account.payment.term.line,value:0
#: selection:account.tax,type:0
+#: selection:account.tax.template,type:0
msgid "Fixed Amount"
msgstr "Fester Betrag"
@@ -5752,13 +5796,14 @@ msgid "Generate Opening Entries"
msgstr "Erstelle Vortragsbuchungen"
#. module: account
-#: code:addons/account/account_move_line.py:759
+#: code:addons/account/account_move_line.py:775
#, python-format
msgid "Already Reconciled!"
msgstr "Bereits ausgeglichen"
#. module: account
#: help:account.tax,type:0
+#: help:account.tax.template,type:0
msgid "The computation method for the tax amount."
msgstr "Die Berechnungsmethode für die Höhe der Steuern."
@@ -5785,14 +5830,14 @@ msgid "Child Accounts"
msgstr "untergeordnete Konten"
#. module: account
-#: code:addons/account/account_move_line.py:1214
+#: code:addons/account/account_move_line.py:1229
#, python-format
msgid "Move name (id): %s (%s)"
msgstr "Buchungsnummer (id): %s (%s)"
#. module: account
#: view:account.move.line.reconcile:0
-#: code:addons/account/account_move_line.py:857
+#: code:addons/account/account_move_line.py:871
#, python-format
msgid "Write-Off"
msgstr "Abschreibung"
@@ -5812,7 +5857,7 @@ msgstr "Erlöse"
#: selection:account.bank.statement.line,type:0
#: view:account.invoice:0
#: view:account.invoice.report:0
-#: code:addons/account/account_invoice.py:339
+#: code:addons/account/account_invoice.py:348
#, python-format
msgid "Supplier"
msgstr "Lieferant"
@@ -5842,7 +5887,7 @@ msgid "Account n°"
msgstr "Kontonummer"
#. module: account
-#: code:addons/account/account_invoice.py:88
+#: code:addons/account/account_invoice.py:91
#, python-format
msgid "Free Reference"
msgstr "Freie Referenz"
@@ -5857,7 +5902,9 @@ msgstr "Berechnungsform"
#: selection:account.common.partner.report,result_selection:0
#: selection:account.partner.balance,result_selection:0
#: selection:account.partner.ledger,result_selection:0
+#: code:addons/account/report/account_aged_partner_balance.py:376
#: code:addons/account/report/account_partner_balance.py:301
+#: code:addons/account/report/account_partner_ledger.py:398
#, python-format
msgid "Receivable and Payable Accounts"
msgstr "Debitoren und Kreditoren"
@@ -5876,12 +5923,12 @@ msgstr "Status Offen"
#. module: account
#: report:account.analytic.account.quantity_cost_ledger:0
msgid "Max Qty:"
-msgstr "Max. Menge"
+msgstr "Max. Menge:"
#. module: account
#: view:account.invoice.refund:0
msgid "Refund Invoice"
-msgstr "Gutschrift Rechnung"
+msgstr "Rechnungsgutschrift"
#. module: account
#: field:account.invoice,address_invoice_id:0
@@ -5895,10 +5942,10 @@ msgid ""
"document shows your debit and credit taking in consideration some criteria "
"you can choose by using the search tool."
msgstr ""
-"Durch diese Ansicht können Sie multidimensionale Ansichten auf Ihre "
-"Finanzkonten vornehmen. Diese Perspektive zeigt Ihnen Ihre Salden und "
-"Verkehrszahlen sowie diverse andere Kriterien und Werte die beim Suchdialog "
-"gewählt werden können."
+"Durch diese Ansicht erhalten Sie mehrdimensionale Ansichten auf Ihre "
+"Finanzkonten. Diese Perspektive zeigt Ihnen Ihre Salden und Verkehrszahlen "
+"sowie diverse andere Kriterien und Werte die im Auswahldialog gewählt werden "
+"können."
#. module: account
#: model:ir.actions.act_window,help:account.action_tax_code_list
@@ -5907,9 +5954,9 @@ msgid ""
"OpenERP allows you to define the tax structure and manage it from this menu. "
"You can define both numeric and alphanumeric tax codes."
msgstr ""
-"Die Definition der Umsatzsteuern richtet sich nach der im jeweiligen Land "
-"gültigen Regelung für die Abgabe von Steuererklärungen OpenERP ermöglicht "
-"Ihnen dabei die Struktur der Steuern zu definieren und über dieses Menü zu "
+"Die Definition der Steuern richtet sich nach der im jeweiligen Land gültigen "
+"Regelung für die Abgabe von Steuererklärungen. OpenERP ermöglicht Ihnen "
+"dabei die Struktur der Steuern zu definieren und über dieses Menü zu "
"verwalten. Sie können sowohl numerische als auch alphanumerische "
"Zeichenfolgen für die Definition verwenden."
@@ -5931,8 +5978,8 @@ msgid ""
"that you should have your last line with the type 'Balance' to ensure that "
"the whole amount will be threated."
msgstr ""
-"Wählen Sie hier die Berechnungsart dieser Zeile Ihrer Zahlungsbedingung. Sie "
-"sollten dabei mindestens eine letzte Zeile mit der Berechnungsart "
+"Wählen Sie hier die Berechnungsart dieser Position Ihrer Zahlungsbedingung. "
+"Sie sollten dabei mindestens eine letzte Zeile mit der Berechnungsart "
"'Saldoausgleich' definiert haben."
#. module: account
@@ -5947,7 +5994,7 @@ msgstr "Erzwinge Periode"
#: view:account.invoice.report:0
#: field:account.invoice.report,nbr:0
msgid "# of Lines"
-msgstr "# Positionen"
+msgstr "Anz. Positionen"
#. module: account
#: field:account.aged.trial.balance,filter:0
@@ -5969,10 +6016,10 @@ msgid "Filter by"
msgstr "Filter durch"
#. module: account
-#: code:addons/account/account.py:2256
+#: code:addons/account/account.py:2273
#, python-format
msgid "You have a wrong expression \"%(...)s\" in your model !"
-msgstr "Sie haben einen falschen Ausdruck \"%(...)s\" in Ihrem Model !"
+msgstr "Sie haben einen falschen Ausdruck \"%(...)s\" in Ihrem Modell!"
#. module: account
#: field:account.bank.statement.line,date:0
@@ -5980,8 +6027,8 @@ msgid "Entry Date"
msgstr "Buchungsdatum"
#. module: account
-#: code:addons/account/account_move_line.py:1155
-#: code:addons/account/account_move_line.py:1238
+#: code:addons/account/account_move_line.py:1170
+#: code:addons/account/account_move_line.py:1253
#, python-format
msgid "You can not use an inactive account!"
msgstr "Sie können kein inaktives Konto verwenden!"
@@ -6010,7 +6057,7 @@ msgstr "Die aktuelle Währung ist nicht richtig konfiguriert!"
#: field:account.tax,account_collected_id:0
#: field:account.tax.template,account_collected_id:0
msgid "Invoice Tax Account"
-msgstr "Rechnung Steuerkonto"
+msgstr "Konto der Rechnungssteuer"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_general_journal
@@ -6024,12 +6071,12 @@ msgid "Number of Days"
msgstr "Anzahl Tage"
#. module: account
-#: code:addons/account/account_bank_statement.py:402
-#: code:addons/account/account_invoice.py:392
+#: code:addons/account/account_bank_statement.py:403
+#: code:addons/account/account_invoice.py:401
#: code:addons/account/wizard/account_period_close.py:51
#, python-format
msgid "Invalid action !"
-msgstr "Fehlerhafte Aktion"
+msgstr "Ungültige Aktion!"
#. module: account
#: code:addons/account/wizard/account_move_journal.py:102
@@ -6045,13 +6092,13 @@ msgstr "Überprüfen Sie Ihre Finanzjournale"
#. module: account
#: help:account.tax,name:0
msgid "This name will be displayed on reports"
-msgstr "Dieser Name wird in Reports angezeigt"
+msgstr "Dieser Name wird in Berichten angezeigt"
#. module: account
#: report:account.analytic.account.cost_ledger:0
#: report:account.analytic.account.quantity_cost_ledger:0
msgid "Printing date"
-msgstr "Datum Druck"
+msgstr "Druckdatum"
#. module: account
#: selection:account.account.type,close_method:0
@@ -6079,7 +6126,7 @@ msgstr "Fremdwährung Saldo"
#. module: account
#: field:account.journal.period,name:0
msgid "Journal-Period Name"
-msgstr "Journal Periode Bezeichnung"
+msgstr "Bezeichnung der Journal-Periode"
#. module: account
#: field:account.invoice.tax,factor_base:0
@@ -6087,7 +6134,7 @@ msgid "Multipication factor for Base code"
msgstr "Multiplikationsfaktor für Steuergrundbetrag"
#. module: account
-#: code:addons/account/wizard/account_report_common.py:150
+#: code:addons/account/wizard/account_report_common.py:151
#, python-format
msgid "not implemented"
msgstr "nicht implementiert"
@@ -6105,27 +6152,29 @@ msgid ""
"Forma' state!"
msgstr ""
"Ausgewählte Rechnung kann nicht bestätigt werden bevor Sie nicht im Status "
-"'Entwurf' oder 'Pro Forma' ist !"
+"'Entwurf' oder 'Proforma' ist !"
#. module: account
#: view:account.subscription:0
msgid "Running Subscription"
-msgstr "aktuelle Abonnements"
+msgstr "Laufende Abonnements"
#. module: account
#: report:account.invoice:0
msgid "Fiscal Position Remark :"
-msgstr "Hinweis Steuerzuordnung"
+msgstr "Hinweis zum Finanzbericht:"
#. 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 "Statistik Analysebuchungen"
+msgstr "Statistik der Analysebuchungen"
#. module: account
#: selection:account.aged.trial.balance,direction_selection:0
+#: code:addons/account/report/account_aged_partner_balance.py:381
+#, python-format
msgid "Past"
msgstr "Vergangenheit"
@@ -6137,7 +6186,7 @@ msgid ""
"\"View\"! "
msgstr ""
"Konfigurationsfehler!\n"
-"Das übergeordnete Konto muss den Typ View haben. "
+"Das übergeordnete Konto muss den Typ Sicht haben. "
#. module: account
#: help:res.partner.bank,journal_id:0
@@ -6156,7 +6205,7 @@ msgstr "Buchung Analysekonto"
#: view:res.company:0
#: field:res.company,overdue_msg:0
msgid "Overdue Payments Message"
-msgstr "Text Zahlungserinnerung"
+msgstr "Nachricht der Zahlungserinnerung"
#. module: account
#: model:ir.actions.act_window,help:account.action_account_moves_all_a
@@ -6194,13 +6243,13 @@ msgid ""
"(i.e. paid) in the system."
msgstr ""
"Sobald der Zahlungsausgleich erfolgt ist, wechselt der Status der Rechnung "
-"zu 'Erledigt' ( d.h. Bezahlt)."
+"zu 'Erledigt' (d. h. Bezahlt)."
#. module: account
#: view:account.chart.template:0
#: field:account.chart.template,account_root_id:0
msgid "Root Account"
-msgstr "Oberstes Konto"
+msgstr "Stammkonto"
#. module: account
#: field:res.partner,last_reconciliation_date:0
@@ -6215,7 +6264,7 @@ msgstr "Analytische Buchung"
#. module: account
#: field:product.template,taxes_id:0
msgid "Customer Taxes"
-msgstr "Produkt Steuern"
+msgstr "Umsatzsteuern"
#. module: account
#: help:account.model,name:0
@@ -6236,7 +6285,7 @@ msgstr "Erstelle ein Konto auf Basis der Vorlage"
#: view:account.account.type:0
#: view:account.tax.code:0
msgid "Reporting Configuration"
-msgstr "Konfiguration Auswertungen"
+msgstr "Berichtseinstellungen"
#. module: account
#: field:account.tax,type:0
@@ -6248,7 +6297,7 @@ msgstr "Steuerart"
#: 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 "Konto Vorlagen"
+msgstr "Konto-Vorlagen"
#. module: account
#: help:wizard.multi.charts.accounts,complete_tax_set:0
@@ -6258,14 +6307,14 @@ msgid ""
"choice assumes that the set of tax defined for the chosen template is "
"complete"
msgstr ""
-"Diese Auswähl erlaubt Ihnen die Einkaufs und Verkaufssteuern zu definieren "
+"Diese Auswähl erlaubt Ihnen die Einkaufs- und Verkaufssteuern zu definieren "
"oder aus einer Liste auszuwählen. Letzteres setzt voraus, dass die Vorlage "
-"komplett ist."
+"vollständig ist."
#. module: account
#: report:account.vat.declaration:0
msgid "Tax Statement"
-msgstr "Auswertung Steueranmeldung"
+msgstr "Steueranmeldung"
#. module: account
#: model:ir.model,name:account.model_res_company
@@ -6289,13 +6338,13 @@ msgid ""
"You can not remove/desactivate an account which is set on a customer or "
"supplier."
msgstr ""
-"Sie können dieses Konto nicht deaktivieren oder löschen, da es bei einem "
-"Kunden oder Lieferanten verwendet wird."
+"Sie können dieses Konto nicht deaktivieren oder löschen, da es einem Kunden "
+"oder Lieferanten zugeordnet ist."
#. module: account
#: help:account.fiscalyear.close.state,fy_id:0
msgid "Select a fiscal year to close"
-msgstr "Wähle Geschäftsjahr für Beendigung"
+msgstr "Wähle abzuschließendes Geschäftsjahr"
#. module: account
#: help:account.chart.template,tax_template_ids:0
@@ -6310,7 +6359,7 @@ msgstr "IntraCom"
#. module: account
#: view:account.move.line.reconcile.writeoff:0
msgid "Information addendum"
-msgstr "Informationsbeilage"
+msgstr "Informationsanhang"
#. module: account
#: field:account.chart,fiscalyear:0
@@ -6320,7 +6369,7 @@ msgstr "Geschäftsjahr"
#. module: account
#: view:account.move.reconcile:0
msgid "Partial Reconcile Entries"
-msgstr "Teilausgleich Rechnungen"
+msgstr "Rechnungen mit Teilzahlungen"
#. module: account
#: view:account.addtmpl.wizard:0
@@ -6375,7 +6424,7 @@ msgstr "Debitor"
#. module: account
#: constraint:account.move.line:0
msgid "Company must be the same for its related account and period."
-msgstr "Company must be the same for its related account and period."
+msgstr "Das Unternehmen muss für Konto wie auch Periode das gleiche sein."
#. module: account
#: view:account.invoice:0
@@ -6400,15 +6449,16 @@ msgstr "Aktuell"
#. module: account
#: view:account.bank.statement:0
msgid "CashBox"
-msgstr "Kassenbuch"
+msgstr "Barkasse"
#. module: account
#: model:account.account.type,name:account.account_type_cash_equity
msgid "Equity"
-msgstr "Eigenkapital"
+msgstr "Buchwert"
#. module: account
#: selection:account.tax,type:0
+#: selection:account.tax.template,type:0
msgid "Percentage"
msgstr "Prozentsatz"
@@ -6420,13 +6470,13 @@ msgstr "Journal & Partner"
#. module: account
#: field:account.automatic.reconcile,power:0
msgid "Power"
-msgstr "Power"
+msgstr "Stärke"
#. module: account
-#: code:addons/account/account.py:3368
+#: code:addons/account/account.py:3385
#, python-format
msgid "Cannot generate an unused journal code."
-msgstr "Kann keine nicht verwendeten Journal Code erzeugen."
+msgstr "Kann keinen nicht verwendeten Journal Code erzeugen."
#. module: account
#: view:project.account.analytic.line:0
@@ -6445,8 +6495,8 @@ msgid ""
"Indicates if the amount of tax must be included in the base amount for the "
"computation of the next taxes"
msgstr ""
-"Anzeige, inwieweit diese Steuer im Steuergrundbetrag für die weitere "
-"Berechnung inbegriffen ist, oder nicht."
+"Anzeige, inwieweit diese Steuer im Grundbetrag für die weitere Berechnung "
+"enthalten sein muß, oder nicht."
#. module: account
#: model:ir.actions.act_window,name:account.action_account_partner_reconcile
@@ -6462,12 +6512,12 @@ msgstr "Umgekehrter Saldo (Anal.)"
#. module: account
#: field:account.tax.template,applicable_type:0
msgid "Applicable Type"
-msgstr "Anwendb. Typ"
+msgstr "Anwendbare Art"
#. module: account
#: field:account.invoice.line,invoice_id:0
msgid "Invoice Reference"
-msgstr "Rechnungsreferenz"
+msgstr "Rechnungsbezug"
#. module: account
#: help:account.tax.template,sequence:0
@@ -6476,16 +6526,16 @@ msgid ""
"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 ""
-"Die Sequenz ist für die Sortierung einzelner Steuerpositionen. Die Sequenz "
-"ist wichtig, wenn es mehrere untergeordnete Steuern zu einer "
-"übergeordetneten Obersteuer gibt."
+"Die Sequenz dient der Sortierung einzelner Steuerpositionen. Die Sequenz ist "
+"wichtig, wenn mehrere untergeordnete Steuern zu einer übergeordneten Steuer "
+"vorliegen."
#. module: account
#: selection:account.account,type:0
#: selection:account.account.template,type:0
#: view:account.journal:0
msgid "Liquidity"
-msgstr "Finanzmittel"
+msgstr "Liquidität"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_analytic_journal_open_form
@@ -6518,7 +6568,7 @@ msgid ""
"the tool search to analyse information about analytic entries generated in "
"the system."
msgstr ""
-"Durch dieses Ansicht können Sie ihre unterschiedlichen analytischen Konten "
+"Durch diese Ansicht können Sie ihre unterschiedlichen analytischen Konten "
"unter Berücksichtigung Ihres individullen Informationsbedarfs auswerten. "
"Benutzen Sie dieses Werkzeug für die Auswertung, der von Ihnen gebuchten "
"Beträge auf Analysekonten."
@@ -6526,7 +6576,7 @@ msgstr ""
#. module: account
#: sql_constraint:account.journal:0
msgid "The name of the journal must be unique per company !"
-msgstr "Die Journalbezeichnung sollte pro Unternehmen eindeutig sein."
+msgstr "Die Journalbezeichnung muss pro Unternehmen eindeutig sein."
#. module: account
#: field:account.account.template,nocreate:0
@@ -6547,7 +6597,7 @@ msgstr ""
#: code:addons/account/wizard/account_report_aged_partner_balance.py:58
#, python-format
msgid "Enter a Start date !"
-msgstr "Geben Sie ein Startdatum ein !"
+msgstr "Geben Sie ein Startdatum ein!"
#. module: account
#: report:account.invoice:0
@@ -6555,7 +6605,7 @@ msgstr "Geben Sie ein Startdatum ein !"
#: selection:account.invoice.report,type:0
#: selection:report.invoice.created,type:0
msgid "Supplier Refund"
-msgstr "Lieferanten Gutschrift"
+msgstr "Lieferantengutschrift"
#. module: account
#: field:account.bank.statement,move_line_ids:0
@@ -6603,7 +6653,7 @@ msgstr " Bewertung: Saldo"
#. module: account
#: field:account.invoice.line,uos_id:0
msgid "Unit of Measure"
-msgstr "ME"
+msgstr "Mengeneinheit"
#. module: account
#: constraint:account.payment.term.line:0
@@ -6612,7 +6662,7 @@ msgid ""
"2% "
msgstr ""
"Prozentwert für eine Position der Zahlungsbedingung muss zwischen 0 und 1 "
-"sein, z.B. 0.02 für 2% "
+"sein, z. B. 0.02 für 2% "
#. module: account
#: field:account.installer,has_default_company:0
@@ -6655,7 +6705,7 @@ msgstr "Steuergrundbetrag"
#. module: account
#: field:account.model,name:0
msgid "Model Name"
-msgstr "Buchungsvorlage Bezeichnung"
+msgstr "Modell-Bezeichnung"
#. module: account
#: field:account.chart.template,property_account_expense_categ:0
@@ -6698,8 +6748,8 @@ msgid "You can not remove an account containing journal items."
msgstr "Sie dürfen kein Konto löschen, das Buchungen beinhaltet"
#. module: account
-#: code:addons/account/account_analytic_line.py:145
-#: code:addons/account/account_move_line.py:933
+#: code:addons/account/account_analytic_line.py:143
+#: code:addons/account/account_move_line.py:947
#, python-format
msgid "Entries: "
msgstr "Buchungen: "
@@ -6715,7 +6765,7 @@ msgid "Currency of the related account journal."
msgstr "Währung des verwendten Buchungsjournals"
#. module: account
-#: code:addons/account/account.py:1563
+#: code:addons/account/account.py:1580
#, python-format
msgid "Couldn't create move between different companies"
msgstr "Konnte keine überbetriebliche Buchung erzeugen"
@@ -6731,14 +6781,14 @@ msgid ""
"account. From this view, you can create and manage the account types you "
"need for your company."
msgstr ""
-"Über Kontoarten wird gesteuert mit welcher Logik in den verschiedenen "
+"Über Kontoarten wird gesteuert, mit welcher Logik in den verschiedenen "
"Journalen gebucht wird. Die Methode für die Abgrenzung beim Jahreswechsel "
"steuert dabei den Prozess der Buchung beim Jahresabschluss. Die GuV & Bilanz "
"Positionen steuern den Ausweis für die Auswertungen Bilanz sowie Gewinn und "
"Verlust. Zum Beispiel könnte eine Kontoart entweder mit einem Konto aus dem "
"Anlagevermögen, einem Aufwands- oder einem Kreditorenkonto verbunden sein. "
"Über diese Ansicht können Sie die in Ihrem Unternehmen benötigten Kontoarten "
-"exakt definieren."
+"festlegen."
#. module: account
#: selection:account.account.type,report_type:0
@@ -6765,16 +6815,16 @@ msgstr "Status ist Entwurf"
#. module: account
#: view:account.move.line:0
-#: code:addons/account/account_move_line.py:1043
+#: code:addons/account/account_move_line.py:1058
#, python-format
msgid "Total debit"
msgstr "Gesamt Soll"
#. module: account
-#: code:addons/account/account_move_line.py:808
+#: code:addons/account/account_move_line.py:824
#, python-format
msgid "Entry \"%s\" is not valid !"
-msgstr "Eintrag \"%s\" ist ungültig !"
+msgstr "Eintrag \"%s\" ist ungültig!"
#. module: account
#: report:account.invoice:0
@@ -6788,7 +6838,7 @@ msgid ""
"taxes and journals according to the selected template"
msgstr ""
"Automatische Konfiguration Ihres Kontenplans, Bankkontos, Steuern und "
-"Journaldefinition resultierend aus der gewählten Vorlage,"
+"Journaldefinition gemäß der gewählten Vorlage,"
#. module: account
#: help:res.partner,property_account_receivable:0
@@ -6827,12 +6877,12 @@ msgstr ""
#. module: account
#: view:account.fiscalyear.close:0
msgid "Create"
-msgstr "Erstellen"
+msgstr "Anlegen"
#. module: account
#: model:process.transition.action,name:account.process_transition_action_createentries0
msgid "Create entry"
-msgstr "Erzeuge Buchung"
+msgstr "Buchung anlegen"
#. module: account
#: selection:account.account.type,report_type:0
@@ -6845,49 +6895,50 @@ msgstr "Gewinn & Verlust ( Aufwandskonto )"
#: code:addons/account/account.py:622
#: code:addons/account/account.py:624
#: code:addons/account/account.py:963
-#: code:addons/account/account.py:1052
-#: code:addons/account/account.py:1129
-#: code:addons/account/account.py:1344
-#: code:addons/account/account.py:1351
-#: code:addons/account/account.py:2280
-#: code:addons/account/account.py:2596
-#: code:addons/account/account_analytic_line.py:92
-#: code:addons/account/account_analytic_line.py:101
+#: code:addons/account/account.py:1057
+#: code:addons/account/account.py:1136
+#: code:addons/account/account.py:1352
+#: code:addons/account/account.py:1359
+#: code:addons/account/account.py:1361
+#: code:addons/account/account.py:2297
+#: code:addons/account/account.py:2613
+#: code:addons/account/account_analytic_line.py:90
+#: code:addons/account/account_analytic_line.py:99
#: code:addons/account/account_bank_statement.py:301
#: code:addons/account/account_bank_statement.py:314
#: code:addons/account/account_bank_statement.py:352
-#: code:addons/account/account_cash_statement.py:292
-#: code:addons/account/account_cash_statement.py:314
-#: code:addons/account/account_invoice.py:808
-#: code:addons/account/account_invoice.py:839
-#: code:addons/account/account_invoice.py:1030
-#: code:addons/account/account_move_line.py:1200
-#: code:addons/account/account_move_line.py:1216
-#: code:addons/account/account_move_line.py:1218
+#: code:addons/account/account_cash_statement.py:293
+#: code:addons/account/account_cash_statement.py:315
+#: code:addons/account/account_invoice.py:819
+#: code:addons/account/account_invoice.py:850
+#: code:addons/account/account_invoice.py:1042
+#: code:addons/account/account_move_line.py:1215
+#: code:addons/account/account_move_line.py:1231
+#: code:addons/account/account_move_line.py:1233
#: code:addons/account/wizard/account_invoice_refund.py:108
#: code:addons/account/wizard/account_invoice_refund.py:110
#: code:addons/account/wizard/account_open_closed_fiscalyear.py:39
#: code:addons/account/wizard/account_use_model.py:44
#, python-format
msgid "Error !"
-msgstr "Fehler !"
+msgstr "Fehler!"
#. module: account
#: field:account.financial.report,style_overwrite:0
msgid "Financial Report Style"
-msgstr "Finanz Report Stiel"
+msgstr "Stil des Finanzberichts"
#. module: account
#: selection:account.financial.report,sign:0
msgid "Preserve balance sign"
-msgstr "Erhalte Saldo Vorzeichen"
+msgstr "Erhalte Saldo-Vorzeichen"
#. 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 "Umsatzsteuer"
+msgstr "Umsatzsteuer-Anmeldung"
#. module: account
#: selection:account.journal.period,state:0
@@ -6895,16 +6946,16 @@ msgid "Printed"
msgstr "Gedruckt"
#. module: account
-#: code:addons/account/account_move_line.py:584
-#: code:addons/account/account_move_line.py:591
+#: code:addons/account/account_move_line.py:575
+#: code:addons/account/account_move_line.py:582
#, python-format
msgid "Error :"
-msgstr "Fehler :"
+msgstr "Fehler:"
#. module: account
#: view:account.analytic.line:0
msgid "Project line"
-msgstr "Budget Projekt"
+msgstr "Projektbudget"
#. module: account
#: field:account.invoice.tax,manual:0
@@ -6921,11 +6972,11 @@ msgid ""
"the amounts correspond."
msgstr ""
"Damit Ihre Rechnung als bezahlt gekennzeichnet werden kann, müssen Sie einen "
-"Ausgleich durch eine Gegenbuchung herbeiführen, welches üblicherweise eine "
-"Zahlung ist. Durch die Funktion des automatisierten Ausgleichs offener "
-"Posten, nutzen Sie die OpenERP Automatik für die Suche und den Ausgleich von "
-"zusammengehörigen Rechnungen und Zahlungen über eine Prüfung "
-"zuammenpassender Beträge."
+"Ausgleich durch eine Gegenbuchung herbeiführen. Üblicherweise ist dies eine "
+"Zahlung. Durch die Funktion des automatisierten Ausgleichs offener Posten, "
+"nutzen Sie die Automatik von OpenERP den Ausgleich von zusammengehörigen "
+"Rechnungen und Zahlungen über eine Suche zuammenpassender Beträge "
+"durchzuführen."
#. module: account
#: view:account.move:0
@@ -6941,9 +6992,9 @@ msgid ""
"row to display the amount of debit/credit/balance that precedes the filter "
"you've set."
msgstr ""
-"Wenn ein Tages oder Periodenfilter gewählt wird, können sie mit diesem "
-"Kennzeichen steuern, ob eine Zeile mit Soll/Haben/Saldo ausgegeben wird, die "
-"die Buchungen davor summiert."
+"Wenn ein Filter nach Datum oder Periode gewählt wird, können sie mit diesem "
+"Kennzeichen steuern, ob eine Zeile mit Soll/Haben/Saldo der Ausgabe "
+"vorangestellt wird."
#. module: account
#: view:account.bank.statement:0
@@ -6952,7 +7003,7 @@ msgstr ""
#: 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 "Buchungsbelege"
+msgstr "Buchungen"
#. module: account
#: help:account.partner.ledger,page_split:0
@@ -6960,7 +7011,7 @@ msgid "Display Ledger Report with One partner per page"
msgstr "Kontoauszug mit einem Partner pro Seite"
#. module: account
-#: code:addons/account/account_move_line.py:1218
+#: code:addons/account/account_move_line.py:1233
#, python-format
msgid ""
"You can not do this modification on a reconciled entry! You can just change "
@@ -6987,9 +7038,9 @@ msgid ""
"This report is an analysis done by a partner. It is a PDF report containing "
"one line per partner representing the cumulative credit balance"
msgstr ""
-"Diese Auswertung analysiert die Salden auf Partnerskonten. Der Bericht "
-"beinhaltet eine PDF Auswertung mit je einer zusammenfassenden "
-"Auswertungszeile je Partner"
+"Diese Auswertung analysiert die Salden auf Partnerskonten. Der PDF-Bericht "
+"beinhaltet eine Auswertung mit je einer zusammenfassenden Auswertungszeile "
+"je Partner"
#. module: account
#: code:addons/account/wizard/account_validate_account_move.py:61
@@ -7027,7 +7078,7 @@ msgid ""
"Error: The default UOM and the purchase UOM must be in the same category."
msgstr ""
"Fehler: Die Standard Mengeneinheit (ME) sowie die Mengeneinheit (ME) bei der "
-"Beschaffung muss in derselben Kategorie sein."
+"Beschaffung müssen derselben Kategorie angehören."
#. module: account
#: view:account.journal.select:0
@@ -7045,12 +7096,12 @@ msgstr "Anfangssaldo"
#. module: account
#: model:ir.model,name:account.model_account_move_reconcile
msgid "Account Reconciliation"
-msgstr "Konto OP Ausgleich"
+msgstr "Konto OP-Ausgleich"
#. module: account
#: model:ir.model,name:account.model_account_fiscal_position_tax
msgid "Taxes Fiscal Position"
-msgstr "Steuern Zuordnung"
+msgstr "Steuerzuordnung"
#. module: account
#: report:account.general.ledger:0
@@ -7066,7 +7117,7 @@ msgstr "Umsätze nach Konten und Perioden"
#. module: account
#: model:process.transition,note:account.process_transition_paymentorderbank0
msgid "The payment order is sent to the bank."
-msgstr "Der Zahlungsauftrag wurde an Bank versendet."
+msgstr "Die Zahlungsanweisung wurde der Bank zugesendet."
#. module: account
#: view:account.balance.report:0
@@ -7127,7 +7178,7 @@ msgid "Total:"
msgstr "Summe:"
#. module: account
-#: code:addons/account/account.py:2229
+#: code:addons/account/account.py:2246
#, python-format
msgid ""
"You can specify year, month and date in the name of the model using the "
@@ -7142,11 +7193,11 @@ msgstr ""
"Sie können Jahr, Monat und Datum für die Anwendung dieser Buchungsvorlage "
"als Buchungstext durch folgende Platzhalter definieren:\n"
"\n"
-"%(year)s: Spezifikation für das Jahr \n"
-"%(month)s: Spezifikation für den Monat \n"
-"%(date)s: Spezifikation für das Datum\n"
+"%(year)s: Festlegung des Jahres \n"
+"%(month)s: Festlegung des Monats \n"
+"%(date)s: Festlegung des heutigen Datums\n"
"\n"
-"z.B. Meine Buchungsvorlage am %(date)s"
+"z. B. Meine Buchungsvorlage am %(date)s"
#. module: account
#: help:report.invoice.created,origin:0
@@ -7157,7 +7208,7 @@ msgstr "Belegreferenz für diese Rechnung"
#: field:account.tax.code,child_ids:0
#: field:account.tax.code.template,child_ids:0
msgid "Child Codes"
-msgstr "untergeordnete Codes"
+msgstr "untergeordnete Schlüssel"
#. module: account
#: view:account.tax.template:0
@@ -7165,7 +7216,7 @@ msgid "Taxes used in Sales"
msgstr "Steuern für Verkäufe"
#. module: account
-#: code:addons/account/account_invoice.py:495
+#: code:addons/account/account_invoice.py:504
#: code:addons/account/wizard/account_invoice_refund.py:145
#, python-format
msgid "Data Insufficient !"
@@ -7210,15 +7261,16 @@ msgid ""
"automatically based on these data."
msgstr ""
"Konfigurieren Sie ie Bankkonten des Unternehmens und wählen Sie diejenigen, "
-"die in den Report Fußzeilen erscheinen sollen.\r\n"
+"die in Fußzeilen des Berichts erscheinen sollen.\r\n"
"Sie können die Bankkonten in der Liste sortieren. Wenn Sie die Buchhaltung "
-"von OpenERP einsetzen werden automatisch Journale und Konten generiert."
+"von OpenERP einsetzen werden aus diesen Angaben automatisch Journale und "
+"Konten generiert."
#. module: account
#: model:process.transition,note:account.process_transition_invoicemanually0
msgid "A statement with manual entries becomes a draft statement."
msgstr ""
-"Ein Bankauszug mit händischen Buchungen erhält zunächst den Status Entwurf."
+"Ein Bankauszug mit händischen Buchungen erhält zunächst den Status 'Entwurf'."
#. module: account
#: view:account.aged.trial.balance:0
@@ -7234,21 +7286,21 @@ msgstr ""
"Ihrer Debitoren aufgeteilt in zeitliche Intervalle. Wenn Sie diesen Bericht "
"öffnen, fragt OpenERP nach dem Unternehmen, der Periode und dem "
"Zeitintervall für die Auswertung (in Tagen). OpenERP berechnet dann eine "
-"Tabelle mit Kundensalden nach Perioden. Wenn Sie eine Intervalle von 30 "
-"Tagen eingeben, erzeugt OpenERP eine Auswertung der Salden für den letzten "
-"Monat, vorletzten Monat usw. "
+"Tabelle mit Kundensalden nach Perioden. Wenn Sie ein Intervalle von 30 Tagen "
+"eingeben, erzeugt OpenERP eine Auswertung der Salden für den letzten Monat, "
+"vorletzten Monat usw. "
#. module: account
#: field:account.invoice,origin:0
#: field:report.invoice.created,origin:0
msgid "Source Document"
-msgstr "Herkunftsverweis"
+msgstr "Herkunftsdokument"
#. module: account
-#: code:addons/account/account.py:1432
+#: code:addons/account/account.py:1449
#, python-format
msgid "You can not delete a posted journal entry \"%s\"!"
-msgstr "Sie können keine verbuchten Buchungen löschen \"%s\"!"
+msgstr "Sie können keine quittierten Buchungen löschen \"%s\"!"
#. module: account
#: selection:account.partner.ledger,filter:0
@@ -7266,7 +7318,7 @@ msgstr "Bankauszug Abstimmung"
#. module: account
#: model:ir.model,name:account.model_accounting_report
msgid "Accounting Report"
-msgstr "Report Finanzen"
+msgstr "Finanzbericht"
#. module: account
#: report:account.invoice:0
@@ -7277,8 +7329,8 @@ msgstr "Steuern:"
#: help:account.tax,amount:0
msgid "For taxes of type percentage, enter % ratio between 0-1."
msgstr ""
-"Für Steuern mit dem Typ Prozent, geben Sie einen Wert zwischen 0 - 1 ein, "
-"z.B. 0.19 für 19%"
+"Für Steuern mit dem Typ Prozent, geben Sie einen Wert zwischen 0 - 1 ein, z. "
+"B. 0.19 für 19%"
#. module: account
#: model:ir.actions.act_window,help:account.action_subscription_form
@@ -7289,7 +7341,7 @@ msgid ""
"you can create such entries to automate the postings in the system."
msgstr ""
"Eine wiederkehrende Buchung ist ein Geschäftsvorfall, der in regelmässigen "
-"wiederkehrenden Zeitabständen zu buchen ist, z.B. die Buchungen aus "
+"wiederkehrenden Zeitabständen zu buchen ist, z. B. die Buchungen aus "
"bestimmten Verträgen mit Kunden oder Lieferanten, Mietaufwendungen oder "
"Erträge aus Abonnements. Durch die Definition wiederkehrender Buchungen "
"können Sie dafür sorgen, dass diese Geschäftsvorfälle automatisch gebucht "
@@ -7298,7 +7350,7 @@ msgstr ""
#. module: account
#: model:ir.actions.act_window,name:account.action_account_report_tree_hierarchy
msgid "Financial Reports Hierarchy"
-msgstr "Hierarchische Finanz Reports"
+msgstr "Hierarchie der Finanzberichte"
#. module: account
#: field:account.entries.report,product_uom_id:0
@@ -7329,8 +7381,8 @@ msgid ""
"This date will be used as the invoice date for Refund Invoice and Period "
"will be chosen accordingly!"
msgstr ""
-"Dieses Datum wird genutzt als Rechnungsdatum für eine Gutschrift. Die "
-"Buchungsperiode wird dabei gleichlautend eingetragen."
+"Dieses Datum wird als Belegdatum für eine Gutschrift. Die Buchungsperiode "
+"wird dabei passend gewählt."
#. module: account
#: model:ir.actions.act_window,name:account.act_account_invoice_partner_relation
@@ -7352,7 +7404,7 @@ msgstr "Positionen"
#. module: account
#: view:account.tax.template:0
msgid "Account Tax Template"
-msgstr "Umsatzsteuer Vorlage"
+msgstr "Umsatzsteuer-Vorlage"
#. module: account
#: view:account.journal.select:0
@@ -7365,8 +7417,8 @@ msgid "Are you sure you want to open this invoice ?"
msgstr "Sind Sie sicher, daß Sie diese Rechnung öffnen wollen?"
#. module: account
-#: code:addons/account/account_invoice.py:528
-#: code:addons/account/account_invoice.py:543
+#: code:addons/account/account_invoice.py:537
+#: code:addons/account/account_invoice.py:552
#, python-format
msgid ""
"Can not find a chart of account, you should create one from the "
@@ -7378,10 +7430,10 @@ msgstr ""
#. module: account
#: field:account.chart.template,property_account_expense_opening:0
msgid "Opening Entries Expense Account"
-msgstr "Eröffnungsbilanz Buchungen Aufwandskonto"
+msgstr "Eröffnungsbuchungen des Aufwandskontos"
#. module: account
-#: code:addons/account/account_move_line.py:999
+#: code:addons/account/account_move_line.py:1014
#, python-format
msgid "Accounting Entries"
msgstr "Buchungen"
@@ -7389,7 +7441,7 @@ msgstr "Buchungen"
#. module: account
#: field:account.account.template,parent_id:0
msgid "Parent Account Template"
-msgstr "Basiskonto Vorlage"
+msgstr "Stammkonto Vorlage"
#. module: account
#: model:ir.actions.act_window,name:account.action_account_configuration_installer
@@ -7421,7 +7473,7 @@ msgstr ""
#. module: account
#: view:account.entries.report:0
msgid "Posted entries"
-msgstr "Verbuchte Buchungen"
+msgstr "Quittierte Buchungen"
#. module: account
#: help:account.payment.term.line,value_amount:0
@@ -7444,7 +7496,7 @@ msgstr "Gruppiere nach Rechnungsjahr"
#. module: account
#: help:res.partner,credit:0
msgid "Total amount this customer owes you."
-msgstr "Gesamtschulden eines Kunden"
+msgstr "Gesamtschulden dieses Kunden"
#. module: account
#: model:ir.model,name:account.model_ir_sequence
@@ -7465,7 +7517,7 @@ msgstr "OK"
#. module: account
#: field:account.chart.template,tax_code_root_id:0
msgid "Root Tax Code"
-msgstr "Basis Steuerkonto"
+msgstr "Basis Steuerschlüssel"
#. module: account
#: help:account.journal,centralisation:0
@@ -7485,17 +7537,17 @@ msgstr "Beendet am"
#. module: account
#: model:ir.model,name:account.model_account_bank_statement_line
msgid "Bank Statement Line"
-msgstr "Bankauszug Buchungen"
+msgstr "Positionen auf Bankauszug"
#. module: account
#: field:account.automatic.reconcile,date2:0
msgid "Ending Date"
-msgstr "Ende Datum"
+msgstr "Enddatum"
#. module: account
#: field:wizard.multi.charts.accounts,purchase_tax:0
msgid "Default Purchase Tax"
-msgstr "Standard Steuer Einkauf"
+msgstr "Standard Erwerbssteuer"
#. module: account
#: field:account.chart.template,property_account_income_opening:0
@@ -7518,26 +7570,26 @@ msgstr ""
"Steuerberechnung gebraucht wird."
#. module: account
-#: code:addons/account/account.py:1088
+#: code:addons/account/account.py:1095
#, python-format
msgid "You should have chosen periods that belongs to the same company"
msgstr ""
-"Sie sollten Perioden wählen, die für dieses Unternehmen vorhanden sind"
+"Sie sollten Perioden wählen, die dem gleichen Unternehmen zugeordnet sind"
#. module: account
#: model:ir.actions.act_window,name:account.action_review_payment_terms_installer
msgid "Review your Payment Terms"
-msgstr "Überprüfen Sie Ihre Zahlungskonditionen"
+msgstr "Überprüfen Sie Ihre Zahlungsbedingungen"
#. module: account
#: field:account.fiscalyear.close,report_name:0
msgid "Name of new entries"
-msgstr "Buchungstext"
+msgstr "Text neuer Buchungen"
#. module: account
#: view:account.use.model:0
msgid "Create Entries"
-msgstr "Erstelle Buchungen"
+msgstr "Buchungen anlegen"
#. module: account
#: view:res.partner:0
@@ -7550,8 +7602,8 @@ msgid "Reporting"
msgstr "Berichtswesen"
#. module: account
-#: code:addons/account/account_move_line.py:759
-#: code:addons/account/account_move_line.py:842
+#: code:addons/account/account_move_line.py:775
+#: code:addons/account/account_move_line.py:856
#: 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
@@ -7575,13 +7627,13 @@ msgstr "Kassenabschluss"
#: view:account.journal:0
#: field:res.partner.bank,journal_id:0
msgid "Account Journal"
-msgstr "Journal Konto"
+msgstr "Konto-Journal"
#. module: account
#: model:process.node,name:account.process_node_paidinvoice0
#: model:process.node,name:account.process_node_supplierpaidinvoice0
msgid "Paid invoice"
-msgstr "Rechnung Bezahlt"
+msgstr "Beglichene Rechnung"
#. module: account
#: help:account.partner.reconcile.process,next_partner_id:0
@@ -7590,9 +7642,9 @@ msgid ""
"the system to go through the reconciliation process, based on the latest day "
"it have been reconciled."
msgstr ""
-"Dieses Feld zeigt den nächsten Partner an, der automatisch durch das System "
-"im Rahmen des Ausgleichs offener Posten auf Basis des letztmaligen "
-"Ausgleichs von offenen Posten vorgeschlagen wird."
+"Dieses Feld zeigt automatisch den nächsten Partner an, der im Rahmen des "
+"Ausgleichs offener Posten, auf Basis des letztmaligen Ausgleichs von offenen "
+"Posten, vorgeschlagen wird."
#. module: account
#: field:account.move.line.reconcile.writeoff,comment:0
@@ -7608,13 +7660,13 @@ msgstr "Domain"
#. module: account
#: model:ir.model,name:account.model_account_use_model
msgid "Use model"
-msgstr "Benutze Buchungsvorlage"
+msgstr "Benutze Modellvorlage"
#. module: account
#: code:addons/account/account.py:429
#, python-format
msgid "Unable to adapt the initial balance (negative value)!"
-msgstr "Kann die Anfangsbilanz nicht berechnen (negativer Wert)"
+msgstr "Kann die Anfangsbilanz nicht berechnen (negativer Wert)!"
#. module: account
#: model:ir.actions.act_window,help:account.action_account_moves_purchase
@@ -7645,21 +7697,23 @@ msgstr "Kunden und Lieferanten Gutschriften"
#. module: account
#: field:account.financial.report,sign:0
msgid "Sign on Reports"
-msgstr "Sign On Reports"
+msgstr "Vorzeichen in Berichten"
#. module: account
-#: code:addons/account/wizard/account_fiscalyear_close.py:73
+#: code:addons/account/wizard/account_fiscalyear_close.py:88
#, python-format
msgid "The periods to generate opening entries were not found"
-msgstr "Die Perioden für die Eröffnungsbilanz konnte nicht gefunden werden."
+msgstr ""
+"Die Perioden zur Erstellung der Eröffnungsbilanz konntennicht gefunden "
+"werden."
#. module: account
#: model:account.account.type,name:account.data_account_type_view
msgid "Root/View"
-msgstr "Wurzel/Sicht"
+msgstr "Stamm/Sicht"
#. module: account
-#: code:addons/account/account.py:3121
+#: code:addons/account/account.py:3138
#, python-format
msgid "OPEJ"
msgstr "EB"
@@ -7668,7 +7722,7 @@ msgstr "EB"
#: report:account.invoice:0
#: view:account.invoice:0
msgid "PRO-FORMA"
-msgstr "PRO-FORMA"
+msgstr "PROFORMA"
#. module: account
#: selection:account.entries.report,move_line_state:0
@@ -7694,13 +7748,14 @@ msgid "Optional Information"
msgstr "Informationen (Optional)"
#. module: account
-#: code:addons/account/wizard/account_fiscalyear_close.py:84
+#: code:addons/account/wizard/account_fiscalyear_close.py:100
#, python-format
msgid "The journal must have default credit and debit account"
msgstr "Das Journal benötigt einen Standardwert für Debitor und Kreditor"
#. module: account
#: report:account.general.journal:0
+#: xsl:account.transfer:0
msgid ":"
msgstr ":"
@@ -7727,25 +7782,25 @@ msgstr "Multi-Währung"
#. module: account
#: field:account.model.line,date_maturity:0
msgid "Maturity Date"
-msgstr "Datum Fällig"
+msgstr "Fälligkeitsdatum"
#. module: account
-#: code:addons/account/account_move_line.py:1302
+#: code:addons/account/account_move_line.py:1317
#, python-format
msgid "Bad account !"
msgstr "Falsches Konto!"
#. module: account
-#: code:addons/account/account.py:3108
+#: code:addons/account/account.py:3125
#, python-format
msgid "Sales Journal"
-msgstr "Journal Verkauf"
+msgstr "Verkaufs-Journal"
#. module: account
#: code:addons/account/wizard/account_move_journal.py:104
#, python-format
msgid "Open Journal Items !"
-msgstr "Öffne Journalbuchungen"
+msgstr "Öffne Journalbuchungen!"
#. module: account
#: model:ir.model,name:account.model_account_invoice_tax
@@ -7753,7 +7808,7 @@ msgid "Invoice Tax"
msgstr "Umsatzsteuer"
#. module: account
-#: code:addons/account/account_move_line.py:1277
+#: code:addons/account/account_move_line.py:1292
#, python-format
msgid "No piece number !"
msgstr "Keine Stückzahl!"
@@ -7762,7 +7817,7 @@ msgstr "Keine Stückzahl!"
#: view:account.financial.report:0
#: model:ir.ui.menu,name:account.menu_account_report_tree_hierarchy
msgid "Account Reports Hierarchy"
-msgstr "Konten Report Hierarchie"
+msgstr "Bericht der Konten-Hierarchie"
#. module: account
#: help:account.account.template,chart_template_id:0
@@ -7774,22 +7829,21 @@ msgid ""
"common to both several times)."
msgstr ""
"Dieses wahlfreie Feld ermöglicht Ihnen eine Konten-Vorlage von einer "
-"Kontenplan-Vorlage abzuleiten, wobei sich die Konten des vom Stamm-"
-"Kontenplan unterscheiden können. So können Sie eine Kontenplan-Vorlage "
-"festlegen, die eine Andere, ggf. auch nur geringfügig, erweitert. (Sie "
-"brauchen also nicht die beiden gemeinsamen Strukturen mehrfach zu "
-"definieren)."
+"Kontenplan-Vorlage abzuleiten, wobei sich die Konten vom Stamm-Kontenplan "
+"unterscheiden können. So können Sie eine Kontenplan-Vorlage festlegen, die "
+"eine Andere, ggf. auch nur geringfügig, erweitert. (Sie brauchen also nicht "
+"die beiden gemeinsamen Strukturen mehrfach zu definieren)."
#. module: account
#: view:account.move:0
msgid "Unposted Journal Entries"
-msgstr "Nicht verbuchte Buchungen"
+msgstr "Nicht Quittierte Buchungen"
#. module: account
#: view:product.product:0
#: view:product.template:0
msgid "Sales Properties"
-msgstr "Verkauf Eigenschaften"
+msgstr "Verkaufseinstellungen"
#. module: account
#: model:ir.ui.menu,name:account.menu_manual_reconcile
@@ -7799,7 +7853,7 @@ msgstr "Manueller Kontenausgleich"
#. module: account
#: report:account.overdue:0
msgid "Total amount due:"
-msgstr "Gesamtbetrag fällig:"
+msgstr "Fälliger Gesamtbetrag:"
#. module: account
#: field:account.analytic.chart,to_date:0
@@ -7809,7 +7863,7 @@ msgstr "An"
#. module: account
#: selection:account.move.line,centralisation:0
-#: code:addons/account/account.py:1518
+#: code:addons/account/account.py:1535
#, python-format
msgid "Currency Adjustment"
msgstr "Währungsanpassung"
@@ -7863,18 +7917,20 @@ msgstr "Mai"
#: selection:account.common.partner.report,result_selection:0
#: selection:account.partner.balance,result_selection:0
#: selection:account.partner.ledger,result_selection:0
+#: code:addons/account/report/account_aged_partner_balance.py:374
#: code:addons/account/report/account_partner_balance.py:299
+#: code:addons/account/report/account_partner_ledger.py:396
#, python-format
msgid "Payable Accounts"
msgstr "Kreditorenkonten"
#. module: account
-#: code:addons/account/account_invoice.py:732
+#: code:addons/account/account_invoice.py:741
#, python-format
msgid "Global taxes defined, but they are not in invoice lines !"
msgstr ""
-"Allgemeine Steuern wurden definiert, aber befinden sich nicht auf "
-"Rechnungszeilenebene!"
+"Allgemeine Steuern wurden definiert, aber in den Rechnungspositionensind "
+"keine aufgeführt!"
#. module: account
#: model:ir.model,name:account.model_account_chart_template
@@ -7897,17 +7953,17 @@ msgstr "Steuercode Nummer"
#. module: account
#: view:validate.account.move:0
msgid "Post Journal Entries of a Journal"
-msgstr "Erzeuge Buchungen in Journal"
+msgstr "Buchungen eines Journals quittieren"
#. module: account
#: view:product.product:0
msgid "Sale Taxes"
-msgstr "Steuern Verkauf"
+msgstr "Verkaufssteuern"
#. module: account
#: field:account.financial.report,name:0
msgid "Report Name"
-msgstr "Report Bezeichnung"
+msgstr "Berichtsbezeichnung"
#. module: account
#: model:account.account.type,name:account.data_account_type_cash
@@ -7915,38 +7971,38 @@ msgstr "Report Bezeichnung"
#: selection:account.bank.accounts.wizard,account_type:0
#: selection:account.entries.report,type:0
#: selection:account.journal,type:0
-#: code:addons/account/account.py:3003
+#: code:addons/account/account.py:3020
#, python-format
msgid "Cash"
-msgstr "Kasse"
+msgstr "Barkasse"
#. 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 "Konto Zuordnung"
-
-#. module: account
-#: code:addons/account/account.py:1431
-#: code:addons/account/account.py:1460
-#: code:addons/account/account.py:1467
-#: code:addons/account/account_invoice.py:920
-#: code:addons/account/account_move_line.py:1104
-#: code:addons/account/wizard/account_automatic_reconcile.py:152
-#: code:addons/account/wizard/account_fiscalyear_close.py:73
-#: code:addons/account/wizard/account_fiscalyear_close.py:83
-#: code:addons/account/wizard/account_fiscalyear_close.py:86
+msgstr "Kontozuordnung"
+
+#. module: account
+#: code:addons/account/account.py:1448
+#: code:addons/account/account.py:1477
+#: code:addons/account/account.py:1484
+#: code:addons/account/account_invoice.py:931
+#: code:addons/account/account_move_line.py:1119
+#: 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_move_journal.py:165
#: 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 "UserError"
-msgstr "BenutzerFehler"
+msgstr "UserError"
#. module: account
#: model:process.node,note:account.process_node_supplierpaymentorder0
msgid "Payment of invoices"
-msgstr "Zahlung von Eingangsrechnungen"
+msgstr "Ausgleich von Eingangsrechnungen"
#. module: account
#: field:account.bank.statement.line,sequence:0
@@ -7976,7 +8032,7 @@ msgstr "Optionale Menge in Buchungen"
#. module: account
#: view:account.financial.report:0
msgid "Parent Report"
-msgstr "Übergeordneter Report"
+msgstr "Übergeordneter Bericht"
#. module: account
#: view:account.state.open:0
@@ -7991,7 +8047,7 @@ msgstr "Verkauf nach Kontotyp"
#. module: account
#: help:account.invoice,move_id:0
msgid "Link to the automatically generated Journal Items."
-msgstr "Verlinke mit automatisch generierten Buchungen"
+msgstr "Verweis auf automatisch generierte Buchungen"
#. module: account
#: selection:account.installer,period:0
@@ -8047,12 +8103,12 @@ msgstr ""
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_legal_statement
msgid "Legal Reports"
-msgstr "Offizielle Auswertungen"
+msgstr "Offizielle Finanzberichte"
#. module: account
#: field:account.tax.code,sum_period:0
msgid "Period Sum"
-msgstr "Summe Periode"
+msgstr "Periodensumme"
#. module: account
#: help:account.tax,sequence:0
@@ -8061,15 +8117,15 @@ msgid ""
"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 ""
-"Des Feld \"Reihenfolge\" wird benutzt, um die Steuerzeilen aufsteigend zu "
-"sortieren. Die Reihenfolge ist dann von Bedeutung, wenn es eine Steuerart "
-"mit mehreren Steuersätzen gibt. In diesem Fall ist die Reihenfolge für die "
-"Auswahl entscheidend."
+"Des Feld \"Reihenfolge\" (Sequenz) wird benutzt, um die Steuerzeilen "
+"aufsteigend zu sortieren. Die Reihenfolge ist dann von Bedeutung, wenn es "
+"eine Steuerart mit mehreren Steuersätzen gibt. In diesem Fall ist die "
+"Reihenfolge für die Auswahl entscheidend."
#. module: account
#: model:ir.model,name:account.model_account_cashbox_line
msgid "CashBox Line"
-msgstr "Barkasse Buchungen"
+msgstr "Barkassenbuchung"
#. module: account
#: view:account.partner.ledger:0
@@ -8084,7 +8140,7 @@ msgstr "Partner Kontoauszug"
#. module: account
#: selection:account.tax.template,type:0
msgid "Fixed"
-msgstr "Fest"
+msgstr "Fix"
#. module: account
#: code:addons/account/account.py:629
@@ -8092,32 +8148,33 @@ msgstr "Fest"
#: code:addons/account/account.py:645
#: code:addons/account/account.py:664
#: code:addons/account/account.py:787
-#: code:addons/account/account.py:1077
-#: code:addons/account/account_invoice.py:732
-#: code:addons/account/account_invoice.py:735
-#: code:addons/account/account_invoice.py:738
+#: code:addons/account/account.py:1082
+#: code:addons/account/account_invoice.py:741
+#: code:addons/account/account_invoice.py:744
+#: code:addons/account/account_invoice.py:747
#: code:addons/account/account_move_line.py:97
-#: code:addons/account/account_move_line.py:750
-#: code:addons/account/account_move_line.py:803
+#: code:addons/account/account_move_line.py:766
+#: code:addons/account/account_move_line.py:819
+#: code:addons/account/wizard/account_fiscalyear_close.py:62
#, python-format
msgid "Warning !"
-msgstr "Warnung"
+msgstr "Warnung!"
#. module: account
#: field:account.entries.report,move_line_state:0
msgid "State of Move Line"
-msgstr "Status Buchungszeile"
+msgstr "Status der Buchung"
#. module: account
#: model:ir.model,name:account.model_account_move_line_reconcile
msgid "Account move line reconcile"
-msgstr "Storno Buchung"
+msgstr "Ausgleich der Buchung"
#. module: account
#: view:account.subscription.generate:0
#: model:ir.model,name:account.model_account_subscription_generate
msgid "Subscription Compute"
-msgstr "Wiederkehrende Buchungen"
+msgstr "Wiederkehrende Buchungen berechnen"
#. module: account
#: field:account.bank.statement.line,partner_id:0
@@ -8150,7 +8207,7 @@ msgid "Select a currency to apply on the invoice"
msgstr "Wähle eine Währung für diese Rechnung"
#. module: account
-#: code:addons/account/account.py:3446
+#: code:addons/account/account.py:3463
#, python-format
msgid ""
"The bank account defined on the selected chart of accounts hasn't a code."
@@ -8160,18 +8217,18 @@ msgstr "Das Bankkonto in der ausgewählten Vorlage hat keinen Code"
#: code:addons/account/wizard/account_invoice_refund.py:108
#, python-format
msgid "Can not %s draft/proforma/cancel invoice."
-msgstr "Kann Entwurf/ProForma/Storno für Rechnung %s nicht durchführen"
+msgstr "Kann Entwurf/Proforma/Storno für Rechnung %s nicht durchführen"
#. module: account
-#: code:addons/account/account_invoice.py:810
+#: code:addons/account/account_invoice.py:821
#, python-format
msgid "No Invoice Lines !"
-msgstr "Keine Rechnungszeilen !"
+msgstr "Keine Rechnungspositionen!"
#. module: account
#: view:account.financial.report:0
msgid "Report Type"
-msgstr "Report Type"
+msgstr "Berichtsart"
#. module: account
#: view:account.analytic.account:0
@@ -8200,8 +8257,8 @@ msgid ""
"Select Fiscal Year which you want to remove entries for its End of year "
"entries journal"
msgstr ""
-"Wähle das abzuschliessende Geschäftsjahr für die Buchung in das definierte "
-"Journal für den Jahresabschluss"
+"Wähle das Geschäftsjahr aus dessen Jahres-Abschlussbericht und dessen "
+"Abschluss-Salden entfernt werden sollen"
#. module: account
#: field:account.tax.template,type_tax_use:0
@@ -8248,10 +8305,10 @@ msgid "Deferral Method"
msgstr "Abgrenzung Jahreswechsel"
#. module: account
-#: code:addons/account/account_invoice.py:379
+#: code:addons/account/account_invoice.py:388
#, python-format
msgid "Invoice '%s' is paid."
-msgstr "Rechnung '%s' wurde bezahlt."
+msgstr "Rechnung '%s' wurde beglichen."
#. module: account
#: model:process.node,note:account.process_node_electronicfile0
@@ -8261,7 +8318,7 @@ msgstr "Automatische Buchung"
#. module: account
#: constraint:account.tax.code.template:0
msgid "Error ! You can not create recursive Tax Codes."
-msgstr "Fehler! Sie können keine rekursiven Umsatzsteuern definieren"
+msgstr "Fehler! Sie können keine rekursiven Steuern definieren"
#. module: account
#: help:account.journal,group_invoice_lines:0
@@ -8313,7 +8370,7 @@ msgid "Associated Partner"
msgstr "Zugehöriger Partner"
#. module: account
-#: code:addons/account/account_invoice.py:1332
+#: code:addons/account/account_invoice.py:1345
#, python-format
msgid "You must first select a partner !"
msgstr "Sie müssen zuerst einen Partner wählen!"
@@ -8370,13 +8427,13 @@ msgstr ""
"zugeordneten Steuerschlüsseln für die Umsatzsteuererklärung in Ihrem Land."
#. module: account
-#: code:addons/account/account_invoice.py:428
+#: code:addons/account/account_invoice.py:437
#, python-format
msgid ""
"Can not find a chart of accounts for this company, you should create one."
msgstr ""
"Kann keinen Kontenplan für dieses Unternehmen finden. Sie müssen einen "
-"anlagen!"
+"anlegen!"
#. module: account
#: view:account.invoice:0
@@ -8394,16 +8451,16 @@ msgid "Choose Fiscal Year"
msgstr "Wähle Geschäftsjahr"
#. module: account
-#: code:addons/account/account.py:3111
+#: code:addons/account/account.py:3128
#, python-format
msgid "Purchase Refund Journal"
-msgstr "Journal Gutschriften Eingangsrechnungen"
+msgstr "Journal zu Gutschriften aus Eingangsrechnungen"
#. module: account
#: help:account.tax.template,amount:0
msgid "For Tax Type percent enter % ratio between 0-1."
msgstr ""
-"Für den Typ Prozent erfassen Sie einen Wert zwischen 0 und 1, z.B. 0.19 für "
+"Für den Typ Prozent erfassen Sie einen Wert zwischen 0 und 1, z. B. 0.19 für "
"19%"
#. module: account
@@ -8414,7 +8471,7 @@ msgstr "aktuelle Konten"
#. module: account
#: view:account.invoice.report:0
msgid "Group by Invoice Date"
-msgstr "Gruppiert je Rechnungsdatum"
+msgstr "Gruppiert nach Rechnungsdatum"
#. module: account
#: view:account.invoice.refund:0
@@ -8456,8 +8513,8 @@ msgid ""
"Total amount (in Company currency) for transactions held in secondary "
"currency for this account."
msgstr ""
-"Gesamtbetrag in Unternehmenswährung für Buchungen in der 2.Währung des "
-"Kontos"
+"Gesamtbetrag in Unternehmenswährung für Buchungen in der Alternativwährung "
+"des Kontos"
#. module: account
#: report:account.invoice:0
@@ -8488,13 +8545,13 @@ msgid "Compute Code for Taxes Included Prices"
msgstr "Berechnungsgrundlage (inkl. Steuer)"
#. module: account
-#: code:addons/account/account_invoice.py:1030
+#: code:addons/account/account_invoice.py:1042
#, python-format
msgid ""
"You can not cancel an invoice which is partially paid! You need to "
"unreconcile related payment entries first!"
msgstr ""
-"Sie können eine teilbezahlte Rechnungen nicht stornieren! Sie müssen der OP-"
+"Sie können eine angezahlte Rechnungen nicht stornieren! Sie müssen der OP-"
"Ausgleich der Zahlung zuerst rückgängig machen."
#. module: account
@@ -8511,17 +8568,17 @@ msgstr "korrigierter Saldo"
#: 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 "Steuerzuordnung Vorlage"
+msgstr "Vorlage zum Finanzbericht"
#. module: account
#: view:account.entries.report:0
msgid "Int.Type"
-msgstr "Int. Typ"
+msgstr "Int. Art"
#. module: account
#: field:account.move.line,tax_amount:0
msgid "Tax/Base Amount"
-msgstr "Betrag für Steuerberechnung"
+msgstr "Grundbetrag für Steuerberechnung"
#. module: account
#: view:account.payment.term.line:0
@@ -8568,7 +8625,7 @@ msgstr "Tel.:"
#. module: account
#: field:account.account,company_currency_id:0
msgid "Company Currency"
-msgstr "Betriebl. Währung"
+msgstr "Unternehmenswährung"
#. module: account
#: field:account.aged.trial.balance,chart_account_id:0
@@ -8632,7 +8689,7 @@ msgid "current month"
msgstr "laufender Monat"
#. module: account
-#: code:addons/account/account.py:1052
+#: code:addons/account/account.py:1057
#, python-format
msgid ""
"No period defined for this date: %s !\n"
@@ -8681,7 +8738,7 @@ msgstr " Betrag: NV"
#: model:process.node,name:account.process_node_supplierreconciliation0
#, python-format
msgid "Reconciliation"
-msgstr "Ausgleichen Offene Posten"
+msgstr "Ausgleichen offener Posten"
#. module: account
#: view:account.chart.template:0
@@ -8718,6 +8775,7 @@ msgstr "Journal Gutschriften"
#. module: account
#: report:account.account.balance:0
#: report:account.central.journal:0
+#: report:account.financial.report:0
#: report:account.general.journal:0
#: report:account.general.ledger:0
#: report:account.general.ledger_landscape:0
@@ -8761,7 +8819,7 @@ msgid "The partner account used for this invoice."
msgstr "Partner Finanzkonto dieser Rechnung."
#. module: account
-#: code:addons/account/account.py:3296
+#: code:addons/account/account.py:3313
#, python-format
msgid "Tax %.2f%%"
msgstr "Steuer %.2f%%"
@@ -8784,16 +8842,15 @@ msgid "Payment Term Line"
msgstr "Zahlungsbedingungen"
#. module: account
-#: code:addons/account/account.py:3109
+#: code:addons/account/account.py:3126
#, python-format
msgid "Purchase Journal"
-msgstr "Journal Einkauf"
+msgstr "Einkaufs-Journal"
#. module: account
#: view:account.invoice.refund:0
msgid "Refund Invoice: Creates the refund invoice, ready for editing."
-msgstr ""
-"Gutschrift Rechnung: Generiert eine Gutschrift mit Bearbeitungsmöglichkeit"
+msgstr "Rechnungsgutschrift: Legt eine Gutschrift zur Weiterbearbeitung an."
#. module: account
#: field:account.invoice.line,price_subtotal:0
@@ -8803,7 +8860,7 @@ msgstr "Zwischensumme"
#. module: account
#: view:account.vat.declaration:0
msgid "Print Tax Statement"
-msgstr "Drucke Auswertung Umsatzsteuer"
+msgstr "Drucke Umsatzsteueranmeldung"
#. module: account
#: view:account.model.line:0
@@ -8828,12 +8885,12 @@ msgstr "Lieferanten"
#. module: account
#: view:account.journal:0
msgid "Accounts Type Allowed (empty for no control)"
-msgstr "zugelassene Kontotypen (leer = alle)"
+msgstr "zugelassene Kontoarten (leer = alle)"
#. module: account
#: view:res.partner:0
msgid "Supplier Accounting Properties"
-msgstr "Kreditoren Eigenschaften"
+msgstr "Kreditoren-Eigenschaften"
#. module: account
#: help:account.move.line,amount_residual:0
@@ -8858,7 +8915,7 @@ msgstr "Von"
#. module: account
#: model:ir.model,name:account.model_account_fiscalyear_close
msgid "Fiscalyear Close"
-msgstr "Geschäftsjahr beenden"
+msgstr "Geschäftsjahr abschließen"
#. module: account
#: sql_constraint:account.account:0
@@ -8872,10 +8929,10 @@ msgid "Unpaid Invoices"
msgstr "Offene Rechnungen"
#. module: account
-#: code:addons/account/account_invoice.py:495
+#: code:addons/account/account_invoice.py:504
#, python-format
msgid "The payment term of supplier does not have a payment term line!"
-msgstr "Die Zahlungskonditionen des Lieferanten haben keine Zeilen!"
+msgstr "Die Zahlungsbedingungen des Lieferanten enthalten keine Positionen!"
#. module: account
#: field:account.move.line.reconcile,debit:0
@@ -8940,7 +8997,7 @@ msgstr "Journal Bezeichnung"
#. module: account
#: view:account.move.line:0
msgid "Next Partner Entries to reconcile"
-msgstr "Op-Ausgleich des nächsten Partners"
+msgstr "OP-Ausgleich des nächsten Partners"
#. module: account
#: selection:account.financial.report,style_overwrite:0
@@ -8958,7 +9015,7 @@ msgid ""
"Unique number of the invoice, computed automatically when the invoice is "
"created."
msgstr ""
-"Einheitliche Rechnungsnummer, automatisch ermittelt bei der Erzeugung der "
+"Eindeutige Rechnungsnummer, automatisch ermittelt bei der Erzeugung der "
"Rechnung."
#. module: account
@@ -8982,10 +9039,10 @@ msgid "Keep empty for all open fiscal years"
msgstr "Frei lassen für alle offenen Geschäftsjahre"
#. module: account
-#: code:addons/account/account_move_line.py:1105
+#: code:addons/account/account_move_line.py:1120
#, python-format
msgid "The account move (%s) for centralisation has been confirmed!"
-msgstr "Die Buchungszeile (%s)"
+msgstr "Die Buchung (%s) wurde zur Sammlung/Zentralisierung genehmigt!"
#. module: account
#: help:account.move.line,amount_currency:0
@@ -8993,11 +9050,11 @@ msgid ""
"The amount expressed in an optional other currency if it is a multi-currency "
"entry."
msgstr ""
-"Der Betrag in Fremdwährung, wenn es sich um eine Mulit-Währungsbuchung "
+"Der Betrag in Fremdwährung, wenn es sich um eine Fremd-Währungsbuchung "
"handelt"
#. module: account
-#: code:addons/account/account.py:1307
+#: code:addons/account/account.py:1315
#, python-format
msgid ""
"You can not validate a non-balanced entry !\n"
@@ -9047,7 +9104,7 @@ msgstr "Erzeugt Sequenz für Anzeige der Bankdetails bei Buchungen"
#. module: account
#: model:process.transition,note:account.process_transition_validentries0
msgid "Accountant validates the accounting entries coming from the invoice."
-msgstr "Ein Buchhalter verbucht die Buchungssätze einer Rechnung"
+msgstr "Ein Buchhalter quittiert die Buchungssätze einer Rechnung"
#. module: account
#: model:ir.actions.act_window,help:account.action_account_fiscalyear_form
@@ -9077,15 +9134,15 @@ msgstr ""
#: view:account.entries.report:0
#: model:ir.actions.act_window,name:account.act_account_acount_move_line_reconcile_open
msgid "Reconciled entries"
-msgstr "Auszugleichende Buchungsposten"
+msgstr "Auszugleichende Buchungen"
#. module: account
#: field:account.invoice,address_contact_id:0
msgid "Contact Address"
-msgstr "Kontakt Adresse"
+msgstr "Kontaktadresse"
#. module: account
-#: code:addons/account/account.py:2256
+#: code:addons/account/account.py:2273
#, python-format
msgid "Wrong model !"
msgstr "Falsches Modell!"
@@ -9098,7 +9155,7 @@ msgstr "Erzwinge Periode"
#. module: account
#: model:ir.model,name:account.model_account_partner_balance
msgid "Print Account Partner Balance"
-msgstr "Drucke Partner Saldenliste"
+msgstr "Drucke Partner-Saldenliste"
#. module: account
#: help:account.financial.report,sign:0
@@ -9109,7 +9166,7 @@ msgid ""
"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 ""
-"Für Salden die mit umgekehrten Vorzeichen gedruckt werden sollen. zB "
+"Für Salden die mit umgekehrten Vorzeichen gedruckt werden sollen. z. B. "
"Aufwandskonten negativ, Ertragskonten positiv."
#. module: account
@@ -9122,12 +9179,14 @@ msgstr "Verträge"
#: field:account.cashbox.line,starting_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 "unbekannt"
#. module: account
#: field:account.fiscalyear.close,journal_id:0
-#: code:addons/account/account.py:3113
+#: code:addons/account/account.py:3130
#, python-format
msgid "Opening Entries Journal"
msgstr "Start Buchungsjournal"
@@ -9150,10 +9209,10 @@ msgstr ""
"wird durch die Auswertung Gewinn & Verlust generiert."
#. module: account
-#: code:addons/account/account_invoice.py:808
+#: code:addons/account/account_invoice.py:819
#, python-format
msgid "Please define sequence on the journal related to this invoice."
-msgstr "BItte definieren Sie Sequenzen für das Journal dieser Rechnung."
+msgstr "Bitte legen Sie Sequenzen für das Journal dieser Rechnung fest."
#. module: account
#: view:account.move:0
@@ -9180,8 +9239,8 @@ msgid ""
"Set if the tax computation is based on the computation of child taxes rather "
"than on the total amount."
msgstr ""
-"Aktivieren, wenn die Steuerberechnung auf die untergeordneten Steuern beruht "
-"und nicht auf dem Gesamtbetrag"
+"Aktivieren, wenn die Steuerberechnung auf untergeordneten Steuern beruht und "
+"nicht auf dem Gesamtbetrag"
#. module: account
#: selection:account.tax,applicable_type:0
@@ -9241,7 +9300,7 @@ msgid "Period from"
msgstr "Gültig ab"
#. module: account
-#: code:addons/account/account.py:3110
+#: code:addons/account/account.py:3127
#, python-format
msgid "Sales Refund Journal"
msgstr "Gutschriften Ausgangsrechnungen Journal"
@@ -9288,10 +9347,10 @@ msgid "Purchase Tax(%)"
msgstr "Steuer Einkauf (%)"
#. module: account
-#: code:addons/account/account_invoice.py:810
+#: code:addons/account/account_invoice.py:821
#, python-format
msgid "Please create some invoice lines."
-msgstr "Bitte erstellen Sie einige Rechnungspositionen"
+msgstr "Bitte erstellen Sie Rechnungspositionen"
#. module: account
#: report:account.overdue:0
@@ -9304,7 +9363,7 @@ msgid "Display Detail"
msgstr "Zeige Detail"
#. module: account
-#: code:addons/account/account.py:3118
+#: code:addons/account/account.py:3135
#, python-format
msgid "SCNJ"
msgstr "GSV"
@@ -9343,8 +9402,6 @@ msgstr "Ende der Periode"
#: 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.actions.act_window,name:account.action_account_report_bs
-#: model:ir.actions.act_window,name:account.action_account_report_pl
#: model:ir.ui.menu,name:account.menu_account_reports
msgid "Financial Reports"
msgstr "Finanz Reports"
@@ -9359,6 +9416,7 @@ msgstr "Finanz Reports"
#: 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.financial.report:0
#: report:account.general.journal:0
#: field:account.general.journal,period_from:0
#: report:account.general.ledger:0
@@ -9379,6 +9437,7 @@ msgstr "Start Periode"
#. module: account
#: field:account.aged.trial.balance,direction_selection:0
+#: report:account.aged_trial_balance:0
msgid "Analysis Direction"
msgstr "Analysezeitraum"
@@ -9398,7 +9457,7 @@ msgstr "Ansicht Journal"
#. module: account
#: view:account.move.line:0
-#: code:addons/account/account_move_line.py:1046
+#: code:addons/account/account_move_line.py:1061
#, python-format
msgid "Total credit"
msgstr "Gesamt Haben"
@@ -9412,7 +9471,7 @@ msgstr ""
#. module: account
#: report:account.overdue:0
msgid "Best regards."
-msgstr "Beste Grüsse."
+msgstr "Mit freundlichen Grüssen."
#. module: account
#: view:account.invoice:0
@@ -9470,6 +9529,7 @@ msgstr "Bankauszüge"
#: report:account.analytic.account.inverted.balance:0
#: report:account.central.journal:0
#: field:account.entries.report,balance:0
+#: report:account.financial.report:0
#: report:account.general.journal:0
#: report:account.general.ledger:0
#: report:account.general.ledger_landscape:0
@@ -9552,7 +9612,7 @@ msgstr ""
"Debitorenkonto."
#. module: account
-#: code:addons/account/wizard/account_automatic_reconcile.py:152
+#: code:addons/account/wizard/account_automatic_reconcile.py:148
#, python-format
msgid "You must select accounts to reconcile"
msgstr "Bitte Konten zum Ausgleich auswählen"
@@ -9585,7 +9645,7 @@ msgstr ""
#: report:account.third_party_ledger:0
#: report:account.third_party_ledger_other:0
msgid "Filters By"
-msgstr "Filter nch"
+msgstr "Filter nach"
#. module: account
#: model:process.node,note:account.process_node_manually0
@@ -9604,10 +9664,10 @@ msgid "Move"
msgstr "Buchung"
#. module: account
-#: code:addons/account/account_move_line.py:1153
+#: code:addons/account/account_move_line.py:1168
#, python-format
msgid "You can not change the tax, you should remove and recreate lines !"
-msgstr "Die Steuer kann nicht verändert werden. Löschen und Neuerstellen."
+msgstr "Die Steuer kann nicht verändert werden. Löschen und Neuerstellen!"
#. module: account
#: view:analytic.entries.report:0
@@ -9664,7 +9724,7 @@ msgid "Consolidated Children"
msgstr "Konsolidierte Konten"
#. module: account
-#: code:addons/account/wizard/account_fiscalyear_close.py:87
+#: code:addons/account/wizard/account_fiscalyear_close.py:103
#, python-format
msgid ""
"The journal must have centralised counterpart without the Skipping draft "
@@ -9729,6 +9789,7 @@ msgstr ""
#: 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.financial.report:0
#: report:account.general.journal:0
#: field:account.general.journal,period_to:0
#: report:account.general.ledger:0
@@ -9750,7 +9811,7 @@ msgstr "Ende der Periode"
#. module: account
#: field:account.move.line,date_maturity:0
msgid "Due date"
-msgstr "Datum fällig"
+msgstr "Fälligkeitsdatum"
#. module: account
#: view:account.move.journal:0
@@ -9771,7 +9832,7 @@ msgstr ""
"\"Einkauf\" für Lieferantenrechnungsjournale\r\n"
"\"Kassa\" oder \"Bank\" für Kunden und Lieferantenzahlungen\r\n"
"\"Allgemein\" für alles andere.\r\n"
-"\"Eröffnung/Schluss Buchungen\" für Buchungen des Jahresabschlusses"
+"\"Eröffnungs-/Schluss-Buchungen\" für Buchungen des Jahresabschlusses"
#. module: account
#: model:ir.model,name:account.model_account_subscription
@@ -9781,7 +9842,7 @@ msgstr "Konto Automatische Buchung"
#. module: account
#: report:account.overdue:0
msgid "Maturity date"
-msgstr "Datum Fällig"
+msgstr "Fälligkeitsdatum"
#. module: account
#: view:account.subscription:0
@@ -9791,6 +9852,7 @@ msgstr "Eingabe automat. Buchung"
#. module: account
#: report:account.account.balance:0
#: field:account.aged.trial.balance,date_from:0
+#: report:account.aged_trial_balance:0
#: field:account.balance.report,date_from:0
#: report:account.central.journal:0
#: field:account.central.journal,date_from:0
@@ -9798,6 +9860,7 @@ msgstr "Eingabe automat. Buchung"
#: field:account.common.journal.report,date_from:0
#: field:account.common.partner.report,date_from:0
#: field:account.common.report,date_from:0
+#: report:account.financial.report:0
#: field:account.fiscalyear,date_start:0
#: report:account.general.journal:0
#: field:account.general.journal,date_from:0
@@ -9816,7 +9879,7 @@ msgstr "Eingabe automat. Buchung"
#: field:accounting.report,date_from:0
#: field:accounting.report,date_from_cmp:0
msgid "Start Date"
-msgstr "Start Datum"
+msgstr "Anfangsdatum"
#. module: account
#: help:account.invoice,reconciled:0
@@ -9832,17 +9895,17 @@ msgstr ""
#: view:account.invoice.report:0
#: model:process.node,name:account.process_node_supplierdraftinvoices0
msgid "Draft Invoices"
-msgstr "Entwurf Rechnungen"
+msgstr "Rechnungsentwürfe"
#. module: account
#: selection:account.account.type,close_method:0
#: view:account.entries.report:0
#: view:account.move.line:0
msgid "Unreconciled"
-msgstr "Offene Posten"
+msgstr "Nicht beglichen"
#. module: account
-#: code:addons/account/account_invoice.py:828
+#: code:addons/account/account_invoice.py:839
#, python-format
msgid "Bad total !"
msgstr "Falsche Summe!"
@@ -9850,7 +9913,7 @@ msgstr "Falsche Summe!"
#. module: account
#: field:account.journal,sequence_id:0
msgid "Entry Sequence"
-msgstr "Eingabe Sequenz"
+msgstr "Eingabereihenfolge"
#. module: account
#: model:ir.actions.act_window,help:account.action_account_period_tree
@@ -9910,7 +9973,7 @@ msgid "Comparison"
msgstr "Vergleich"
#. module: account
-#: code:addons/account/account_invoice.py:372
+#: code:addons/account/account_invoice.py:381
#, python-format
msgid "Unknown Error"
msgstr "Unbekannter Fehler"
@@ -9927,7 +9990,7 @@ msgstr ""
#. module: account
#: field:account.period,special:0
msgid "Opening/Closing Period"
-msgstr "Eröffnungs- / Abschlussperiode"
+msgstr "Eröffnungs-/Abschlussperiode"
#. module: account
#: field:account.account,currency_id:0
@@ -9939,7 +10002,7 @@ msgstr "Alternative Währung"
#. module: account
#: model:ir.model,name:account.model_validate_account_move
msgid "Validate Account Move"
-msgstr "Buchen"
+msgstr "Buchung quittieren"
#. module: account
#: field:account.account,credit:0
@@ -9949,6 +10012,7 @@ msgstr "Buchen"
#: report:account.analytic.account.inverted.balance:0
#: report:account.central.journal:0
#: field:account.entries.report,credit:0
+#: report:account.financial.report:0
#: report:account.general.journal:0
#: report:account.general.ledger:0
#: report:account.general.ledger_landscape:0
@@ -10056,16 +10120,18 @@ msgstr "Analytische Buchungen der letzten 30 Tage"
#: view:accounting.report:0
#: selection:accounting.report,filter:0
#: selection:accounting.report,filter_cmp:0
+#: code:addons/account/report/common_report_header.py:99
#: model:ir.actions.act_window,name:account.action_account_period_form
#: model:ir.ui.menu,name:account.menu_action_account_period_form
#: model:ir.ui.menu,name:account.next_id_23
+#, python-format
msgid "Periods"
msgstr "Perioden"
#. module: account
#: field:account.invoice.report,currency_rate:0
msgid "Currency Rate"
-msgstr "Wechsellkurs"
+msgstr "Wechselkurs"
#. module: account
#: view:account.account:0
@@ -10191,14 +10257,14 @@ msgstr "Kontotyp"
#. module: account
#: model:ir.actions.act_window,name:account.action_subscription_form_running
msgid "Running Subscriptions"
-msgstr "Entwurf"
+msgstr "Laufende Abbonnements"
#. module: account
#: view:report.account.sales:0
#: view:report.account_type.sales:0
#: view:report.hr.timesheet.invoice.journal:0
msgid "This Month"
-msgstr "Dieser Monat"
+msgstr "Diesen Monat"
#. module: account
#: view:account.analytic.balance:0
@@ -10216,7 +10282,7 @@ msgstr "Periode auswählen"
#: selection:account.move,state:0
#: view:account.move.line:0
msgid "Posted"
-msgstr "Gebucht"
+msgstr "Quittiert"
#. module: account
#: report:account.account.balance:0
@@ -10228,6 +10294,7 @@ msgstr "Gebucht"
#: field:account.common.journal.report,date_to:0
#: field:account.common.partner.report,date_to:0
#: field:account.common.report,date_to:0
+#: report:account.financial.report:0
#: field:account.fiscalyear,date_stop:0
#: report:account.general.journal:0
#: field:account.general.journal,date_to:0
@@ -10245,13 +10312,13 @@ msgstr "Gebucht"
#: field:accounting.report,date_to:0
#: field:accounting.report,date_to_cmp:0
msgid "End Date"
-msgstr "Ende Datum"
+msgstr "Enddatum"
#. module: account
#: 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 "Abbrechen Buchen Jahreseröffnung"
+msgstr "Buchen der Jahreseröffnung abbrechen"
#. module: account
#: field:account.payment.term.line,days2:0
@@ -10272,10 +10339,10 @@ msgstr "Geschäftsjahr Sequenz"
#. module: account
#: selection:account.financial.report,display_detail:0
msgid "No detail"
-msgstr "Kein Detail"
+msgstr "Keine Details"
#. module: account
-#: code:addons/account/account_analytic_line.py:102
+#: code:addons/account/account_analytic_line.py:100
#, python-format
msgid "There is no income account defined for this product: \"%s\" (id:%d)"
msgstr ""
@@ -10284,7 +10351,7 @@ msgstr ""
#. module: account
#: constraint:account.move.line:0
msgid "You can not create journal items on closed account."
-msgstr "You can not create journal items on closed account."
+msgstr "Sie können auf ein abgeschlossenes Konto nicht mehr buchen."
#. module: account
#: field:account.account,unrealized_gain_loss:0
@@ -10304,14 +10371,15 @@ msgstr "Status"
#. module: account
#: model:ir.actions.server,name:account.ir_actions_server_edi_invoice
msgid "Auto-email confirmed invoices"
-msgstr "automatischer EMail Versand der Rechnungen"
+msgstr "automatischer E-Mail Versand der Rechnungen"
#. module: account
#: field:account.invoice,check_total:0
msgid "Verification Total"
-msgstr "Gesamt Prüfsumme"
+msgstr "Zu prüfende Gesamtsumme"
#. module: account
+#: report:account.aged_trial_balance:0
#: report:account.analytic.account.balance:0
#: report:account.analytic.account.inverted.balance:0
#: report:account.analytic.account.quantity_cost_ledger:0
@@ -10329,7 +10397,7 @@ msgstr "Bruttobetrag"
#, python-format
msgid "Journal: All"
msgstr ""
-"Journal: AlleErstelle und manage die Finanzjournale des Unternehmens über "
+"Journal: Alle Erstelle und manage die Finanzjournale des Unternehmens über "
"dieses Menü. Ein Journal ist eine lückenlose und chronologische Aufzeichnung "
"aller Geschäftsvorfälle in einem Unternehmen in Form der doppelten "
"Buchhaltung. In Abhängigkeit des Anwendungsumfangs der Buchhaltung sowie der "
@@ -10339,6 +10407,7 @@ 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
@@ -10353,7 +10422,9 @@ msgstr ""
#: 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
@@ -10363,6 +10434,8 @@ msgstr ""
#: view:account.journal:0
#: field:account.journal,company_id:0
#: field:account.journal.period,company_id:0
+#: report:account.journal.period.print:0
+#: report:account.journal.period.print.sale.purchase:0
#: field:account.model,company_id:0
#: field:account.move,company_id:0
#: field:account.move.line,company_id:0
@@ -10380,7 +10453,7 @@ msgstr ""
#: field:analytic.entries.report,company_id:0
#: field:wizard.multi.charts.accounts,company_id:0
msgid "Company"
-msgstr "Firma"
+msgstr "Unternehmen"
#. module: account
#: model:ir.ui.menu,name:account.menu_action_subscription_form
@@ -10421,12 +10494,12 @@ msgstr "Vorzeichen f. überg. Steuer"
#. module: account
#: model:ir.model,name:account.model_account_balance_report
msgid "Trial Balance Report"
-msgstr "Test Auswertung Bilanz"
+msgstr "Salden-Bilanz"
#. module: account
#: model:ir.actions.act_window,name:account.action_bank_statement_draft_tree
msgid "Draft statements"
-msgstr "Beleg Entwurf"
+msgstr "Belegentwürfe"
#. module: account
#: model:process.transition,note:account.process_transition_statemententries0
@@ -10455,14 +10528,14 @@ msgstr "Rechnungspositionen"
#. module: account
#: field:account.chart,period_to:0
msgid "End period"
-msgstr "Ende Periode"
+msgstr "End-Periode"
#. module: account
#: sql_constraint:account.journal:0
msgid "The code of the journal must be unique per company !"
msgstr ""
-"Die Kurzbezeichnung des Journals sollte eindeutig sein je Unternehmen "
-"(Mandant)."
+"Die Kurzbezeichnung des Journals sollte je Unternehmen (Mandant)eindeutig "
+"sein."
#. module: account
#: help:product.category,property_account_expense_categ:0
@@ -10510,7 +10583,7 @@ msgstr "Auswertung Verkauf nach Konto"
#. module: account
#: model:ir.model,name:account.model_account_fiscal_position_account
msgid "Accounts Fiscal Position"
-msgstr "Steuerzuordnung"
+msgstr "Konten des Haushaltsberichts"
#. module: account
#: report:account.invoice:0
@@ -10530,6 +10603,7 @@ msgstr "Eingangsrechnungen"
#: report:account.analytic.account.inverted.balance:0
#: report:account.central.journal:0
#: field:account.entries.report,debit:0
+#: report:account.financial.report:0
#: report:account.general.journal:0
#: report:account.general.ledger:0
#: report:account.general.ledger_landscape:0
@@ -10559,10 +10633,12 @@ msgstr "Rechnungszeilen"
#. module: account
#: constraint:account.account.template:0
msgid "Error ! You can not create recursive account templates."
-msgstr "Fehler ! Rekursive Finanzkontenvorlagen sind nicht erlaubt"
+msgstr "Fehler! Rekursive Finanzkontenvorlagen sind nicht erlaubt."
#. module: account
#: selection:account.print.journal,sort_selection:0
+#: code:addons/account/report/account_journal.py:197
+#, python-format
msgid "Journal Entry Number"
msgstr "Belegnummer"
@@ -10582,7 +10658,7 @@ msgstr ""
"mit Buchungen geändert werden."
#. module: account
-#: code:addons/account/account_move_line.py:832
+#: code:addons/account/account_move_line.py:843
#, python-format
msgid "Entry is already reconciled"
msgstr "Buchung wurde bereits ausgeglichen"
@@ -10624,8 +10700,10 @@ msgstr ""
"geschlossen für nicht mehr verwendete"
#. 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 "Konten mit Buchungen"
@@ -10679,7 +10757,7 @@ msgstr "Überfällige Forderungen"
#. module: account
#: field:account.tax,applicable_type:0
msgid "Applicability"
-msgstr "Individualberechnung"
+msgstr "Anwendbarkeit"
#. module: account
#: code:addons/account/wizard/account_move_journal.py:165
@@ -10741,16 +10819,16 @@ msgstr "Kontenplan Analysekonten"
#. module: account
#: help:account.invoice,residual:0
msgid "Remaining amount due."
-msgstr "verbleibender Restwert nach Zahlung"
+msgstr "Verbleibender, fälliger Restbetrag"
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_statistic_report_statement
msgid "Statistic Reports"
-msgstr "Statistische Auswertungen"
+msgstr "Statistische Berichte"
#. module: account
-#: code:addons/account/account_move_line.py:1155
-#: code:addons/account/account_move_line.py:1238
+#: code:addons/account/account_move_line.py:1170
+#: code:addons/account/account_move_line.py:1253
#, python-format
msgid "Bad account!"
msgstr "Falsches Konto!"
@@ -10779,7 +10857,7 @@ msgid "Accounts Mapping"
msgstr "Zuordnung Finanzkonten"
#. module: account
-#: code:addons/account/account_invoice.py:364
+#: code:addons/account/account_invoice.py:373
#, python-format
msgid "Invoice '%s' is waiting for validation."
msgstr "Rechnung '%s' wartet auf Buchungsfreigabe."
@@ -10907,16 +10985,17 @@ msgstr ""
"''}${object.address_invoice_id.name or ''},\n"
"\n"
"Eine neue Rechnung ist verfügbar: ${object.partner_id.name}:\n"
-" | Invoice number: *${object.number}*\n"
-" | Invoice total: *${object.amount_total} ${object.currency_id.name}*\n"
-" | Invoice date: ${object.date_invoice}\n"
+" | Rechnungsnummer: *${object.number}*\n"
+" | Rechnungsbetrag: *${object.amount_total} "
+"${object.currency_id.name}*\n"
+" | Rechnungsdatum : ${object.date_invoice}\n"
" % if object.origin:\n"
" | Auftrag: ${object.origin}\n"
" % endif\n"
-" | Ihr Kontakt: ${object.user_id.name} ${object.user_id.user_email and "
-"'<%s>'%(object.user_id.user_email) or ''}\n"
+" | Ihr Ansprechpartner: ${object.user_id.name} "
+"${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''}\n"
"\n"
-"Sie können dieses Dokument ansehen, herunterladenund Online bezahlen, wenn "
+"Sie können dieses Dokument ansehen, herunterladen und Online bezahlen, wenn "
"Sie den folgenden Link verwenden:\n"
" ${ctx.get('edi_web_url_view') or 'n/a'}\n"
"\n"
@@ -10941,9 +11020,9 @@ msgstr ""
" ${paypal_url}\n"
"% endif\n"
"\n"
-"Im Falle von Fragen wollen Sie uns bitte kontaktieren.\n"
+"Im Falle von Fragen können Sie uns gerne kontaktieren.\n"
"\n"
-"Danke, dass Sie ${object.company_id.name} gewählt haben!\n"
+"Danke, dass Sie ${object.company_id.name} Ihr vertrauen schenken!\n"
"\n"
"\n"
"--\n"
@@ -10964,7 +11043,7 @@ msgstr ""
"or ''} ${object.company_id.country_id.name or ''}\n"
"% endif\n"
"% if object.company_id.phone:\n"
-"Phone: ${object.company_id.phone}\n"
+"Tel.: ${object.company_id.phone}\n"
"% endif\n"
"% if object.company_id.website:\n"
"${object.company_id.website or ''}\n"
@@ -10979,7 +11058,7 @@ msgstr "Bankkonten"
#. module: account
#: field:res.partner,credit:0
msgid "Total Receivable"
-msgstr "Gesamt Forderungen"
+msgstr "Forderungsgesamtsumme"
#. module: account
#: view:account.account:0
@@ -11039,6 +11118,7 @@ msgstr "account.addtmpl.wizard"
#. module: account
#: field:account.aged.trial.balance,result_selection:0
+#: report:account.aged_trial_balance:0
#: field:account.common.partner.report,result_selection:0
#: report:account.partner.balance:0
#: field:account.partner.balance,result_selection:0
@@ -11113,17 +11193,19 @@ msgstr "Zentrales Journal"
#. module: account
#: report:account.overdue:0
msgid "Maturity"
-msgstr "überfälllig"
+msgstr "Überfällig"
#. module: account
#: selection:account.aged.trial.balance,direction_selection:0
+#: code:addons/account/report/account_aged_partner_balance.py:383
+#, python-format
msgid "Future"
msgstr "Zukunft"
#. module: account
#: view:account.move.line:0
msgid "Search Journal Items"
-msgstr "Suche Journaleinträge"
+msgstr "Durchsuche Buchungen"
#. module: account
#: help:account.tax,base_sign:0
@@ -11862,9 +11944,6 @@ msgstr ""
#~ msgid "3 Months"
#~ msgstr "3 Monate"
-#~ msgid "Standard entries"
-#~ msgstr "Standard Buchung"
-
#~ msgid ""
#~ "Check this box if you want to print all entries when printing the General "
#~ "Ledger, otherwise it will only print its balance."
@@ -12637,9 +12716,6 @@ msgstr ""
#~ msgid "Calculated Balance"
#~ msgstr "Berechneter Saldo"
-#~ msgid "Open For Unreconciliation"
-#~ msgstr "Öffne Storno Ausgleich"
-
#, python-format
#~ msgid "CashBox Balance is not matching with Calculated Balance !"
#~ msgstr "Kassenbestand passt nicht zu Kontensaldo"
@@ -13204,9 +13280,6 @@ msgstr ""
#~ msgid "Receivable Accounts"
#~ msgstr "Debitorenkonten"
-#~ msgid "Tax codes"
-#~ msgstr "Umsatzsteuererklärung"
-
#~ msgid ""
#~ "Streamlines invoice payment and creates hooks to plug automated payment "
#~ "systems in."
@@ -13231,9 +13304,6 @@ msgstr ""
#~ msgid " day of the month= -1"
#~ msgstr " Tag des Monats= -1"
-#~ msgid "Reconciliation result"
-#~ msgstr "Ergebnis Kontoabstimmung"
-
#~ msgid ""
#~ "You cannot create entries on different periods/journals in the same move"
#~ msgstr ""
@@ -13366,3 +13436,15 @@ msgstr ""
#~ msgid "Description On Invoices"
#~ msgstr "Beschreibung auf Rechnungen"
+
+#~ msgid "Open For Unreconciliation"
+#~ msgstr "Öffne zur Stornierung des OP-Ausgleichs"
+
+#~ msgid "Tax codes"
+#~ msgstr "Steuerschlüssel"
+
+#~ msgid "Reconciliation result"
+#~ msgstr "Ergebnis Kontoausgleich"
+
+#~ msgid "Standard entries"
+#~ msgstr "Standard-Buchungen"
diff --git a/addons/account/product_view.xml b/addons/account/product_view.xml
index 5f417825032..4d64af3e154 100644
--- a/addons/account/product_view.xml
+++ b/addons/account/product_view.xml
@@ -14,8 +14,8 @@
<field name="taxes_id" colspan="2" attrs="{'readonly':[('sale_ok','=',0)]}" widget="many2many_tags"/>
</group>
<group>
- <field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}"/>
- <field name="supplier_taxes_id" colspan="2" attrs="{'readonly':[('purchase_ok','=',0)]}" widget="many2many_tags"/>
+ <field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" />
+ <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"/>
</group>
</group>
</page>
diff --git a/addons/account/project/report/analytic_balance.rml b/addons/account/project/report/analytic_balance.rml
index 0c488eac400..1754988f7d6 100644
--- a/addons/account/project/report/analytic_balance.rml
+++ b/addons/account/project/report/analytic_balance.rml
@@ -163,7 +163,7 @@
<para style="terp_tblheader_Details_Right">[[ formatLang(sum_all(get_objects(data['form']['empty_acc']),data['form']['date1'],data['form']['date2'],'credit')) ]] </para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(sum_balance(get_objects(data['form']['empty_acc']),data['form']['date1'],data['form']['date2'])) ]] [[ company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(sum_balance(get_objects(data['form']['empty_acc']),data['form']['date1'],data['form']['date2']), currency_obj = company.currency_id)]]</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">[[ formatLang(sum_all(get_objects(data['form']['empty_acc']),data['form']['date1'],data['form']['date2'],'quantity')) ]]</para>
@@ -187,7 +187,7 @@
<para style="terp_default_Right_9_Bold">[[ formatLang(move_sum(o['id'],data['form']['date1'],data['form']['date2'],'credit')) ]] </para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(move_sum_balance(o['id'],data['form']['date1'],data['form']['date2'])) ]] [[ company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(move_sum_balance(o['id'],data['form']['date1'],data['form']['date2']), currency_obj = company.currency_id)]]</para>
</td>
<td>
<para style="terp_default_Right_9_Bold">[[ formatLang(move_sum(o['id'],data['form']['date1'],data['form']['date2'],'quantity')) ]]</para>
@@ -211,7 +211,7 @@
<para style="terp_default_Right_9">[[ formatLang(move_g['credit']) ]] </para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(move_g['balance'])]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(move_g['balance'], currency_obj = company.currency_id) ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang(move_g['quantity']) ]]</para>
diff --git a/addons/account/project/report/cost_ledger.rml b/addons/account/project/report/cost_ledger.rml
index 7500b655ab3..1099a8b8b4e 100644
--- a/addons/account/project/report/cost_ledger.rml
+++ b/addons/account/project/report/cost_ledger.rml
@@ -224,7 +224,7 @@
<para style="terp_Default_Bold_Right_9_U">[[ formatLang (sum_credit(objects,data['form']['date1'],data['form']['date2'])) ]] </para>
</td>
<td>
- <para style="terp_Default_Bold_Right_9_U">[[ formatLang (sum_balance(objects,data['form']['date1'],data['form']['date2'])) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_Default_Bold_Right_9_U">[[ formatLang (sum_balance(objects,data['form']['date1'],data['form']['date2']), currency_obj = company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -245,7 +245,7 @@
<para style="terp_Default_Bold_Right_9_U">[[ formatLang (account_sum_credit(account,data['form']['date1'],data['form']['date2'])) ]] </para>
</td>
<td>
- <para style="terp_Default_Bold_Right_9_U">[[ formatLang (account_sum_balance(account,data['form']['date1'],data['form']['date2']))]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_Default_Bold_Right_9_U">[[ formatLang (account_sum_balance(account,data['form']['date1'],data['form']['date2']), currency_obj = company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -266,7 +266,7 @@
<para style="terp_Default_Bold_Right_9_U">[[ formatLang( move_g['credit']) ]] </para>
</td>
<td>
- <para style="terp_Default_Bold_Right_9_U">[[ formatLang( move_g['balance']) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_Default_Bold_Right_9_U">[[ formatLang( move_g['balance'], currency_obj = company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -290,7 +290,7 @@
<para style="terp_default_9_italic_Rignt">[[ formatLang( move_a['credit']) ]] </para>
</td>
<td>
- <para style="terp_default_9_italic_Rignt">[[ formatLang( move_a['balance']) ]] [[ company.currency_id.symbol]]</para>
+ <para style="terp_default_9_italic_Rignt">[[ formatLang( move_a['balance'], currency_obj = company.currency_id)]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/account/project/report/inverted_analytic_balance.rml b/addons/account/project/report/inverted_analytic_balance.rml
index f112ec8fbd3..54b6878c407 100644
--- a/addons/account/project/report/inverted_analytic_balance.rml
+++ b/addons/account/project/report/inverted_analytic_balance.rml
@@ -164,7 +164,7 @@
<para style="terp_tblheader_Details_Right">[[ formatLang(sum_credit(objects,data['form']['date1'],data['form']['date2']))]]</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(sum_balance(objects,data['form']['date1'],data['form']['date2']))]] [[ company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(sum_balance(objects,data['form']['date1'],data['form']['date2']), currency_obj = company.currency_id)]]</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">[[ formatLang(sum_quantity(objects,data['form']['date1'],data['form']['date2'])) ]]</para>
@@ -188,7 +188,7 @@
<para style="terp_tblheader_Details_Right">[[formatLang(move_g['credit'])]]</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(move_g['balance'])]] [[ company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(move_g['balance'], currency_obj = company.currency_id)]]</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">[[formatLang(move_g['quantity']) ]]</para>
@@ -212,7 +212,7 @@
<para style="terp_default_Right_9">[[ formatLang(move_a['credit']) ]] </para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(move_a['balance']) ]] [[ company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(move_a['balance'], currency_obj = company.currency_id)]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang(move_a['quantity']) ]]</para>
diff --git a/addons/account/project/wizard/account_analytic_journal_report.py b/addons/account/project/wizard/account_analytic_journal_report.py
index 8148a016927..3d6bf0f5447 100644
--- a/addons/account/project/wizard/account_analytic_journal_report.py
+++ b/addons/account/project/wizard/account_analytic_journal_report.py
@@ -63,8 +63,12 @@ class account_analytic_journal_report(osv.osv_memory):
if context is None:
context = {}
res = super(account_analytic_journal_report, self).default_get(cr, uid, fields, context=context)
+ if not context.has_key('active_ids'):
+ journal_ids = self.pool.get('account.analytic.journal').search(cr, uid, [], context=context)
+ else:
+ journal_ids = context.get('active_ids')
if 'analytic_account_journal_id' in fields:
- res.update({'analytic_account_journal_id': context.get('active_ids',[])})
+ res.update({'analytic_account_journal_id': journal_ids})
return res
account_analytic_journal_report()
diff --git a/addons/account/report/account_analytic_entries_report_view.xml b/addons/account/report/account_analytic_entries_report_view.xml
index 8963ba97376..8a421e3cb36 100644
--- a/addons/account/report/account_analytic_entries_report_view.xml
+++ b/addons/account/report/account_analytic_entries_report_view.xml
@@ -5,7 +5,7 @@
<field name="name">analytic.entries.report.tree</field>
<field name="model">analytic.entries.report</field>
<field name="arch" type="xml">
- <tree string="Analytic Entries Analysis">
+ <tree string="Analytic Entries Analysis" create="false">
<field name="date" invisible="1"/>
<field name="year" invisible="1"/>
<field name="day" invisible="1"/>
diff --git a/addons/account/report/account_entries_report_view.xml b/addons/account/report/account_entries_report_view.xml
index 667c61ab78f..551265252cc 100644
--- a/addons/account/report/account_entries_report_view.xml
+++ b/addons/account/report/account_entries_report_view.xml
@@ -5,7 +5,7 @@
<field name="name">account.entries.report.tree</field>
<field name="model">account.entries.report</field>
<field name="arch" type="xml">
- <tree colors="blue:move_state == 'draft';black:move_state == 'posted'" string="Entries Analysis">
+ <tree colors="blue:move_state == 'draft';black:move_state == 'posted'" create="false" string="Entries Analysis">
<field name="date" invisible="1"/>
<field name="date_created" invisible="1"/>
<field name="date_maturity" invisible="1"/>
diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml
index c22d5d55f45..13a137e53df 100644
--- a/addons/account/report/account_invoice_report_view.xml
+++ b/addons/account/report/account_invoice_report_view.xml
@@ -5,7 +5,7 @@
<field name="name">account.invoice.report.tree</field>
<field name="model">account.invoice.report</field>
<field name="arch" type="xml">
- <tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" string="Invoices Analysis">
+ <tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" create="false" string="Invoices Analysis">
<field name="date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="year" invisible="1"/>
diff --git a/addons/account/report/account_print_overdue.py b/addons/account/report/account_print_overdue.py
index 1b617e9afa4..4ddedc102f5 100644
--- a/addons/account/report/account_print_overdue.py
+++ b/addons/account/report/account_print_overdue.py
@@ -29,34 +29,11 @@ class Overdue(report_sxw.rml_parse):
super(Overdue, self).__init__(cr, uid, name, context=context)
self.localcontext.update( {
'time': time,
- 'adr_get': self._adr_get,
'getLines': self._lines_get,
'tel_get': self._tel_get,
'message': self._message,
})
self.context = context
- def _adr_get(self, partner, type):
- res = []
- res_partner = pooler.get_pool(self.cr.dbname).get('res.partner')
- addresses = res_partner.address_get(self.cr, self.uid, [partner.id], [type])
- adr_id = addresses and addresses[type] or False
- result = {
- 'name': False,
- 'street': False,
- 'street2': False,
- 'city': False,
- 'zip': False,
- 'state_id':False,
- 'country_id': False,
- }
- if adr_id:
- result = res_partner.read(self.cr, self.uid, [adr_id], context=self.context.copy())
- result[0]['country_id'] = result[0]['country_id'] and result[0]['country_id'][1] or False
- result[0]['state_id'] = result[0]['state_id'] and result[0]['state_id'][1] or False
- return result
-
- res.append(result)
- return res
def _tel_get(self,partner):
if not partner:
diff --git a/addons/account/report/account_print_overdue.rml b/addons/account/report/account_print_overdue.rml
index 2d4238823da..577cb9142a2 100644
--- a/addons/account/report/account_print_overdue.rml
+++ b/addons/account/report/account_print_overdue.rml
@@ -126,15 +126,10 @@
<blockTable colWidths="286.0,224.0" style="Tableau2">
<tr>
<td>
- <para style="terp_default_9">[[ repeatIn(adr_get(o, 'invoice'),'addr') ]]</para>
</td>
<td>
<para style="terp_default_9">[[ o.title.name or '' ]] [[ o.name ]]</para>
- <para style="terp_default_9">[[ addr['street'] ]]</para>
- <para style="terp_default_9">[[ addr['street2'] or removeParentNode('para') ]]</para>
- <para style="terp_default_9">[[ addr['zip'] ]] [[ addr['city'] ]]</para>
- <para style="terp_default_9">[[ addr['state_id'] or removeParentNode('para')]]</para>
- <para style="terp_default_9">[[ addr['country_id'] ]]</para>
+ <para style="terp_default_9">[[ display_address(o.partner_id)] ]]</para>
<para style="terp_default_9">
<font color="white"> </font>
</para>
@@ -216,7 +211,7 @@
<para style="terp_default_Right_9">[[ (line['account_id']['type'] == 'receivable' and formatLang(line['credit']) or 0) or (line['account_id']['type'] == 'payable' and formatLang(line['debit'] * -1) or 0) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ time.strftime('%Y-%m-%d') &gt; formatLang((line['date_maturity'])) and formatLang(line['debit'] - line['credit']) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ time.strftime('%Y-%m-%d') &gt; formatLang((line['date_maturity'])) and formatLang(line['debit'] - line['credit'], currency_obj = company.currency_id) ]]</para>
</td>
<td>
<para style="terp_default_Centre_9">[[ line['blocked'] and 'X' or '' ]]</para>
@@ -241,7 +236,7 @@
<para style="terp_default_Right_9">[[ formatLang((reduce(lambda x, y: x + ((y['account_id']['type'] == 'receivable' and y['credit'] or 0) or (y['account_id']['type'] == 'payable' and y['debit'] * -1 or 0)), getLines(o), 0))) ]] </para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang((reduce(lambda x, y: x + (y['debit'] - y['credit']), filter(lambda x: x['date_maturity'] &lt; time.strftime('%Y-%m-%d'), getLines(o)), 0))) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang((reduce(lambda x, y: x + (y['debit'] - y['credit']), filter(lambda x: x['date_maturity'] &lt; time.strftime('%Y-%m-%d'), getLines(o)), 0)), currency_obj=company.currency_id) ]]</para>
</td>
<td>
<para style="terp_default_9">
@@ -261,7 +256,7 @@
<para style="terp_default_Bold_9">Balance :</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang((reduce(lambda x, y: x +(y['debit'] - y['credit']), getLines(o), 0))) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang((reduce(lambda x, y: x +(y['debit'] - y['credit']), getLines(o), 0)), currency_obj = company.currency_id) ]]</para>
</td>
<td>
<para style="terp_default_8">
diff --git a/addons/account/report/account_treasury_report_view.xml b/addons/account/report/account_treasury_report_view.xml
index ee21b9e5ec6..be6ae0dfdc9 100644
--- a/addons/account/report/account_treasury_report_view.xml
+++ b/addons/account/report/account_treasury_report_view.xml
@@ -5,7 +5,7 @@
<field name="name">account.treasury.report.tree</field>
<field name="model">account.treasury.report</field>
<field name="arch" type="xml">
- <tree string="Treasury Analysis">
+ <tree string="Treasury Analysis" create="false">
<field name="date" invisible="1"/>
<field name="fiscalyear_id"/>
<field name="period_id"/>
diff --git a/addons/account/static/src/xml/account_move_reconciliation.xml b/addons/account/static/src/xml/account_move_reconciliation.xml
index c266e819198..d7b5301238d 100644
--- a/addons/account/static/src/xml/account_move_reconciliation.xml
+++ b/addons/account/static/src/xml/account_move_reconciliation.xml
@@ -3,10 +3,17 @@
<templates id="template" xml:space="preserve">
<t t-name="AccountReconciliation">
+ <t t-if="widget.current_partner === null">
+ <div class="oe_view_nocontent">
+ <p>
+ Good job!
+ </p><p>
+ There is nothing to reconcile. All invoices and payments
+ have been reconciled, your partner balance is clean.
+ </p>
+ </div>
+ </t>
<div class="oe_account_reconciliation">
- <t t-if="widget.current_partner === null">
- There is no pending reconciliation.
- </t>
<t t-if="widget.current_partner !== null">
<div>
<div>
diff --git a/addons/account/test/account_supplier_invoice.yml b/addons/account/test/account_supplier_invoice.yml
index 9c5ce2dea3e..02c3d367050 100644
--- a/addons/account/test/account_supplier_invoice.yml
+++ b/addons/account/test/account_supplier_invoice.yml
@@ -21,7 +21,7 @@
-
I create a supplier invoice
-
- !record {model: account.invoice, id: account_invoice_supplier0}:
+ !record {model: account.invoice, id: account_invoice_supplier0, view: invoice_supplier_form}:
account_id: account.a_pay
check_total: 3000.0
company_id: base.main_company
diff --git a/addons/account/wizard/account_invoice_state_view.xml b/addons/account/wizard/account_invoice_state_view.xml
index 11703a4f259..eb636f61b50 100644
--- a/addons/account/wizard/account_invoice_state_view.xml
+++ b/addons/account/wizard/account_invoice_state_view.xml
@@ -6,7 +6,12 @@
<field name="model">account.invoice.confirm</field>
<field name="arch" type="xml">
<form string="Confirm Draft Invoices" version="7.0">
- <separator string="Confirm Draft Invoices"/>
+ <p class="oe_grey">
+ Once draft invoices are confirmed, you will not be able
+ to modify them. The invoices will receive a unique
+ number and journal items will be created in your chart
+ of accounts.
+ </p>
<footer>
<button string="Confirm Invoices" name="invoice_confirm" type="object" default_focus="1" class="oe_highlight"/>
or
@@ -27,7 +32,6 @@
<field name="model">account.invoice.cancel</field>
<field name="arch" type="xml">
<form string="Cancel Selected Invoices" version="7.0">
- <separator string="Cancel Selected Invoices"/>
<footer>
<button string="Cancel Invoices" name="invoice_cancel" type="object" default_focus="1" class="oe_highlight"/>
or
diff --git a/addons/account_analytic_default/i18n/hu.po b/addons/account_analytic_default/i18n/hu.po
index 557aa2e66f5..8b863f51679 100644
--- a/addons/account_analytic_default/i18n/hu.po
+++ b/addons/account_analytic_default/i18n/hu.po
@@ -7,15 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
-"PO-Revision-Date: 2011-02-01 18:11+0000\n"
-"Last-Translator: NOVOTRADE RENDSZERHÁZ ( novotrade.hu ) "
-"<openerp@novotrade.hu>\n"
+"PO-Revision-Date: 2012-10-09 13:58+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:22+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: account_analytic_default
#: help:account.analytic.default,partner_id:0
@@ -134,12 +133,14 @@ msgstr "Gyűjtőkód alapértelmezések"
#. module: account_analytic_default
#: sql_constraint:stock.picking:0
msgid "Reference must be unique per Company!"
-msgstr ""
+msgstr "Minden vállalkozáshoz egyedi hivatkozás kell!"
#. module: account_analytic_default
#: view:account.analytic.default:0
msgid "Analytical defaults whose end date is greater than today or None"
msgstr ""
+"A mai napnál későbbi lejáratú vagy nem létező dátumú elemzések "
+"alapértelmezései"
#. module: account_analytic_default
#: help:account.analytic.default,product_id:0
diff --git a/addons/account_analytic_plans/i18n/de.po b/addons/account_analytic_plans/i18n/de.po
index a2ecd5177dd..cff2c65a081 100644
--- a/addons/account_analytic_plans/i18n/de.po
+++ b/addons/account_analytic_plans/i18n/de.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-02-08 00:35+0000\n"
-"PO-Revision-Date: 2012-02-08 08:45+0000\n"
+"PO-Revision-Date: 2012-10-12 23:19+0000\n"
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:19+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-14 04:39+0000\n"
+"X-Generator: Launchpad (build 16137)\n"
#. module: account_analytic_plans
#: view:analytic.plan.create.model:0
@@ -471,7 +471,7 @@ msgstr "Analyt. Verrechnungsvorlage"
#. module: account_analytic_plans
#: field:account.analytic.plan.instance,code:0
msgid "Distribution Code"
-msgstr "Kurzbezeichnung"
+msgstr "Verteilungs-Schlüssel"
#. module: account_analytic_plans
#: report:account.analytic.account.crossovered.analytic:0
@@ -526,6 +526,8 @@ msgid ""
"analytic accounts for each plan set. Then, you must attach a plan set to "
"your account journals."
msgstr ""
+"Für jede Kostenrechnung muss ein Stammkonto definiert werden. Dann muss ein "
+"Plan definiert werden"
#. module: account_analytic_plans
#: constraint:account.move.line:0
diff --git a/addons/account_asset/account_asset_view.xml b/addons/account_asset/account_asset_view.xml
index 3fab306863c..520ee733e73 100644
--- a/addons/account_asset/account_asset_view.xml
+++ b/addons/account_asset/account_asset_view.xml
@@ -106,27 +106,27 @@
</group>
<notebook colspan="4">
<page string="General">
- <group>
- <group>
- <field name="purchase_value"/>
- <field name="salvage_value"/>
- <field name="value_residual"/>
+ <group>
+ <group>
+ <field name="purchase_value" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="salvage_value" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="value_residual" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="partner_id"/>
- </group>
- <group>
- <field name="method"/>
- <field name="method_progress_factor" attrs="{'invisible':[('method','=','linear')], 'required':[('method','=','degressive')]}"/>
+ </group>
+ <group>
+ <field name="method"/>
+ <field name="method_progress_factor" attrs="{'invisible':[('method','=','linear')], 'required':[('method','=','degressive')]}"/>
<label for="method_time"/>
<div>
- <field name="method_time" on_change="onchange_method_time(method_time)" class="oe_inline"/>
- <button name="%(action_asset_modify)d" states="open" string="Change Duration" type="action" icon="terp-stock_effects-object-colorize" class="oe_inline" colspan="1"/>
+ <field name="method_time" on_change="onchange_method_time(method_time)" class="oe_inline"/>
+ <button name="%(action_asset_modify)d" states="open" string="Change Duration" type="action" icon="terp-stock_effects-object-colorize" class="oe_inline" colspan="1"/>
</div>
- <field name="prorata" attrs="{'invisible': [('method_time','=','end')]}"/>
- <field name="method_number" attrs="{'invisible':[('method_time','=','end')], 'required':[('method_time','=','number')]}"/>
- <field name="method_period"/>
- <field name="method_end" attrs="{'required': [('method_time','=','end')], 'invisible':[('method_time','=','number')]}"/>
- </group>
- </group>
+ <field name="prorata" attrs="{'invisible': [('method_time','=','end')]}"/>
+ <field name="method_number" attrs="{'invisible':[('method_time','=','end')], 'required':[('method_time','=','number')]}"/>
+ <field name="method_period"/>
+ <field name="method_end" attrs="{'required': [('method_time','=','end')], 'invisible':[('method_time','=','number')]}"/>
+ </group>
+ </group>
</page>
<page string="Depreciation Board">
<field name="depreciation_line_ids" mode="tree">
diff --git a/addons/account_asset/report/account_asset_report_view.xml b/addons/account_asset/report/account_asset_report_view.xml
index bc598011086..4865196c4a8 100644
--- a/addons/account_asset/report/account_asset_report_view.xml
+++ b/addons/account_asset/report/account_asset_report_view.xml
@@ -6,7 +6,7 @@
<field name="name">asset.asset.report.tree</field>
<field name="model">asset.asset.report</field>
<field name="arch" type="xml">
- <tree string="Assets">
+ <tree string="Assets" create="false">
<field name="name" invisible="1"/>
<field name="asset_id" invisible="1"/>
<field name="asset_category_id" invisible="1"/>
diff --git a/addons/account_budget/account_budget_view.xml b/addons/account_budget/account_budget_view.xml
index 7868755d143..fdc358f5c98 100644
--- a/addons/account_budget/account_budget_view.xml
+++ b/addons/account_budget/account_budget_view.xml
@@ -1,13 +1,8 @@
<?xml version="1.0" ?>
<openerp>
<data>
- <!-- budget form and tree view from account module *********************************** -->
- <record id="action_account_budget_post_tree" model="ir.actions.act_window">
- <field name="name">Budgets</field>
- <field name="res_model">account.budget.post</field>
- <field name="view_type">tree</field>
- </record>
- <menuitem action="action_account_budget_post_tree" id="menu_action_account_budget_post_tree" parent="account.menu_finance_generic_reporting" sequence="6"/>
+
+ <menuitem name="Budgets" id="menu_action_account_budget_post_tree" parent="account.menu_finance_generic_reporting" sequence="6"/>
<!--
Budgets
diff --git a/addons/account_budget/i18n/hu.po b/addons/account_budget/i18n/hu.po
index c48392c7c8a..35df6ac7dc9 100644
--- a/addons/account_budget/i18n/hu.po
+++ b/addons/account_budget/i18n/hu.po
@@ -7,15 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
-"PO-Revision-Date: 2011-01-30 16:38+0000\n"
-"Last-Translator: NOVOTRADE RENDSZERHÁZ ( novotrade.hu ) "
-"<openerp@novotrade.hu>\n"
+"PO-Revision-Date: 2012-10-09 13:49+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:27+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: account_budget
#: field:crossovered.budget,creating_user_id:0
@@ -105,6 +104,7 @@ msgid "Percentage"
msgstr "Százalék"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:crossovered.budget.report:0
msgid "to"
msgstr "-"
@@ -138,21 +138,24 @@ msgstr ""
#: code:addons/account_budget/account_budget.py:119
#, python-format
msgid "The Budget '%s' has no accounts!"
-msgstr ""
+msgstr "A '%s' költségvetésnek nincs számlaszáma!"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "%"
msgstr "%"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Description"
msgstr "Leírás"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:crossovered.budget.report:0
msgid "Currency"
msgstr "Pénznem"
@@ -187,6 +190,7 @@ msgid "Planned Amount"
msgstr "Tervezett összeg"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Perc(%)"
@@ -199,6 +203,7 @@ msgid "Done"
msgstr "Kész"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Practical Amt"
@@ -259,7 +264,7 @@ msgstr "Üzleti terv"
#. module: account_budget
#: view:crossovered.budget:0
msgid "To Approve Budgets"
-msgstr ""
+msgstr "Költségvetés jóváhagyása"
#. module: account_budget
#: code:addons/account_budget/account_budget.py:119
@@ -333,6 +338,7 @@ msgid "Account Budget crossvered summary report"
msgstr "Üzleti terv összesítő kimutatás"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Theoretical Amt"
@@ -359,9 +365,10 @@ msgstr "Nyomtatás"
#: view:crossovered.budget:0
#: field:crossovered.budget.lines,theoritical_amount:0
msgid "Theoretical Amount"
-msgstr ""
+msgstr "Elméleti mennyiség"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: field:crossovered.budget.lines,analytic_account_id:0
#: model:ir.model,name:account_budget.model_account_analytic_account
msgid "Analytic Account"
@@ -373,6 +380,7 @@ msgid "Budget :"
msgstr "Üzleti terv :"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Planned Amt"
@@ -413,6 +421,7 @@ msgid "Error! You can not create recursive analytic accounts."
msgstr "Hiba! Nem hozhat létre rekurzív gyűjtőkódokat."
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Analysis from"
@@ -421,7 +430,7 @@ msgstr "Elemzési időszak"
#. module: account_budget
#: view:crossovered.budget:0
msgid "Draft Budgets"
-msgstr ""
+msgstr "Előzetes, tervezett költségvetés"
#, python-format
#~ msgid "The General Budget '%s' has no Accounts!"
diff --git a/addons/account_budget/i18n/lo.po b/addons/account_budget/i18n/lo.po
index daa39b8a6e6..cbc81b84000 100644
--- a/addons/account_budget/i18n/lo.po
+++ b/addons/account_budget/i18n/lo.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-02-08 00:35+0000\n"
-"PO-Revision-Date: 2011-01-19 15:50+0000\n"
+"PO-Revision-Date: 2012-10-09 16:05+0000\n"
"Last-Translator: Brice Muangkhot ສຸພາ ເມືອງໂຄຕ <bmuangkhot@gmail.com>\n"
"Language-Team: Lao <lo@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: 2012-08-28 06:27+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: account_budget
#: field:crossovered.budget,creating_user_id:0
@@ -31,7 +31,7 @@ msgstr "ຮັບຮູ້ເເລັວ"
#: model:ir.actions.act_window,name:account_budget.open_budget_post_form
#: model:ir.ui.menu,name:account_budget.menu_budget_post_form
msgid "Budgetary Positions"
-msgstr "ຈຸດງົບປະມານ"
+msgstr "ຕໍາແຫນ່ງງົບປະມານ"
#. module: account_budget
#: report:account.budget:0
@@ -105,6 +105,7 @@ msgid "Percentage"
msgstr "ເປີເຊັນ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:crossovered.budget.report:0
msgid "to"
msgstr "ຫາ"
@@ -126,6 +127,14 @@ msgid ""
"revenue per analytic account and monitor its evolution based on the actuals "
"realised during that period."
msgstr ""
+"ງົບປະມານແມ່ນຄາດຄະເນລາຍໄດ້ຂອງບໍລິສັດຂອງທ່ານແລະຄ່າໃຊ້ຈ່າຍຄາດວ່າຈະສໍາລັບໄລຍະເວລາ"
+"ໃນອະນາຄົດໄດ້. ມີງົບປະມານ, "
+"ບໍລິສັດສາມາດລະມັດລະວັງເບິ່ງວິທີການເງິນຫຼາຍປານເຂົາເຈົ້າໄດ້ຖືກກິນໃນໄລຍະເວລາໃນໄລ"
+"ຍະໃດຫນຶ່ງ, ແລະສະວິທີທີ່ດີທີ່ສຸດເພື່ອແບ່ງມັນໃນບັນດາປະເພດຂອງລາຍການຕ່າງໆ. "
+"ໂດຍການຮັກສາຕິດຕາມບ່ອນທີ່ເງິນຂອງທ່ານດີ, ທ່ານອາດຈະມີຫນ້ອຍອາດຈະ overspend, "
+"ແລະອື່ນໆທີ່ອາດຈະຕອບສະຫນອງໄດ້ຕາມເປົ້າຫມາຍທາງດ້ານການເງິນຂອງທ່ານ. "
+"ຄາດງົບປະມານໂດຍ detailing ລາຍຮັບຄາດວ່າຈະຕໍ່ບັນຊີແຍກທາດແລະຕິດຕາມກວດກາຂອງຕົນ "
+"evolution ອີງຕາມຕົວຈິງໃນ realized ໃນໄລຍະນັ້ນ."
#. module: account_budget
#: code:addons/account_budget/account_budget.py:119
@@ -134,18 +143,21 @@ msgid "The Budget '%s' has no accounts!"
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "%"
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Description"
msgstr "ຄຳອະທິບາຍ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:crossovered.budget.report:0
msgid "Currency"
msgstr "ເງິນຕາ"
@@ -170,7 +182,7 @@ msgstr "ເພື່ອຮັບຮູ້"
#. module: account_budget
#: view:crossovered.budget:0
msgid "Reset to Draft"
-msgstr ""
+msgstr "ປັບກັບຮ່າງ"
#. module: account_budget
#: view:account.budget.post:0
@@ -180,6 +192,7 @@ msgid "Planned Amount"
msgstr "ຈໍານວນຄາດໝາຍມ້ຽນ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Perc(%)"
@@ -192,6 +205,7 @@ msgid "Done"
msgstr "ຈົບເເລັວ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Practical Amt"
@@ -203,7 +217,7 @@ msgstr ""
#: view:crossovered.budget:0
#: field:crossovered.budget.lines,practical_amount:0
msgid "Practical Amount"
-msgstr ""
+msgstr "ຈໍານວນເງິນປະຕິບັດໄດ້"
#. module: account_budget
#: field:crossovered.budget,date_to:0
@@ -292,7 +306,7 @@ msgstr ""
#. module: account_budget
#: selection:crossovered.budget,state:0
msgid "Cancelled"
-msgstr ""
+msgstr "ຍົກເລີກ"
#. module: account_budget
#: view:crossovered.budget:0
@@ -326,6 +340,7 @@ msgid "Account Budget crossvered summary report"
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Theoretical Amt"
@@ -355,6 +370,7 @@ msgid "Theoretical Amount"
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: field:crossovered.budget.lines,analytic_account_id:0
#: model:ir.model,name:account_budget.model_account_analytic_account
msgid "Analytic Account"
@@ -366,6 +382,7 @@ msgid "Budget :"
msgstr "ງົບປະມານ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Planned Amt"
@@ -406,6 +423,7 @@ msgid "Error! You can not create recursive analytic accounts."
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Analysis from"
diff --git a/addons/account_check_writing/report/check_print.py b/addons/account_check_writing/report/check_print.py
index f8e048beb2d..fd52c96b9aa 100644
--- a/addons/account_check_writing/report/check_print.py
+++ b/addons/account_check_writing/report/check_print.py
@@ -32,7 +32,6 @@ class report_print_check(report_sxw.rml_parse):
'time': time,
'get_lines': self.get_lines,
'fill_stars' : self.fill_stars,
- 'get_zip_line': self.get_zip_line,
})
def fill_stars(self, amount):
amount = amount.replace('Dollars','')
@@ -41,25 +40,6 @@ class report_print_check(report_sxw.rml_parse):
return ' '.join([amount,'*'*stars])
else: return amount
-
- def get_zip_line(self, address):
- '''
- Get the address line
- '''
- ret = ''
- if address:
- if address.city:
- ret += address.city
- if address.state_id:
- if address.state_id.name:
- if ret:
- ret += ', '
- ret += address.state_id.name
- if address.zip:
- if ret:
- ret += ' '
- ret += address.zip
- return ret
def get_lines(self, voucher_lines):
result = []
diff --git a/addons/account_check_writing/report/check_print_bottom.rml b/addons/account_check_writing/report/check_print_bottom.rml
index bb499a8aac1..f9add2fe60b 100644
--- a/addons/account_check_writing/report/check_print_bottom.rml
+++ b/addons/account_check_writing/report/check_print_bottom.rml
@@ -281,10 +281,7 @@
</td>
<td>
<para style="P15">[[ voucher.partner_id.name ]]</para>
- <para style="P15">[[ voucher.partner_id.street or removeParentNode('para') ]]</para>
- <para style="P15">[[ voucher.partner_id.street2 or removeParentNode('para') ]]</para>
- <para style="P15">[[ get_zip_line(voucher.partner_id) ]] </para>
- <para style="P15">[[ voucher.partner_id.country_id.name]]</para>
+ <para style="P15">[[ display_address(voucher.partner_id) or removeParentNode('para') ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/account_check_writing/report/check_print_middle.rml b/addons/account_check_writing/report/check_print_middle.rml
index 5a2f83f20a2..b1fffca662d 100644
--- a/addons/account_check_writing/report/check_print_middle.rml
+++ b/addons/account_check_writing/report/check_print_middle.rml
@@ -237,10 +237,7 @@
</td>
<td>
<para style="P15">[[ voucher.partner_id.name ]]</para>
- <para style="P15">[[ voucher.partner_id.street or removeParentNode('para') ]]</para>
- <para style="P15">[[ voucher.partner_id.street2 or removeParentNode('para') ]]</para>
- <para style="P15">[[ get_zip_line(voucher.partner_id) ]] </para>
- <para style="P15">[[ voucher.partner_id.country_id.name]]</para>
+ <para style="P15">[[ display_address(voucher.partner_id) or removeParentNode('para') ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/account_check_writing/report/check_print_top.rml b/addons/account_check_writing/report/check_print_top.rml
index 41526605f47..9a4d633e680 100644
--- a/addons/account_check_writing/report/check_print_top.rml
+++ b/addons/account_check_writing/report/check_print_top.rml
@@ -153,9 +153,7 @@
</td>
<td>
<para style="P9">[[ voucher.partner_id.name ]] </para>
- <para style="P15">[[ voucher.partner_id.street2 or removeParentNode('para') ]]</para>
- <para style="P15">[[ get_zip_line(voucher.partner_id) ]] </para>
- <para style="P15">[[ voucher.partner_id.country_id.name]]</para>
+ <para style="P15">[[ display_address(voucher.partner_id) or removeParentNode('para') ]]</para>
</td>
<td>
<para/>
diff --git a/addons/account_followup/i18n/ar.po b/addons/account_followup/i18n/ar.po
index 567253c4c02..bf1fde2db25 100644
--- a/addons/account_followup/i18n/ar.po
+++ b/addons/account_followup/i18n/ar.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
-"PO-Revision-Date: 2009-02-03 06:24+0000\n"
-"Last-Translator: <>\n"
+"PO-Revision-Date: 2012-10-08 15:59+0000\n"
+"Last-Translator: waleed bazaza <waleed_bazaza@yahoo.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: 2012-08-28 06:07+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: account_followup
#: view:account_followup.followup:0
@@ -42,7 +42,7 @@ msgstr "متابعة"
#: help:account.followup.print.all,test_print:0
msgid ""
"Check if you want to print followups without changing followups level."
-msgstr ""
+msgstr "اختر هذه الخانة إذا أردت طباعة المتابعات بدون تغيير متوى المتابعات."
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line2
@@ -101,7 +101,7 @@ msgstr "الدليل"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Follow up Entries with period in current year"
-msgstr ""
+msgstr "مدخلات المتابعات بفترات في السنة الحالية"
#. module: account_followup
#: view:account.followup.print.all:0
@@ -314,6 +314,9 @@ msgid ""
"\n"
"%s"
msgstr ""
+"جميع رسائل البريد الالكتروني قد أرسلت بنجاح للشركاء:.\n"
+"\n"
+"%s"
#. module: account_followup
#: constraint:account_followup.followup.line:0
@@ -362,6 +365,11 @@ msgid ""
"\n"
"%s"
msgstr ""
+"\n"
+"\n"
+"رسالة البريد الالكتروني قد أرسلت للشركاء التاليين.!\n"
+"\n"
+"%s"
#. module: account_followup
#: help:account.followup.print,date:0
@@ -503,7 +511,7 @@ msgstr "تقرير المتابعة"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "Follow-Up Steps"
-msgstr ""
+msgstr "خطوات المتابعة"
#. module: account_followup
#: field:account_followup.stat,period_id:0
@@ -514,7 +522,7 @@ msgstr "فترة"
#: code:addons/account_followup/wizard/account_followup_print.py:307
#, python-format
msgid "Followup Summary"
-msgstr ""
+msgstr "خلاصة المتابعة"
#. module: account_followup
#: view:account.followup.print:0
@@ -535,7 +543,7 @@ msgstr "مستوى اعلى متابعة"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_view_account_followup_followup_form
msgid "Review Invoicing Follow-Ups"
-msgstr ""
+msgstr "استعراض متابعة الفوترة"
#. module: account_followup
#: constraint:account.move.line:0
@@ -595,7 +603,7 @@ msgstr "الوصف"
#. module: account_followup
#: constraint:account_followup.followup:0
msgid "Only One Followup by Company."
-msgstr ""
+msgstr "متابعة واحدة غقط من الشركة."
#. module: account_followup
#: view:account_followup.stat:0
diff --git a/addons/account_followup/report/account_followup_print.py b/addons/account_followup/report/account_followup_print.py
index 8d64ce30f6b..593430691aa 100644
--- a/addons/account_followup/report/account_followup_print.py
+++ b/addons/account_followup/report/account_followup_print.py
@@ -30,7 +30,6 @@ class report_rappel(report_sxw.rml_parse):
self.localcontext.update({
'time': time,
'ids_to_objects': self._ids_to_objects,
- 'adr_get': self._adr_get,
'getLines': self._lines_get,
'get_text': self._get_text
})
@@ -43,11 +42,6 @@ class report_rappel(report_sxw.rml_parse):
all_lines.append(line)
return all_lines
- def _adr_get(self, stat_line, type):
- res_partner = pooler.get_pool(self.cr.dbname).get('res.partner')
- adr = res_partner.address_get(self.cr, self.uid, [stat_line.partner_id.id], [type])[type]
- return adr and res_partner.read(self.cr, self.uid, [adr]) or [{}]
-
def _lines_get(self, stat_by_partner_line):
pool = pooler.get_pool(self.cr.dbname)
moveline_obj = pool.get('account.move.line')
diff --git a/addons/account_followup/report/account_followup_print.rml b/addons/account_followup/report/account_followup_print.rml
index 3d096ecf3ac..7f2242991de 100644
--- a/addons/account_followup/report/account_followup_print.rml
+++ b/addons/account_followup/report/account_followup_print.rml
@@ -129,15 +129,10 @@
<blockTable colWidths="298.0,234.0" style="Tableau2">
<tr>
<td>
- <para style="terp_default_9">[[ repeatIn(adr_get(o,'invoice'),'a' )]]</para>
</td>
<td>
<para style="terp_default_9">[[ o.partner_id.name or '' ]]</para>
- <para style="terp_default_9">[[ a['street'] or '']]</para>
- <para style="terp_default_9">[[ a['street2'] or removeParentNode('para') ]]</para>
- <para style="terp_default_9">[[ a['zip'] or '' ]] [[ a['city'] or '' ]]</para>
- <para style="terp_default_9">[[( a['state_id'] and a['state_id'][1]) or removeParentNode('para') ]]</para>
- <para style="terp_default_9">[[( a['country_id'] and a['country_id'][1]) or '']]</para>
+ <para style="terp_default_9">[[ display_address(o.partner_id) or '']]</para>
<para style="terp_default_9">
<font color="white"> </font>
</para>
diff --git a/addons/account_payment/report/order.rml b/addons/account_payment/report/order.rml
index 973588e5410..7ad897890e4 100644
--- a/addons/account_payment/report/order.rml
+++ b/addons/account_payment/report/order.rml
@@ -256,10 +256,10 @@
<para style="terp_default_Centre_9">[[line.date=='False' and '-' or formatLang(line.date,date=True) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[formatLang(line.amount) or '-' ]] [[get_company_currency_symbol()]] </para>
+ <para style="terp_default_Right_9">[[formatLang(line.amount, currency_obj= user.company_id.currency_id) or '-' ]] </para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line.amount_currency) ]] [[ line.currency.symbol]] </para>
+ <para style="terp_default_Right_9">[[ formatLang(line.amount_currency, currency_obj= line.currency)]]</para>
</td>
</tr>
</blockTable>
@@ -275,10 +275,10 @@
<para style="terp_default_Bold_9">Total:</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(get_amount_total(o)) or '' ]] [[get_company_currency_symbol()]] </para>
+ <para style="terp_default_Right_9">[[ formatLang(get_amount_total(o), currency_obj= user.company_id.currency_id) or '' ]] </para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(get_amount_total_in_currency(o)) or '' ]] [[get_company_currency_symbol()]] </para>
+ <para style="terp_default_Right_9">[[ formatLang(get_amount_total_in_currency(o), currency_obj= user.company_id.currency_id) or '' ]] </para>
</td>
</tr>
</blockTable>
diff --git a/addons/account_payment/report/payment_order.py b/addons/account_payment/report/payment_order.py
index 6872bbe3516..5f9708f876c 100644
--- a/addons/account_payment/report/payment_order.py
+++ b/addons/account_payment/report/payment_order.py
@@ -32,7 +32,6 @@ class payment_order(report_sxw.rml_parse):
'time': time,
'get_invoice_name': self._get_invoice_name,
'get_company_currency': self._get_company_currency,
- 'get_company_currency_symbol': self._get_company_currency_symbol,
'get_amount_total_in_currency': self._get_amount_total_in_currency,
'get_amount_total': self._get_amount_total,
'get_account_name': self._get_account_name,
@@ -72,12 +71,8 @@ class payment_order(report_sxw.rml_parse):
user = pool.get('res.users').browse(self.cr, self.uid, self.uid)
return user.company_id and user.company_id.currency_id and user.company_id.currency_id.symbol or False
- def _get_company_currency_symbol(self):
- pool = pooler.get_pool(self.cr.dbname)
- user = pool.get('res.users').browse(self.cr, self.uid, self.uid)
- return user.company_id and user.company_id.currency_id and user.company_id.currency_id.symbol or False
- def _get_account_name(self, bank_id):
+ def _get_account_name(self,bank_id):
if bank_id:
pool = pooler.get_pool(self.cr.dbname)
value_name = pool.get('res.partner.bank').name_get(self.cr, self.uid, [bank_id])
diff --git a/addons/account_payment/wizard/account_payment_populate_statement.py b/addons/account_payment/wizard/account_payment_populate_statement.py
index ecfd4988329..fffe6c17b92 100644
--- a/addons/account_payment/wizard/account_payment_populate_statement.py
+++ b/addons/account_payment/wizard/account_payment_populate_statement.py
@@ -86,24 +86,24 @@ class account_payment_populate_statement(osv.osv_memory):
'name': line.name,
'partner_id': line.partner_id.id,
'journal_id': statement.journal_id.id,
- 'account_id': result.get('account_id', statement.journal_id.default_credit_account_id.id),
+ '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 or time.strftime('%Y-%m-%d'),
'amount': abs(amount),
- 'period_id': statement.period_id.id
+ 'period_id': statement.period_id.id,
}
voucher_id = voucher_obj.create(cr, uid, voucher_res, context=context)
- voucher_line_dict = False
- if result['value']['line_ids']:
- for line_dict in result['value']['line_ids']:
- move_line = move_line_obj.browse(cr, uid, line_dict['move_line_id'], context)
- if line.move_line_id.move_id.id == move_line.move_id.id:
- voucher_line_dict = line_dict
+
+ voucher_line_dict = {}
+ for line_dict in result['value']['line_cr_ids'] + result['value']['line_dr_ids']:
+ move_line = move_line_obj.browse(cr, uid, line_dict['move_line_id'], context)
+ if line.move_line_id.move_id.id == move_line.move_id.id:
+ voucher_line_dict = line_dict
+
if voucher_line_dict:
voucher_line_dict.update({'voucher_id': voucher_id})
voucher_line_obj.create(cr, uid, voucher_line_dict, context=context)
-
st_line_id = statement_line_obj.create(cr, uid, {
'name': line.order_id.reference or '?',
'amount': - amount,
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index 4b0365e1a11..f97f3f6af3c 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -547,6 +547,19 @@ class account_voucher(osv.osv):
vals = self.recompute_payment_rate(cr, uid, ids, res, currency_id, date, ttype, journal_id, amount, context=context)
for key in vals.keys():
res[key].update(vals[key])
+ #TODO: onchange_partner_id() should not returns [pre_line, line_dr_ids, payment_rate...] for type sale, and not
+ # [pre_line, line_cr_ids, payment_rate...] for type purchase.
+ # We should definitively split account.voucher object in two and make distinct on_change functions. In the
+ # meanwhile, bellow lines must be there because the fields aren't present in the view, what crashes if the
+ # onchange returns a value for them
+ if ttype == 'sale':
+ del(res['value']['line_dr_ids'])
+ del(res['value']['pre_line'])
+ del(res['value']['payment_rate'])
+ elif ttype == 'purchase':
+ del(res['value']['line_cr_ids'])
+ del(res['value']['pre_line'])
+ del(res['value']['payment_rate'])
return res
def recompute_voucher_lines(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None):
@@ -588,7 +601,7 @@ class account_voucher(osv.osv):
#set default values
default = {
- 'value': {'line_ids': [] ,'line_dr_ids': [] ,'line_cr_ids': [] ,'pre_line': False,},
+ 'value': {'line_dr_ids': [] ,'line_cr_ids': [] ,'pre_line': False,},
}
#drop existing lines
@@ -667,6 +680,7 @@ class account_voucher(osv.osv):
#voucher line creation
for line in account_move_lines:
+
if _remove_noise_in_o2m():
continue
@@ -771,8 +785,10 @@ class account_voucher(osv.osv):
if account_id and account_id.tax_ids:
tax_id = account_id.tax_ids[0].id
- vals = self.onchange_price(cr, uid, ids, line_ids, tax_id, partner_id, context)
- vals['value'].update({'tax_id':tax_id,'amount': amount})
+ vals = {'value':{} }
+ if ttype in ('sale', 'purchase'):
+ vals = self.onchange_price(cr, uid, ids, line_ids, tax_id, partner_id, context)
+ vals['value'].update({'tax_id':tax_id,'amount': amount})
currency_id = False
if journal.currency:
currency_id = journal.currency.id
@@ -1054,7 +1070,8 @@ class account_voucher(osv.osv):
if line.amount == line.amount_unreconciled:
if not line.move_line_id.amount_residual:
raise osv.except_osv(_('Wrong bank statement line'),_("You have to delete the bank statement line which the payment was reconciled to manually. Please check the payment of the partner %s by the amount of %s.")%(line.voucher_id.partner_id.name, line.voucher_id.amount))
- currency_rate_difference = line.move_line_id.amount_residual - amount
+ sign = voucher_brw.type in ('payment', 'purchase') and -1 or 1
+ currency_rate_difference = sign * (line.move_line_id.amount_residual - amount)
else:
currency_rate_difference = 0.0
move_line = {
@@ -1183,6 +1200,7 @@ class account_voucher(osv.osv):
account_id = voucher_brw.partner_id.property_account_receivable.id
else:
account_id = voucher_brw.partner_id.property_account_payable.id
+ sign = voucher_brw.type == 'payment' and -1 or 1
move_line = {
'name': write_off_name or name,
'account_id': account_id,
@@ -1191,7 +1209,7 @@ class account_voucher(osv.osv):
'date': voucher_brw.date,
'credit': diff > 0 and diff or 0.0,
'debit': diff < 0 and -diff or 0.0,
- 'amount_currency': company_currency <> current_currency and voucher_brw.writeoff_amount or False,
+ 'amount_currency': company_currency <> current_currency and (sign * -1 * voucher_brw.writeoff_amount) or False,
'currency_id': company_currency <> current_currency and current_currency or False,
'analytic_account_id': voucher_brw.analytic_id and voucher_brw.analytic_id.id or False,
}
diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml
index 5e26c366778..f8bab444453 100644
--- a/addons/account_voucher/account_voucher_view.xml
+++ b/addons/account_voucher/account_voucher_view.xml
@@ -34,6 +34,7 @@
</field>
</record>
+ <!-- where and when is this view used?? -->
<record model="ir.ui.view" id="view_voucher_form">
<field name="name">account.voucher.form</field>
<field name="model">account.voucher</field>
diff --git a/addons/account_voucher/report/account_voucher_print.rml b/addons/account_voucher/report/account_voucher_print.rml
index 923e900887a..9f0f2e1f07e 100644
--- a/addons/account_voucher/report/account_voucher_print.rml
+++ b/addons/account_voucher/report/account_voucher_print.rml
@@ -219,7 +219,7 @@
<para style="terp_default_9_30cm">[[ p['pname'] ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ p['amount'] ]] [[ voucher.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(p['amount'], currency_obj=voucher.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -323,7 +323,7 @@
</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ voucher.amount ]] [[ voucher.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(voucher.amount, currency_obj=voucher.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/account_voucher/report/account_voucher_sales_receipt_view.xml b/addons/account_voucher/report/account_voucher_sales_receipt_view.xml
index 15b2433ec25..fbd40ee17ba 100644
--- a/addons/account_voucher/report/account_voucher_sales_receipt_view.xml
+++ b/addons/account_voucher/report/account_voucher_sales_receipt_view.xml
@@ -6,7 +6,7 @@
<field name="name">sale.receipt.report.tree</field>
<field name="model">sale.receipt.report</field>
<field name="arch" type="xml">
- <tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" string="Sales Receipt Analysis">
+ <tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" create="false" string="Sales Receipt Analysis">
<field name="date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="year" invisible="1"/>
diff --git a/addons/account_voucher/test/account_voucher.yml b/addons/account_voucher/test/account_voucher.yml
index 2ea6c0b7890..f8e20f496e5 100644
--- a/addons/account_voucher/test/account_voucher.yml
+++ b/addons/account_voucher/test/account_voucher.yml
@@ -1,7 +1,8 @@
-
In order to check account voucher module in OpenERP I create a customer voucher
-
- !record {model: account.voucher, id: account_voucher_voucherforaxelor0}:
+ !record {model: account.voucher, id: account_voucher_voucherforaxelor0, view: view_sale_receipt_form}:
+ type: sale
account_id: account.cash
amount: 1000.0
company_id: base.main_company
@@ -47,7 +48,8 @@
-
Now I create a Vendor Voucher
-
- !record {model: account.voucher, id: account_voucher_voucheraxelor0, view: False}:
+ !record {model: account.voucher, id: account_voucher_voucheraxelor0, view: view_voucher_filter_vendor}:
+ type: purchase
account_id: account.cash
amount: 1000.0
company_id: base.main_company
diff --git a/addons/account_voucher/test/account_voucher_report.yml b/addons/account_voucher/test/account_voucher_report.yml
index 3996e0c27e4..60dc4103553 100644
--- a/addons/account_voucher/test/account_voucher_report.yml
+++ b/addons/account_voucher/test/account_voucher_report.yml
@@ -1,7 +1,8 @@
-
Demo for Account Voucher
-
- !record {model: account.voucher, id: account_voucher_voucheraxelor0again}:
+ !record {model: account.voucher, id: account_voucher_voucheraxelor0again, view: view_sale_receipt_form}:
+ type: sale
account_id: account.cash
company_id: base.main_company
journal_id: account.bank_journal
diff --git a/addons/account_voucher/test/case1_usd_usd.yml b/addons/account_voucher/test/case1_usd_usd.yml
index b706e6f0644..300d565f229 100644
--- a/addons/account_voucher/test/case1_usd_usd.yml
+++ b/addons/account_voucher/test/case1_usd_usd.yml
@@ -216,6 +216,10 @@
assert move_line.credit == 63.00, "Debtor account has wrong entry."
elif move_line.amount_currency == 10.00:
assert move_line.debit == 9.00, "Writeoff amount is wrong."
+ elif move_line.amount_currency == 240.00:
+ assert move_line.debit == 216.00, "Bank entry is wrong."
+ else:
+ assert False, "Unrecognized journal entry"
-
I check the residual amount of Invoice1, should be 20 in amount_currency
-
@@ -237,7 +241,7 @@
-
On the first April, I create the second voucher of payment with values 45 USD, journal USD,
-
- !record {model: account.voucher, id: account_voucher_2_case1}:
+ !record {model: account.voucher, id: account_voucher_2_case1, view: view_vendor_receipt_form}:
account_id: account.cash
amount: 45.0
company_id: base.main_company
@@ -323,8 +327,16 @@
assert move_line.debit == 4.75, "Writeoff amount is wrong."
elif move_line.debit == 11.5 and move_line.account_id.reconcile:
assert move_line.amount_currency == 0.0 and move_line.reconcile_id.id == reconcile_a, "Exchange difference entry for the invoice of 100$ is wrong"
+ elif move_line.credit == 11.5:
+ assert move_line.amount_currency == 0.0
elif move_line.debit == 31.0 and move_line.account_id.reconcile:
assert move_line.amount_currency == 0.0 and move_line.reconcile_id.id == reconcile_b, "Exchange difference entry for the invoice of 200$ is wrong"
+ elif move_line.credit == 31.0:
+ assert move_line.amount_currency == 0.0
+ elif move_line.amount_currency == 45.00:
+ assert move_line.debit == 42.75, "Bank entry is wrong."
+ else:
+ assert False, "Unrecognized journal entry"
-
I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual and paid
-
diff --git a/addons/account_voucher/test/case4_cad_chf.yml b/addons/account_voucher/test/case4_cad_chf.yml
index a78669c95ef..a2b252497cd 100644
--- a/addons/account_voucher/test/case4_cad_chf.yml
+++ b/addons/account_voucher/test/case4_cad_chf.yml
@@ -164,7 +164,7 @@
-
I check that my currency rate difference is correct. 0 in debit with no amount_currency
-
- I check that my writeoff is correct. 11.05 credit and 13.26 amount_currency
+ I check that my writeoff is correct. 11.05 credit and -13.26 amount_currency
-
!python {model: account.voucher}: |
voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 4'), ('partner_id', '=', ref('base.res_partner_19'))])
@@ -179,7 +179,7 @@
elif move_line.debit == 0.00 and move_line.credit == 0.00:
assert move_line.amount_currency == 0.00, "Incorrect Currency Difference."
elif move_line.credit == 10.61:
- assert move_line.amount_currency == 13.26, "Writeoff amount is wrong."
+ assert move_line.amount_currency == -13.26, "Writeoff amount is wrong."
else:
assert False, "Wrong entry"
-
diff --git a/addons/account_voucher/test/sales_receipt.yml b/addons/account_voucher/test/sales_receipt.yml
index f39d784bd42..7cd82eecaff 100644
--- a/addons/account_voucher/test/sales_receipt.yml
+++ b/addons/account_voucher/test/sales_receipt.yml
@@ -1,7 +1,7 @@
-
Creating a Voucher Receipt for partner Seagate with amount 30000.0
-
- !record {model: account.voucher, id: account_voucher_seagate_0}:
+ !record {model: account.voucher, id: account_voucher_seagate_0, view: view_sale_receipt_form}:
account_id: account.a_recv
amount: 30000.0
company_id: base.main_company
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 78b76e5c9b7..e1a48c6c535 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -136,11 +136,8 @@
<group>
<group>
<field name="partner_id" required="1" invisible="context.get('line_type', False)" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" context="{'invoice_currency':currency_id, 'default_customer': 0, 'search_default_supplier': 1, 'default_supplier': 1}" string="Supplier"/>
- <label for="amount" string="Amount"/>
- <div>
- <field name="amount" invisible="context.get('line_type', False)" on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)" class="oe_inline"/>
- <field name="currency_id" class="oe_inline"/>
- </div>
+ <field name="currency_id" invisible="1"/>
+ <field name="amount" invisible="context.get('line_type', False)" on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)" class="oe_inline" widget='monetary' options='{"currency_field": "currency_id"}'/>
<field name="journal_id"
domain="[('type','in',['bank', 'cash'])]"
invisible="context.get('line_type', False)"
@@ -203,7 +200,7 @@
</group>
<group col="2">
<separator string="Payment Options" colspan="2"/>
- <field name="writeoff_amount"/>
+ <field name="writeoff_amount" widget='monetary' options='{"currency_field": "currency_id"}'/>
<field name="payment_option" required="1"/>
<field name="writeoff_acc_id"
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"
@@ -294,13 +291,12 @@
<group>
<field name="state" invisible="1"/>
<field name="partner_id" required="1" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" string="Customer" context="{'search_default_customer': 1}"/>
- <label for="amount" string="Paid Amount"/>
- <div>
- <field name="amount" class="oe_inline"
- invisible="context.get('line_type', False)"
- on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
- <field name="currency_id" class="oe_inline"/>
- </div>
+ <field name="currency_id" invisible="1"/>
+ <field name="amount" class="oe_inline"
+ string="Paid Amount"
+ widget='monetary' options='{"currency_field": "currency_id"}'
+ invisible="context.get('line_type', False)"
+ on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
<field name="journal_id"
domain="[('type','in',['bank', 'cash'])]"
invisible="context.get('line_type', False)"
@@ -323,7 +319,7 @@
</group>
<notebook invisible="1">
<page string="Payment Information" groups="base.group_user">
- <label for="line_cr_ids"/>
+ <label for="line_cr_ids"/>
<field name="line_cr_ids" context="{'journal_id':journal_id, 'type':type, 'partner_id':partner_id}" on_change="onchange_line_ids(line_dr_ids, line_cr_ids, amount, currency_id, type, context)">
<tree string="Invoices and outstanding transactions" editable="bottom" colors="gray:amount==0">
<field name="move_line_id" context="{'journal_id':parent.journal_id, 'partner_id':parent.partner_id}"
@@ -367,7 +363,7 @@
<field name="paid_amount_in_company_currency" colspan="4" invisible="1"/>
</group>
<group>
- <field name="writeoff_amount"/>
+ <field name="writeoff_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="payment_option" required="1"/>
<field name="writeoff_acc_id"
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"
@@ -406,14 +402,12 @@
<group>
<group>
<field name="partner_id" domain="[('customer','=',True)]" required="1" invisible="context.get('line_type', False)" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" string="Customer" context="{'search_default_customer': 1}"/>
- <label for="amount" string="Paid Amount"/>
- <div>
- <field name="amount" class="oe_inline"
- invisible="context.get('line_type', False)"
- on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
- <field name="currency_id" class="oe_inline"/>
- </div>
-
+ <field name="currency_id" invisible="1"/>
+ <field name="amount" class="oe_inline"
+ string="Paid Amount"
+ widget="monetary" options="{'currency_field': 'currency_id'}"
+ invisible="context.get('line_type', False)"
+ on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
<field name="journal_id"
domain="[('type','in',['bank', 'cash'])]"
invisible="context.get('line_type', False)"
@@ -436,7 +430,7 @@
</group>
<notebook>
<page string="Payment Information" groups="base.group_user">
- <label for="line_cr_ids"/>
+ <label for="line_cr_ids"/>
<field name="line_cr_ids" context="{'journal_id':journal_id, 'type':type, 'partner_id':partner_id}" on_change="onchange_line_ids(line_dr_ids, line_cr_ids, amount, currency_id, type, context)">
<tree string="Invoices and outstanding transactions" editable="bottom" colors="gray:amount==0">
<field name="move_line_id" context="{'journal_id':parent.journal_id, 'partner_id':parent.partner_id}"
@@ -480,7 +474,7 @@
<field name="paid_amount_in_company_currency" colspan="4" invisible="1"/>
</group>
<group>
- <field name="writeoff_amount"/>
+ <field name="writeoff_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="payment_option" required="1"/>
<field name="writeoff_acc_id"
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"
diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml
index 5bcecfa268e..a362c553ccd 100644
--- a/addons/account_voucher/voucher_sales_purchase_view.xml
+++ b/addons/account_voucher/voucher_sales_purchase_view.xml
@@ -72,7 +72,8 @@
<h1><label for="number" string="Sale Receipt"/> <field name="number" class="oe_inline" readonly="1"/></h1>
<group>
<group>
- <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="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"/>
</group>
<group>
@@ -80,9 +81,9 @@
<field name="date" on_change="onchange_date(date, currency_id, currency_id, amount, company_id, context)"/>
<field name="name"/>
<field name="paid" invisible="1"/>
+ <field name="paid_amount_in_company_currency" invisible="1"/>
<field name="currency_id" invisible="1"/>
</group>
- <field name="type" invisible="True"/>
</group>
<notebook>
<page string="Sales Information">
@@ -235,6 +236,7 @@
widget="selection"
on_change="onchange_journal(journal_id, line_dr_ids, tax_id, partner_id, date, amount, type, company_id, context)"
groups="account.group_account_user"/>
+ <field name="paid_amount_in_company_currency" invisible="1"/>
</group>
</group>
<notebook>
diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py
index ff09349b8a2..1ce483a26cd 100644
--- a/addons/analytic/analytic.py
+++ b/addons/analytic/analytic.py
@@ -125,7 +125,8 @@ class account_analytic_account(osv.osv):
if account.company_id:
if account.company_id.currency_id.id != value:
raise osv.except_osv(_('Error!'), _("If you set a company, the currency selected has to be the same as it's currency. \nYou can remove the company belonging, and thus change the currency, only on analytic account of type 'view'. This can be really usefull for consolidation purposes of several companies charts with different currencies, for example."))
- return cr.execute("""update account_analytic_account set currency_id=%s where id=%s""", (value, account.id, ))
+ if value:
+ return cr.execute("""update account_analytic_account set currency_id=%s where id=%s""", (value, account.id, ))
def _currency(self, cr, uid, ids, field_name, arg, context=None):
result = {}
@@ -163,7 +164,7 @@ class account_analytic_account(osv.osv):
'date': fields.date('Date End', select=True),
'company_id': fields.many2one('res.company', 'Company', required=False), #not required because we want to allow different companies to use the same chart of account, except for leaf accounts.
'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','To Renew'),('close','Closed')], 'Status', required=True,),
- 'currency_id': fields.function(_currency, fnct_inv=_set_company_currency,
+ 'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, #the currency_id field is readonly except if it's a view account and if there is no company
store = {
'res.company': (_get_analytic_account, ['currency_id'], 10),
}, string='Currency', type='many2one', relation='res.currency'),
diff --git a/addons/analytic/analytic_view.xml b/addons/analytic/analytic_view.xml
index 51f5428002f..0bb009e72b0 100644
--- a/addons/analytic/analytic_view.xml
+++ b/addons/analytic/analytic_view.xml
@@ -24,6 +24,7 @@
<field name="partner_id" on_change="on_change_partner_id(partner_id, name)" attrs="{'required':[('type','=','contract')]}"/>
<field name="manager_id"/>
<field name="code"/>
+ <field name="currency_id" attrs="{'invisible': ['|',('type', '&lt;&gt;', 'view'), ('company_id', '&lt;&gt;', False)]}"/>
</group>
<group>
<field name="type"/>
diff --git a/addons/audittrail/audittrail_view.xml b/addons/audittrail/audittrail_view.xml
index b041329f6bd..c26e1b5b570 100644
--- a/addons/audittrail/audittrail_view.xml
+++ b/addons/audittrail/audittrail_view.xml
@@ -145,7 +145,7 @@
<field name="name">audittrail.log.tree</field>
<field name="model">audittrail.log</field>
<field name="arch" type="xml">
- <tree string="AuditTrail Logs">
+ <tree string="AuditTrail Logs" create="false">
<field name="timestamp"/>
<field name="name"/>
<field name="object_id"/>
diff --git a/addons/auth_oauth/__openerp__.py b/addons/auth_oauth/__openerp__.py
index c8da9c65d4a..1c29ca8c093 100644
--- a/addons/auth_oauth/__openerp__.py
+++ b/addons/auth_oauth/__openerp__.py
@@ -34,6 +34,7 @@ Allow users to login through Google OAuth2.
'depends': ['base', 'web', 'base_setup'],
'data': [
'auth_oauth_data.xml',
+ 'auth_oauth_data.yml',
'auth_oauth_view.xml',
'security/ir.model.access.csv'
],
diff --git a/addons/auth_oauth/auth_oauth_data.xml b/addons/auth_oauth/auth_oauth_data.xml
index 83e9df2e44d..c07359a062c 100644
--- a/addons/auth_oauth/auth_oauth_data.xml
+++ b/addons/auth_oauth/auth_oauth_data.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<openerp>
- <data>
+ <data noupdate="1">
<record id="provider_openerp" model="auth.oauth.provider">
<field name="name">OpenERP Accounts</field>
diff --git a/addons/auth_oauth/auth_oauth_data.yml b/addons/auth_oauth/auth_oauth_data.yml
new file mode 100644
index 00000000000..af43811a560
--- /dev/null
+++ b/addons/auth_oauth/auth_oauth_data.yml
@@ -0,0 +1,6 @@
+-
+ Use database uuid as client_id for OpenERP oauth provider
+-
+ !python {model: ir.config_parameter}: |
+ oauth = self.pool.get('auth.oauth.provider')
+ oauth.write(cr, uid, [ref('provider_openerp')], {'client_id': self.get_param(cr, uid, 'database.uuid')})
diff --git a/addons/auth_oauth/controllers/main.py b/addons/auth_oauth/controllers/main.py
index ae01df5f6f7..26016f3f0a1 100644
--- a/addons/auth_oauth/controllers/main.py
+++ b/addons/auth_oauth/controllers/main.py
@@ -4,28 +4,25 @@ import simplejson
import werkzeug.urls
import werkzeug.utils
-import openerp.modules.registry
-import openerp.addons.web.controllers.main
-import openerp.addons.web.common.http as openerpweb
-from openerp import SUPERUSER_ID
+import openerp
_logger = logging.getLogger(__name__)
-class OAuthController(openerpweb.Controller):
+class OAuthController(openerp.addons.web.http.Controller):
_cp_path = '/auth_oauth'
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def list_providers(self, req, dbname):
try:
registry = openerp.modules.registry.RegistryManager.get(dbname)
with registry.cursor() as cr:
providers = registry.get('auth.oauth.provider')
- l = providers.read(cr, SUPERUSER_ID, providers.search(cr, SUPERUSER_ID, [('enabled','=',True)]))
+ l = providers.read(cr, openerp.SUPERUSER_ID, providers.search(cr, openerp.SUPERUSER_ID, [('enabled','=',True)]))
except Exception:
l = []
return l
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def signin(self, req, **kw):
state = simplejson.loads(kw['state'])
dbname = state['d']
@@ -34,7 +31,7 @@ class OAuthController(openerpweb.Controller):
with registry.cursor() as cr:
try:
u = registry.get('res.users')
- credentials = u.auth_oauth(cr, SUPERUSER_ID, provider, kw)
+ credentials = u.auth_oauth(cr, openerp.SUPERUSER_ID, provider, kw)
cr.commit()
return openerp.addons.web.controllers.main.login_and_redirect(req, *credentials)
except AttributeError:
@@ -43,7 +40,7 @@ class OAuthController(openerpweb.Controller):
url = "/#action=login&oauth_error=1"
except Exception,e:
# signup error
- _logger.exception('oops')
+ _logger.exception("OAuth2: %s" % str(e))
url = "/#action=login&oauth_error=2"
return openerp.addons.web.controllers.main.set_cookie_and_redirect(req, url)
diff --git a/addons/auth_oauth/res_users.py b/addons/auth_oauth/res_users.py
index fd26e89c2e3..115e3136f00 100644
--- a/addons/auth_oauth/res_users.py
+++ b/addons/auth_oauth/res_users.py
@@ -15,13 +15,17 @@ class res_users(osv.Model):
_inherit = 'res.users'
_columns = {
- 'oauth_provider_id': fields.many2one('auth.oauth.provider','OAuth Provider'),
+ 'oauth_provider_id': fields.many2one('auth.oauth.provider', 'OAuth Provider'),
'oauth_uid': fields.char('OAuth User ID', help="Oauth Provider user_id"),
- 'oauth_access_token': fields.char('OAuth Token', readonly=True),
+ 'oauth_access_token': fields.char('OAuth Access Token', readonly=True),
}
+ _sql_constraints = [
+ ('uniq_users_oauth_provider_oauth_uid', 'unique(oauth_provider_id, oauth_uid)', 'OAuth UID must be unique per provider'),
+ ]
+
def auth_oauth_rpc(self, cr, uid, endpoint, access_token, context=None):
- params = urllib.urlencode({ 'access_token': access_token })
+ params = urllib.urlencode({'access_token': access_token})
if urlparse.urlparse(endpoint)[4]:
url = endpoint + '&' + params
else:
@@ -41,22 +45,26 @@ class res_users(osv.Model):
validation = self.auth_oauth_rpc(cr, uid, p.validation_endpoint, access_token)
if validation.get("error"):
- raise openerp.exceptions.AccessDenied
+ raise Exception(validation['error'])
if p.data_endpoint:
data = self.auth_oauth_rpc(cr, uid, p.data_endpoint, access_token)
validation.update(data)
# required
oauth_uid = validation['user_id']
if not oauth_uid:
- raise openerp.exceptions.AccessDenied
+ raise openerp.exceptions.AccessDenied()
email = validation.get('email', 'provider_%d_user_%d' % (p.id, oauth_uid))
# optional
name = validation.get('name', email)
- res = self.search(cr, uid, [("oauth_uid", "=", oauth_uid)])
+ res = self.search(cr, uid, [("oauth_uid", "=", oauth_uid), ('oauth_provider_id', '=', provider)])
if res:
- self.write(cr, uid, res[0], { 'oauth_access_token': access_token })
+ assert len(res) == 1
+ self.write(cr, uid, res[0], {'oauth_access_token': access_token})
else:
- # New user
+ # New user if signup module available
+ if not hasattr(self, '_signup_create_user'):
+ raise openerp.exceptions.AccessDenied()
+
new_user = {
'name': name,
'login': email,
@@ -66,7 +74,9 @@ class res_users(osv.Model):
'oauth_access_token': access_token,
'active': True,
}
- self.auth_signup_create(cr, uid, new_user)
+ # TODO pass signup token to allow attach new user to right partner
+ self._signup_create_user(cr, uid, new_user)
+
credentials = (cr.dbname, email, access_token)
return credentials
@@ -74,7 +84,7 @@ class res_users(osv.Model):
try:
return super(res_users, self).check_credentials(cr, uid, password)
except openerp.exceptions.AccessDenied:
- res = self.search(cr, SUPERUSER_ID, [('id','=',uid),('oauth_access_token','=',password)])
+ res = self.search(cr, SUPERUSER_ID, [('id', '=', uid), ('oauth_access_token', '=', password)])
if not res:
raise
diff --git a/addons/auth_openid/controllers/main.py b/addons/auth_openid/controllers/main.py
index ebcaab4bf25..7ee562d4d29 100644
--- a/addons/auth_openid/controllers/main.py
+++ b/addons/auth_openid/controllers/main.py
@@ -23,24 +23,21 @@ import logging
import os
import tempfile
import urllib
-from openerp import SUPERUSER_ID
import werkzeug.urls
import werkzeug.exceptions
-from openerp.modules.registry import RegistryManager
-from openerp.addons.web.controllers.main import login_and_redirect, set_cookie_and_redirect
-try:
- import openerp.addons.web.common.http as openerpweb
-except ImportError:
- import web.common.http as openerpweb # noqa
-
from openid import oidutil
from openid.store import filestore
from openid.consumer import consumer
from openid.cryptutil import randomString
from openid.extensions import ax, sreg
+import openerp
+from openerp import SUPERUSER_ID
+from openerp.modules.registry import RegistryManager
+from openerp.addons.web.controllers.main import login_and_redirect, set_cookie_and_redirect
+
from .. import utils
_logger = logging.getLogger(__name__)
@@ -70,7 +67,7 @@ class GoogleAppsAwareConsumer(consumer.GenericConsumer):
return super(GoogleAppsAwareConsumer, self).complete(message, endpoint, return_to)
-class OpenIDController(openerpweb.Controller):
+class OpenIDController(openerp.addons.web.http.Controller):
_cp_path = '/auth_openid/login'
_store = filestore.FileOpenIDStore(_storedir)
@@ -118,7 +115,7 @@ class OpenIDController(openerpweb.Controller):
def _get_realm(self, req):
return req.httprequest.host_url
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def verify_direct(self, req, db, url):
result = self._verify(req, db, url)
if 'error' in result:
@@ -127,7 +124,7 @@ class OpenIDController(openerpweb.Controller):
return werkzeug.utils.redirect(result['value'])
return result['value']
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def verify(self, req, db, url):
return self._verify(req, db, url)
@@ -157,7 +154,7 @@ class OpenIDController(openerpweb.Controller):
form_html = request.htmlMarkup(realm, redirect_to)
return {'action': 'post', 'value': form_html, 'session_id': req.session_id}
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def process(self, req, **kw):
session = getattr(req.session, 'openid_session', None)
if not session:
@@ -225,7 +222,7 @@ class OpenIDController(openerpweb.Controller):
return set_cookie_and_redirect(req, '/#action=login&loginerror=1')
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def status(self, req):
session = getattr(req.session, 'openid_session', {})
return {'status': session.get('status'), 'message': session.get('message')}
diff --git a/addons/auth_reset_password/__init__.py b/addons/auth_reset_password/__init__.py
index 28bbdd18161..8341ccd60c7 100644
--- a/addons/auth_reset_password/__init__.py
+++ b/addons/auth_reset_password/__init__.py
@@ -1 +1,23 @@
-import auth_reset_password
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+#
+##############################################################################
+
+import controllers
+import res_users
diff --git a/addons/auth_reset_password/__openerp__.py b/addons/auth_reset_password/__openerp__.py
index ccf5ca53a21..e620d515fa1 100644
--- a/addons/auth_reset_password/__openerp__.py
+++ b/addons/auth_reset_password/__openerp__.py
@@ -1,3 +1,24 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+#
+##############################################################################
+
{
'name': 'Reset Password',
'description': """
@@ -9,9 +30,11 @@ Allow users to reset their password from the login page.
'category': 'Authentication',
'website': 'http://www.openerp.com',
'installable': True,
- 'depends': ['auth_anonymous', 'email_template'],
- 'data': ['auth_reset_password.xml'],
+ 'depends': ['auth_signup', 'email_template'],
+ 'data': [
+ 'auth_reset_password.xml',
+ 'res_users_view.xml',
+ ],
'js': ['static/src/js/reset_password.js'],
- 'css': ['static/src/css/reset_password.css'],
'qweb': ['static/src/xml/reset_password.xml'],
}
diff --git a/addons/auth_reset_password/auth_reset_password.py b/addons/auth_reset_password/auth_reset_password.py
deleted file mode 100644
index cef7bc9c212..00000000000
--- a/addons/auth_reset_password/auth_reset_password.py
+++ /dev/null
@@ -1,130 +0,0 @@
-import base64
-import hashlib
-import simplejson
-import time
-import urlparse
-
-from openerp.tools import config
-from openerp.osv import osv, fields
-from openerp import SUPERUSER_ID
-
-TWENTY_FOUR_HOURS = 24 * 60 * 60
-
-def message_sign(data, secret):
- src = simplejson.dumps([data, secret], indent=None, separators=(',', ':'), sort_keys=True)
- sign = hashlib.sha1(src).hexdigest()
- msg = simplejson.dumps([data, sign], indent=None, separators=(',', ':'), sort_keys=True)
- # pad message to avoid '='
- pad = (3 - len(msg) % 3) % 3
- msg = msg + " " * pad
- msg = base64.urlsafe_b64encode(msg)
- return msg, sign
-
-def message_check(msg, secret):
- msg = base64.urlsafe_b64decode(msg)
- l = simplejson.loads(msg)
- msg_data = l[0]
- msg_sign = l[1]
- tmp, sign = message_sign(msg_data, secret)
- if msg_sign == sign:
- return msg_data
-
-class res_users(osv.osv):
- _inherit = 'res.users'
-
- def _auth_reset_password_secret(self, cr, uid, context=None):
- uuid = self.pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
- res = {
- 'dbname': cr.dbname,
- 'uuid': uuid,
- 'admin_passwd': config['admin_passwd']
- }
- return res
-
- def _auth_reset_password_host(self, cr, uid, context=None):
- return self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', '')
-
- def _auth_reset_password_link(self, cr, uid, ids, context=None):
- assert len(ids) == 1
- host = self._auth_reset_password_host(cr, uid, context)
- secret = self._auth_reset_password_secret(cr, uid, context)
- msg_src = {
- 'time': time.time(),
- 'uid': ids[0],
- }
- msg, sign = message_sign(msg_src, secret)
- link = urlparse.urljoin(host, '/login?db=%s&login=anonymous&key=anonymous#action=reset_password&token=%s' % (cr.dbname, msg))
- return link
-
- def _auth_reset_password_check_token(self, cr, uid, token, context=None):
- secret = self._auth_reset_password_secret(cr, uid, context)
- data = message_check(token, secret)
- if data and (time.time() - data['time'] < TWENTY_FOUR_HOURS):
- return data
- return None
-
- def _auth_reset_password_send_email(self, cr, uid, email_to, tpl_name, res_id, context=None):
- model, tpl_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'auth_reset_password', tpl_name)
- assert model == 'email.template'
-
- msg_id = self.pool.get(model).send_mail(cr, uid, tpl_id, res_id, force_send=False, context=context)
- MailMessage = self.pool.get('mail.message')
- MailMessage.write(cr, uid, [msg_id], {'email_to': email_to}, context=context)
- MailMessage.send(cr, uid, [msg_id], context=context)
-
- def send_reset_password_request(self, cr, uid, email, context=None):
- # TODO reseting a password knowing only an email is not good enough (email can be shared between multiple logins).
- ids = self.pool.get('res.users').search(cr, SUPERUSER_ID, [('user_email', '=', email)], context=context)
- if ids:
- self._auth_reset_password_send_email(cr, SUPERUSER_ID, email, 'reset_password_email', ids[0], context=context)
- return True
- #else:
- # _m, company_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'main_company')
- # self._auth_reset_password_send_email(cr, uid, email, 'email_no_user', company_id, context=context)
- return False
-
-class auth_reset_password(osv.TransientModel):
- _name = 'auth.reset_password'
- _rec_name = 'password'
- _columns = {
- 'password': fields.char('Password', size=64),
- 'password_confirmation': fields.char('Confirm Password', size=64),
- 'token': fields.char('Token', size=128),
- 'state': fields.selection([(x, x) for x in 'draft done missmatch error'.split()], required=True),
- }
- _defaults = {
- 'state': 'draft',
- }
-
- def create(self, cr, uid, values, context=None):
- # NOTE here, invalid values raises exceptions to avoid storing
- # sensitive data into the database (which then are available to anyone)
-
- pw = values.get('password')
- if not pw or pw != values.get('password_confirmation'):
- raise osv.except_osv('Error', 'Passwords missmatch')
-
- Users = self.pool.get('res.users')
- data = Users._auth_reset_password_check_token(cr, uid, values.get('token', ''))
- if data:
- Users.write(cr, SUPERUSER_ID, data['uid'], {'password': pw}, context=context)
- else:
- raise osv.except_osv('Error', 'Invalid token')
-
- # Dont store password
- values = {'state': 'done'}
- return super(auth_reset_password, self).create(cr, uid, values, context)
-
- def change(self, cr, uid, ids, context=None):
- return True
-
- def onchange_pw(self, cr, uid, ids, password, password_confirmation, context=None):
- if password != password_confirmation:
- return {'value': {'state': 'missmatch'}}
- return {'value': {'state': 'draft'}}
-
- def onchange_token(self, cr, uid, ids, token, context=None):
- Users = self.pool.get('res.users')
- if not Users._auth_reset_password_check_token(cr, uid, token, context=context):
- return {'value': {'state': 'error'}}
- return {}
diff --git a/addons/auth_reset_password/auth_reset_password.xml b/addons/auth_reset_password/auth_reset_password.xml
index bb75da34ce8..90f08a25899 100644
--- a/addons/auth_reset_password/auth_reset_password.xml
+++ b/addons/auth_reset_password/auth_reset_password.xml
@@ -7,56 +7,15 @@
<field name="name">Reset Password</field>
<field name="model_id" ref="base.model_res_users"/>
<field name="email_from"><![CDATA[${object.company_id.name} <${object.company_id.email}>]]></field>
- <field name="email_to" eval="False"><!--(set by reset_password module)--></field>
+ <field name="email_to">${object.email}</field>
<field name="subject">Password reset</field>
<field name="body_html"><![CDATA[
-<p>A password reset was requested the OpenERP account linked to this email on ${object._auth_reset_password_host()}</p>
+<p>A password reset was requested for the OpenERP account linked to this email.</p>
-<p>You may change your password following this <a href="${object._auth_reset_password_link()}">link</a>,
-or by copy-pasting the following URL in your browser: ${object._auth_reset_password_link()}</p>
+<p>You may change your password following <a href="${object.signup_url}">this link</a>.</p>
<p>Note: If you did not ask for a password reset, you can safely ignore this email.</p>]]></field>
</record>
- <!-- TODO get own css -->
- <record id="reset_password_wizard_form_view" model="ir.ui.view">
- <field name="name">auth.reset_password.form</field>
- <field name="model">auth.reset_password</field>
- <field name="arch" type="xml">
- <form string="Reset Password" version="7.0">
- <field name="state" invisible="1"/>
- <field name="token" on_change="onchange_token(token)" invisible="1"/>
- <group colspan="4" states="draft,missmatch">
- <field name="password" required='1' on_change="onchange_pw(password,password_confirmation)"/>
- <field name="password_confirmation" required='1' on_change="onchange_pw(password,password_confirmation)"/>
- <group colspan="4" states="missmatch">
- <div>Passwords missmatch</div>
- </group>
- <group colspan="2" col="1">
- <button string="Change Password" name="change" icon="gtk-dialog-authentication" attrs="{'readonly': [('state', '=', 'missmatch')]}"/>
- </group>
- </group>
- <group colspan="4" states="error" col="1">
- <div>Invalid or expired token</div>
- <button special="cancel" string="Close"/>
- </group>
- <group colspan="4" states="done" col="1">
- <div>Password changed. We sent you an email confirming the password change.</div>
- <button special="cancel" string="Close"/>
- </group>
- </form>
- </field>
- </record>
-
- <record id="action_reset" model="ir.actions.act_window">
- <field name="name">Reset Password</field>
- <field name="type">ir.actions.act_window</field>
- <field name="res_model">auth.reset_password</field>
- <field name="view_type">form</field>
- <field name="view_mode">form</field>
- <field name="target">new</field>
- </record>
-
-
</data>
</openerp>
diff --git a/addons/auth_reset_password/controllers/__init__.py b/addons/auth_reset_password/controllers/__init__.py
new file mode 100644
index 00000000000..f40f0ee976e
--- /dev/null
+++ b/addons/auth_reset_password/controllers/__init__.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+#
+##############################################################################
+
+import main
+
+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_reset_password/controllers/main.py b/addons/auth_reset_password/controllers/main.py
new file mode 100644
index 00000000000..639945cfc09
--- /dev/null
+++ b/addons/auth_reset_password/controllers/main.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+#
+##############################################################################
+import logging
+
+import werkzeug
+
+import openerp
+from openerp import SUPERUSER_ID
+from openerp.modules.registry import RegistryManager
+
+_logger = logging.getLogger(__name__)
+
+class Controller(openerp.addons.web.http.Controller):
+ _cp_path = '/auth_reset_password'
+
+ @openerp.addons.web.http.httprequest
+ def reset_password(self, req, dbname, login):
+ """ retrieve user, and perform reset password """
+ url = '/'
+ registry = RegistryManager.get(dbname)
+ with registry.cursor() as cr:
+ try:
+ res_users = registry.get('res.users')
+ res_users.reset_password(cr, SUPERUSER_ID, login)
+ cr.commit()
+ message = 'An email has been sent with credentials to reset your password'
+ except Exception as e:
+ # signup error
+ _logger.exception('error when resetting password')
+ message = e.message
+ url = "/#action=login&error_message=%s" % werkzeug.urls.url_quote(message)
+ return werkzeug.utils.redirect(url)
+
+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_reset_password/res_users.py b/addons/auth_reset_password/res_users.py
new file mode 100644
index 00000000000..b1039031812
--- /dev/null
+++ b/addons/auth_reset_password/res_users.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+#
+##############################################################################
+
+from openerp.osv import osv, fields
+from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
+
+from datetime import datetime, timedelta
+
+def now(**kwargs):
+ dt = datetime.now() + timedelta(**kwargs)
+ return dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+
+
+class res_users(osv.osv):
+ _inherit = 'res.users'
+
+ def reset_password(self, cr, uid, login, context=None):
+ """ retrieve the user corresponding to login (login or email),
+ and reset their password
+ """
+ user_ids = self.search(cr, uid, [('login', '=', login)], context=context)
+ if not user_ids:
+ user_ids = self.search(cr, uid, [('email', '=', login)], context=context)
+ if len(user_ids) != 1:
+ raise Exception('Reset password: invalid username or email')
+ return self.action_reset_password(cr, uid, user_ids, context=context)
+
+ def action_reset_password(self, cr, uid, ids, context=None):
+ """ create signup token for each user, and send their signup url by email """
+ # prepare reset password signup
+ res_partner = self.pool.get('res.partner')
+ partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context)]
+ res_partner.signup_prepare(cr, uid, partner_ids, expiration=now(days=+1), context=context)
+
+ # send email to users with their signup url
+ template = self.pool.get('ir.model.data').get_object(cr, uid, 'auth_reset_password', 'reset_password_email')
+ assert template._name == 'email.template'
+ for user in self.browse(cr, uid, ids, context):
+ self.pool.get('email.template').send_mail(cr, uid, template.id, user.id, context=context)
+
+ return True
diff --git a/addons/auth_reset_password/res_users_view.xml b/addons/auth_reset_password/res_users_view.xml
new file mode 100644
index 00000000000..9952162ae65
--- /dev/null
+++ b/addons/auth_reset_password/res_users_view.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+ <data>
+
+ <record id="res_users_form_view" model="ir.ui.view">
+ <field name="name">user.form.reset_password</field>
+ <field name="model">res.users</field>
+ <field name="inherit_id" ref="base.view_users_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//sheet/*[1]" position="before">
+ <div class="oe_right oe_button_box">
+ <button string="Reset Password" type="object" name="action_reset_password"/>
+ </div>
+ </xpath>
+ </field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/auth_reset_password/static/src/css/reset_password.css b/addons/auth_reset_password/static/src/css/reset_password.css
deleted file mode 100644
index dd590365918..00000000000
--- a/addons/auth_reset_password/static/src/css/reset_password.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.openerp .oe_login .oe_login_pane {
- height: 152px;
-}
-.openerp .oe_login .oe_login_pane ul.oe_login_switch a {
- color: #eeeeee;
- margin: 0 8px;
-}
-.openerp .oe_login .oe_login_pane ul.oe_login_switch a:hover {
- text-decoration: underline;
-}
-
-
diff --git a/addons/auth_reset_password/static/src/js/reset_password.js b/addons/auth_reset_password/static/src/js/reset_password.js
index 4e09b5c5318..13fe2a39ce5 100644
--- a/addons/auth_reset_password/static/src/js/reset_password.js
+++ b/addons/auth_reset_password/static/src/js/reset_password.js
@@ -1,72 +1,30 @@
openerp.auth_reset_password = function(instance) {
var _t = instance.web._t;
+
instance.web.Login.include({
start: function() {
- var $e = this.$el;
- $e.find('a.oe_login_switch').click(function() {
- $e.find('ul.oe_login_switch').toggle();
- var $m = $e.find('form input[name=is_reset_pw]');
- $m.attr('checked', !$m.is(':checked'));
- });
+ this.$('a.oe_reset_password').click(this.do_reset_password);
return this._super();
},
- on_submit: function(ev) {
- if(ev) {
+ do_reset_password: function(ev) {
+ if (ev) {
ev.preventDefault();
}
-
- var $e = this.$el;
- var db = $e.find("form [name=db]").val();
+ var db = this.$("form [name=db]").val();
+ var login = this.$("form input[name=login]").val();
if (!db) {
- this.do_warn(_t("Login"), _t("No database selected !"));
+ this.do_warn("Login", "No database selected !");
+ return false;
+ } else if (!login) {
+ this.do_warn("Login", "Please enter a username or email address.")
return false;
}
- var $m = $e.find('form input[name=is_reset_pw]');
- if ($m.is(':checked')) {
- var email = $e.find('form input[name=email]').val();
- return this.do_reset_password(db, email);
- } else {
- return this._super(ev);
- }
- },
- do_reset_password: function(db, email) {
- var self = this;
- instance.session.session_authenticate(db, 'anonymous', 'anonymous', true).pipe(function () {
- var func = new instance.web.Model("res.users").get_func("send_reset_password_request");
- return func(email).then(function(res) {
- // show message
- self.do_notify(_t('Reset Password'), _.str.sprintf(_t('We have sent an email to %s with further instructions'), email), true);
- }, function(error, event) {
- // no traceback please
- event.preventDefault();
- });
- }).fail(function(error, event) {
- // cannot log as anonymous or reset_password not installed
- self.do_warn(_t('Reset Password'), _.str.sprintf(_t('Reset Password functionnality is not available for database %s'), db), true);
- });
- }
- });
-
- instance.reset_password = {};
- instance.reset_password.ResetPassword = instance.web.Widget.extend({
- init: function(parent, params) {
- this._super(parent);
- this.token = (params && params.token) || false;
- },
- start: function() {
- this.do_action({
- name: 'Reset Password',
- type: 'ir.actions.act_window',
- context: {default_token: this.token},
- res_model: 'auth.reset_password',
- target: 'new',
- views: [[false, 'form']]
- });
+ var params = {
+ dbname : db,
+ login: login,
+ };
+ var url = "/auth_reset_password/reset_password?" + $.param(params);
+ window.location = url;
}
});
-
-
- instance.web.client_actions.add("reset_password", "instance.reset_password.ResetPassword");
-
-
};
diff --git a/addons/auth_reset_password/static/src/xml/reset_password.xml b/addons/auth_reset_password/static/src/xml/reset_password.xml
index e57334b9c15..841f3906622 100644
--- a/addons/auth_reset_password/static/src/xml/reset_password.xml
+++ b/addons/auth_reset_password/static/src/xml/reset_password.xml
@@ -1,26 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- vim:fdl=1:
--->
+<!-- vim:fdl=1: -->
<templates id="template" xml:space="preserve">
<t t-extend="Login">
- <t t-jquery="form ul:first">
- // addClass does not work :(
- this.attr('class', (this.attr('class') || '') + ' oe_login_switch');
- </t>
<t t-jquery="form ul:first li:last" t-operation="after">
- <li>
- <a class="oe_login_switch" href="#">Forgot your password?</a>
- </li>
- </t>
- <t t-jquery="form ul:first" t-operation="after">
- <ul class="oe_login_switch" style="display:none;">
- <li style="display:none;"><input type="checkbox" name="is_reset_pw"/></li>
- <li>Email</li>
- <li><input type="email" name="email"/></li>
- <li><button name="submit">Reset Password</button></li>
- <li><a class="oe_login_switch" href="#">&lt; Back</a></li>
- </ul>
+ <li><a class="oe_reset_password" href="#">Reset password</a></li>
</t>
</t>
+
</templates>
diff --git a/addons/auth_signup/__openerp__.py b/addons/auth_signup/__openerp__.py
index 9cfe89cdc1c..9cbeb60638f 100644
--- a/addons/auth_signup/__openerp__.py
+++ b/addons/auth_signup/__openerp__.py
@@ -34,7 +34,9 @@ Allow users to sign up.
'data': [
'auth_signup_data.xml',
'res_config.xml',
+ 'res_users_view.xml',
],
'js': ['static/src/js/auth_signup.js'],
+ 'css' : ['static/src/css/base.css'],
'qweb': ['static/src/xml/auth_signup.xml'],
}
diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py
index 821ef44f459..54dcc5b4362 100644
--- a/addons/auth_signup/controllers/main.py
+++ b/addons/auth_signup/controllers/main.py
@@ -1,35 +1,62 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+#
+##############################################################################
import logging
-import werkzeug.urls
+import werkzeug
+import openerp
from openerp.modules.registry import RegistryManager
from openerp.addons.web.controllers.main import login_and_redirect
-import openerp.addons.web.common.http as openerpweb
-from openerp import SUPERUSER_ID
_logger = logging.getLogger(__name__)
-class OpenIDController(openerpweb.Controller):
+class Controller(openerp.addons.web.http.Controller):
_cp_path = '/auth_signup'
- @openerpweb.httprequest
- def signup(self, req, dbname, name, login, password):
+ @openerp.addons.web.http.jsonrequest
+ def retrieve(self, req, dbname, token):
+ """ retrieve the user info (name, login or email) corresponding to a signup token """
+ registry = RegistryManager.get(dbname)
+ user_info = None
+ with registry.cursor() as cr:
+ res_partner = registry.get('res.partner')
+ user_info = res_partner.signup_retrieve_info(cr, openerp.SUPERUSER_ID, token)
+ return user_info
+
+ @openerp.addons.web.http.httprequest
+ def signup(self, req, dbname, token, name, login, password, state=''):
+ """ sign up a user (new or existing), and log it in """
url = '/'
registry = RegistryManager.get(dbname)
with registry.cursor() as cr:
try:
- Users = registry.get('res.users')
- credentials = Users.auth_signup(cr, SUPERUSER_ID, name, login, password)
+ res_users = registry.get('res.users')
+ values = {'name': name, 'login': login, 'password': password}
+ credentials = res_users.signup(cr, openerp.SUPERUSER_ID, values, token)
cr.commit()
- return login_and_redirect(req, *credentials)
- except AttributeError:
- # auth_signup is not installed
- _logger.exception('attribute error when signup')
- url = "/#action=auth_signup&error=NA" # Not Available
- except Exception:
+ return login_and_redirect(req, *credentials, redirect_url='/#%s'%state)
+ except Exception as e:
# signup error
_logger.exception('error when signup')
- url = "/#action=auth_signup&error=UE" # Unexcpected Error
+ url = "/#action=login&error_message=%s" % werkzeug.urls.url_quote(e.message)
return werkzeug.utils.redirect(url)
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_signup/res_config.py b/addons/auth_signup/res_config.py
index 8bfe1fc3ddb..21fce19745c 100644
--- a/addons/auth_signup/res_config.py
+++ b/addons/auth_signup/res_config.py
@@ -20,22 +20,27 @@
##############################################################################
from openerp.osv import osv, fields
+from openerp.tools.safe_eval import safe_eval
class base_config_settings(osv.TransientModel):
_inherit = 'base.config.settings'
_columns = {
- 'auth_signup_uninvited': fields.boolean('Allow public users to sign up', help="If unchecked only invited users may sign up"),
+ 'auth_signup_uninvited': fields.boolean('Allow external users to sign up', help="If unchecked, only invited users may sign up"),
'auth_signup_template_user_id': fields.many2one('res.users', 'Template user for new users created through signup'),
}
def get_default_auth_signup_template_user_id(self, cr, uid, fields, context=None):
icp = self.pool.get('ir.config_parameter')
+ # we use safe_eval on the result, since the value of the parameter is a nonempty string
return {
- 'auth_signup_template_user_id': icp.get_param(cr, uid, 'auth_signup.template_user_id', 0) or False
+ 'auth_signup_uninvited': safe_eval(icp.get_param(cr, uid, 'auth_signup.allow_uninvited', 'False')),
+ 'auth_signup_template_user_id': safe_eval(icp.get_param(cr, uid, 'auth_signup.template_user_id', 'False')),
}
def set_auth_signup_template_user_id(self, cr, uid, ids, context=None):
config = self.browse(cr, uid, ids[0], context=context)
icp = self.pool.get('ir.config_parameter')
- icp.set_param(cr, uid, 'auth_signup.template_user_id', config.auth_signup_template_user_id.id)
+ # we store the repr of the values, since the value of the parameter is a required string
+ icp.set_param(cr, uid, 'auth_signup.allow_uninvited', repr(config.auth_signup_uninvited))
+ icp.set_param(cr, uid, 'auth_signup.template_user_id', repr(config.auth_signup_template_user_id.id))
diff --git a/addons/auth_signup/res_config.xml b/addons/auth_signup/res_config.xml
index c17634ececb..9d3eb4eaa5a 100644
--- a/addons/auth_signup/res_config.xml
+++ b/addons/auth_signup/res_config.xml
@@ -14,7 +14,9 @@
</div>
<div attrs="{'invisible':[('auth_signup_uninvited','=',False)]}">
<label for="auth_signup_template_user_id"/>
- <field name="auth_signup_template_user_id" class="oe_inline" domain="['|',('active','=',0),('active','=',1)]"/>
+ <field name="auth_signup_template_user_id" class="oe_inline"
+ attrs="{'required': [('auth_signup_uninvited', '=', True)]}"
+ domain="['|',('active','=',0),('active','=',1)]"/>
</div>
</xpath>
</field>
diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py
index 5f6463508b6..59196c4da87 100644
--- a/addons/auth_signup/res_users.py
+++ b/addons/auth_signup/res_users.py
@@ -1,47 +1,201 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+#
+##############################################################################
+import random
+import time
+import urllib
+import urlparse
+
import openerp
-from openerp.osv import osv
+from openerp.osv import osv, fields
from openerp import SUPERUSER_ID
+from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
+from openerp.tools.safe_eval import safe_eval
+
+def random_token():
+ # the token has an entropy of about 120 bits (6 bits/char * 20 chars)
+ chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
+ return ''.join(random.choice(chars) for i in xrange(20))
+
+def now():
+ return time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+
+class res_partner(osv.Model):
+ _inherit = 'res.partner'
+
+ def _get_signup_valid(self, cr, uid, ids, name, arg, context=None):
+ dt = now()
+ res = {}
+ for partner in self.browse(cr, uid, ids, context):
+ res[partner.id] = bool(partner.signup_token) and \
+ (not partner.signup_expiration or dt <= partner.signup_expiration)
+ return res
+
+ def _get_signup_url(self, cr, uid, ids, name, arg, context=None):
+ """ determine a signup url for a given partner """
+ base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
+
+ # if required, make sure that every partner without user has a valid signup token
+ if context and context.get('signup_valid'):
+ unsigned_ids = [p.id for p in self.browse(cr, uid, ids, context) if not p.user_ids]
+ self.signup_prepare(cr, uid, unsigned_ids, context=context)
+
+ res = dict.fromkeys(ids, False)
+ for partner in self.browse(cr, uid, ids, context):
+ if partner.signup_token:
+ params = (urllib.quote(cr.dbname), urllib.quote(partner.signup_token))
+ res[partner.id] = urlparse.urljoin(base_url, "#action=login&db=%s&token=%s" % params)
+ elif partner.user_ids:
+ user = partner.user_ids[0]
+ params = (urllib.quote(cr.dbname), urllib.quote(user.login))
+ res[partner.id] = urlparse.urljoin(base_url, "#action=login&db=%s&login=%s" % params)
+ return res
+
+ _columns = {
+ 'signup_token': fields.char(size=24, string='Signup Token'),
+ 'signup_expiration': fields.datetime(string='Signup Expiration'),
+ 'signup_valid': fields.function(_get_signup_valid, type='boolean', string='Signup Token is Valid'),
+ 'signup_url': fields.function(_get_signup_url, type='char', string='Signup URL'),
+ }
+
+ def action_signup_prepare(self, cr, uid, ids, context=None):
+ return self.signup_prepare(cr, uid, ids, context=context)
+
+ def signup_prepare(self, cr, uid, ids, expiration=False, context=None):
+ """ generate a new token for the partners with the given validity, if necessary
+ :param expiration: the expiration datetime of the token (string, optional)
+ """
+ for partner in self.browse(cr, uid, ids, context):
+ if expiration or not partner.signup_valid:
+ token = random_token()
+ while self._signup_retrieve_partner(cr, uid, token, context=context):
+ token = random_token()
+ partner.write({'signup_token': token, 'signup_expiration': expiration})
+ return True
+
+ def _signup_retrieve_partner(self, cr, uid, token,
+ check_validity=False, raise_exception=False, context=None):
+ """ find the partner corresponding to a token, and possibly check its validity
+ :param token: the token to resolve
+ :param check_validity: if True, also check validity
+ :param raise_exception: if True, raise exception instead of returning False
+ :return: partner (browse record) or False (if raise_exception is False)
+ """
+ partner_ids = self.search(cr, uid, [('signup_token', '=', token)], context=context)
+ if not partner_ids:
+ if raise_exception:
+ raise Exception("Signup token '%s' is not valid" % token)
+ return False
+ partner = self.browse(cr, uid, partner_ids[0], context)
+ if check_validity and not partner.signup_valid:
+ if raise_exception:
+ raise Exception("Signup token '%s' is no longer valid" % token)
+ return False
+ return partner
+
+ def signup_retrieve_info(self, cr, uid, token, context=None):
+ """ retrieve the user info about the token
+ :return: a dictionary with the user information:
+ - 'db': the name of the database
+ - 'token': the token, if token is valid
+ - 'name': the name of the partner, if token is valid
+ - 'login': the user login, if the user already exists
+ - 'email': the partner email, if the user does not exist
+ """
+ partner = self._signup_retrieve_partner(cr, uid, token, raise_exception=True, context=None)
+ res = {'db': cr.dbname}
+ if partner.signup_valid:
+ res['token'] = token
+ res['name'] = partner.name
+ if partner.user_ids:
+ res['login'] = partner.user_ids[0].login
+ else:
+ res['email'] = partner.email or ''
+ return res
class res_users(osv.Model):
_inherit = 'res.users'
- def auth_signup_create(self, cr, uid, new_user, context=None):
- # new_user:
- # login
- # email
- # name (optional)
- # partner_id (optional)
- # groups (optional)
- # sign (for partner_id and groups)
- #
- user_template_id = self.pool.get('ir.config_parameter').get_param(cr, uid, 'auth.signup_template_user_id', 0)
- if user_template_id:
- self.pool.get('res.users').copy(cr, SUPERUSER_ID, user_template_id, new_user, context=context)
- else:
- self.pool.get('res.users').create(cr, SUPERUSER_ID, new_user, context=context)
-
- def auth_signup(self, cr, uid, name, login, password, context=None):
- r = (cr.dbname, login, password)
- res = self.search(cr, uid, [("login", "=", login)])
- if res:
- # Existing user
- user_id = res[0]
- try:
- self.check(cr.dbname, user_id, password)
- # Same password
- except openerp.exceptions.AccessDenied:
- # Different password
- raise
- else:
- # New user
- new_user = {
- 'name': name,
- 'login': login,
- 'user_email': login,
- 'password': password,
- 'active': True,
- }
- self.auth_signup_create(cr, uid, new_user)
- return r
+ def _get_state(self, cr, uid, ids, name, arg, context=None):
+ return dict((user.id, 'new' if not user.login_date else 'reset' if user.signup_token else 'active')
+ for user in self.browse(cr, uid, ids, context))
-#
+ _columns = {
+ 'state': fields.function(_get_state, string='State', type='selection',
+ selection=[('new', 'New'), ('active', 'Active'), ('reset', 'Resetting Password')]),
+ }
+
+ def signup(self, cr, uid, values, token=None, context=None):
+ """ signup a user, to either:
+ - create a new user (no token), or
+ - create a user for a partner (with token, but no user for partner), or
+ - change the password of a user (with token, and existing user).
+ :param values: a dictionary with field values
+ :param token: signup token (optional)
+ :return: (dbname, login, password) for the signed up user
+ """
+ assert values.get('login') and values.get('password')
+ result = (cr.dbname, values['login'], values['password'])
+
+ if token:
+ # signup with a token: find the corresponding partner id
+ res_partner = self.pool.get('res.partner')
+ partner = res_partner._signup_retrieve_partner(cr, uid, token,
+ check_validity=True, raise_exception=True, context=None)
+ # invalidate signup token
+ partner.write({'signup_token': False, 'signup_expiration': False})
+ if partner.user_ids:
+ # user exists, modify its password
+ partner.user_ids[0].write({'password': values['password']})
+ else:
+ # user does not exist: sign up invited user
+ self._signup_create_user(cr, uid, {
+ 'name': partner.name,
+ 'login': values['login'],
+ 'password': values['password'],
+ 'email': values['login'],
+ 'partner_id': partner.id,
+ }, context=context)
+ return result
+
+ # sign up an external user
+ assert values.get('name'), 'Signup: no name given for new user'
+ self._signup_create_user(cr, uid, {
+ 'name': values['name'],
+ 'login': values['login'],
+ 'password': values['password'],
+ 'email': values['login'],
+ }, context=context)
+ return result
+
+ def _signup_create_user(self, cr, uid, values, context=None):
+ """ create a new user from the template user """
+ ir_config_parameter = self.pool.get('ir.config_parameter')
+ template_user_id = safe_eval(ir_config_parameter.get_param(cr, uid, 'auth_signup.template_user_id', 'False'))
+ assert template_user_id and self.exists(cr, uid, template_user_id, context=context), 'Signup: invalid template user'
+
+ # check that uninvited users may sign up
+ if 'partner_id' not in values:
+ if not safe_eval(ir_config_parameter.get_param(cr, uid, 'auth_signup.allow_uninvited', 'False')):
+ raise Exception('Signup is not allowed for uninvited users')
+
+ # create a copy of the template user (attached to a specific partner_id if given)
+ values['active'] = True
+ return self.copy(cr, uid, template_user_id, values, context=context)
diff --git a/addons/auth_signup/res_users_view.xml b/addons/auth_signup/res_users_view.xml
new file mode 100644
index 00000000000..c42e1ab5f41
--- /dev/null
+++ b/addons/auth_signup/res_users_view.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+ <data>
+
+ <record id="res_users_form_view" model="ir.ui.view">
+ <field name="name">user.form.state</field>
+ <field name="model">res.users</field>
+ <field name="inherit_id" ref="base.view_users_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//sheet" position="before">
+ <header>
+ <field name="state" widget="statusbar"/>
+ </header>
+ </xpath>
+ </field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/auth_signup/static/src/css/Makefile b/addons/auth_signup/static/src/css/Makefile
new file mode 100644
index 00000000000..d6b4f4b2fc8
--- /dev/null
+++ b/addons/auth_signup/static/src/css/Makefile
@@ -0,0 +1,3 @@
+base.css: base.sass
+ sass --trace -t expanded base.sass base.css
+
diff --git a/addons/auth_signup/static/src/css/base.css b/addons/auth_signup/static/src/css/base.css
new file mode 100644
index 00000000000..3f97e7a9301
--- /dev/null
+++ b/addons/auth_signup/static/src/css/base.css
@@ -0,0 +1,10 @@
+@charset "utf-8";
+.openerp .oe_login .oe_signup_show {
+ display: none;
+}
+.openerp .oe_login_signup .oe_signup_show {
+ display: block !important;
+}
+.openerp .oe_login_signup .oe_signup_hide {
+ display: none;
+}
diff --git a/addons/auth_signup/static/src/css/base.sass b/addons/auth_signup/static/src/css/base.sass
new file mode 100644
index 00000000000..f97665d192c
--- /dev/null
+++ b/addons/auth_signup/static/src/css/base.sass
@@ -0,0 +1,13 @@
+@charset "utf-8"
+
+.openerp
+ // Regular login form
+ .oe_login
+ .oe_signup_show
+ display: none
+ // Signup form
+ .oe_login_signup
+ .oe_signup_show
+ display: block !important
+ .oe_signup_hide
+ display: none
diff --git a/addons/auth_signup/static/src/js/auth_signup.js b/addons/auth_signup/static/src/js/auth_signup.js
index 2ab13aa7598..0974b73292d 100644
--- a/addons/auth_signup/static/src/js/auth_signup.js
+++ b/addons/auth_signup/static/src/js/auth_signup.js
@@ -5,56 +5,100 @@ openerp.auth_signup = function(instance) {
instance.web.Login.include({
start: function() {
var self = this;
- this.$('a.oe_signup').click(function() {
- var dbname = self.$("form [name=db]").val();
- self.do_action({
- type: 'ir.actions.client',
- tag: 'auth_signup.signup',
- params: {'dbname': dbname},
- target: 'new',
- name: 'Sign up'
- });
- return true;
+ var d = this._super();
+
+ // to switch between the signup and regular login form
+ this.$('a.oe_signup_signup').click(function() {
+ self.$el.addClass("oe_login_signup");
+ });
+ this.$('a.oe_signup_back').click(function() {
+ self.$el.removeClass("oe_login_signup");
+ delete self.params.token;
});
- return this._super();
- },
- });
+ // if there is an error message in params, show it then forget it
+ if (self.params.error_message) {
+ this.show_error(self.params.error_message);
+ delete self.params.error_message;
+ }
- instance.auth_signup.Signup = instance.web.Widget.extend({
- template: 'auth_signup.signup',
- init: function(parent, params) {
- this.params = params;
- return this._super();
+ // in case of a signup, retrieve the user information from the token
+ if (self.params.db && self.params.token) {
+ d = self.rpc("/auth_signup/retrieve", {dbname: self.params.db, token: self.params.token})
+ .done(self.on_token_loaded)
+ .fail(self.on_token_failed);
+ }
+ return d;
},
- start: function() {
- var self = this;
- this.$('input[name=password_confirmation]').keyup(function() {
- var v = $(this).val();
- var $b = self.$('button');
- if (_.isEmpty(v) || self.$('input[name=password]').val() === v) {
- $b.removeAttr('disabled');
+ on_token_loaded: function(result) {
+ // select the right the database
+ this.selected_db = result.db;
+ this.on_db_loaded({db_list: [result.db]});
+ if (result.token) {
+ // switch to signup mode, set user name and login
+ this.$el.addClass("oe_login_signup");
+ this.$("form input[name=name]").val(result.name).attr("readonly", "readonly");
+ if (result.login) {
+ this.$("form input[name=login]").val(result.login).attr("readonly", "readonly");
} else {
- $b.attr('disabled', 'disabled');
+ this.$("form input[name=login]").val(result.email);
}
- });
-
- this.$('form').submit(function(ev) {
- if(ev) {
- ev.preventDefault();
+ } else {
+ // remain in login mode, set login if present
+ delete this.params.token;
+ this.$("form input[name=login]").val(result.login || "");
+ }
+ },
+ on_token_failed: function(result, ev) {
+ if (ev) {
+ ev.preventDefault();
+ }
+ this.show_error("Invalid signup token");
+ delete this.params.db;
+ delete this.params.token;
+ },
+ on_submit: function(ev) {
+ if (ev) {
+ ev.preventDefault();
+ }
+ if (this.$el.hasClass("oe_login_signup")) {
+ // signup user (or reset password)
+ var db = this.$("form [name=db]").val();
+ var name = this.$("form input[name=name]").val();
+ var login = this.$("form input[name=login]").val();
+ var password = this.$("form input[name=password]").val();
+ var confirm_password = this.$("form input[name=confirm_password]").val();
+ if (!db) {
+ this.do_warn("Login", "No database selected !");
+ return false;
+ } else if (!name) {
+ this.do_warn("Login", "Please enter a name.")
+ return false;
+ } else if (!login) {
+ this.do_warn("Login", "Please enter a username.")
+ return false;
+ } else if (!password || !confirm_password) {
+ this.do_warn("Login", "Please enter a password and confirm it.")
+ return false;
+ } else if (password !== confirm_password) {
+ this.do_warn("Login", "Passwords do not match; please retype them.")
+ return false;
}
var params = {
- dbname : self.params.dbname,
- name: self.$('input[name=name]').val(),
- login: self.$('input[name=email]').val(),
- password: self.$('input[name=password]').val(),
+ dbname : db,
+ token: this.params.token || "",
+ name: name,
+ login: login,
+ password: password,
+ state: $.param(this.params)
};
var url = "/auth_signup/signup?" + $.param(params);
window.location = url;
- });
- return this._super();
- }
+ } else {
+ // regular login
+ this._super(ev);
+ }
+ },
});
- instance.web.client_actions.add("auth_signup.signup", "instance.auth_signup.Signup");
};
diff --git a/addons/auth_signup/static/src/xml/auth_signup.xml b/addons/auth_signup/static/src/xml/auth_signup.xml
index c2eec846d15..e63bd5863b0 100644
--- a/addons/auth_signup/static/src/xml/auth_signup.xml
+++ b/addons/auth_signup/static/src/xml/auth_signup.xml
@@ -1,28 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- vim:fdl=1:
--->
+<!-- vim:fdl=1: -->
<templates id="template" xml:space="preserve">
-<t t-extend="Login">
- <t t-jquery="form ul:first li:last" t-operation="after">
- <li>
- <a class="oe_signup" href="#">Sign Up</a>
- </li>
+ <t t-extend="Login">
+ <t t-jquery="form ul:first li:contains('Username')" t-operation="before">
+ <li class="oe_signup_show">Name</li>
+ <li class="oe_signup_show"><input name="name" type="text"/></li>
+ </t>
+ <t t-jquery="form ul:first li:contains('Username')" t-operation="replace">
+ <li class="oe_signup_hide">Username</li>
+ <li class="oe_signup_show">Username (Email)</li>
+ </t>
+ <t t-jquery="form ul:first li:has(input[name=password])" t-operation="after">
+ <li class="oe_signup_show">Confirm Password</li>
+ <li class="oe_signup_show"><input name="confirm_password" type="password"/></li>
+ </t>
+ <t t-jquery="form ul:first li:has(button[name=submit])" t-operation="replace">
+ <li class="oe_signup_hide"><button name="submit">Log in</button></li>
+ <li class="oe_signup_show"><button name="submit">Sign in</button></li>
+ </t>
+ <t t-jquery="form ul:first li:last" t-operation="after">
+ <li><a class="oe_signup_hide oe_signup_signup" href="#">Sign Up</a></li>
+ <li><a class="oe_signup_show oe_signup_back" href="#">Back to Login</a></li>
+ </t>
</t>
-</t>
-
-<t t-name="auth_signup.signup">
- <div>
- <form>
- Name = <input type="text" name="name"/><br/>
- Email = <input type="email" name="email"/><br/>
- Password = <input type="password" name="password"/><br/>
- Confirmation = <input type="password" name="password_confirmation"/><br/>
- <button type="submit" disabled="disabled">Signup</button>
- </form>
- </div>
-</t>
-
-
</templates>
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 5b8c41787d4..f5fb3dbd051 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -39,11 +39,11 @@ months = {
def get_recurrent_dates(rrulestring, exdate, startdate=None, exrule=None):
"""
- Get recurrent dates based on Rule string considering exdate and start date
- @param rrulestring: Rulestring
- @param exdate: List of exception dates for rrule
- @param startdate: Startdate for computing recurrent dates
- @return: List of Recurrent dates
+ Get recurrent dates based on Rule string considering exdate and start date.
+ @param rrulestring: rulestring
+ @param exdate: list of exception dates for rrule
+ @param startdate: startdate for computing recurrent dates
+ @return: list of Recurrent dates
"""
def todate(date):
val = parser.parse(''.join((re.compile('\d')).findall(date)))
@@ -67,11 +67,12 @@ def get_recurrent_dates(rrulestring, exdate, startdate=None, exrule=None):
def base_calendar_id2real_id(base_calendar_id=None, with_date=False):
"""
- This function converts virtual event id into real id of actual event
- @param base_calendar_id: Id of calendar
- @param with_date: If value passed to this param it will return dates based on value of withdate + base_calendar_id
+ Convert a "virtual/recurring event id" (type string) into a real event id (type int).
+ E.g. virtual/recurring event id is 4-20091201100000, so it will return 4.
+ @param base_calendar_id: id of calendar
+ @param with_date: if a value is passed to this param it will return dates based on value of withdate + base_calendar_id
+ @return: real event id
"""
-
if base_calendar_id and isinstance(base_calendar_id, (str, unicode)):
res = base_calendar_id.split('-')
@@ -89,12 +90,13 @@ def base_calendar_id2real_id(base_calendar_id=None, with_date=False):
def real_id2base_calendar_id(real_id, recurrent_date):
"""
- Convert real id of record into virtual id using recurrent_date
- e.g. real id is 1 and recurrent_date is 01-12-2009 10:00:00 then it will return
- 1-20091201100000
- @return: real id with recurrent date.
+ Convert a real event id (type int) into a "virtual/recurring event id" (type string).
+ E.g. real event id is 1 and recurrent_date is set to 01-12-2009 10:00:00, so
+ it will return 1-20091201100000.
+ @param real_id: real event id
+ @param recurrent_date: real event recurrent date
+ @return: string containing the real id and the recurrent date
"""
-
if real_id and recurrent_date:
recurrent_date = time.strftime("%Y%m%d%H%M%S", \
time.strptime(recurrent_date, "%Y-%m-%d %H:%M:%S"))
@@ -104,10 +106,10 @@ def real_id2base_calendar_id(real_id, recurrent_date):
def _links_get(self, cr, uid, context=None):
"""
Get request link.
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param context: A standard dictionary for contextual values
- @return: list of dictionary which contain object and name and id.
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's ID for security checks
+ @param context: a standard dictionary for contextual values
+ @return: list of dictionary which contain object and name and id
"""
obj = self.pool.get('res.request.link')
ids = obj.search(cr, uid, [])
@@ -216,9 +218,9 @@ class calendar_attendee(osv.osv):
def _get_address(self, name=None, email=None):
"""
- Gives email information in ical CAL-ADDRESS type format
- @param name: Name for CAL-ADDRESS value
- @param email: Email address for CAL-ADDRESS value
+ Gives email information in ical CAL-ADDRESS type format.
+ @param name: name for CAL-ADDRESS value
+ @param email: email address for CAL-ADDRESS value
"""
if name and email:
name += ':'
@@ -226,13 +228,13 @@ class calendar_attendee(osv.osv):
def _compute_data(self, cr, uid, ids, name, arg, context=None):
"""
- Compute data on function fields for attendee values .
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of calendar attendee’s IDs.
- @param name: name of field.
- @param context: A standard dictionary for contextual values
- @return: Dictionary of form {id: {'field Name': value'}}.
+ Compute data on function fields for attendee values.
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's ID for security checks
+ @param ids: list of calendar attendee's IDs
+ @param name: name of field
+ @param context: a standard dictionary for contextual values
+ @return: dictionary of form {id: {'field Name': value'}}
"""
name = name[0]
result = {}
@@ -297,10 +299,10 @@ class calendar_attendee(osv.osv):
def _links_get(self, cr, uid, context=None):
"""
Get request link for ref field in calendar attendee.
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's id for security checks
@param context: A standard dictionary for contextual values
- @return: list of dictionary which contain object and name and id.
+ @return: list of dictionary which contain object and name and id
"""
obj = self.pool.get('res.request.link')
ids = obj.search(cr, uid, [])
@@ -310,10 +312,10 @@ class calendar_attendee(osv.osv):
def _lang_get(self, cr, uid, context=None):
"""
Get language for language selection field.
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param context: A standard dictionary for contextual values
- @return: list of dictionary which contain code and name and id.
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's id for security checks
+ @param context: a standard dictionary for contextual values
+ @return: list of dictionary which contain code and name and id
"""
obj = self.pool.get('res.lang')
ids = obj.search(cr, uid, [])
@@ -375,7 +377,6 @@ property or property parameter."),
'ref': fields.reference('Event Ref', selection=_links_get, size=128),
'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
}
-
_defaults = {
'state': 'needs-action',
'role': 'req-participant',
@@ -388,12 +389,12 @@ property or property parameter."),
def get_ics_file(self, cr, uid, event_obj, context=None):
"""
- Returns iCalendar file for the event invitation
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param event_obj: Event object (browse record)
- @param context: A standard dictionary for contextual values
+ Returns iCalendar file for the event invitation.
+ @param self: the object pointer
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's id for security checks
+ @param event_obj: event object (browse record)
+ @param context: a standard dictionary for contextual values
@return: .ics file content
"""
res = None
@@ -471,7 +472,7 @@ property or property parameter."),
def _send_mail(self, cr, uid, ids, mail_to, email_from=tools.config.get('email_from', False), context=None):
"""
Send mail for event invitation to event attendees.
- @param email_from: Email address for user sending the mail
+ @param email_from: email address for user sending the mail
@return: True
"""
company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.name
@@ -517,11 +518,11 @@ property or property parameter."),
def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv):
"""
Make entry on email and availbility on change of user_id field.
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of calendar attendee’s IDs.
- @param user_id: Changed value of User id
- @return: dictionary of value. which put value in email and availability fields.
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's ID for security checks
+ @param ids: list of calendar attendee's IDs
+ @param user_id: changed value of User id
+ @return: dictionary of values which put value in email and availability fields
"""
if not user_id:
@@ -531,24 +532,25 @@ property or property parameter."),
return {'value': {'email': user.email, 'availability':user.availability}}
def do_tentative(self, cr, uid, ids, context=None, *args):
- """ Makes event invitation as Tentative
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of calendar attendee’s IDs
- @param *args: Get Tupple value
- @param context: A standard dictionary for contextual values
+ """
+ Makes event invitation as Tentative.
+ @param self: the object pointer
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's ID for security checks
+ @param ids: list of calendar attendee's IDs
+ @param *args: get Tupple value
+ @param context: a standard dictionary for contextual values
"""
return self.write(cr, uid, ids, {'state': 'tentative'}, context)
def do_accept(self, cr, uid, ids, context=None, *args):
"""
- Update state of invitation as Accepted and
- if the invited user is other then event user it will make a copy of this event for invited user
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of calendar attendee’s IDs.
- @param context: A standard dictionary for contextual values
+ Update state of invitation as Accepted and if the invited user is other
+ then event user it will make a copy of this event for invited user.
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's ID for security checks
+ @param ids: list of calendar attendee's IDs
+ @param context: a standard dictionary for contextual values
@return: True
"""
if context is None:
@@ -564,25 +566,28 @@ property or property parameter."),
return True
def do_decline(self, cr, uid, ids, context=None, *args):
- """ Marks event invitation as Declined
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of calendar attendee’s IDs
- @param *args: Get Tupple value
- @param context: A standard dictionary for contextual values """
+ """
+ Marks event invitation as Declined.
+ @param self: the object pointer
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's ID for security checks
+ @param ids: list of calendar attendee's IDs
+ @param *args: get Tupple value
+ @param context: a standard dictionary for contextual values
+ """
if context is None:
context = {}
return self.write(cr, uid, ids, {'state': 'declined'}, context)
def create(self, cr, uid, vals, context=None):
- """ Overrides orm create method.
+ """
+ Overrides orm create method.
@param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param vals: Get Values
- @param context: A standard dictionary for contextual values """
-
+ @param cr: the current row, from the database cursor
+ @param uid: the current user's ID for security checks
+ @param vals: get Values
+ @param context: a standard dictionary for contextual values
+ """
if context is None:
context = {}
if not vals.get("email") and vals.get("cn"):
@@ -592,6 +597,7 @@ property or property parameter."),
vals['cn'] = vals.get("cn")
res = super(calendar_attendee, self).create(cr, uid, vals, context)
return res
+
calendar_attendee()
class res_alarm(osv.osv):
@@ -630,8 +636,8 @@ true, it will allow you to hide the event alarm information without removing it.
"""
Create Alarm for event.
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of res alarm’s IDs.
+ @param uid: the current user's ID for security checks,
+ @param ids: List of res alarm's IDs.
@param model: Model name.
@param date: Event date
@param context: A standard dictionary for contextual values
@@ -704,8 +710,8 @@ true, it will allow you to hide the event alarm information without removing it.
"""
Delete alarm specified in ids
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of res alarm’s IDs.
+ @param uid: the current user's ID for security checks,
+ @param ids: List of res alarm's IDs.
@param model: Model name for which alarm is to be cleared.
@return: True
"""
@@ -715,12 +721,12 @@ true, it will allow you to hide the event alarm information without removing it.
ir_obj = self.pool.get('ir.model')
model_id = ir_obj.search(cr, uid, [('model', '=', model)])[0]
model_obj = self.pool.get(model)
- for datas in model_obj.browse(cr, uid, ids, context=context):
- alarm_ids = alarm_obj.search(cr, uid, [('model_id', '=', model_id), ('res_id', '=', datas.id)])
+ for data in model_obj.browse(cr, uid, ids, context=context):
+ alarm_ids = alarm_obj.search(cr, uid, [('model_id', '=', model_id), ('res_id', '=', data.id)])
if alarm_ids:
alarm_obj.unlink(cr, uid, alarm_ids)
cr.execute('Update %s set base_calendar_alarm_id=NULL, alarm_id=NULL\
- where id=%%s' % model_obj._table,(datas.id,))
+ where id=%%s' % model_obj._table,(data.id,))
return True
res_alarm()
@@ -773,7 +779,7 @@ class calendar_alarm(osv.osv):
Overrides orm create method.
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param vals: dictionary of fields value.{‘name_of_the_field’: value, ...}
+ @param vals: dictionary of fields value.{'name_of_the_field': value, ...}
@param context: A standard dictionary for contextual values
@return: new record id for calendar_alarm.
"""
@@ -798,8 +804,8 @@ class calendar_alarm(osv.osv):
"""Scheduler for event reminder
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of calendar alarm’s IDs.
+ @param uid: the current user's ID for security checks,
+ @param ids: List of calendar alarm's IDs.
@param use_new_cursor: False or the dbname
@param context: A standard dictionary for contextual values
"""
@@ -891,8 +897,8 @@ class calendar_event(osv.osv):
"""Returns duration and/or end date based on values passed
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of calendar event’s IDs.
+ @param uid: the current user's ID for security checks,
+ @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
@@ -967,14 +973,14 @@ class calendar_event(osv.osv):
if not isinstance(ids, list):
ids = [ids]
- for datas in self.read(cr, uid, ids, ['id','byday','recurrency', 'month_list','end_date', 'rrule_type', 'select1', 'interval', 'count', 'end_type', 'mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'exrule', 'day', 'week_list' ], context=context):
- event = datas['id']
- if datas.get('interval', 0) < 0:
+ for data in self.read(cr, uid, ids, ['id','byday','recurrency', 'month_list','end_date', 'rrule_type', 'select1', 'interval', 'count', 'end_type', 'mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'exrule', 'day', 'week_list' ], context=context):
+ event = data['id']
+ if data.get('interval', 0) < 0:
raise osv.except_osv(_('Warning!'), _('Interval cannot be negative.'))
- if datas.get('count', 0) <= 0:
+ if data.get('count', 0) <= 0:
raise osv.except_osv(_('Warning!'), _('Count cannot be negative or 0.'))
- if datas['recurrency']:
- result[event] = self.compute_rule_string(datas)
+ if data['recurrency']:
+ result[event] = self.compute_rule_string(data)
else:
result[event] = ""
return result
@@ -990,7 +996,6 @@ class calendar_event(osv.osv):
super(calendar_event, obj).write(cr, uid, ids, data, context=context)
return True
-
_columns = {
'id': fields.integer('ID', readonly=True),
'sequence': fields.integer('Sequence'),
@@ -1006,21 +1011,24 @@ class calendar_event(osv.osv):
'show_as': fields.selection([('free', 'Free'), ('busy', 'Busy')], \
'Show Time as', states={'done': [('readonly', True)]}),
'base_calendar_url': fields.char('Caldav URL', size=264),
- 'state': fields.selection([('tentative', 'Tentative'),
- ('cancelled', 'Cancelled'),
- ('confirmed', 'Confirmed'),
- ], 'Status', readonly=True),
+ 'state': fields.selection([
+ ('tentative', 'Tentative'),
+ ('cancelled', 'Cancelled'),
+ ('confirmed', 'Confirmed'),
+ ], 'Status', readonly=True),
'exdate': fields.text('Exception Date/Times', help="This property \
defines the list of date/time exceptions for a recurring calendar component."),
'exrule': fields.char('Exception Rule', size=352, help="Defines a \
rule or repeating pattern of time to exclude from the recurring rule."),
'rrule': fields.function(_get_rulestring, type='char', size=124, \
fnct_inv=_rrule_write, store=True, string='Recurrent Rule'),
- 'rrule_type': fields.selection([('none', ''), ('daily', 'Daily'), \
- ('weekly', 'Weekly'), ('monthly', 'Monthly'), \
- ('yearly', 'Yearly'),],
- 'Recurrency', states={'done': [('readonly', True)]},
- help="Let the event automatically repeat at that interval"),
+ 'rrule_type': fields.selection([
+ ('daily', 'Daily'),
+ ('weekly', 'Weekly'),
+ ('monthly', 'Monthly'),
+ ('yearly', 'Yearly')
+ ], 'Recurrency', states={'done': [('readonly', True)]},
+ help="Let the event automatically repeat at that interval"),
'alarm_id': fields.many2one('res.alarm', 'Reminder', states={'done': [('readonly', True)]},
help="Set an alarm at this time, before the event occurs" ),
'base_calendar_alarm_id': fields.many2one('calendar.alarm', 'Alarm'),
@@ -1028,7 +1036,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'recurrent_id': fields.datetime('Recurrent ID date'),
'vtimezone': fields.selection(_tz_get, size=64, string='Timezone'),
'user_id': fields.many2one('res.users', 'Responsible', states={'done': [('readonly', True)]}),
- 'organizer': fields.char("Organizer", size=256, states={'done': [('readonly', True)]}), # Map with Organizer Attribure of VEvent.
+ 'organizer': fields.char("Organizer", size=256, states={'done': [('readonly', True)]}), # Map with organizer attribute of VEvent.
'organizer_id': fields.many2one('res.users', 'Organizer', states={'done': [('readonly', True)]}),
'end_type' : fields.selection([('count', 'Number of repetitions'), ('end_date','End date')], 'Recurrence Termination'),
'interval': fields.integer('Repeat Every', help="Repeat every (Days/Week/Month/Year)"),
@@ -1043,13 +1051,21 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'select1': fields.selection([('date', 'Date of month'),
('day', 'Day of month')], 'Option'),
'day': fields.integer('Date of month'),
- 'week_list': fields.selection([('MO', 'Monday'), ('TU', 'Tuesday'), \
- ('WE', 'Wednesday'), ('TH', 'Thursday'), \
- ('FR', 'Friday'), ('SA', 'Saturday'), \
- ('SU', 'Sunday')], 'Weekday'),
- 'byday': fields.selection([('1', 'First'), ('2', 'Second'), \
- ('3', 'Third'), ('4', 'Fourth'), \
- ('5', 'Fifth'), ('-1', 'Last')], 'By day'),
+ 'week_list': fields.selection([
+ ('MO', 'Monday'),
+ ('TU', 'Tuesday'),
+ ('WE', 'Wednesday'),
+ ('TH', 'Thursday'),
+ ('FR', 'Friday'),
+ ('SA', 'Saturday'),
+ ('SU', 'Sunday')], 'Weekday'),
+ 'byday': fields.selection([
+ ('1', 'First'),
+ ('2', 'Second'),
+ ('3', 'Third'),
+ ('4', 'Fourth'),
+ ('5', 'Fifth'),
+ ('-1', 'Last')], 'By day'),
'month_list': fields.selection(months.items(), 'Month'),
'end_date': fields.date('Repeat Until'),
'attendee_ids': fields.many2many('calendar.attendee', 'event_attendee_rel', \
@@ -1101,9 +1117,9 @@ rule or repeating pattern of time to exclude from the recurring rule."),
return res
_defaults = {
- 'end_type' : 'count',
- 'count' : 1,
- 'rrule_type' : 'none',
+ 'end_type': 'count',
+ 'count': 1,
+ 'rrule_type': False,
'state': 'tentative',
'class': 'public',
'show_as': 'busy',
@@ -1113,7 +1129,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'user_id': lambda self, cr, uid, ctx: uid,
'organizer': default_organizer,
}
-
+
def _check_closing_date(self, cr, uid, ids, context=None):
for event in self.browse(cr, uid, ids, context=context):
if event.date_deadline < event.date:
@@ -1129,7 +1145,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
This method gives ids of dates that comes between start date and end date of calendar views
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param limit: The Number of Results to Return """
if not context:
context = {}
@@ -1140,7 +1156,8 @@ rule or repeating pattern of time to exclude from the recurring rule."),
result.append(data['id'])
continue
event_date = datetime.strptime(data['date'], "%Y-%m-%d %H:%M:%S")
-# To check: If the start date is replace by event date .. the event date will be changed by that of calendar code
+
+ # TOCHECK: the start date should be replaced by event date; the event date will be changed by that of calendar code
if not data['rrule']:
continue
@@ -1186,45 +1203,46 @@ rule or repeating pattern of time to exclude from the recurring rule."),
ids = list(set(result))
return ids
- def compute_rule_string(self, datas):
+ def compute_rule_string(self, data):
"""
Compute rule string according to value type RECUR of iCalendar from the values given.
@param self: the object pointer
- @param datas: dictionary of freq and interval value.
+ @param data: dictionary of freq and interval value
+ @return: string containing recurring rule (empty if no rule)
"""
- def get_week_string(freq, datas):
+ def get_week_string(freq, data):
weekdays = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su']
if freq == 'weekly':
- byday = map(lambda x: x.upper(), filter(lambda x: datas.get(x) and x in weekdays, datas))
+ byday = map(lambda x: x.upper(), filter(lambda x: data.get(x) and x in weekdays, data))
if byday:
return ';BYDAY=' + ','.join(byday)
return ''
- def get_month_string(freq, datas):
+ def get_month_string(freq, data):
if freq == 'monthly':
- if datas.get('select1')=='date' and (datas.get('day') < 1 or datas.get('day') > 31):
+ if data.get('select1')=='date' and (data.get('day') < 1 or data.get('day') > 31):
raise osv.except_osv(_('Error!'), ("Please select a proper day of the month."))
- if datas.get('select1')=='day':
- return ';BYDAY=' + datas.get('byday') + datas.get('week_list')
- elif datas.get('select1')=='date':
- return ';BYMONTHDAY=' + str(datas.get('day'))
+ if data.get('select1')=='day':
+ return ';BYDAY=' + data.get('byday') + data.get('week_list')
+ elif data.get('select1')=='date':
+ return ';BYMONTHDAY=' + str(data.get('day'))
return ''
- def get_end_date(datas):
- if datas.get('end_date'):
- datas['end_date_new'] = ''.join((re.compile('\d')).findall(datas.get('end_date'))) + 'T235959Z'
-
- return (datas.get('end_type') == 'count' and (';COUNT=' + str(datas.get('count'))) or '') +\
- ((datas.get('end_date_new') and datas.get('end_type') == 'end_date' and (';UNTIL=' + datas.get('end_date_new'))) or '')
+ def get_end_date(data):
+ if data.get('end_date'):
+ data['end_date_new'] = ''.join((re.compile('\d')).findall(data.get('end_date'))) + 'T235959Z'
- freq=datas.get('rrule_type')
- if freq == 'none':
- return ''
+ return (data.get('end_type') == 'count' and (';COUNT=' + str(data.get('count'))) or '') +\
+ ((data.get('end_date_new') and data.get('end_type') == 'end_date' and (';UNTIL=' + data.get('end_date_new'))) or '')
- interval_srting = datas.get('interval') and (';INTERVAL=' + str(datas.get('interval'))) or ''
+ freq = data.get('rrule_type', False)
+ res = ''
+ if freq:
+ interval_srting = data.get('interval') and (';INTERVAL=' + str(data.get('interval'))) or ''
+ res = 'FREQ=' + freq.upper() + get_week_string(freq, data) + interval_srting + get_end_date(data) + get_month_string(freq, data)
- return 'FREQ=' + freq.upper() + get_week_string(freq, datas) + interval_srting + get_end_date(datas) + get_month_string(freq, datas)
+ return res
def _get_empty_rrule_data(self):
return {
@@ -1248,19 +1266,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'week_list' : False
}
- #def _write_rrule(self, cr, uid, ids, field_value, rule_date=False, context=None):
- # data = self._get_empty_rrule_data()
- #
- # if field_value:
- # data['recurrency'] = True
- # for event in self.browse(cr, uid, ids, context=context):
- # rdate = rule_date or event.date
- # update_data = self._parse_rrule(field_value, dict(data), rdate)
- # data.update(update_data)
- # #parse_rrule
- # self.write(cr, uid, event.id, data, context=context)
-
-
def _parse_rrule(self, rule, data, date_start):
day_list = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su']
rrule_type = ['yearly', 'monthly', 'weekly', 'daily']
@@ -1278,7 +1283,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
if i in r._byweekday:
data[day_list[i]] = True
data['rrule_type'] = 'weekly'
- #repeat monthly bynweekday ((weekday, weeknumber), )
+ #repeat monthly by nweekday ((weekday, weeknumber), )
if r._bynweekday:
data['week_list'] = day_list[r._bynweekday[0][0]].upper()
data['byday'] = r._bynweekday[0][1]
@@ -1290,7 +1295,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
data['select1'] = 'date'
data['rrule_type'] = 'monthly'
- #yearly but for openerp it's monthly, take same information as monthly but interval is 12 times
+ #repeat yearly but for openerp it's monthly, take same information as monthly but interval is 12 times
if r._bymonth:
data['interval'] = data['interval'] * 12
@@ -1363,7 +1368,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
except Exception:
return True
-
def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True):
context = context or {}
if isinstance(ids, (str, int, long)):
@@ -1384,14 +1388,14 @@ rule or repeating pattern of time to exclude from the recurring rule."),
data = self.read(cr, uid, event_id, ['date', 'date_deadline', \
'rrule', 'duration', 'exdate'])
if data.get('rrule'):
- data.update(vals)
- data.update({
- 'recurrent_uid': real_event_id,
- 'recurrent_id': data.get('date'),
- 'rrule_type': 'none',
- 'rrule': '',
- 'recurrency' : False,
- })
+ data.update(
+ vals,
+ recurrent_uid=real_event_id,
+ recurrent_id=data.get('date'),
+ rrule_type=False,
+ rrule='',
+ recurrency=False,
+ )
new_id = self.copy(cr, uid, real_event_id, default=data, context=context)
@@ -1435,7 +1439,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
return res
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
- # FIXME This whole id mangling has to go!
if context is None:
context = {}
fields2 = fields and fields[:] or None
@@ -1445,10 +1448,12 @@ rule or repeating pattern of time to exclude from the recurring rule."),
if fields and (f not in fields):
fields2.append(f)
+ # FIXME This whole id mangling has to go!
if isinstance(ids, (str, int, long)):
select = [ids]
else:
select = ids
+
select = map(lambda x: (x, base_calendar_id2real_id(x)), select)
result = []
@@ -1477,7 +1482,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
if f not in ('id','date','date_deadline','duration','user_id','state'):
if isinstance(r[f], list):
r[f] = []
- else:
+ else:
r[f] = False
if f=='name':
r[f] = _('Busy')
@@ -1525,7 +1530,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
self.unlink_events(cr, uid, ids, context=context)
return res
-
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
@@ -1543,7 +1547,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
""" Makes event invitation as Tentative
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param ids: List of Event IDs
@param *args: Get Tupple value
@param context: A standard dictionary for contextual values
@@ -1554,7 +1558,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
""" Makes event invitation as Tentative
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param ids: List of Event IDs
@param *args: Get Tupple value
@param context: A standard dictionary for contextual values
@@ -1565,7 +1569,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
""" Makes event invitation as Tentative
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param ids: List of Event IDs
@param *args: Get Tupple value
@param context: A standard dictionary for contextual values
@@ -1586,9 +1590,9 @@ class calendar_todo(osv.osv):
Get Date
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param ids: List of calendar todo's IDs.
- @param args: list of tuples of form [(‘name_of_the_field’, ‘operator’, value), ...].
+ @param args: list of tuples of form [(‘name_of_the_field', ‘operator', value), ...].
@param context: A standard dictionary for contextual values
"""
@@ -1602,10 +1606,10 @@ class calendar_todo(osv.osv):
Set Date
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param id: calendar's ID.
@param value: Get Value
- @param args: list of tuples of form [(‘name_of_the_field’, ‘operator’, value), ...].
+ @param args: list of tuples of form [('name_of_the_field', 'operator', value), ...].
@param context: A standard dictionary for contextual values
"""
@@ -1633,7 +1637,7 @@ class ir_values(osv.osv):
Set IR Values
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param model: Get The Model
"""
@@ -1652,7 +1656,7 @@ class ir_values(osv.osv):
Get IR Values
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param model: Get The Model
"""
if context is None:
@@ -1678,8 +1682,8 @@ class ir_model(osv.osv):
Overrides orm read method.
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of IR Model’s IDs.
+ @param uid: the current user's ID for security checks,
+ @param ids: List of IR Model's IDs.
@param context: A standard dictionary for contextual values
"""
new_ids = isinstance(ids, (str, int, long)) and [ids] or ids
@@ -1696,24 +1700,24 @@ ir_model()
class virtual_report_spool(web_services.report_spool):
- def exp_report(self, db, uid, object, ids, datas=None, context=None):
+ def exp_report(self, db, uid, object, ids, data=None, context=None):
"""
Export Report
@param self: The object pointer
@param db: get the current database,
- @param uid: the current user’s ID for security checks,
+ @param uid: the current user's ID for security checks,
@param context: A standard dictionary for contextual values
"""
if object == 'printscreen.list':
return super(virtual_report_spool, self).exp_report(db, uid, \
- object, ids, datas, context)
+ object, ids, data, context)
new_ids = []
for id in ids:
new_ids.append(base_calendar_id2real_id(id))
- if datas.get('id', False):
- datas['id'] = base_calendar_id2real_id(datas['id'])
- return super(virtual_report_spool, self).exp_report(db, uid, object, new_ids, datas, context)
+ if data.get('id', False):
+ data['id'] = base_calendar_id2real_id(data['id'])
+ return super(virtual_report_spool, self).exp_report(db, uid, object, new_ids, data, context)
virtual_report_spool()
@@ -1725,8 +1729,8 @@ class res_users(osv.osv):
Get User Availability
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of res user’s IDs.
+ @param uid: the current user's ID for security checks,
+ @param ids: List of res user's IDs.
@param context: A standard dictionary for contextual values
"""
@@ -1755,8 +1759,8 @@ class res_users(osv.osv):
Get User Availability Function
@param self: The object pointer
@param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of res user’s IDs.
+ @param uid: the current user's ID for security checks,
+ @param ids: List of res user's IDs.
@param context: A standard dictionary for contextual values
"""
@@ -1770,5 +1774,4 @@ class res_users(osv.osv):
res_users()
-
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml
index fe292a489ab..d5dc75df873 100644
--- a/addons/base_calendar/base_calendar_view.xml
+++ b/addons/base_calendar/base_calendar_view.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
- <!-- Attendee form view-->
-
+ <!-- Attendee form view -->
<record id="base_calendar_attendee_form_view" model="ir.ui.view">
<field name="name">calendar.attendee.form</field>
<field name="model">calendar.attendee</field>
@@ -55,8 +54,7 @@
</field>
</record>
- <!-- Attendee tree view-->
-
+ <!-- Attendee tree view -->
<record id="base_calendar_attendee_tree_view" model="ir.ui.view">
<field name="name">calendar.attendee.tree</field>
<field name="model">calendar.attendee</field>
@@ -73,8 +71,7 @@
</field>
</record>
- <!-- Attendee search view-->
-
+ <!-- Attendee search view -->
<record id="base_calendar_attendee_search_view" model="ir.ui.view">
<field name="name">calendar.attendee.search</field>
<field name="model">calendar.attendee</field>
@@ -110,18 +107,16 @@
<field name="context">{'default_sent_by_uid': uid}</field>
</record>
- <!-- Calenadar's menu -->
+ <!-- Calendar's menu -->
<menuitem id="base.menu_calendar_configuration" name="Calendar"
parent="base.menu_base_config" sequence="50" groups="base.group_no_one"/>
<!-- Invitation menu -->
-
<menuitem id="menu_attendee_invitations"
parent="base.menu_calendar_configuration"
sequence="10" action="action_view_attendee_form"/>
- <!-- ALARM FORM VIEW-->
-
+ <!-- Alarm form view -->
<record id="res_alarm_form_view" model="ir.ui.view">
<field name="name">res.alarm.form</field>
<field name="model">res.alarm</field>
@@ -140,8 +135,7 @@
</field>
</record>
- <!-- ALARM TREE VIEW-->
-
+ <!-- Alarm list view -->
<record id="res_alarm_tree_view" model="ir.ui.view">
<field name="name">res.alarm.tree</field>
<field name="model">res.alarm</field>
@@ -171,15 +165,13 @@
</field>
</record>
- <!-- Menu for Alarms-->
-
+ <!-- Alarms menu -->
<menuitem id="menu_crm_meeting_avail_alarm"
groups="base.group_no_one"
action="base_calendar.action_res_alarm_view"
parent="base.menu_calendar_configuration" sequence="5"/>
- <!-- Event Form View-->
-
+ <!-- Event form view -->
<record model="ir.ui.view" id="event_form_view">
<field name="name">Event Form</field>
<field name="model">calendar.event</field>
@@ -334,8 +326,7 @@
</field>
</record>
- <!-- Event Tree View -->
-
+ <!-- Event list view -->
<record model="ir.ui.view" id="event_tree_view">
<field name="name">Event Tree</field>
<field name="model">calendar.event</field>
@@ -352,8 +343,7 @@
</field>
</record>
- <!-- Event Calendar View -->
-
+ <!-- Event calendar view -->
<record model="ir.ui.view" id="event_calendar_view">
<field name="name">Events Calendar</field>
<field name="model">calendar.event</field>
@@ -367,8 +357,7 @@
</field>
</record>
- <!-- Event Search View-->
-
+ <!-- Event search view -->
<record id="view_calendar_event_filter" model="ir.ui.view">
<field name="name">Calendar Events Search</field>
<field name="model">calendar.event</field>
@@ -393,8 +382,7 @@
</record>
- <!-- Event action -->
-
+ <!-- Event action -->
<record id="action_view_event" model="ir.actions.act_window">
<field name="name">Events</field>
<field name="type">ir.actions.act_window</field>
@@ -404,8 +392,7 @@
<field name="search_view_id" ref="view_calendar_event_filter"/>
</record>
- <!-- Event menu -->
-
+ <!-- Event menu -->
<menuitem id="menu_events"
name="Events" parent="base.menu_calendar_configuration"
sequence="15" action="action_view_event"/>
diff --git a/addons/base_calendar/crm_meeting.py b/addons/base_calendar/crm_meeting.py
index b87114f3a66..9ceaea671ca 100644
--- a/addons/base_calendar/crm_meeting.py
+++ b/addons/base_calendar/crm_meeting.py
@@ -43,14 +43,14 @@ class crm_meeting(base_state, osv.Model):
_name = 'crm.meeting'
_description = "Meeting"
_order = "id desc"
- _inherit = ["calendar.event", "mail.thread", 'ir.needaction_mixin']
+ _inherit = ["calendar.event", "mail.thread", "ir.needaction_mixin"]
_columns = {
# base_state required fields
'create_date': fields.datetime('Creation Date', readonly=True),
'write_date': fields.datetime('Write Date', readonly=True),
'date_open': fields.datetime('Confirmed', readonly=True),
'date_closed': fields.datetime('Closed', readonly=True),
- 'partner_ids': fields.many2many('res.partner', 'crm_meeting_partner_rel', 'meeting_id','partner_id',
+ 'partner_ids': fields.many2many('res.partner', 'crm_meeting_partner_rel', 'meeting_id', 'partner_id',
string='Attendees', states={'done': [('readonly', True)]}),
'state': fields.selection(
[('draft', 'Unconfirmed'), ('open', 'Confirmed')],
@@ -115,5 +115,3 @@ class crm_meeting(base_state, osv.Model):
def case_close_send_note(self, cr, uid, ids, context=None):
return self.message_post(cr, uid, ids, body=_("Meeting <b>completed</b>."), context=context)
-
-
diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml
index adcfc23a520..4df0a8a22b2 100644
--- a/addons/base_calendar/crm_meeting_view.xml
+++ b/addons/base_calendar/crm_meeting_view.xml
@@ -15,9 +15,9 @@
<record id="action_crm_meeting_read" model="ir.values">
<field name="name">action_crm_meeting_read</field>
<field name="action_id" ref="actions_server_crm_meeting_read"/>
- <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_read'))" />
+ <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_read'))"/>
<field name="key">action</field>
- <field name="model_id" ref="model_crm_meeting" />
+ <field name="model_id" ref="model_crm_meeting"/>
<field name="model">crm.meeting</field>
<field name="key2">client_action_multi</field>
</record>
@@ -33,9 +33,9 @@
<record id="action_crm_meeting_unread" model="ir.values">
<field name="name">action_crm_meeting_unread</field>
<field name="action_id" ref="actions_server_crm_meeting_unread"/>
- <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_unread'))" />
+ <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_unread'))"/>
<field name="key">action</field>
- <field name="model_id" ref="model_crm_meeting" />
+ <field name="model_id" ref="model_crm_meeting"/>
<field name="model">crm.meeting</field>
<field name="key2">client_action_multi</field>
</record>
@@ -73,7 +73,7 @@
<sheet>
<div class="oe_title">
<div class="oe_edit_only">
- <label for="name"/>
+ <label for="name"/>
</div>
<h1>
<field name="name"/>
@@ -116,9 +116,49 @@
</page>
<page string="Options">
<group>
- <group>
- <field name="recurrency"
- attrs="{'readonly': [('recurrent_uid','!=',False)]}"/>
+ <group col="1">
+ <group>
+ <field name="recurrency"
+ attrs="{'readonly': [('recurrent_uid','!=',False)]}"/>
+ </group>
+ <group attrs="{'invisible': [('recurrency','=',False)]}">
+ <label for="interval"/>
+ <div>
+ <field name="interval" attrs="{'required': [('recurrency','==',True)]}" class="oe_inline"/>
+ <field name="rrule_type" attrs="{'required': [('recurrency','==',True)]}" class="oe_inline"/>
+ </div>
+ <label string="Until" for="end_type"/>
+ <div>
+ <field name="end_type" attrs="{'required': [('recurrency','==',True)]}" class="oe_inline"/>
+ <field name="count" attrs="{'invisible': [('end_type', '!=', 'count')], 'required': [('recurrency','==',True)]}" class="oe_inline"/>
+ <field name="end_date" attrs="{'invisible': [('end_type', '!=', 'end_date')], 'required': [('end_type', '=', 'end_date')]}" class="oe_inline"/>
+ </div>
+ <label string="Select Weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}"/>
+ <group col="2" colspan="1" name="weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}">
+ <field name="mo"/>
+ <field name="tu"/>
+ <field name="we"/>
+ <field name="th"/>
+ <field name="fr"/>
+ <field name="sa"/>
+ <field name="su"/>
+ </group>
+
+ <label string="Day of Month"
+ attrs="{'invisible': [('rrule_type','!=','monthly')]}"/>
+
+ <div attrs="{'invisible': [('rrule_type','!=','monthly')]}">
+ <field name="select1"/>
+ <field name="day"
+ attrs="{'required': [('select1','=','date'), ('rrule_type','=','monthly')],
+ 'invisible': [('select1','=','day')]}"/>
+ <field name="byday" string="The"
+ attrs="{'required': [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible': [('select1','=','date')]}"/>
+ <field name="week_list" nolabel="1"
+ attrs="{'required': [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible': [('select1','=','date')]}"/>
+ </div>
+
+ </group>
</group>
<group>
<field name="alarm_id" widget="selection" groups="base.group_no_one"/>
@@ -128,44 +168,6 @@
<field name="recurrent_id" invisible="1"/>
<field name="recurrent_uid" invisible="1"/>
</group>
- <group attrs="{'invisible': [('recurrency','=',False)]}">
- <label for="interval"/>
- <div>
- <field name="interval" class="oe_inline"/>
- <field name="rrule_type" class="oe_inline"/>
- </div>
- <label string="Until" for="end_type"/>
- <div>
- <field name="end_type" class="oe_inline"/>
- <field name="count" attrs="{'invisible' : [('end_type', '!=', 'count')] }" class="oe_inline"/>
- <field name="end_date" attrs="{'invisible' : [('end_type', '!=', 'end_date')], 'required': [('end_type', '=', 'end_date')]}" class="oe_inline"/>
- </div>
- <label string="Select Weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}"/>
- <group col="2" colspan="1" name="weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}">
- <field name="mo" />
- <field name="tu" />
- <field name="we" />
- <field name="th" />
- <field name="fr" />
- <field name="sa" />
- <field name="su" />
- </group>
-
- <label string="Day of Month"
- attrs="{'invisible' : [('rrule_type','!=','monthly')]}"/>
-
- <div attrs="{'invisible' : [('rrule_type','!=','monthly')]}">
- <field name="select1" />
- <field name="day"
- attrs="{'required' : [('select1','=','date'), ('rrule_type','=','monthly')],
- 'invisible' : [('select1','=','day')]}" />
- <field name="byday" string="The"
- attrs="{'required' : [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible' : [('select1','=','date')]}" />
- <field name="week_list" nolabel="1"
- attrs="{'required' : [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible' : [('select1','=','date')]}" />
- </div>
-
- </group>
</group>
</page>
<!--
@@ -178,12 +180,11 @@
<tree string="Invitation details" editable="top">
<field name="partner_id"/>
<field name="email" string="Mail To"/>
- <field name="state" />
+ <field name="state"/>
<button name="do_tentative"
states="needs-action,declined,accepted"
string="Uncertain" type="object"
- icon="terp-crm"
- />
+ icon="terp-crm"/>
<button name="do_accept" string="Accept"
states="needs-action,tentative,declined"
type="object" icon="gtk-apply"/>
@@ -195,21 +196,21 @@
<header>
<button name="do_tentative" type="object"
states="needs-action,declined,accepted"
- string="Uncertain" />
+ string="Uncertain"/>
<button name="do_accept" type="object"
states="needs-action,tentative,declined"
- string="Accept" />
+ string="Accept"/>
<button name="do_decline" type="object"
states="needs-action,tentative,accepted"
- string="Decline" />
+ string="Decline"/>
<field name="state" widget="statusbar" statusbar_visible="draft,open,done"/>
</header>
<group>
<group>
- <field name="email" />
- <field name="rsvp" />
- <field name="cutype" />
- <field name="role" />
+ <field name="email"/>
+ <field name="rsvp"/>
+ <field name="cutype"/>
+ <field name="role"/>
</group>
<group>
<field name="partner_id"/>
@@ -237,11 +238,11 @@
<field name="model">crm.meeting</field>
<field name="arch" type="xml">
<tree string="Meetings" fonts="bold:message_unread==True">
- <field name="name" string="Subject" />
+ <field name="name" string="Subject"/>
<field name="user_id"/>
<field name="date"/>
<field name="state" invisible="True"/>
- <field name="duration" />
+ <field name="duration"/>
<field name="message_unread" invisible="1"/>
</tree>
</field>
@@ -279,7 +280,7 @@
<field name="arch" type="xml">
<search string="Search Meetings">
<field name="name" string="Meeting" filter_domain="[('name','ilike',self)]"/>
- <filter string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter string="My Meetings" help="My Meetings" domain="[('user_id','=',uid)]"/>
<field name="user_id"/>
@@ -299,7 +300,7 @@
<field name="context">{"calendar_default_user_id": uid}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
- Click to schedule a new meeting.
+ Click to schedule a new meeting.
</p><p>
The calendar is shared between employees and fully integrated with
other applications such as the employee holidays or the business
diff --git a/addons/base_calendar/test/base_calendar_test.yml b/addons/base_calendar/test/base_calendar_test.yml
index cc1b3c3b292..c84f3ce36c3 100644
--- a/addons/base_calendar/test/base_calendar_test.yml
+++ b/addons/base_calendar/test/base_calendar_test.yml
@@ -10,8 +10,7 @@
duration: 2.5
location: OpenERP S.A.
name: Technical Presentation
- rrule_type: none
--
+-
Now I will set recurrence for this event to occur monday and friday of week
-
!python {model: calendar.event}: |
@@ -39,10 +38,9 @@
description: 'All day technical test '
location: School
name: All day test event
- rrule_type: none
-
In order to check reminder I will first create reminder
--
+-
!record {model: res.alarm, id: res_alarm_daybeforeeventstarts0}:
name: 1 Day before event starts
trigger_duration: 1
diff --git a/addons/base_import/__openerp__.py b/addons/base_import/__openerp__.py
index eff20bc90ab..f5a707650d8 100644
--- a/addons/base_import/__openerp__.py
+++ b/addons/base_import/__openerp__.py
@@ -26,13 +26,14 @@ Re-implement openerp's file import system:
'author': 'OpenERP SA',
'depends': ['base'],
'installable': True,
- 'auto_install': False, # set to true and allow uninstall?
+ 'auto_install': True,
'css': [
'static/lib/select2/select2.css',
'static/src/css/import.css',
],
'js': [
'static/lib/select2/select2.js',
+ 'static/lib/javascript-state-machine/state-machine.js',
'static/src/js/import.js',
],
'qweb': ['static/src/xml/import.xml'],
diff --git a/addons/base_import/controllers.py b/addons/base_import/controllers.py
index 85ff993e92e..c831ffd229d 100644
--- a/addons/base_import/controllers.py
+++ b/addons/base_import/controllers.py
@@ -1,15 +1,12 @@
# -*- coding: utf-8 -*-
import simplejson
-try:
- import openerp.addons.web.common.http as openerpweb
-except ImportError:
- import web.common.http as openerpweb
+import openerp
-class ImportController(openerpweb.Controller):
+class ImportController(openerp.addons.web.http.Controller):
_cp_path = '/base_import'
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def set_file(self, req, file, import_id, jsonp='callback'):
import_id = int(import_id)
diff --git a/addons/base_import/models.py b/addons/base_import/models.py
index 1e5ad002b84..996dbf7964d 100644
--- a/addons/base_import/models.py
+++ b/addons/base_import/models.py
@@ -83,6 +83,10 @@ class ir_import(orm.TransientModel):
}]
fields_got = self.pool[model].fields_get(cr, uid, context=context)
for name, field in fields_got.iteritems():
+ # an empty string means the field is deprecated, @deprecated must
+ # be absent or False to mean not-deprecated
+ if field.get('deprecated', False) is not False:
+ continue
if field.get('readonly'):
states = field.get('states')
if not states:
@@ -97,7 +101,7 @@ class ir_import(orm.TransientModel):
'id': name,
'name': name,
'string': field['string'],
- # Y U NO ALWAYS HAVE REQUIRED
+ # Y U NO ALWAYS HAS REQUIRED
'required': bool(field.get('required')),
'fields': [],
}
@@ -124,8 +128,8 @@ class ir_import(orm.TransientModel):
"""
csv_iterator = csv.reader(
StringIO(record.file),
- quotechar=options['quoting'],
- delimiter=options['separator'])
+ quotechar=str(options['quoting']),
+ delimiter=str(options['separator']))
csv_nonempty = itertools.ifilter(None, csv_iterator)
# TODO: guess encoding with chardet? Or https://github.com/aadsm/jschardet
encoding = options.get('encoding', 'utf-8')
@@ -307,22 +311,14 @@ class ir_import(orm.TransientModel):
except ValueError, e:
return [{
'type': 'error',
- 'message': str(e),
+ 'message': unicode(e),
'record': False,
}]
- try:
- _logger.info('importing %d rows...', len(data))
- (code, record, message, _wat) = self.pool[record.res_model].import_data(
- cr, uid, import_fields, data, context=context)
- _logger.info('done')
-
- except Exception, e:
- _logger.exception("Import failed")
- # TODO: remove when exceptions stop being an "expected"
- # behavior of import_data on some (most) invalid
- # input.
- code, record, message = -1, None, str(e)
+ _logger.info('importing %d rows...', len(data))
+ import_result = self.pool[record.res_model].load(
+ cr, uid, import_fields, data, context=context)
+ _logger.info('done')
# If transaction aborted, RELEASE SAVEPOINT is going to raise
# an InternalError (ROLLBACK should work, maybe). Ignore that.
@@ -339,14 +335,4 @@ class ir_import(orm.TransientModel):
except psycopg2.InternalError:
pass
- if code != -1:
- return []
-
- # TODO: add key for error location?
- # TODO: error not within normal preview, how to display? Re-preview
- # with higher ``count``?
- return [{
- 'type': 'error',
- 'message': message,
- 'record': record or False
- }]
+ return import_result['messages']
diff --git a/addons/base_import/static/lib/javascript-state-machine/LICENSE b/addons/base_import/static/lib/javascript-state-machine/LICENSE
new file mode 100644
index 00000000000..8ad703ca4ef
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2012 Jake Gordon and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/addons/base_import/static/lib/javascript-state-machine/README.md b/addons/base_import/static/lib/javascript-state-machine/README.md
new file mode 100644
index 00000000000..64c045e69d7
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/README.md
@@ -0,0 +1,327 @@
+Javascript Finite State Machine (v2.1.0)
+========================================
+
+This standalone javascript micro-framework provides a finite state machine for your pleasure.
+
+ * You can find the [code here](https://github.com/jakesgordon/javascript-state-machine)
+ * You can find a [description here](http://codeincomplete.com/posts/2011/8/19/javascript_state_machine_v2/)
+ * You can find a [working demo here](http://codeincomplete.com/posts/2011/8/19/javascript_state_machine_v2/example/)
+
+Download
+========
+
+You can download [state-machine.js](https://github.com/jakesgordon/javascript-state-machine/raw/master/state-machine.js),
+or the [minified version](https://github.com/jakesgordon/javascript-state-machine/raw/master/state-machine.min.js)
+
+Alternatively:
+
+ git clone git@github.com:jakesgordon/javascript-state-machine
+
+
+ * All code is in state-machine.js
+ * Minified version provided in state-machine.min.js
+ * No 3rd party library is required
+ * Demo can be found in /index.html
+ * QUnit tests can be found in /test/index.html
+
+Usage
+=====
+
+Include `state-machine.min.js` in your application.
+
+In its simplest form, create a standalone state machine using:
+
+ var fsm = StateMachine.create({
+ initial: 'green',
+ events: [
+ { name: 'warn', from: 'green', to: 'yellow' },
+ { name: 'panic', from: 'yellow', to: 'red' },
+ { name: 'calm', from: 'red', to: 'yellow' },
+ { name: 'clear', from: 'yellow', to: 'green' }
+ ]});
+
+... will create an object with a method for each event:
+
+ * fsm.warn() - transition from 'green' to 'yellow'
+ * fsm.panic() - transition from 'yellow' to 'red'
+ * fsm.calm() - transition from 'red' to 'yellow'
+ * fsm.clear() - transition from 'yellow' to 'green'
+
+along with the following members:
+
+ * fsm.current - contains the current state
+ * fsm.is(s) - return true if state `s` is the current state
+ * fsm.can(e) - return true if event `e` can be fired in the current state
+ * fsm.cannot(e) - return true if event `e` cannot be fired in the current state
+
+Multiple 'from' and 'to' states for a single event
+==================================================
+
+If an event is allowed **from** multiple states, and always transitions to the same
+state, then simply provide an array of states in the `from` attribute of an event. However,
+if an event is allowed from multiple states, but should transition **to** a different
+state depending on the current state, then provide multiple event entries with
+the same name:
+
+ var fsm = StateMachine.create({
+ initial: 'hungry',
+ events: [
+ { name: 'eat', from: 'hungry', to: 'satisfied' },
+ { name: 'eat', from: 'satisfied', to: 'full' },
+ { name: 'eat', from: 'full', to: 'sick' },
+ { name: 'rest', from: ['hungry', 'satisfied', 'full', 'sick'], to: 'hungry' },
+ ]});
+
+This example will create an object with 2 event methods:
+
+ * fsm.eat()
+ * fsm.rest()
+
+The `rest` event will always transition to the `hungry` state, while the `eat` event
+will transition to a state that is dependent on the current state.
+
+>> NOTE: The `rest` event could use a wildcard '*' for the 'from' state if it should be
+allowed from any current state.
+
+>> NOTE: The `rest` event in the above example can also be specified as multiple events with
+the same name if you prefer the verbose approach.
+
+Callbacks
+=========
+
+4 callbacks are available if your state machine has methods using the following naming conventions:
+
+ * onbefore**event** - fired before the event
+ * onleave**state** - fired when leaving the old state
+ * onenter**state** - fired when entering the new state
+ * onafter**event** - fired after the event
+
+You can affect the event in 3 ways:
+
+ * return `false` from an `onbeforeevent` handler to cancel the event.
+ * return `false` from an `onleavestate` handler to cancel the event.
+ * return `ASYNC` from an `onleavestate` handler to perform an asynchronous state transition (see next section)
+
+For convenience, the 2 most useful callbacks can be shortened:
+
+ * on**event** - convenience shorthand for onafter**event**
+ * on**state** - convenience shorthand for onenter**state**
+
+In addition, a generic `onchangestate()` callback can be used to call a single function for _all_ state changes:
+
+All callbacks will be passed the same arguments:
+
+ * **event** name
+ * **from** state
+ * **to** state
+ * _(followed by any arguments you passed into the original event method)_
+
+Callbacks can be specified when the state machine is first created:
+
+ var fsm = StateMachine.create({
+ initial: 'green',
+ events: [
+ { name: 'warn', from: 'green', to: 'yellow' },
+ { name: 'panic', from: 'yellow', to: 'red' },
+ { name: 'calm', from: 'red', to: 'yellow' },
+ { name: 'clear', from: 'yellow', to: 'green' }
+ ],
+ callbacks: {
+ onpanic: function(event, from, to, msg) { alert('panic! ' + msg); },
+ onclear: function(event, from, to, msg) { alert('thanks to ' + msg); },
+ ongreen: function(event, from, to) { document.body.className = 'green'; },
+ onyellow: function(event, from, to) { document.body.className = 'yellow'; },
+ onred: function(event, from, to) { document.body.className = 'red'; },
+ }
+ });
+
+ fsm.panic('killer bees');
+ fsm.clear('sedatives in the honey pots');
+ ...
+
+Additionally, they can be added and removed from the state machine at any time:
+
+ fsm.ongreen = null;
+ fsm.onyellow = null;
+ fsm.onred = null;
+ fsm.onchangestate = function(event, from, to) { document.body.className = to; };
+
+Asynchronous State Transitions
+==============================
+
+Sometimes, you need to execute some asynchronous code during a state transition and ensure the
+new state is not entered until your code has completed.
+
+A good example of this is when you transition out of a `menu` state, perhaps you want to gradually
+fade the menu away, or slide it off the screen and don't want to transition to your `game` state
+until after that animation has been performed.
+
+You can now return `StateMachine.ASYNC` from your `onleavestate` handler and the state machine
+will be _'put on hold'_ until you are ready to trigger the transition using the new `transition()`
+method.
+
+For example, using jQuery effects:
+
+ var fsm = StateMachine.create({
+
+ initial: 'menu',
+
+ events: [
+ { name: 'play', from: 'menu', to: 'game' },
+ { name: 'quit', from: 'game', to: 'menu' }
+ ],
+
+ callbacks: {
+
+ onentermenu: function() { $('#menu').show(); },
+ onentergame: function() { $('#game').show(); },
+
+ onleavemenu: function() {
+ $('#menu').fadeOut('fast', function() {
+ fsm.transition();
+ });
+ return StateMachine.ASYNC; // tell StateMachine to defer next state until we call transition (in fadeOut callback above)
+ },
+
+ onleavegame: function() {
+ $('#game').slideDown('slow', function() {
+ fsm.transition();
+ };
+ return StateMachine.ASYNC; // tell StateMachine to defer next state until we call transition (in slideDown callback above)
+ }
+
+ }
+ });
+
+
+State Machine Classes
+=====================
+
+You can also turn all instances of a _class_ into an FSM by applying
+the state machine functionality to the prototype, including your callbacks
+in your prototype, and providing a `startup` event for use when constructing
+instances:
+
+ MyFSM = function() { // my constructor function
+ this.startup();
+ };
+
+ MyFSM.prototype = {
+
+ onpanic: function(event, from, to) { alert('panic'); },
+ onclear: function(event, from, to) { alert('all is clear'); },
+
+ // my other prototype methods
+
+ };
+
+ StateMachine.create({
+ target: MyFSM.prototype,
+ events: [
+ { name: 'startup', from: 'none', to: 'green' },
+ { name: 'warn', from: 'green', to: 'yellow' },
+ { name: 'panic', from: 'yellow', to: 'red' },
+ { name: 'calm', from: 'red', to: 'yellow' },
+ { name: 'clear', from: 'yellow', to: 'green' }
+ ]});
+
+
+This should be easy to adjust to fit your appropriate mechanism for object construction.
+
+Initialization Options
+======================
+
+How the state machine should initialize can depend on your application requirements, so
+the library provides a number of simple options.
+
+By default, if you dont specify any initial state, the state machine will be in the `'none'`
+state and you would need to provide an event to take it out of this state:
+
+ var fsm = StateMachine.create({
+ events: [
+ { name: 'startup', from: 'none', to: 'green' },
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.current); // "none"
+ fsm.startup();
+ alert(fsm.current); // "green"
+
+If you specify the name of your initial event (as in all the earlier examples), then an
+implicit `startup` event will be created for you and fired when the state machine is constructed.
+
+ var fsm = StateMachine.create({
+ initial: 'green',
+ events: [
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.current); // "green"
+
+If your object already has a `startup` method you can use a different name for the initial event
+
+ var fsm = StateMachine.create({
+ initial: { state: 'green', event: 'init' },
+ events: [
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.current); // "green"
+
+Finally, if you want to wait to call the initial state transition event until a later date you
+can `defer` it:
+
+ var fsm = StateMachine.create({
+ initial: { state: 'green', event: 'init', defer: true },
+ events: [
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.current); // "none"
+ fsm.init();
+ alert(fsm.current); // "green"
+
+Of course, we have now come full circle, this last example is pretty much functionally the
+same as the first example in this section where you simply define your own startup event.
+
+So you have a number of choices available to you when initializing your state machine.
+
+Handling Failures
+======================
+
+By default, if you try to call an event method that is not allowed in the current state, the
+state machine will throw an exception. If you prefer to handle the problem yourself, you can
+define a custom `error` handler:
+
+ var fsm = StateMachine.create({
+ initial: 'green',
+ error: function(eventName, from, to, args, errorCode, errorMessage) {
+ return 'event ' + eventName + ' was naughty :- ' + errorMessage;
+ },
+ events: [
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.calm()); // "event calm was naughty :- event not allowed in current state green"
+
+Release Notes
+=============
+
+See [RELEASE NOTES](https://github.com/jakesgordon/javascript-state-machine/blob/master/RELEASE_NOTES.md) file.
+
+License
+=======
+
+See [LICENSE](https://github.com/jakesgordon/javascript-state-machine/blob/master/LICENSE) file.
+
+Contact
+=======
+
+If you have any ideas, feedback, requests or bug reports, you can reach me at
+[jake@codeincomplete.com](mailto:jake@codeincomplete.com), or via
+my website: [Code inComplete](http://codeincomplete.com/posts/2011/8/19/javascript_state_machine_v2/)
+
+
+
+
+
diff --git a/addons/base_import/static/lib/javascript-state-machine/RELEASE_NOTES.md b/addons/base_import/static/lib/javascript-state-machine/RELEASE_NOTES.md
new file mode 100644
index 00000000000..06abf402d38
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/RELEASE_NOTES.md
@@ -0,0 +1,32 @@
+Version 2.1.0 (January 7th 2012)
+--------------------------------
+
+ * Wrapped in self executing function to be more easily used with loaders like `require.js` or `curl.js` (issue #15)
+ * Allow event to be cancelled by returning `false` from `onleavestate` handler (issue #13) - WARNING: this breaks backward compatibility for async transitions (you now need to return `StateMachine.ASYNC` instead of `false`)
+ * Added explicit return values for event methods (issue #12)
+ * Added support for wildcard events that can be fired 'from' any state (issue #11)
+ * Added support for no-op events that transition 'to' the same state (issue #5)
+ * extended custom error callback to handle any exceptions caused by caller provided callbacks
+ * added custom error callback to override exception when an illegal state transition is attempted (thanks to cboone)
+ * fixed typos (thanks to cboone)
+ * fixed issue #4 - ensure before/after event hooks are called even if the event doesn't result in a state change
+
+Version 2.0.0 (August 19th 2011)
+--------------------------------
+
+ * adding support for asynchronous state transitions (see README) - with lots of qunit tests (see test/async.js).
+ * consistent arguments for ALL callbacks, first 3 args are ALWAYS event name, from state and to state, followed by whatever arguments the user passed to the original event method.
+ * added a generic `onchangestate(event,from,to)` callback to detect all state changes with a single function.
+ * allow callbacks to be declared at creation time (instead of having to attach them afterwards)
+ * renamed 'hooks' => 'callbacks'
+ * [read more...](http://codeincomplete.com/posts/2011/8/19/javascript_state_machine_v2/)
+
+Version 1.2.0 (June 21st 2011)
+------------------------------
+ * allows the same event to transition to different states, depending on the current state (see 'Multiple...' section in README.md)
+ * [read more...](http://codeincomplete.com/posts/2011/6/21/javascript_state_machine_v1_2_0/)
+
+Version 1.0.0 (June 1st 2011)
+-----------------------------
+ * initial version
+ * [read more...](http://codeincomplete.com/posts/2011/6/1/javascript_state_machine/)
diff --git a/addons/base_import/static/lib/javascript-state-machine/Rakefile b/addons/base_import/static/lib/javascript-state-machine/Rakefile
new file mode 100644
index 00000000000..beb8702a7f0
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/Rakefile
@@ -0,0 +1,8 @@
+
+desc "create minified version of state-machine.js"
+task :minify do
+ require File.expand_path(File.join(File.dirname(__FILE__), 'minifier/minifier'))
+ Minifier.enabled = true
+ Minifier.minify('state-machine.js')
+end
+
diff --git a/addons/base_import/static/lib/javascript-state-machine/index.html b/addons/base_import/static/lib/javascript-state-machine/index.html
new file mode 100644
index 00000000000..2d6cb62617b
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/index.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Javascript Finite State Machine</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <link href="demo/demo.css" media="screen, print" rel="stylesheet" type="text/css" />
+</head>
+
+<body>
+
+ <div id="demo" class='green'>
+
+ <h1> Finite State Machine </h1>
+
+ <div id="controls">
+ <button id="clear" onclick="Demo.clear();">clear</button>
+ <button id="calm" onclick="Demo.calm();">calm</button>
+ <button id="warn" onclick="Demo.warn();">warn</button>
+ <button id="panic" onclick="Demo.panic();">panic!</button>
+ </div>
+
+ <div id="diagram">
+ </div>
+
+ <div id="notes">
+ <i>dashed lines are asynchronous state transitions (3 seconds)</i>
+ </div>
+
+ <textarea id="output">
+ </textarea>
+
+ </div>
+
+
+ <script src="state-machine.js"></script>
+ <script src="demo/demo.js"></script>
+
+</body>
+</html>
diff --git a/addons/base_import/static/lib/javascript-state-machine/state-machine.js b/addons/base_import/static/lib/javascript-state-machine/state-machine.js
new file mode 100644
index 00000000000..0d503ee7bdb
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/state-machine.js
@@ -0,0 +1,155 @@
+(function (window) {
+
+ StateMachine = {
+
+ //---------------------------------------------------------------------------
+
+ VERSION: "2.1.0",
+
+ //---------------------------------------------------------------------------
+
+ Result: {
+ SUCCEEDED: 1, // the event transitioned successfully from one state to another
+ NOTRANSITION: 2, // the event was successfull but no state transition was necessary
+ CANCELLED: 3, // the event was cancelled by the caller in a beforeEvent callback
+ ASYNC: 4, // the event is asynchronous and the caller is in control of when the transition occurs
+ },
+
+ Error: {
+ INVALID_TRANSITION: 100, // caller tried to fire an event that was innapropriate in the current state
+ PENDING_TRANSITION: 200, // caller tried to fire an event while an async transition was still pending
+ INVALID_CALLBACK: 300, // caller provided callback function threw an exception
+ },
+
+ WILDCARD: '*',
+ ASYNC: 'async',
+
+ //---------------------------------------------------------------------------
+
+ create: function(cfg, target) {
+
+ var initial = (typeof cfg.initial == 'string') ? { state: cfg.initial } : cfg.initial; // allow for a simple string, or an object with { state: 'foo', event: 'setup', defer: true|false }
+ var fsm = target || cfg.target || {};
+ var events = cfg.events || [];
+ var callbacks = cfg.callbacks || {};
+ var map = {};
+
+ var add = function(e) {
+ var from = (e.from instanceof Array) ? e.from : (e.from ? [e.from] : [StateMachine.WILDCARD]); // allow 'wildcard' transition if 'from' is not specified
+ map[e.name] = map[e.name] || {};
+ for (var n = 0 ; n < from.length ; n++)
+ map[e.name][from[n]] = e.to || from[n]; // allow no-op transition if 'to' is not specified
+ };
+
+ if (initial) {
+ initial.event = initial.event || 'startup';
+ add({ name: initial.event, from: 'none', to: initial.state });
+ }
+
+ for(var n = 0 ; n < events.length ; n++)
+ add(events[n]);
+
+ for(var name in map) {
+ if (map.hasOwnProperty(name))
+ fsm[name] = StateMachine.buildEvent(name, map[name]);
+ }
+
+ for(var name in callbacks) {
+ if (callbacks.hasOwnProperty(name))
+ fsm[name] = callbacks[name]
+ }
+
+ fsm.current = 'none';
+ fsm.is = function(state) { return this.current == state; };
+ fsm.can = function(event) { return !this.transition && (map[event].hasOwnProperty(this.current) || map[event].hasOwnProperty(StateMachine.WILDCARD)); }
+ fsm.cannot = function(event) { return !this.can(event); };
+ fsm.error = cfg.error || function(name, from, to, args, error, msg) { throw msg; }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3)
+
+ if (initial && !initial.defer)
+ fsm[initial.event]();
+
+ return fsm;
+
+ },
+
+ //===========================================================================
+
+ doCallback: function(fsm, func, name, from, to, args) {
+ if (func) {
+ try {
+ return func.apply(fsm, [name, from, to].concat(args));
+ }
+ catch(e) {
+ return fsm.error(name, from, to, args, StateMachine.Error.INVALID_CALLBACK, "an exception occurred in a caller-provided callback function");
+ }
+ }
+ },
+
+ beforeEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbefore' + name], name, from, to, args); },
+ afterEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafter' + name] || fsm['on' + name], name, from, to, args); },
+ leaveState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleave' + from], name, from, to, args); },
+ enterState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenter' + to] || fsm['on' + to], name, from, to, args); },
+ changeState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onchangestate'], name, from, to, args); },
+
+
+ buildEvent: function(name, map) {
+ return function() {
+
+ var from = this.current;
+ var to = map[from] || map[StateMachine.WILDCARD] || from;
+ var args = Array.prototype.slice.call(arguments); // turn arguments into pure array
+
+ if (this.transition)
+ return this.error(name, from, to, args, StateMachine.Error.PENDING_TRANSITION, "event " + name + " inappropriate because previous transition did not complete");
+
+ if (this.cannot(name))
+ return this.error(name, from, to, args, StateMachine.Error.INVALID_TRANSITION, "event " + name + " inappropriate in current state " + this.current);
+
+ if (false === StateMachine.beforeEvent(this, name, from, to, args))
+ return StateMachine.CANCELLED;
+
+ if (from === to) {
+ StateMachine.afterEvent(this, name, from, to, args);
+ return StateMachine.NOTRANSITION;
+ }
+
+ // prepare a transition method for use EITHER lower down, or by caller if they want an async transition (indicated by an ASYNC return value from leaveState)
+ var fsm = this;
+ this.transition = function() {
+ fsm.transition = null; // this method should only ever be called once
+ fsm.current = to;
+ StateMachine.enterState( fsm, name, from, to, args);
+ StateMachine.changeState(fsm, name, from, to, args);
+ StateMachine.afterEvent( fsm, name, from, to, args);
+ };
+
+ var leave = StateMachine.leaveState(this, name, from, to, args);
+ if (false === leave) {
+ this.transition = null;
+ return StateMachine.CANCELLED;
+ }
+ else if ("async" === leave) {
+ return StateMachine.ASYNC;
+ }
+ else {
+ if (this.transition)
+ this.transition(); // in case user manually called transition() but forgot to return ASYNC
+ return StateMachine.SUCCEEDED;
+ }
+
+ };
+ }
+
+ }; // StateMachine
+
+ //===========================================================================
+
+ if ("function" === typeof define) {
+ define("statemachine", [], function() { return StateMachine; });
+ }
+ else {
+ window.StateMachine = StateMachine;
+ }
+
+}(this));
+
diff --git a/addons/base_import/static/src/css/import.css b/addons/base_import/static/src/css/import.css
index f6258f5aa50..21e598ff707 100644
--- a/addons/base_import/static/src/css/import.css
+++ b/addons/base_import/static/src/css/import.css
@@ -10,7 +10,8 @@
.oe_import .oe_import_grid,
.oe_import .oe_import_error_report,
.oe_import .oe_import_with_file,
-.oe_import .oe_import_noheaders {
+.oe_import .oe_import_noheaders,
+.oe_import .oe_import_report_more {
display: none;
}
@@ -19,7 +20,8 @@
}
.oe_import.oe_import_error .oe_import_error_report,
.oe_import.oe_import_with_file .oe_import_with_file,
-.oe_import.oe_import_noheaders .oe_import_noheaders {
+.oe_import.oe_import_noheaders .oe_import_noheaders,
+.oe_import .oe_import_report_showmore .oe_import_report_more {
display: block;
}
@@ -29,6 +31,9 @@
.oe_import .oe_import_error_report ul .oe_import_report_warning {
background-color: #FEFFD9;
}
+.oe_import .oe_import_error_report ul .oe_import_report_info {
+ background-color: #d3ffd3;
+}
.oe_import .oe_import_noheaders {
color: #888;
@@ -47,7 +52,7 @@
}
.oe_import .oe_import_options label {
display: inline-block;
- width: 10em;
+ width: 8em;
text-align: right;
}
diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js
index c2deb660ff2..33c86e88b2c 100644
--- a/addons/base_import/static/src/js/import.js
+++ b/addons/base_import/static/src/js/import.js
@@ -47,31 +47,35 @@ openerp.base_import = function (instance) {
this._super.apply(this, arguments);
if(add_button) {
this.$buttons.on('click', '.oe_list_button_import', function() {
- new instance.web.DataImport(self, self.dataset).open();
+ self.do_action({
+ type: 'ir.actions.client',
+ tag: 'import',
+ params: {
+ model: self.dataset.model
+ }
+ }, void 0, void 0, function () {
+ self.reload();
+ });
return false;
});
}
}
});
- instance.web.DataImport = instance.web.Dialog.extend({
+ instance.web.client_actions.add(
+ 'import', 'instance.web.DataImport');
+ instance.web.DataImport = instance.web.Widget.extend({
template: 'ImportView',
- dialog_title: _lt("Import Data"),
opts: [
{name: 'encoding', label: _lt("Encoding:"), value: 'utf-8'},
{name: 'separator', label: _lt("Separator:"), value: ','},
{name: 'quoting', label: _lt("Quoting:"), value: '"'}
],
events: {
- 'change .oe_import_grid input': 'import_dryrun',
- 'change input.oe_import_file': 'file_update',
- 'change input.oe_import_has_header, .oe_import_options input': 'settings_updated',
- 'click a.oe_import_csv': function (e) {
- e.preventDefault();
- },
- 'click a.oe_import_export': function (e) {
- e.preventDefault();
- },
+ // 'change .oe_import_grid input': 'import_dryrun',
+ 'change .oe_import_file': 'loaded_file',
+ 'click .oe_import_file_reload': 'loaded_file',
+ 'change input.oe_import_has_header, .oe_import_options input': 'settings_changed',
'click a.oe_import_toggle': function (e) {
e.preventDefault();
var $el = $(e.target);
@@ -79,30 +83,84 @@ openerp.base_import = function (instance) {
? $el.next()
: $el.parent().next())
.toggle();
+ },
+ 'click .oe_import_report a.oe_import_report_count': function (e) {
+ e.preventDefault();
+ $(e.target).parent().toggleClass('oe_import_report_showmore');
+ },
+ 'click .oe_import_moreinfo_action a': function (e) {
+ e.preventDefault();
+ // #data will parse the attribute on its own, we don't like
+ // that sort of things
+ var action = JSON.parse($(e.target).attr('data-action'));
+ // FIXME: when JS-side clean_action
+ action.views = _(action.views).map(function (view) {
+ var id = view[0], type = view[1];
+ return [
+ id,
+ type !== 'tree' ? type
+ : action.view_type === 'form' ? 'list'
+ : 'tree'
+ ];
+ });
+ this.do_action(_.extend(action, {
+ target: 'new',
+ flags: {
+ search_view: true,
+ display_title: true,
+ pager: true,
+ list: {selectable: false}
+ }
+ }));
+ },
+ // buttons
+ 'click .oe_import_validate': 'validate',
+ 'click .oe_import_import': 'import',
+ 'click .oe_import_cancel': function (e) {
+ e.preventDefault();
+ this.exit();
}
},
- init: function (parent, dataset) {
+ init: function (parent, params) {
var self = this;
- this._super(parent, {
- buttons: [
- {text: _t("Import File"), click: function () {
- self.do_import();
- }, 'class': 'oe_import_dialog_button'}
- ]
- });
- this.res_model = parent.model;
+ this._super.apply(this, arguments);
+ this.res_model = params.model;
// import object id
this.id = null;
this.Import = new instance.web.Model('base_import.import');
},
start: function () {
var self = this;
- return this.Import.call('create', [{
- 'res_model': this.res_model
- }]).then(function (id) {
- self.id = id;
- self.$('input[name=import_id]').val(id);
- });
+ this.setup_encoding_picker();
+
+ return $.when(
+ this._super(),
+ this.Import.call('create', [{
+ 'res_model': this.res_model
+ }]).then(function (id) {
+ self.id = id;
+ self.$('input[name=import_id]').val(id);
+ })
+ )
+ },
+ setup_encoding_picker: function () {
+ this.$('input.oe_import_encoding').select2({
+ width: '160px',
+ query: function (q) {
+ var make = function (term) { return {id: term, text: term}; };
+ var suggestions = _.map(
+ ('utf-8 utf-16 windows-1252 latin1 latin2 big5 ' +
+ 'gb18030 shift_jis windows-1251 koir8_r').split(/\s+/),
+ make);
+ if (q.term) {
+ suggestions.unshift(make(q.term));
+ }
+ q.callback({results: suggestions});
+ },
+ initSelection: function (e, c) {
+ return c({id: 'utf-8', text: 'utf-8'});
+ }
+ }).select2('val', 'utf-8');
},
import_options: function () {
@@ -118,34 +176,52 @@ openerp.base_import = function (instance) {
},
//- File & settings change section
- file_update: function (e) {
+ onfile_loaded: function () {
+ this.$('.oe_import_button').prop('disabled', true);
if (!this.$('input.oe_import_file').val()) { return; }
this.$el.removeClass('oe_import_preview oe_import_error');
jsonp(this.$el, {
url: '/base_import/set_file'
- }, this.proxy('settings_updated'));
+ }, this.proxy('settings_changed'));
},
- settings_updated: function () {
+ onpreviewing: function () {
+ var self = this;
+ this.$('.oe_import_button').prop('disabled', true);
this.$el.addClass('oe_import_with_file');
// TODO: test that write // succeeded?
- this.Import.call(
- 'parse_preview', [this.id, this.import_options()])
- .then(this.proxy('preview'));
- },
- preview: function (result) {
+ this.$el.removeClass('oe_import_preview_error oe_import_error');
this.$el.toggleClass(
'oe_import_noheaders',
!this.$('input.oe_import_has_header').prop('checked'));
- if (result.error) {
- this.$el.addClass('oe_import_error');
- this.$('.oe_import_error_report').html(
+ this.Import.call(
+ 'parse_preview', [this.id, this.import_options()])
+ .then(function (result) {
+ var signal = result.error ? 'preview_failed' : 'preview_succeeded';
+ self[signal](result);
+ });
+ },
+ onpreview_error: function (event, from, to, result) {
+ this.$('.oe_import_options').show();
+ this.$el.addClass('oe_import_preview_error oe_import_error');
+ this.$('.oe_import_error_report').html(
QWeb.render('ImportView.preview.error', result));
- return;
- }
+ },
+ onpreview_success: function (event, from, to, result) {
+ this.$('.oe_import_import').removeClass('oe_highlight');
+ this.$('.oe_import_validate').addClass('oe_highlight');
+ this.$('.oe_import_button').prop('disabled', false);
this.$el.addClass('oe_import_preview');
this.$('table').html(QWeb.render('ImportView.preview', result));
+ if (result.headers.length === 1) {
+ this.$('.oe_import_options').show();
+ this.onresults(null, null, null, [{
+ type: 'warning',
+ message: _t("A single column was found in the file, this often means the file separator is incorrect")
+ }]);
+ }
+
var $fields = this.$('.oe_import_fields input');
this.render_fields_matches(result, $fields);
var data = this.generate_fields_completion(result);
@@ -180,7 +256,6 @@ openerp.base_import = function (instance) {
width: 'resolve',
dropdownCssClass: 'oe_import_selector'
});
- this.import_dryrun();
},
generate_fields_completion: function (root) {
var basic = [];
@@ -252,40 +327,116 @@ openerp.base_import = function (instance) {
//- import itself
call_import: function (options) {
- var self = this;
var fields = this.$('.oe_import_fields input.oe_import_match_field').map(function (index, el) {
return $(el).select2('val') || false;
}).get();
return this.Import.call(
'do', [this.id, fields, this.import_options()], options);
},
- import_dryrun: function () {
-// this.call_import({ dryrun: true })
-// .then(this.proxy('render_import_errors'));
+ onvalidate: function () {
+ return this.call_import({ dryrun: true })
+ .then(this.proxy('validated'));
},
- do_import: function () {
+ onimport: function () {
var self = this;
- this.call_import({ dryrun: false }).then(function (errors) {
- if (_.isEmpty(errors)) {
- if (self.getParent().reload_content) {
- self.getParent().reload_content();
- }
- self.close();
+ return this.call_import({ dryrun: false }).then(function (message) {
+ if (!_.any(message, function (message) {
+ return message.type === 'error' })) {
+ self['import_succeeded']();
return;
}
- self.render_import_errors(errors);
+ self['import_failed'](message);
});
},
- render_import_errors: function (errors) {
- if (_.isEmpty(errors)) {
- this.$el.removeClass('oe_import_error');
- return;
+ onimported: function () {
+ this.exit();
+ },
+ exit: function () {
+ this.do_action({
+ type: 'ir.actions.client',
+ tag: 'history_back'
+ });
+ },
+ onresults: function (event, from, to, message) {
+ var no_messages = _.isEmpty(message);
+ this.$('.oe_import_import').toggleClass('oe_highlight', no_messages);
+ this.$('.oe_import_validate').toggleClass('oe_highlight', !no_messages);
+ if (no_messages) {
+ message.push({
+ type: 'info',
+ message: _t("Everything seems valid.")
+ });
}
- // import failed (or maybe just warnings, if we ever get
- // warnings?)
+ // row indexes come back 0-indexed, spreadsheets
+ // display 1-indexed.
+ var offset = 1;
+ // offset more if header
+ if (this.import_options().headers) { offset += 1; }
+
this.$el.addClass('oe_import_error');
this.$('.oe_import_error_report').html(
- QWeb.render('ImportView.error', {errors: errors}));
+ QWeb.render('ImportView.error', {
+ errors: _(message).groupBy('message'),
+ at: function (rows) {
+ var from = rows.from + offset;
+ var to = rows.to + offset;
+ if (from === to) {
+ return _.str.sprintf(_t("at row %d"), from);
+ }
+ return _.str.sprintf(_t("between rows %d and %d"),
+ from, to);
+ },
+ more: function (n) {
+ return _.str.sprintf(_t("(%d more)"), n);
+ },
+ info: function (msg) {
+ if (typeof msg === 'string') {
+ return _.str.sprintf(
+ '<div class="oe_import_moreinfo oe_import_moreinfo_message">%s</div>',
+ _.str.escapeHTML(msg));
+ }
+ if (msg instanceof Array) {
+ return _.str.sprintf(
+ '<div class="oe_import_moreinfo oe_import_moreinfo_choices">%s <ul>%s</ul></div>',
+ _.str.escapeHTML(_t("Here are the possible values:")),
+ _(msg).map(function (msg) {
+ return '<li>'
+ + _.str.escapeHTML(msg)
+ + '</li>';
+ }).join(''));
+ }
+ // Final should be object, action descriptor
+ return [
+ '<div class="oe_import_moreinfo oe_import_moreinfo_action">',
+ _.str.sprintf('<a href="#" data-action="%s">',
+ _.str.escapeHTML(JSON.stringify(msg))),
+ _.str.escapeHTML(
+ _t("Get all possible values")),
+ '</a>',
+ '</div>'
+ ].join('')
+ },
+ }));
},
});
+ // FSM-ize DataImport
+ StateMachine.create({
+ target: instance.web.DataImport.prototype,
+ events: [
+ { name: 'loaded_file',
+ from: ['none', 'file_loaded', 'preview_error', 'preview_success', 'results'],
+ to: 'file_loaded' },
+ { name: 'settings_changed',
+ from: ['file_loaded', 'preview_error', 'preview_success', 'results'],
+ to: 'previewing' },
+ { name: 'preview_failed', from: 'previewing', to: 'preview_error' },
+ { name: 'preview_succeeded', from: 'previewing', to: 'preview_success' },
+ { name: 'validate', from: 'preview_success', to: 'validating' },
+ { name: 'validate', from: 'results', to: 'validating' },
+ { name: 'validated', from: 'validating', to: 'results' },
+ { name: 'import', from: ['preview_success', 'results'], to: 'importing' },
+ { name: 'import_succeeded', from: 'importing', to: 'imported'},
+ { name: 'import_failed', from: 'importing', to: 'results' }
+ ]
+ })
};
diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml
index 386348bea4b..1c57c40c9db 100644
--- a/addons/base_import/static/src/xml/import.xml
+++ b/addons/base_import/static/src/xml/import.xml
@@ -2,17 +2,45 @@
<t t-name="ImportView">
<t t-set="_id" t-value="_.uniqueId('export')"/>
<form action="" method="post" enctype="multipart/form-data" class="oe_import">
+ <header>
+ <button type="button" disabled="disabled"
+ class="oe_button oe_import_button oe_import_validate oe_highlight"
+ >Validate</button>
+ <button type="button" disabled="disabled"
+ class="oe_button oe_import_button oe_import_import"
+ >Import</button>
+ <span class="oe_fade">or</span>
+ <a class="oe_import_cancel" href="#">Cancel</a>
+ </header>
<input type="hidden" name="session_id"
t-att-value="widget.session.session_id"/>
<input type="hidden" name="import_id"/>
<h2>Upload your file</h2>
- <p>Select the <a href="#" class="oe_import_csv">.CSV</a>
+ <p>Select the <a
+ href="http://en.wikipedia.org/wiki/Comma-separated_values"
+ class="oe_import_csv" target="_blank">.CSV</a>
file to import. If you need a sample importable file, you
- can use <a href="#" class="oe_import_export">the export
- tool</a> to generate one.</p>
+ can use the export tool to generate one.</p>
<label t-attf-for="file_#{_id}" autofocus="autofocus">CSV File:</label>
<input type="file" id-attf-id="file_#{_id}"
name="file" class="oe_import_file"/>
+ <button type="button" class="oe_import_file_reload">
+ <img src="/web/static/src/img/icons/gtk-refresh.png"/>
+ </button>
+ <div class="oe_import_with_file">
+ <a href="#" class="oe_import_toggle">
+ File Format Options…</a>
+ <div class="oe_import_toggled oe_import_options">
+ <p t-foreach="widget.opts" t-as="option">
+ <!-- no @name, avoid submission when file_update called -->
+ <label t-attf-for="#{option.name}_#{_id}">
+ <t t-esc="option.label"/></label>
+ <input t-attf-id="#{option.name}_#{_id}"
+ t-attf-class="oe_import_#{option.name}"
+ t-att-value="option.value"/>
+ </p>
+ </div>
+ </div>
<div class="oe_import_with_file">
<h2>Map your data to OpenERP</h2>
@@ -27,18 +55,6 @@
<div class="oe_import_error_report"></div>
<table class="oe_import_grid" width="100%"/>
- <a href="#" class="oe_import_toggle">
- File Format Options…</a>
- <div class="oe_import_toggled oe_import_options">
- <p t-foreach="widget.opts" t-as="option">
- <!-- no @name, avoid submission when file_update called -->
- <label t-attf-for="#{option.name}_#{_id}">
- <t t-esc="option.label"/></label>
- <input t-attf-id="#{option.name}_#{_id}"
- t-attf-class="oe_import_#{option.name}"
- t-att-value="option.value"/>
- </p>
- </div>
<h2>Frequently Asked Questions</h2>
<dl>
@@ -81,17 +97,37 @@
</tr>
</t>
<t t-name="ImportView.preview.error">
- <p>Import preview failed due to: <t t-esc="error"/></p>
+ <p>Import preview failed due to: <t t-esc="error"/>. The issue is
+ usually an incorrect file encoding.</p>
<p>Here is the start of the file we could not import:</p>
<pre><t t-esc="preview"/></pre>
</t>
<ul t-name="ImportView.error">
- <li t-foreach="errors" t-as="error" t-attf-class="oe_import_report_#{error.type}">
- <!-- can also have error.record, but may be *huge* if
- e.g. has image fields -->
- <t t-esc="error.message"/>
+ <li t-foreach="errors" t-as="error"
+ t-attf-class="oe_import_report oe_import_report_#{error_value[0].type}">
+ <t t-call="ImportView.error.each">
+ <t t-set="error" t-value="error_value[0]"/>
+ </t>
+
+ <a href="#" class="oe_import_report_count" t-if="error_value.length gt 1">
+ <t t-esc="more(error_value.length - 1)"/>
+ </a>
+ <ul class="oe_import_report_more" t-if="error_value.length gt 1">
+ <li t-foreach="error_value.length - 1" t-as="index">
+ <t t-call="ImportView.error.each">
+ <t t-set="error" t-value="error_value[index + 1]"/>
+ </t>
+ </li>
+ </ul>
</li>
</ul>
+ <t t-name="ImportView.error.each">
+ <span class="oe_import_report_message">
+ <t t-esc="error.message"/>
+ </span>
+ <t t-if="error.rows" t-esc="at(error.rows)"/>
+ <t t-if="error.moreinfo" t-raw="info(error.moreinfo)"/>
+ </t>
<t t-extend="ListView.buttons">
<t t-jquery="span.oe_alternative">
this.attr('t-if', 'widget.options.import_enabled');
diff --git a/addons/board/controllers.py b/addons/board/controllers.py
index 53845c96095..81557f64fa3 100644
--- a/addons/board/controllers.py
+++ b/addons/board/controllers.py
@@ -1,19 +1,14 @@
# -*- coding: utf-8 -*-
from xml.etree import ElementTree
-try:
- import openerp.addons.web.common.http as openerpweb
- from openerp.addons.web.common import nonliterals
- from openerp.addons.web.controllers.main import load_actions_from_ir_values
-except ImportError:
- import web.common.http as openerpweb # noqa
- from web.common import nonliterals # noqa
- from web.controllers.main import load_actions_from_ir_values # noqa
+import openerp
+from openerp.addons.web import nonliterals
+from openerp.addons.web.controllers.main import load_actions_from_ir_values
-class Board(openerpweb.Controller):
+class Board(openerp.addons.web.http.Controller):
_cp_path = '/board'
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def add_to_dashboard(self, req, menu_id, action_id, context_to_save, domain, view_mode, name=''):
# FIXME move this method to board.board model
to_eval = nonliterals.CompoundContext(context_to_save)
diff --git a/addons/board/static/src/js/dashboard.js b/addons/board/static/src/js/dashboard.js
index 43d7ca76d39..2dbd9f5c9cc 100644
--- a/addons/board/static/src/js/dashboard.js
+++ b/addons/board/static/src/js/dashboard.js
@@ -25,9 +25,9 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({
}).bind('sortstop', self.do_save_dashboard);
var old_title = this.__parentedParent.get('title');
- this.__parentedParent.on_record_loaded.add_last(function(){
- self.__parentedParent.set({ 'title' : old_title});
- });
+ this.__parentedParent.on('load_record', self, function(){
+ self.__parentedParent.set({ 'title': old_title});
+ })
// Events
this.$el.find('.oe_dashboard_link_reset').click(this.on_reset);
this.$el.find('.oe_dashboard_link_change_layout').click(this.on_change_layout);
@@ -173,7 +173,7 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({
},
on_load_action: function(result, index, action_attrs) {
var self = this,
- action = result.result,
+ action = result,
view_mode = action_attrs.view_mode;
if (action_attrs.context && action_attrs.context['dashboard_merge_domains_contexts'] === false) {
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index 7e33f397e8a..fbe47c08dca 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -26,6 +26,7 @@ from osv import fields, osv
import time
import tools
from tools.translate import _
+from tools import html2plaintext
from base.res.res_partner import format_address
@@ -776,7 +777,6 @@ class crm_lead(base_stage, format_address, osv.osv):
'default_user_id': uid,
'default_section_id': opportunity.section_id and opportunity.section_id.id or False,
'default_email_from': opportunity.email_from,
- 'default_state': 'open',
'default_name': opportunity.name,
}
return res
@@ -812,9 +812,11 @@ class crm_lead(base_stage, format_address, osv.osv):
This override updates the document according to the email.
"""
if custom_values is None: custom_values = {}
+
+ desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
custom_values.update({
'name': msg.get('subject') or _("No Subject"),
- 'description': msg.get('body'),
+ 'description': desc,
'email_from': msg.get('from'),
'email_cc': msg.get('cc'),
'user_id': False,
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index f91a8756598..cee80eb0836 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -160,17 +160,17 @@
<field name="street2"/>
<div class="address_format">
<field name="city" placeholder="City" style="width: 40%%"/>
- <field name="state_id" options='{"no_open": true}' placeholder="State" style="width: 24%%"/>
+ <field name="state_id" options='{"no_open": True}' placeholder="State" style="width: 24%%"/>
<field name="zip" placeholder="ZIP" style="width: 34%%"/>
</div>
- <field name="country_id" placeholder="Country" options='{"no_open": true}'/>
+ <field name="country_id" placeholder="Country" options='{"no_open": True}'/>
</div>
</group>
<group>
<label for="contact_name" />
<div>
<field name="contact_name" class="oe_inline"/>,
- <field name="title" placeholder="Title" domain="[('domain', '=', 'contact')]" class="oe_inline" options='{"no_open": true}'/>
+ <field name="title" placeholder="Title" domain="[('domain', '=', 'contact')]" class="oe_inline" options='{"no_open": True}'/>
</div>
<field name="email_from" widget="email"/>
<field name="function" />
@@ -356,10 +356,10 @@
<field name="name" string="Lead / Customer" filter_domain="['|','|',('partner_name','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
<field name="categ_ids" string="Category" filter_domain="[('categ_ids','ilike',self)]" />
<field name="create_date"/>
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter icon="terp-check" string="New" name="new" help="New Leads" domain="[('state','=','draft')]"/>
- <filter icon="terp-camera_test" string="Open" name="open" domain="[('state','=','open')]"/>
+ <filter icon="terp-camera_test" string="In Progress" name="open" domain="[('state','=','open')]"/>
<separator/>
<filter string="Unassigned Leads" icon="terp-personal-" domain="[('user_id','=', False)]" help="Unassigned Leads" />
<separator/>
@@ -477,10 +477,10 @@
<field name="street2"/>
<div class="address_format">
<field name="city" placeholder="City" style="width: 40%%"/>
- <field name="state_id" options='{"no_open": true}' placeholder="State" style="width: 24%%"/>
+ <field name="state_id" options='{"no_open": True}' placeholder="State" style="width: 24%%"/>
<field name="zip" placeholder="ZIP" style="width: 34%%"/>
</div>
- <field name="country_id" placeholder="Country" options='{"no_open": true}'/>
+ <field name="country_id" placeholder="Country" options='{"no_open": True}'/>
</div>
</group>
@@ -488,7 +488,7 @@
<label for="contact_name" />
<div>
<field name="contact_name" class="oe_inline"/>
- <field name="title" placeholder="Title" domain="[('domain', '=', 'contact')]" options='{"no_open": true}' class="oe_inline"/>
+ <field name="title" placeholder="Title" domain="[('domain', '=', 'contact')]" options='{"no_open": True}' class="oe_inline"/>
</div>
<field name="function" />
<field name="mobile"/>
@@ -569,10 +569,10 @@
<field name="name" string="Opportunity / Customer"
filter_domain="['|','|','|',('partner_id','ilike',self),('partner_name','ilike',self),('email_from','ilike',self),('name', 'ilike', self)]"/>
<field name="categ_ids" string="Category" filter_domain="[('categ_ids','ilike', self)]" />
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter icon="terp-check" string="New" help="New Opportunities" name="new" domain="[('state','=','draft')]"/>
- <filter icon="terp-camera_test" string="Open" help="Open Opportunities" name="open" domain="[('state','=','open')]"/>
+ <filter icon="terp-camera_test" string="In Progress" help="Open Opportunities" name="open" domain="[('state','=','open')]"/>
<separator/>
<filter string="Unassigned Opportunities" icon="terp-personal-" domain="[('user_id','=', False)]" help="Unassigned Opportunities" />
<separator/>
@@ -580,9 +580,8 @@
domain="['|', ('section_id.user_id','=',uid), ('section_id.member_ids', 'in', [uid])]" context="{'invisible_section': False}"
help="Opportunities that are assigned to either me or one of the sale teams I manage" />
<field name="user_id"/>
- <field name="country_id"/>
- <field name="partner_id"/>
<field name="section_id" context="{'invisible_section': False, 'default_section_id': self}"/>
+ <field name="partner_id"/>
<group expand="0" string="Group By..." colspan="16">
<filter string="Salesperson" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}" />
<filter string="Team" help="Sales Team" icon="terp-personal+" domain="[]" context="{'group_by':'section_id'}"/>
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index ea20624d738..c610913febf 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -140,6 +140,7 @@
<field name="duration" widget="float_time"/>
<field name="section_id" colspan="1" widget="selection"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
+ <field name="email_from" invisible="1"/> <!--not needed because of the chatter, thus invisible, but must be in the view as it's returned by onchange_partner_id()-->
<field name="categ_id" widget="selection"
domain="[('object_id.model', '=', 'crm.phonecall')]"/>
<field name="partner_mobile"/>
diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml
index 1da78e50843..ba46cc023ab 100644
--- a/addons/crm/crm_view.xml
+++ b/addons/crm/crm_view.xml
@@ -105,7 +105,23 @@
<field name="allow_unlink"/>
</group>
<separator string="Team Members"/>
- <field name="member_ids"/>
+ <field name="member_ids" widget="many2many_kanban">
+ <kanban quick_create="false" create="true">
+ <field name="name"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div style="position: relative">
+ <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
+ <div class="oe_module_vignette">
+ <div class="oe_module_desc">
+ <field name="name"/>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
</page>
<page string="Stages">
<separator string="Select Stages for this Sales Team"/>
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
index 35ed9411215..a17633d0ef6 100644
--- a/addons/crm/report/crm_lead_report_view.xml
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -8,7 +8,7 @@
<field name="name">crm.lead.report.tree</field>
<field name="model">crm.lead.report</field>
<field name="arch" type="xml">
- <tree string="Leads Analysis">
+ <tree string="Leads Analysis" create="false">
<field name="creation_year" invisible="1"/>
<field name="creation_month" invisible="1"/>
<field name="creation_day" invisible="1"/>
@@ -130,7 +130,7 @@
<field name="name">crm.lead.report.tree</field>
<field name="model">crm.lead.report</field>
<field name="arch" type="xml">
- <tree colors="blue:state == 'draft';black:state in ('open','pending','done');gray:state == 'cancel' " string="Opportunities Analysis">
+ <tree colors="blue:state == 'draft';black:state in ('open','pending','done');gray:state == 'cancel' " create="false" string="Opportunities Analysis">
<field name="creation_year" invisible="1"/>
<field name="creation_month" invisible="1"/>
<field name="creation_day" invisible="1"/>
diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml
index ec7ea5e6bdb..a2120aef6ab 100644
--- a/addons/crm/report/crm_phonecall_report_view.xml
+++ b/addons/crm/report/crm_phonecall_report_view.xml
@@ -8,7 +8,7 @@
<field name="name">crm.phonecall.report.tree</field>
<field name="model">crm.phonecall.report</field>
<field name="arch" type="xml">
- <tree string="Phone calls">
+ <tree string="Phone calls" create="false">
<field name="name" invisible="1"/>
<field name="month" invisible="1"/>
<field name="section_id" invisible="1"/>
diff --git a/addons/crm/res_config.py b/addons/crm/res_config.py
index b04853d9f6a..6f431b90cba 100644
--- a/addons/crm/res_config.py
+++ b/addons/crm/res_config.py
@@ -32,6 +32,13 @@ class crm_configuration(osv.osv_memory):
'group_fund_raising': fields.boolean("Manage Fund Raising",
implied_group='crm.group_fund_raising',
help="""Allows you to trace and manage your activities for fund raising."""),
+ 'module_crm_claim':fields.boolean("Manage Customer Claims",
+ help="""Allows you to track your customers/suppliers claims and grievances.
+ This installs the module crm_claim."""),
+ 'module_crm_helpdesk':fields.boolean("Manage Helpdesk and Support",
+ help="""Allows you to communicate with Customer, process Customer query, and provide better help and support. This installs the module crm_helpdesk."""),
+
+
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/res_config_view.xml b/addons/crm/res_config_view.xml
index 6330d7a0500..9534c8620ee 100644
--- a/addons/crm/res_config_view.xml
+++ b/addons/crm/res_config_view.xml
@@ -7,6 +7,22 @@
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="base_setup.view_sale_config_settings"/>
<field name="arch" type="xml">
+ <div name="config_sale" position="before">
+ <separator string="After-Sale Services"/>
+ <group>
+ <label for="id" string="Features"/>
+ <div>
+ <div>
+ <field name="module_crm_claim" class="oe_inline"/>
+ <label for="module_crm_claim"/>
+ </div>
+ <div>
+ <field name="module_crm_helpdesk" class="oe_inline"/>
+ <label for="module_crm_helpdesk"/>
+ </div>
+ </div>
+ </group>
+ </div>
<group name="On Mail Client" version="7.0" position="after">
<group>
<label for="id" string="On Mail Server"/>
diff --git a/addons/crm/res_partner_view.xml b/addons/crm/res_partner_view.xml
index 84a0bd4cf49..b7aa334a9c3 100644
--- a/addons/crm/res_partner_view.xml
+++ b/addons/crm/res_partner_view.xml
@@ -15,31 +15,12 @@
</field>
</record>
- <record id="view_partners_tree_crm2" model="ir.ui.view">
- <field name="name">view.res.partner.tree.crm.inherited2</field>
- <field name="model">res.partner</field>
- <field name="inherit_id" ref="base.view_partner_tree"/>
- <field eval="18" name="priority"/>
- <field name="arch" type="xml">
- <field name="phone" position="after">
- <field name="section_id" completion="1" invisible="context.get('invisible_section', True)"/>
- </field>
- </field>
- </record>
-
<record id="view_partners_form_crm3" model="ir.ui.view">
<field name="name">view.res.partner.search.crm.inherited3</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_res_partner_filter"/>
<field eval="18" name="priority"/>
<field name="arch" type="xml">
- <field name="category_id" position="after">
- <field name="section_id" completion="1"/>
- <field name="section_id" completion="1" widget="selection" context="{'invisible_section': False}"/>
- </field>
- <xpath expr="//field[@name='user_id']" position="after">
- <field name="country_id"/>
- </xpath>
<xpath expr="//group[@string='Group By...']" position="after">
<group string="Display">
<filter string="Show Sales Team" context="{'invisible_section': False}"/>
diff --git a/addons/crm_claim/__openerp__.py b/addons/crm_claim/__openerp__.py
index f5ab836401b..dfc549412d4 100644
--- a/addons/crm_claim/__openerp__.py
+++ b/addons/crm_claim/__openerp__.py
@@ -25,8 +25,10 @@
'version': '1.0',
'category': 'Customer Relationship Management',
'description': """
-This modules allows you to track your customers/suppliers claims and grievances.
+
+Manage Customer Claims.
================================================================================
+This application allows you to track your customers/suppliers claims and grievances.
It is fully integrated with the email gateway so that you can create
automatically new claims based on incoming emails.
diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py
index cbf3ec9f13a..c88b2fe26af 100644
--- a/addons/crm_claim/crm_claim.py
+++ b/addons/crm_claim/crm_claim.py
@@ -26,6 +26,7 @@ from osv import fields, osv
import time
import tools
from tools.translate import _
+from tools import html2plaintext
CRM_CLAIM_PENDING_STATES = (
crm.AVAILABLE_STATES[2][0], # Cancelled
@@ -192,9 +193,10 @@ class crm_claim(base_stage, osv.osv):
This override updates the document according to the email.
"""
if custom_values is None: custom_values = {}
+ desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
custom_values.update({
'name': msg.get('subject') or _("No Subject"),
- 'description': msg.get('body'),
+ 'description': desc,
'email_from': msg.get('from'),
'email_cc': msg.get('cc'),
})
diff --git a/addons/crm_claim/report/crm_claim_report_view.xml b/addons/crm_claim/report/crm_claim_report_view.xml
index 5a3a3d92a09..a61490c6086 100644
--- a/addons/crm_claim/report/crm_claim_report_view.xml
+++ b/addons/crm_claim/report/crm_claim_report_view.xml
@@ -8,7 +8,7 @@
<field name="name">crm.claim.report.tree</field>
<field name="model">crm.claim.report</field>
<field name="arch" type="xml">
- <tree string="Claims">
+ <tree string="Claims" create="false">
<field name="name" invisible="1"/>
<field name="month" invisible="1"/>
<field name="section_id" invisible="1"/>
diff --git a/addons/crm_helpdesk/crm_helpdesk.py b/addons/crm_helpdesk/crm_helpdesk.py
index f36a3b72640..ceffd282aa8 100644
--- a/addons/crm_helpdesk/crm_helpdesk.py
+++ b/addons/crm_helpdesk/crm_helpdesk.py
@@ -25,6 +25,7 @@ from crm import crm
from osv import fields, osv
import tools
from tools.translate import _
+from tools import html2plaintext
CRM_HELPDESK_STATES = (
crm.AVAILABLE_STATES[2][0], # Cancelled
@@ -104,9 +105,10 @@ class crm_helpdesk(base_state, base_stage, osv.osv):
This override updates the document according to the email.
"""
if custom_values is None: custom_values = {}
+ desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
custom_values.update({
'name': msg.get('subject') or _("No Subject"),
- 'description': msg.get('body'),
+ 'description': desc,
'email_from': msg.get('from'),
'email_cc': msg.get('cc'),
'user_id': False,
diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
index 4750fa3344d..05f502656d2 100644
--- a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
+++ b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
@@ -8,7 +8,7 @@
<field name="name">crm.helpdesk.report.tree</field>
<field name="model">crm.helpdesk.report</field>
<field name="arch" type="xml">
- <tree string="Helpdesk">
+ <tree string="Helpdesk" create="false">
<field name="name" invisible="1"/>
<field name="month" invisible="1"/>
<field name="section_id" invisible="1"/>
diff --git a/addons/crm_partner_assign/crm_lead_view.xml b/addons/crm_partner_assign/crm_lead_view.xml
index cd2e3f08c9a..2cffb6fb899 100644
--- a/addons/crm_partner_assign/crm_lead_view.xml
+++ b/addons/crm_partner_assign/crm_lead_view.xml
@@ -56,7 +56,7 @@
<filter string="Assigned Partner" icon="terp-personal" domain="[]" context="{'group_by':'partner_assigned_id'}"/>
</filter>
- <field name="user_id" position="after">
+ <field name="partner_id" position="after">
<field name="partner_assigned_id"/>
</field>
</field>
diff --git a/addons/crm_partner_assign/report/crm_lead_report_view.xml b/addons/crm_partner_assign/report/crm_lead_report_view.xml
index 662a7c3dce0..ee9266a0235 100644
--- a/addons/crm_partner_assign/report/crm_lead_report_view.xml
+++ b/addons/crm_partner_assign/report/crm_lead_report_view.xml
@@ -65,7 +65,7 @@
<field name="name">crm.lead.assign.report.tree</field>
<field name="model">crm.lead.report.assign</field>
<field name="arch" type="xml">
- <tree string="Opportunities Assignment Analysis">
+ <tree string="Opportunities Assignment Analysis" create="false">
<field name="year" invisible="1"/>
<field name="month" invisible="1"/>
<field name="date_assign" invisible="1"/>
diff --git a/addons/crm_partner_assign/report/crm_partner_report_view.xml b/addons/crm_partner_assign/report/crm_partner_report_view.xml
index 107328ac4e0..eb2c86874c4 100644
--- a/addons/crm_partner_assign/report/crm_partner_report_view.xml
+++ b/addons/crm_partner_assign/report/crm_partner_report_view.xml
@@ -41,7 +41,7 @@
<field name="name">crm.partner.assign.report.tree</field>
<field name="model">crm.partner.report.assign</field>
<field name="arch" type="xml">
- <tree string="Opportunities Assignment Analysis">
+ <tree string="Opportunities Assignment Analysis" create="false">
<field name="partner_id" invisible="1"/>
<field name="country_id" invisible="1"/>
<field name="grade_id" invisible="1"/>
diff --git a/addons/document/document.py b/addons/document/document.py
index 3ae783f49e7..37a0219d143 100644
--- a/addons/document/document.py
+++ b/addons/document/document.py
@@ -36,8 +36,7 @@ DMS_ROOT_PATH = tools.config.get('document_path', os.path.join(tools.config['roo
class document_file(osv.osv):
_inherit = 'ir.attachment'
- _rec_name = 'datas_fname'
-
+ _rec_name = 'name'
def _attach_parent_id(self, cr, uid, ids=None, context=None):
"""Migrate ir.attachments to the document module.
@@ -149,29 +148,12 @@ class document_file(osv.osv):
_sql_constraints = [
# filename_uniq is not possible in pure SQL
]
- def _check_duplication(self, cr, uid, vals, ids=None, op='create'):
- name = vals.get('name', False)
- parent_id = vals.get('parent_id', False)
- res_model = vals.get('res_model', False)
- res_id = vals.get('res_id', 0)
- if op == 'write':
- for file in self.browse(cr, uid, ids): # FIXME fields_only
- if not name:
- name = file.name
- if not parent_id:
- parent_id = file.parent_id and file.parent_id.id or False
- if not res_model:
- res_model = file.res_model and file.res_model or False
- if not res_id:
- res_id = file.res_id and file.res_id or 0
- res = self.search(cr, uid, [('id', '<>', file.id), ('name', '=', name), ('parent_id', '=', parent_id), ('res_model', '=', res_model), ('res_id', '=', res_id)])
- if len(res):
- return False
- if op == 'create':
- res = self.search(cr, uid, [('name', '=', name), ('parent_id', '=', parent_id), ('res_id', '=', res_id), ('res_model', '=', res_model)])
- if len(res):
- return False
- return True
+
+ def onchange_file(self, cr, uid, ids, datas_fname=False, context=None):
+ res = {'value':{}}
+ if datas_fname:
+ res['value'].update({'name': datas_fname})
+ return res
def check(self, cr, uid, ids, mode, context=None, values=None):
"""Check access wrt. res_model, relax the rule of ir.attachment parent
@@ -219,8 +201,6 @@ class document_file(osv.osv):
res = self.search(cr, uid, [('id', 'in', ids)])
if not len(res):
return False
- if not self._check_duplication(cr, uid, vals, ids, 'write'):
- raise osv.except_osv(_('ValidateError'), _('File name must be unique!'))
# if nodes call this write(), they must skip the code below
from_node = context and context.get('__from_node', False)
@@ -286,22 +266,8 @@ class document_file(osv.osv):
else:
if vals.get('file_size'):
del vals['file_size']
- result = self._check_duplication(cr, uid, vals)
- if not result:
- domain = [
- ('res_id', '=', vals['res_id']),
- ('res_model', '=', vals['res_model']),
- ('datas_fname', '=', vals['datas_fname']),
- ]
- attach_ids = self.search(cr, uid, domain, context=context)
- super(document_file, self).write(cr, uid, attach_ids,
- {'datas' : vals['datas']},
- context=context)
- result = attach_ids[0]
- else:
- #raise osv.except_osv(_('ValidateError'), _('File name must be unique!'))
- result = super(document_file, self).create(cr, uid, vals, context)
- return result
+
+ return super(document_file, self).create(cr, uid, vals, context)
def __get_partner_id(self, cr, uid, res_model, res_id, context=None):
""" A helper to retrieve the associated partner from any res_model+id
diff --git a/addons/document/document_view.xml b/addons/document/document_view.xml
index b631583fb27..54776c4d36e 100644
--- a/addons/document/document_view.xml
+++ b/addons/document/document_view.xml
@@ -228,6 +228,9 @@
<field name="priority" eval="1"/>
<field name="inherit_id" ref="base.view_attachment_form"/>
<field name="arch" type="xml">
+ <xpath expr="//field[@name='datas_fname']" position="replace">
+ <field name="datas_fname" invisible="1" on_change="onchange_file(datas_fname)"/>
+ </xpath>
<field name="url" position="after">
<field name="user_id"/>
</field>
@@ -338,15 +341,6 @@
<field name="value" eval="'ir.actions.act_window,%d'%action_document_file_directory_form"/>
</record>
- <record model="ir.ui.view" id="view_attachment_form_inherit">
- <field name="name">ir.attachment.view.inherit</field>
- <field name="model">ir.attachment</field>
- <field name="inherit_id" ref="base.view_attachment_form"/>
- <field name="arch" type="xml">
- <field name="datas_fname" position = "replace" >
- </field>
- </field>
- </record>
<record model="ir.ui.view" id="view_process_node_form_inherit1">
<field name="name">process.node.form</field>
diff --git a/addons/document_page/document_page_view.xml b/addons/document_page/document_page_view.xml
index 63f208c08a7..d8daaada967 100644
--- a/addons/document_page/document_page_view.xml
+++ b/addons/document_page/document_page_view.xml
@@ -55,7 +55,7 @@
</div>
<field name="content" placeholder="e.g. Once upon a time..." class="oe_edit_only"/>
<div class="oe_document_page">
- <field name="display_content" widget="html" class="oe_view_only" options='{"safe": true}'/>
+ <field name="display_content" widget="html" class="oe_view_only" options='{"safe": True}'/>
</div>
</form>
</field>
diff --git a/addons/document_page/wizard/document_page_show_diff_view.xml b/addons/document_page/wizard/document_page_show_diff_view.xml
index b1dfb536853..e2d5ef1af4b 100644
--- a/addons/document_page/wizard/document_page_show_diff_view.xml
+++ b/addons/document_page/wizard/document_page_show_diff_view.xml
@@ -8,7 +8,7 @@
<field name="model">wizard.document.page.history.show_diff</field>
<field name="arch" type="xml">
<form string="Difference" version="7.0">
- <field name="diff" widget="html" options='{"safe": true}'/>
+ <field name="diff" widget="html" options='{"safe": True}'/>
<footer>
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
diff --git a/addons/edi/controllers/main.py b/addons/edi/controllers/main.py
index 71560aa9e60..c62fef19cba 100644
--- a/addons/edi/controllers/main.py
+++ b/addons/edi/controllers/main.py
@@ -4,14 +4,8 @@ import textwrap
import simplejson
import werkzeug.wrappers
-try:
- # embedded
- import openerp.addons.web.common.http as openerpweb
- import openerp.addons.web.controllers.main as webmain
-except ImportError:
- # standalone
- import web.common.http as openerpweb
- import web.controllers.main as webmain
+import openerp.addons.web.http as openerpweb
+import openerp.addons.web.controllers.main as webmain
class EDI(openerpweb.Controller):
# http://hostname:8069/edi/view?db=XXXX&token=XXXXXXXXXXX
diff --git a/addons/email_template/email_template.py b/addons/email_template/email_template.py
index 1dc79dc634c..37dca4ceddb 100644
--- a/addons/email_template/email_template.py
+++ b/addons/email_template/email_template.py
@@ -319,7 +319,7 @@ class email_template(osv.osv):
ext = "." + format
if not report_name.endswith(ext):
report_name += ext
- attachments.append(report_name, result)
+ attachments.append((report_name, result))
# Add template attachments
for attach in template.attachment_ids:
diff --git a/addons/email_template/wizard/email_template_preview_view.xml b/addons/email_template/wizard/email_template_preview_view.xml
index 5e8eaa3a836..f91535a17a5 100644
--- a/addons/email_template/wizard/email_template_preview_view.xml
+++ b/addons/email_template/wizard/email_template_preview_view.xml
@@ -20,7 +20,7 @@
<field name="email_cc" readonly="1" attrs="{'invisible':[('email_cc','=',False)]}"/>
<field name="reply_to" readonly="1" attrs="{'invisible':[('reply_to','=',False)]}"/>
<field name="subject" readonly="1"/>
- <field name="body_html" widget="html" readonly="1" options='{"safe": true}'/>
+ <field name="body_html" widget="html" readonly="1" options='{"safe": True}'/>
</group>
</form>
</field>
diff --git a/addons/email_template/wizard/mail_compose_message_view.xml b/addons/email_template/wizard/mail_compose_message_view.xml
index 8d5bc26b213..655f5b9d0c2 100644
--- a/addons/email_template/wizard/mail_compose_message_view.xml
+++ b/addons/email_template/wizard/mail_compose_message_view.xml
@@ -39,7 +39,7 @@
attrs="{'invisible':[('use_template','=',False)]}"
on_change="onchange_template_id(use_template, template_id, composition_mode, model, res_id, context)"/>
</xpath>
- <xpath expr="//button[@class='oe_mail_compose_message_attachment']" position="before">
+ <xpath expr="//button[@name='dummy']" position="before">
<button icon="/email_template/static/src/img/email_template.png"
type="object" name="toggle_template" string=""
help="Use a message template"
diff --git a/addons/event/event.py b/addons/event/event.py
index 0eb2dda8312..b3aee2493f8 100644
--- a/addons/event/event.py
+++ b/addons/event/event.py
@@ -267,25 +267,18 @@ class event_event(osv.osv):
return {'value': dic}
def on_change_address_id(self, cr, uid, ids, address_id, context=None):
- values = {
- 'street' : False,
- 'street2' : False,
- 'city' : False,
- 'zip' : False,
- 'country_id' : False,
- 'state_id' : False,
- }
- if isinstance(address_id, (long, int)):
- address = self.pool.get('res.partner').browse(cr, uid, address_id, context=context)
- values.update({
- 'street' : address.street,
- 'street2' : address.street2,
- 'city' : address.city,
- 'country_id' : address.country_id and address.country_id.id,
- 'state_id' : address.state_id and address.state_id.id,
- 'zip' : address.zip,
- })
-
+ values = {}
+ if not address_id:
+ return values
+ address = self.pool.get('res.partner').browse(cr, uid, address_id, context=context)
+ values.update({
+ 'street' : address.street,
+ 'street2' : address.street2,
+ 'city' : address.city,
+ 'country_id' : address.country_id and address.country_id.id or False,
+ 'state_id' : address.state_id and address.state_id.id or False,
+ 'zip' : address.zip,
+ })
return {'value' : values}
@@ -435,22 +428,6 @@ class event_registration(osv.osv):
'phone':contact_id.phone,
}}
- def onchange_event(self, cr, uid, ids, event_id, context=None):
- """This function returns value of Product Name, Unit Price based on Event.
- """
- if context is None:
- context = {}
- if not event_id:
- return {}
- event_obj = self.pool.get('event.event')
- data_event = event_obj.browse(cr, uid, event_id, context=context)
- return {'value':
- {'event_begin_date': data_event.date_begin,
- 'event_end_date': data_event.date_end,
- 'company_id': data_event.company_id and data_event.company_id.id or False,
- }
- }
-
def onchange_partner_id(self, cr, uid, ids, part, context=None):
res_obj = self.pool.get('res.partner')
data = {}
diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml
index 6ad8fb20467..68742754166 100644
--- a/addons/event/event_view.xml
+++ b/addons/event/event_view.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<openerp>
<data>
-
+
<record id="act_event_list_register_event" model="ir.actions.act_window">
<field name="res_model">event.registration</field>
<field name="view_type">form</field>
@@ -116,30 +116,40 @@
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
- <div>
+ <group>
<group>
- <group>
- <label for="address_id" string="Location"/>
- <div>
- <field name="address_id" on_change="on_change_address_id(address_id)" />
- <field name="street" placeholder="Street..."/>
- <field name="street2"/>
- <div class="address_format">
- <field name="city" placeholder="City" style="width: 40%%"/>
- <field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": true}'/>
- <field name="zip" placeholder="ZIP" style="width: 20%%"/>
- </div>
- <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": true}'/>
- </div>
- </group>
- <group>
- <field name="type" on_change="onchange_event_type(type,context)"/>
- <field name="date_begin"/>
- <field name="date_end"/>
- </group>
+ <label for="address_id" string="Location"/>
+ <div>
+ <field name="address_id" on_change="on_change_address_id(address_id)" />
+ <field name="street" placeholder="Street..."/>
+ <field name="street2"/>
+ <div class="address_format">
+ <field name="city" placeholder="City" style="width: 40%%"/>
+ <field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": true}'/>
+ <field name="zip" placeholder="ZIP" style="width: 20%%"/>
+ </div>
+ <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": true}'/>
+ </div>
</group>
- </div>
+ <group>
+ <field name="type" on_change="onchange_event_type(type,context)" />
+ <field name="date_begin"/>
+ <field name="date_end"/>
+ <field name="company_id" groups="base.group_multi_company"/>
+ </group>
+ </group>
<notebook>
+ <page string="Email Configuration" groups="base.group_no_one">
+ <group>
+ <field name="reply_to"/>
+ <group>
+ <field name="email_registration_id"/>
+ </group>
+ <group>
+ <field name="email_confirmation_id"/>
+ </group>
+ </group>
+ </page>
<page string="Event Description">
<field name="note" colspan="4" nolabel="1"/>
</page>
@@ -217,7 +227,7 @@
<field name="register_current"/>
<field name="register_min"/>
<field name="register_max" invisible="1"/>
- <field name="main_speaker_id" groups="base.extended"/>
+ <field name="main_speaker_id" groups="base.group_no_one"/>
<field name="user_id"/>
<field name="state"/>
<field name="message_unread" invisible="1"/>
@@ -272,13 +282,13 @@
<t t-if="record.register_avail.raw_value != 0">
<t t-if="!record.is_subscribed.raw_value">
<input t-att-id="record.id.raw_value" type="text" name="subscribe" class="no_of_seats" value="1" onchange="document.getElementById('btn_sub' +this.id).setAttribute('data-context',JSON.stringify({'ticket':this.value}))"/>
- <button t-att-id="'btn_sub'+record.id.raw_value" type="object" name="subscribe_to_event" class="oe_mail_button_follow">
+ <button t-att-id="'btn_sub'+record.id.raw_value" type="object" name="subscribe_to_event" class="oe_subscribe_button">
<span >Subscribe</span>
</button>
</t>
</t>
<t t-if="record.is_subscribed.raw_value">
- <button type="object" name="unsubscribe_to_event" class="oe_mail_button_unfollow">
+ <button type="object" name="unsubscribe_to_event" class="oe_unsubscribe_button ">
<span>Subscribed</span>
<span class="unsubscribe">Unsubscribe</span>
</button>
@@ -327,7 +337,7 @@
<field name="arch" type="xml">
<search string="Events">
<field name="name" string="Events"/>
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter icon="terp-check" string="Unconfirmed" name="draft" domain="[('state','=','draft')]" help="Events in New state"/>
<filter icon="terp-camera_test" string="Confirmed" domain="[('state','=','confirm')]" help="Confirmed events"/>
@@ -452,7 +462,7 @@
<sheet string="Registration">
<label for="event_id" class="oe_edit_only"/>
<h1>
- <field name="event_id" on_change="onchange_event(event_id, context)" domain="[('state','in',('draft','confirm'))]"/>
+ <field name="event_id" domain="[('state','in',('draft','confirm'))]"/>
</h1>
<group>
<group>
@@ -517,7 +527,7 @@
<field name="arch" type="xml">
<search string="Event Registration">
<field name="name" string="Participant" filter_domain="['|','|','|',('name','ilike',self),('partner_id','ilike',self),('email','ilike',self),('origin','ilike',self)]"/>
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter icon="terp-check" string="New" name="draft" domain="[('state','=','draft')]" help="Registrations in unconfirmed state"/>
<filter icon="terp-camera_test" string="Confirmed" domain="[('state','=','open')]" help="Confirmed registrations"/>
diff --git a/addons/event/report/report_event_registration.py b/addons/event/report/report_event_registration.py
index 060b1ef7556..042676d0c32 100644
--- a/addons/event/report/report_event_registration.py
+++ b/addons/event/report/report_event_registration.py
@@ -23,16 +23,16 @@ from osv import fields, osv
import tools
class report_event_registration(osv.osv):
-
_name = "report.event.registration"
_description = "Events Analysis"
_auto = False
_columns = {
'event_date': fields.char('Event Start Date', size=64, readonly=True),
'year': fields.char('Year', size=4, readonly=True),
- 'month': fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
- ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
- ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
+ 'month': fields.selection([
+ ('01','January'), ('02','February'), ('03','March'), ('04','April'),
+ ('05','May'), ('06','June'), ('07','July'), ('08','August'),
+ ('09','September'), ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
'event_id': fields.many2one('event.event', 'Event', required=True),
'draft_state': fields.integer(' # No of Draft Registrations', size=20),
'confirm_state': fields.integer(' # No of Confirmed Registrations', size=20),
@@ -48,17 +48,18 @@ class report_event_registration(osv.osv):
'company_id': fields.many2one('res.company', 'Company', readonly=True),
}
_order = 'event_date desc'
+
def init(self, cr):
"""
- initialize the sql view for the event registration
- cr -- the cursor
+ Initialize the sql view for the event registration
"""
tools.drop_view_if_exists(cr, 'report_event_registration')
- cr.execute("""
- CREATE OR REPLACE view report_event_registration AS (
- SELECT
- event_id,
- r.id,
+
+ # TOFIX this request won't select events that have no registration
+ cr.execute(""" CREATE VIEW report_event_registration AS (
+ SELECT
+ e.id::char || '/' || coalesce(r.id::char,'') AS id,
+ e.id AS event_id,
e.user_id AS user_id,
r.user_id AS user_id_registration,
r.name AS name_registration,
@@ -72,23 +73,21 @@ class report_event_registration(osv.osv):
CASE WHEN r.state IN ('open','done') THEN r.nb_register ELSE 0 END AS confirm_state,
e.type AS event_type,
e.register_max AS register_max,
- e.state AS event_state,
- r.state AS registration_state
- FROM
+ e.state AS event_state,
+ r.state AS registration_state
+ FROM
event_event e
+ LEFT JOIN event_registration r ON (e.id=r.event_id)
- LEFT JOIN
- event_registration r ON (e.id=r.event_id)
-
- GROUP BY
+ GROUP BY
event_id,
user_id_registration,
- e.id,
r.id,
registration_state,
r.nb_register,
- event_type, e.id, e.date_begin, e.main_speaker_id,
- e.register_max,event_id, e.user_id,e.company_id,
+ event_type,
+ e.id,
+ e.date_begin,
e.user_id,
event_state,
e.company_id,
@@ -97,9 +96,8 @@ class report_event_registration(osv.osv):
month,
e.register_max,
name_registration
-
- )
- """)
+ )
+ """)
report_event_registration()
diff --git a/addons/event/report/report_event_registration_view.xml b/addons/event/report/report_event_registration_view.xml
index 6ce2c199332..249757efbd3 100644
--- a/addons/event/report/report_event_registration_view.xml
+++ b/addons/event/report/report_event_registration_view.xml
@@ -1,13 +1,13 @@
<?xml version="1.0"?>
<openerp>
- <data>
+ <data>
- <!-- report , event on registration... start -->
+ <!-- Report, event on registration -->
<record model="ir.ui.view" id="report_event_registration_tree">
<field name="name">report.event.registration.tree</field>
<field name="model">report.event.registration</field>
<field name="arch" type="xml">
- <tree colors="blue:event_state == 'draft';black:event_state == 'confirm';gray:event_state in('done','cancel')" string="Events Analysis">
+ <tree colors="blue:event_state == 'draft';black:event_state == 'confirm';gray:event_state in('done','cancel')" create="false" string="Events Analysis">
<field name="event_date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="speaker_id" invisible="1"/>
@@ -28,7 +28,6 @@
</field>
</record>
-
<record model ="ir.ui.view" id="report_event_registration_graph">
<field name="name">report.event.registration.graph</field>
<field name="model">report.event.registration</field>
@@ -42,8 +41,7 @@
</field>
</record>
- <!-- Event on Registration search view -->
-
+ <!-- Event on Registration search view -->
<record model="ir.ui.view" id="view_report_event_registration_search">
<field name="name">report.event.registration.search</field>
<field name="model">report.event.registration</field>
@@ -62,8 +60,8 @@
<newline/>
<group expand="1" string="Group By...">
<filter string="Participant / Contact" icon="terp-personal" context="{'group_by':'name_registration'}" help="Registration contact"/>
- <filter string="Register" icon="terp-personal" context="{'group_by':'user_id_registration'}" help="Registration contact" groups="base.extended"/>
- <filter string="Speaker" name="speaker" icon="terp-personal+" context="{'group_by': 'speaker_id'}" groups="base.extended"/>
+ <filter string="Register" icon="terp-personal" context="{'group_by':'user_id_registration'}" help="Registration contact" groups="base.group_no_one"/>
+ <filter string="Speaker" name="speaker" icon="terp-personal+" context="{'group_by': 'speaker_id'}" groups="base.group_no_one"/>
<filter string="Event Responsible" name="user_id" icon="terp-personal" context="{'group_by': 'user_id'}"/>
<filter string="Event" name="event" icon="terp-crm" context="{'group_by':'event_id', 'max_reg_event_visible':0}"/>
<filter string="Event Type" icon="terp-crm" context="{'group_by':'event_type'}"/>
@@ -82,28 +80,28 @@
</field>
</record>
- <record model="ir.actions.act_window" id="action_report_event_registration">
+ <record model="ir.actions.act_window" id="action_report_event_registration">
<field name="name">Events Analysis</field>
<field name="res_model">report.event.registration</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="search_view_id" ref="view_report_event_registration_search"/>
- <field name="context">{"search_default_year":1,"search_default_this_month":1,"search_default_365day":1, "search_default_invoiced":1, "search_default_event":1, 'group_by_no_leaf':1, 'group_by':[]}</field>
+ <field name="context">{"search_default_year":1,"search_default_this_month":1,"search_default_365day":1, "search_default_invoiced":1, "search_default_event":1, "group_by_no_leaf":1, "group_by":[]}</field>
</record>
- <record model="ir.actions.act_window.view" id="action_report_event_registration_tree">
+ <record model="ir.actions.act_window.view" id="action_report_event_registration_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="report_event_registration_tree"/>
<field name="act_window_id" ref="action_report_event_registration"/>
- </record>
+ </record>
- <record model="ir.actions.act_window.view" id="action_report_event_registration_graph">
+ <record model="ir.actions.act_window.view" id="action_report_event_registration_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="report_event_registration_graph"/>
<field name="act_window_id" ref="action_report_event_registration"/>
- </record>
+ </record>
<menuitem parent="base.menu_reporting" id="menu_reporting_events" sequence="30" groups="event.group_event_manager" name="Events"/>
<menuitem parent="menu_reporting_events" action="action_report_event_registration" id="menu_report_event_registration" sequence="3" groups="event.group_event_manager"/>
diff --git a/addons/event/static/src/css/event.css b/addons/event/static/src/css/event.css
index 8602ea24d53..f49f5474fa6 100644
--- a/addons/event/static/src/css/event.css
+++ b/addons/event/static/src/css/event.css
@@ -42,4 +42,10 @@
width:256px;
border: 1px solid #eeeeee;
}
+.oe_unsubscribe, .oe_unsubscribe_button:hover span {
+ display: none;
+ }
+.oe_unsubscribe_button:hover .oe_unsubscribe {
+ display: inline;
+ }
diff --git a/addons/event_sale/event_sale_view.xml b/addons/event_sale/event_sale_view.xml
index 52f935a0760..ab7568d704e 100644
--- a/addons/event_sale/event_sale_view.xml
+++ b/addons/event_sale/event_sale_view.xml
@@ -6,10 +6,10 @@
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view" />
<field name="arch" type="xml">
- <field name="purchase_ok" position="before">
+ <div name="options" position="inside">
<field name="event_ok" on_change="onchange_event_ok(event_ok, context)"/>
<label for="event_ok"/>
- </field>
+ </div>
<field name='default_code' position='before'>
<field name="event_type_id" attrs="{'readonly': [('event_ok', '=', False)]}"/>
</field>
diff --git a/addons/google_docs/__openerp__.py b/addons/google_docs/__openerp__.py
index b02f2e912fc..8b9a4123aa9 100644
--- a/addons/google_docs/__openerp__.py
+++ b/addons/google_docs/__openerp__.py
@@ -27,7 +27,6 @@
'category': 'Tools',
'installable': True,
'auto_install': False,
- 'web': True,
'js': ['static/src/js/gdocs.js'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/google_docs/google_docs.py b/addons/google_docs/google_docs.py
index f1477f9c7f2..5ff80530c94 100644
--- a/addons/google_docs/google_docs.py
+++ b/addons/google_docs/google_docs.py
@@ -26,8 +26,11 @@ try:
from gdata.client import RequestError
from gdata.docs.service import DOCUMENT_LABEL
import gdata.auth
+ from gdata.docs.data import Resource
except ImportError:
- raise osv.except_osv(_('Google Docs Error!'), _('Please install gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list.'))
+ import logging
+ _logger = logging.getLogger(__name__)
+ _logger.warning("Please install latest gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list")
class google_docs_ir_attachment(osv.osv):
_inherit = 'ir.attachment'
diff --git a/addons/google_docs/res_config_user_view.xml b/addons/google_docs/res_config_user_view.xml
index 4aabba3ac5a..e6c4223735f 100644
--- a/addons/google_docs/res_config_user_view.xml
+++ b/addons/google_docs/res_config_user_view.xml
@@ -8,9 +8,10 @@
<field name="name">google_docs.config.tree</field>
<field name="model">google.docs.config</field>
<field name="arch" type="xml">
- <group name="default_filters" position="inside">
+ <tree string="Google Docs Configuration">
<field name="model_id"/>
- </group>
+ <field name="name_template"/>
+ </tree>
</field>
</record>
@@ -18,11 +19,25 @@
<field name="name">google_docs.config.form</field>
<field name="model">google.docs.config</field>
<field name="arch" type="xml">
- <group colspan='4'>
- <field name="model_id"/>
- <field name='gdocs_resource_id'/>
- <field name='name_template'/>
- </group>
+ <form string="Google Docs Configuration" version="7.0">
+ <group>
+ <field name="model_id"/>
+ <label for='gdocs_resource_id'/>
+ <div>
+ <field name='gdocs_resource_id'/>
+ <p class="oe_grey">
+This is the id of the template document, on google side. You can find it thanks to its URL:
+<ul>
+<li>for a text document with url like `https://docs.google.com/a/openerp.com/document/d/123456789/edit`, the ID is `document:123456789`</li>
+<li>for a spreadsheet document with url like `https://docs.google.com/a/openerp.com/spreadsheet/ccc?key=123456789#gid=0`, the ID is `spreadsheet:123456789`</li>
+<li>for a presentation (slide show) document with url like `https://docs.google.com/a/openerp.com/presentation/d/123456789/edit#slide=id.p`, the ID is `presentation:123456789`</li>
+<li>for a drawing document with url like `https://docs.google.com/a/openerp.com/drawings/d/123456789/edit`, the ID is `drawings:123456789`</li>
+</ul>
+ </p>
+ </div>
+ <field name='name_template'/>
+ </group>
+ </form>
</field>
</record>
diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml
index 69567902763..361bb581b14 100644
--- a/addons/hr/hr_view.xml
+++ b/addons/hr/hr_view.xml
@@ -42,14 +42,14 @@
</group>
<group string="Position">
<field name="department_id" on_change="onchange_department_id(department_id)"/>
- <field name="job_id" options='{"no_open": true}' domain="[('state','!=','old')]" context="{'form_view_ref': 'hr.view_hr_job_employee_form'}"/>
+ <field name="job_id" options='{"no_open": True}' domain="[('state','!=','old')]" context="{'form_view_ref': 'hr.view_hr_job_employee_form'}"/>
<field name="parent_id"/>
<field name="coach_id"/>
</group>
<group>
<field name="company_id" groups="base.group_multi_company" on_change="onchange_company(company_id)"/>
<field name="user_id" on_change="onchange_user(user_id)" string="Related User"/>
- <field name="address_id" on_change="onchange_address_id(address_id)" context="{'show_address': 1}" options='{"always_reload": true, "highlight_first_line": true}'/>
+ <field name="address_id" on_change="onchange_address_id(address_id)" context="{'show_address': 1}" options='{"always_reload": True, "highlight_first_line": True}'/>
</group>
</group>
<field name="notes" placeholder="Other Information ..." colspan="4"/>
@@ -57,14 +57,14 @@
<page string="Personal Information" groups="base.group_hr_user">
<group>
<group string="Citizenship &amp; Other Info">
- <field name="country_id" options='{"no_open": true}'/>
+ <field name="country_id" options='{"no_open": True}'/>
<field name="identification_id" groups="base.group_hr_user"/>
<field name="passport_id" groups="base.group_hr_user"/>
<field name="bank_account_id"/>
<field name="otherid" groups="base.group_hr_user"/>
</group>
<group string="Contact Information">
- <field name="address_home_id" context="{'show_address': 1}" options='{"always_reload": true, "highlight_first_line": true}'/>
+ <field name="address_home_id" context="{'show_address': 1}" options='{"always_reload": True, "highlight_first_line": True}'/>
</group>
<group string="Status">
<field name="gender"/>
@@ -112,8 +112,6 @@
<search string="Employees">
<field name="name" string="Employees"/>
<field name="department_id" />
- <field name="job_id"/>
- <field name="parent_id"/>
<field name="category_ids"/>
<group expand="0" string="Group By...">
<filter string="Manager" icon="terp-personal" domain="[]" context="{'group_by':'parent_id'}"/>
@@ -336,13 +334,10 @@
<field name="state" widget="statusbar" statusbar_visible="recruit,open"/>
</header>
<sheet>
- <label for="name" class="oe_edit_only"/>
- <h1>
- <field name="name" class="oe_inline"/>
- <label class="oe_inline" string="(" attrs="{'invisible': [('department_id', '=', False)]}"/>
- <field name="department_id" class="oe_inline"/>
- <label class="oe_inline" string=")" attrs="{'invisible': [('department_id', '=', False)]}"/>
- </h1>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only"/>
+ <h1><field name="name" class="oe_inline"/></h1>
+ </div>
<group>
<group>
<field name="no_of_employee" groups="base.group_user"/>
@@ -351,7 +346,7 @@
</group>
<group>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
- </group>
+ <field name="department_id"/> </group>
</group>
<div>
<label for="description"/>
diff --git a/addons/hr_contract/i18n/mk.po b/addons/hr_contract/i18n/mk.po
new file mode 100644
index 00000000000..2a4011c9e0d
--- /dev/null
+++ b/addons/hr_contract/i18n/mk.po
@@ -0,0 +1,271 @@
+# Macedonian translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-02-08 00:36+0000\n"
+"PO-Revision-Date: 2012-10-09 08:00+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Macedonian <mk@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: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
+
+#. module: hr_contract
+#: field:hr.contract,wage:0
+msgid "Wage"
+msgstr "Плата"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Information"
+msgstr "Информации"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Trial Period"
+msgstr "Пробен Период"
+
+#. module: hr_contract
+#: field:hr.contract,trial_date_start:0
+msgid "Trial Start Date"
+msgstr "Пробен Почетен Датум"
+
+#. module: hr_contract
+#: view:hr.employee:0
+msgid "Medical Examination"
+msgstr "Систематски Преглед"
+
+#. module: hr_contract
+#: field:hr.employee,vehicle:0
+msgid "Company Vehicle"
+msgstr "Службено Возило"
+
+#. module: hr_contract
+#: view:hr.employee:0
+msgid "Miscellaneous"
+msgstr "Разно"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Current"
+msgstr "Тековен"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Group By..."
+msgstr "Групирај По..."
+
+#. module: hr_contract
+#: field:hr.contract,department_id:0
+msgid "Department"
+msgstr "Сектор"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Overpassed"
+msgstr "Изминат"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,employee_id:0
+#: model:ir.model,name:hr_contract.model_hr_employee
+msgid "Employee"
+msgstr "Вработен"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Search Contract"
+msgstr "Пребарај Договор"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Contracts in progress"
+msgstr "Договори во тек"
+
+#. module: hr_contract
+#: field:hr.employee,vehicle_distance:0
+msgid "Home-Work Distance"
+msgstr "Дома-Работа Одалеченост"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.employee,contract_ids:0
+#: model:ir.actions.act_window,name:hr_contract.act_hr_employee_2_hr_contract
+#: model:ir.actions.act_window,name:hr_contract.action_hr_contract
+#: model:ir.ui.menu,name:hr_contract.hr_menu_contract
+msgid "Contracts"
+msgstr "Договори"
+
+#. module: hr_contract
+#: view:hr.employee:0
+msgid "Personal Info"
+msgstr "Лични информации"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Contracts whose end date already passed"
+msgstr "Договори чии што краен рок е веќе поминат"
+
+#. module: hr_contract
+#: help:hr.employee,contract_id:0
+msgid "Latest contract of the employee"
+msgstr "Последен договор на вработениот"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Job"
+msgstr "Работно Место"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,advantages:0
+msgid "Advantages"
+msgstr "Придобивки"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Valid for"
+msgstr "Валиден за"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Work Permit"
+msgstr "Дозвола за Работа"
+
+#. module: hr_contract
+#: field:hr.employee,children:0
+msgid "Number of Children"
+msgstr "Број на Деца"
+
+#. module: hr_contract
+#: model:ir.actions.act_window,name:hr_contract.action_hr_contract_type
+#: model:ir.ui.menu,name:hr_contract.hr_menu_contract_type
+msgid "Contract Types"
+msgstr "Типови на Договор"
+
+#. module: hr_contract
+#: constraint:hr.employee:0
+msgid "Error ! You cannot create recursive Hierarchy of Employees."
+msgstr "Грешка! Не можете да креирате рекурзивна хиерархија на вработените."
+
+#. module: hr_contract
+#: field:hr.contract,date_end:0
+msgid "End Date"
+msgstr "Краен датум"
+
+#. module: hr_contract
+#: help:hr.contract,wage:0
+msgid "Basic Salary of the employee"
+msgstr "Основна Плата на вработениот"
+
+#. module: hr_contract
+#: field:hr.contract,name:0
+msgid "Contract Reference"
+msgstr "Референца"
+
+#. module: hr_contract
+#: help:hr.employee,vehicle_distance:0
+msgid "In kilometers"
+msgstr "во километри"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,notes:0
+msgid "Notes"
+msgstr "Забелешки"
+
+#. module: hr_contract
+#: field:hr.contract,permit_no:0
+msgid "Work Permit No"
+msgstr "Број на Дозвола за Работа"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.employee,contract_id:0
+#: model:ir.model,name:hr_contract.model_hr_contract
+#: model:ir.ui.menu,name:hr_contract.next_id_56
+msgid "Contract"
+msgstr "Договор"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,type_id:0
+#: view:hr.contract.type:0
+#: field:hr.contract.type,name:0
+#: model:ir.model,name:hr_contract.model_hr_contract_type
+msgid "Contract Type"
+msgstr "Тип на Договор"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,working_hours:0
+msgid "Working Schedule"
+msgstr "Распоред за Работа"
+
+#. module: hr_contract
+#: view:hr.employee:0
+msgid "Job Info"
+msgstr "Информации за Работата"
+
+#. module: hr_contract
+#: field:hr.contract,visa_expire:0
+msgid "Visa Expire Date"
+msgstr "Виза Датум на Истекување"
+
+#. module: hr_contract
+#: field:hr.contract,job_id:0
+msgid "Job Title"
+msgstr "Звање"
+
+#. module: hr_contract
+#: field:hr.employee,manager:0
+msgid "Is a Manager"
+msgstr "Менаџер"
+
+#. module: hr_contract
+#: field:hr.contract,date_start:0
+msgid "Start Date"
+msgstr "Почетен датум"
+
+#. module: hr_contract
+#: constraint:hr.contract:0
+msgid "Error! contract start-date must be lower then contract end-date."
+msgstr ""
+"Грешка! Почетниот датум на договорот мора да биде помал од крајниот датум."
+
+#. module: hr_contract
+#: field:hr.contract,visa_no:0
+msgid "Visa No"
+msgstr "Број на Виза"
+
+#. module: hr_contract
+#: field:hr.employee,place_of_birth:0
+msgid "Place of Birth"
+msgstr "Место на раѓање"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Duration"
+msgstr "Траење"
+
+#. module: hr_contract
+#: field:hr.employee,medic_exam:0
+msgid "Medical Examination Date"
+msgstr "Датум за Систематски Преглед"
+
+#. module: hr_contract
+#: field:hr.contract,trial_date_end:0
+msgid "Trial End Date"
+msgstr "Пробен Краен Датум"
+
+#. module: hr_contract
+#: view:hr.contract.type:0
+msgid "Search Contract Type"
+msgstr "Пребарај Тип на Договор"
diff --git a/addons/hr_evaluation/report/hr_evaluation_report_view.xml b/addons/hr_evaluation/report/hr_evaluation_report_view.xml
index fb1186ae401..d4907c90f11 100644
--- a/addons/hr_evaluation/report/hr_evaluation_report_view.xml
+++ b/addons/hr_evaluation/report/hr_evaluation_report_view.xml
@@ -6,7 +6,7 @@
<field name="name">hr.evaluation.report.tree</field>
<field name="model">hr.evaluation.report</field>
<field name="arch" type="xml">
- <tree colors="blue:state == 'draft';black:state in ('wait','progress');gray:state in('done','cancel')"
+ <tree colors="blue:state == 'draft';black:state in ('wait','progress');gray:state in('done','cancel')" create="false"
string="Appraisal Analysis">
<field name="create_date" invisible="1"/>
<field name="employee_id" invisible="1"/>
diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py
index 91dc44fed61..487e4f58782 100644
--- a/addons/hr_expense/hr_expense.py
+++ b/addons/hr_expense/hr_expense.py
@@ -243,7 +243,7 @@ class product_product(osv.osv):
data_obj = self.pool.get('ir.model.data')
cat_id = data_obj._get_id(cr, uid, 'hr_expense', 'cat_expense')
categ_id = data_obj.browse(cr, uid, cat_id).res_id
- res = {'value' : {'type':'service','procure_method':'make_to_stock','supply_method':'buy','purchase_ok':True,'sale_ok' :False,'categ_id':categ_id }}
+ res = {'value' : {'type':'service','sale_ok' :False,'categ_id':categ_id }}
return res
product_product()
diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml
index 388e5262f6e..76393d9e030 100644
--- a/addons/hr_expense/hr_expense_view.xml
+++ b/addons/hr_expense/hr_expense_view.xml
@@ -124,7 +124,7 @@
<field name="note" placeholder="Free Notes"/>
</div>
<group class="oe_subtotal_footer">
- <field name="amount"/>
+ <field name="amount" widget="monetary" options="{'currency_field': 'currency_id'}"/>
</group>
</group>
</page>
@@ -155,11 +155,12 @@
<field name="name" string="Expenses"/>
<field name="date"/>
<filter icon="terp-document-new" domain="[('state','=','draft')]" string="New" help="New Expense"/>
- <filter icon="terp-camera_test" domain="[('state','=','confirm')]" string="To Approve" help="Confirmed Expense"/>
+ <filter icon="terp-camera_test" domain="[('state','=','confirm')]" string="To Approve" help="Confirmed Expenses"/>
<filter icon="terp-dolar" domain="[('state','=','accepted')]" string="To Pay" help="Expenses to Invoice"/>
+ <separator/>
+ <filter domain="[('user_id', '=', uid)]" string="My Expenses"/>
<field name="employee_id"/>
<field name="department_id" string="Department" context="{'invisible_department': False}"/>
- <field name="user_id" string="User"/>
<group expand="0" string="Group By...">
<filter string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/>
<filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id'}"/>
@@ -195,10 +196,10 @@
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
- <field name="purchase_ok" position="before">
+ <div name="options" position="inside">
<field name="hr_expense_ok" on_change="on_change_hr_expense_ok(hr_expense_ok)"/>
<label for="hr_expense_ok"/>
- </field>
+ </div>
</field>
</record>
diff --git a/addons/hr_expense/report/expense.rml b/addons/hr_expense/report/expense.rml
index bf456cfc4d6..3e07516c01b 100644
--- a/addons/hr_expense/report/expense.rml
+++ b/addons/hr_expense/report/expense.rml
@@ -231,7 +231,7 @@
<para style="terp_default_Right_9">[[ formatLang(line.unit_quantity) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line.total_amount) ]] [[ o.currency_id.symbol ]] </para>
+ <para style="terp_default_Right_9">[[ formatLang(line.total_amount, currency_obj=o.currency_id) ]] </para>
</td>
</tr>
<tr>
@@ -277,7 +277,7 @@
<para style="terp_tblheader_Details">Total:</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(o.amount) ]] [[ o.currency_id.symbol ]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(o.amount, currency_obj=o.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml
index 1cd1e10c5ed..9f94c264c5e 100644
--- a/addons/hr_expense/report/hr_expense_report_view.xml
+++ b/addons/hr_expense/report/hr_expense_report_view.xml
@@ -6,7 +6,7 @@
<field name="name">hr.expense.report.tree</field>
<field name="model">hr.expense.report</field>
<field name="arch" type="xml">
- <tree colors="blue:state == 'draft';black:state in ('confirm','accepted','done');gray:state == 'cancelled'" string="Expenses Analysis">
+ <tree colors="blue:state == 'draft';black:state in ('confirm','accepted','done');gray:state == 'cancelled'" create="false" string="Expenses Analysis">
<field name="employee_id" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="year" invisible="1"/>
diff --git a/addons/hr_expense/security/ir.model.access.csv b/addons/hr_expense/security/ir.model.access.csv
index 0455302319e..092424ef7e6 100644
--- a/addons/hr_expense/security/ir.model.access.csv
+++ b/addons/hr_expense/security/ir.model.access.csv
@@ -9,6 +9,7 @@ access_product_template_hr_expense_user,product.template.hr.expense.user,product
access_product_uom_hr_expense_user,product.uom.hr.expense.user,product.model_product_uom,base.group_hr_user,1,1,1,1
access_product_price_type_user,product.price.type.user,product.model_product_price_type,base.group_hr_user,1,1,1,1
access_account_journal_user,account.journal.user,account.model_account_journal,base.group_hr_user,1,1,1,1
+access_account_journal_employee,account.journal.employee,account.model_account_journal,base.group_user,1,0,0,0
access_account_invoice_user,account.invoice.user,account.model_account_invoice,base.group_hr_user,1,1,1,1
access_account_invoice_line_user,account.invoice.line.user,account.model_account_invoice_line,base.group_hr_user,1,1,1,1
access_account_analytic_journal_user,account.ianalytic.journal.user,account.model_account_analytic_journal,base.group_hr_user,1,1,1,1
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index 306e5201829..b48f0786704 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -212,13 +212,6 @@ class hr_holidays(osv.osv):
}
return result
- def onchange_status_id(self, cr, uid, ids, status_id, context=None):
- double_validation = False
- if status_id:
- holiday_status = self.pool.get('hr.holidays.status').browse(cr, uid, status_id, context=context)
- double_validation = holiday_status.double_validation
- return {'value': {'double_validation': double_validation}}
-
def set_to_draft(self, cr, uid, ids, context=None):
self.write(cr, uid, ids, {
'state': 'draft',
diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml
index 347e2b17ca5..6e3c9b2d083 100644
--- a/addons/hr_holidays/hr_holidays_view.xml
+++ b/addons/hr_holidays/hr_holidays_view.xml
@@ -100,7 +100,7 @@
<group>
<group>
<field name="name" attrs="{'readonly':[('state','!=','draft'),('state','!=','confirm')]}"/>
- <field name="holiday_status_id" on_change="onchange_status_id(holiday_status_id)" context="{'employee_id':employee_id}"/>
+ <field name="holiday_status_id" context="{'employee_id':employee_id}"/>
<label for="number_of_days_temp" string="Duration"/>
<div>
<group col="3">
@@ -145,7 +145,7 @@
<group>
<group>
<field name="name" required="1" attrs="{'readonly':[('state','!=','draft'),('state','!=','confirm')]}"/>
- <field name="holiday_status_id" on_change="onchange_status_id(holiday_status_id)" context="{'employee_id':employee_id}"/>
+ <field name="holiday_status_id" context="{'employee_id':employee_id}"/>
<field name="number_of_days_temp"/>
</group>
<group>
@@ -353,6 +353,32 @@
<menuitem name="My Allocation Requests" parent="menu_open_ask_holidays" id="menu_open_allocation_holidays" action="open_allocation_holidays"/>
+ <record model="ir.actions.act_window" id="request_approve_allocation">
+ <field name="name">Allocation Requests to Approve</field>
+ <field name="res_model">hr.holidays</field>
+ <field name="view_type">form</field>
+ <field name="context">{'default_type': 'add', 'search_default_approve':1}</field>
+ <field name="domain">[('type','=','add')]</field>
+ <field name="view_id" ref="allocation_leave_new"/>
+ <field name="search_view_id" ref="view_hr_holidays_filter"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_request_approve_allocation_tree">
+ <field name="sequence" eval="1"/>
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="view_holiday_allocation_tree"/>
+ <field name="act_window_id" ref="request_approve_allocation"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_request_approve_allocation_form">
+ <field name="sequence" eval="2"/>
+ <field name="view_mode">form</field>
+ <field name="view_id" ref="allocation_leave_new"/>
+ <field name="act_window_id" ref="request_approve_allocation"/>
+ </record>
+
+ <menuitem parent="menu_open_ask_holidays" id="menu_request_approve_allocation" action="request_approve_allocation" groups="base.group_hr_manager"/>
+
<record model="ir.actions.act_window" id="open_company_allocation">
<field name="name">Leaves Summary</field>
<field name="res_model">hr.holidays</field>
diff --git a/addons/hr_holidays/i18n/mk.po b/addons/hr_holidays/i18n/mk.po
new file mode 100644
index 00000000000..2694317ebe9
--- /dev/null
+++ b/addons/hr_holidays/i18n/mk.po
@@ -0,0 +1,864 @@
+# Macedonian translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-02-08 01:37+0100\n"
+"PO-Revision-Date: 2012-10-09 08:43+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Macedonian <mk@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: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Blue"
+msgstr "Сина"
+
+#. module: hr_holidays
+#: field:hr.holidays,holiday_type:0
+msgid "Allocation Type"
+msgstr "Тип на Алокација"
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "Waiting Second Approval"
+msgstr "Се чека на второ одобрување"
+
+#. module: hr_holidays
+#: help:hr.holidays.status,remaining_leaves:0
+msgid "Maximum Leaves Allowed - Leaves Already Taken"
+msgstr "Мкасимален број на дозволени отсуства - Отсуствата се веќе земени"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Leaves Management"
+msgstr "Менаџирање на Отсуства"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Group By..."
+msgstr "Групирај По..."
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Allocation Mode"
+msgstr "Мод на Алокација"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,department_id:0
+msgid "Department"
+msgstr "Сектор"
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,name:hr_holidays.request_approve_holidays
+msgid "Requests Approve"
+msgstr "Одобри Барања"
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "Refused"
+msgstr "Одбиени"
+
+#. module: hr_holidays
+#: help:hr.holidays,category_id:0
+msgid "Category of Employee"
+msgstr "Категорија на Вработен"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid " Month-1"
+msgstr " Месец-1"
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Brown"
+msgstr "Кафена"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Remaining Days"
+msgstr "Останати Денови"
+
+#. module: hr_holidays
+#: selection:hr.holidays,holiday_type:0
+msgid "By Employee"
+msgstr "По Вработен"
+
+#. module: hr_holidays
+#: help:hr.holidays,employee_id:0
+msgid ""
+"Leave Manager can let this field empty if this leave request/allocation is "
+"for every employee"
+msgstr ""
+"Менаџерот за отсуства може да го остави ова поле празно ако барањето за "
+"отсуство/преместување е за секој вработен"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Set to Draft"
+msgstr "Подеси на нацрт"
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Cyan"
+msgstr "Светла Цијан"
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Green"
+msgstr "Светло зелено"
+
+#. module: hr_holidays
+#: field:hr.employee,current_leave_id:0
+msgid "Current Leave Type"
+msgstr "Тековен Тип на Отсуство"
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,help:hr_holidays.open_ask_holidays
+msgid ""
+"Leave requests can be recorded by employees and validated by their managers. "
+"Once a leave request is validated, it appears automatically in the agenda of "
+"the employee. You can define several allowance types (paid holidays, "
+"sickness, etc.) and manage allowances per type."
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.actions.report.xml,name:hr_holidays.report_holidays_summary
+msgid "Summary Of Leaves"
+msgstr "Збир на Отсуства"
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: view:hr.holidays:0
+#: selection:hr.holidays,state:0
+msgid "Approved"
+msgstr "Одобрено"
+
+#. module: hr_holidays
+#: field:hr.employee,last_login:0
+msgid "Latest Connection"
+msgstr "Последна Конекција"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Refuse"
+msgstr "Одбиј"
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:344
+#, python-format
+msgid ""
+"You cannot validate leaves for employee %s: too few remaining days (%s)."
+msgstr ""
+"Не можете да валидирате отсуства за вработениот %s: премалку преостанати "
+"денови (%s)."
+
+#. module: hr_holidays
+#: help:hr.holidays,state:0
+msgid ""
+"The state is set to 'Draft', when a holiday request is created. \n"
+"The state is 'Waiting Approval', when holiday request is confirmed by user. "
+" \n"
+"The state is 'Refused', when holiday request is refused by manager. "
+" \n"
+"The state is 'Approved', when holiday request is approved by manager."
+msgstr ""
+
+#. module: hr_holidays
+#: view:board.board:0
+#: model:ir.actions.act_window,name:hr_holidays.act_hr_employee_holiday_request
+#: model:ir.ui.menu,name:hr_holidays.menu_hr_reporting_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_open_ask_holidays
+msgid "Leaves"
+msgstr "Отсуства"
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_hr_holidays
+msgid "Leave"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_request_approve_holidays
+msgid "Leave Requests to Approve"
+msgstr "Барања за отсуства за одобрување"
+
+#. module: hr_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_account_central_journal
+msgid "Leaves by Department"
+msgstr "Отсуства по Сектор"
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "Cancelled"
+msgstr "Откажано"
+
+#. module: hr_holidays
+#: help:hr.holidays,type:0
+msgid ""
+"Choose 'Leave Request' if someone wants to take an off-day. \n"
+"Choose 'Allocation Request' if you want to increase the number of leaves "
+"available for someone"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.employee,remaining_leaves:0
+msgid ""
+"Total number of legal leaves allocated to this employee, change this value "
+"to create allocation/leave requests."
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.status:0
+msgid "Validation"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:377
+#, python-format
+msgid "Warning !"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,color_name:0
+msgid "Color in Report"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_hr_holidays_summary_employee
+msgid "HR Holidays Summary Report By Employee"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays,manager_id:0
+msgid "This area is automatically filled by the user who validate the leave"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,holiday_status_id:0
+#: field:hr.holidays.remaining.leaves.user,leave_type:0
+#: view:hr.holidays.status:0
+#: field:hr.holidays.status,name:0
+#: field:hr.holidays.summary.dept,holiday_type:0
+#: model:ir.actions.act_window,name:hr_holidays.open_view_holiday_status
+#: model:ir.model,name:hr_holidays.model_hr_holidays_status
+#: model:ir.ui.menu,name:hr_holidays.menu_open_view_holiday_status
+msgid "Leave Type"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:199
+#: code:addons/hr_holidays/hr_holidays.py:344
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Magenta"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/wizard/hr_holidays_summary_department.py:44
+#, python-format
+msgid "You have to select at least 1 Department. And try again"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.summary.dept,holiday_type:0
+#: selection:hr.holidays.summary.employee,holiday_type:0
+msgid "Confirmed"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.summary.dept,date_from:0
+#: field:hr.holidays.summary.employee,date_from:0
+msgid "From"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Confirm"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:384
+#, python-format
+msgid "Leave Request for %s"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,remaining_leaves:0
+msgid "Remaining Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,state:0
+msgid "State"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_hr_holidays_remaining_leaves_user
+msgid "Total holidays by type"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.employee:0
+#: view:hr.holidays:0
+#: field:hr.holidays,employee_id:0
+#: field:hr.holidays.remaining.leaves.user,name:0
+#: model:ir.model,name:hr_holidays.model_hr_employee
+msgid "Employee"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "New"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Type"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Red"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.remaining.leaves.user:0
+msgid "Leaves by Type"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Salmon"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Wheat"
+msgstr ""
+
+#. module: hr_holidays
+#: constraint:resource.calendar.leaves:0
+msgid "Error! leave start-date must be lower then leave end-date."
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:382
+#, python-format
+msgid "Allocation for %s"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,number_of_days:0
+#: field:hr.holidays,number_of_days_temp:0
+msgid "Number of Days"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:377
+#, python-format
+msgid ""
+"The feature behind the field 'Remaining Legal Leaves' can only be used when "
+"there is only one leave type with the option 'Allow to Override Limit' "
+"unchecked. (%s Found). Otherwise, the update is ambiguous as we cannot "
+"decide on which leave type the update has to be done. \n"
+"You may prefer to use the classic menus 'Leave Requests' and 'Allocation "
+"Requests' located in 'Human Resources \\ Leaves' to manage the leave days of "
+"the employees if the configuration does not allow to use this field."
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.status:0
+msgid "Search Leave Type"
+msgstr ""
+
+#. module: hr_holidays
+#: sql_constraint:hr.holidays:0
+msgid "You have to select an employee or a category"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,double_validation:0
+msgid ""
+"When selected, the Allocation/Leave Requests for this type require a second "
+"validation to be approved."
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "Waiting Approval"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.summary.employee,emp:0
+msgid "Employee(s)"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,categ_id:0
+msgid ""
+"If you set a meeting type, OpenERP will create a meeting in the calendar "
+"once a leave is validated."
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,linked_request_ids:0
+msgid "Linked Requests"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,parent_id:0
+msgid "Parent"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Lavender"
+msgstr ""
+
+#. module: hr_holidays
+#: xsl:holidays.summary:0
+#: view:hr.holidays:0
+msgid "Month"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: model:ir.actions.act_window,name:hr_holidays.open_ask_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_open_ask_holidays_new
+msgid "Leave Requests"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,limit:0
+msgid "Allow to Override Limit"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.summary.employee:0
+#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_summary_employee
+msgid "Employee's Holidays"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,category_id:0
+msgid "Category"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,max_leaves:0
+msgid ""
+"This value is given by the sum of all holidays requests with a positive "
+"value."
+msgstr ""
+
+#. module: hr_holidays
+#: view:board.board:0
+msgid "All Employee Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Coral"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.summary.dept:0
+#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_summary_dept
+msgid "Holidays by Department"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Black"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,name:hr_holidays.hr_holidays_leaves_assign_legal
+msgid "Allocate Leaves for Employees"
+msgstr ""
+
+#. module: hr_holidays
+#: field:resource.calendar.leaves,holiday_id:0
+msgid "Holiday"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,case_id:0
+#: field:hr.holidays.status,categ_id:0
+msgid "Meeting"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Ivory"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.summary.dept,holiday_type:0
+#: selection:hr.holidays.summary.employee,holiday_type:0
+msgid "Both Validated and Confirmed"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,leaves_taken:0
+msgid "Leaves Already Taken"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,user_id:0
+#: field:hr.holidays.remaining.leaves.user,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: hr_holidays
+#: sql_constraint:hr.holidays:0
+msgid "The start date must be before the end date !"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,active:0
+msgid "Active"
+msgstr ""
+
+#. module: hr_holidays
+#: constraint:hr.employee:0
+msgid "Error ! You cannot create recursive Hierarchy of Employees."
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.employee:0
+#: field:hr.employee,remaining_leaves:0
+msgid "Remaining Legal Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,manager_id:0
+msgid "First Approval"
+msgstr ""
+
+#. module: hr_holidays
+#: model:hr.holidays.status,name:hr_holidays.holiday_status_unpaid
+msgid "Unpaid"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: model:ir.actions.act_window,name:hr_holidays.open_company_allocation
+#: model:ir.ui.menu,name:hr_holidays.menu_open_company_allocation
+msgid "Leaves Summary"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Holidays during last month"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/wizard/hr_holidays_summary_department.py:44
+#, python-format
+msgid "Error"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.employee:0
+msgid "Assign Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Blue"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "My Department Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.employee,current_leave_state:0
+msgid "Current Leave Status"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,type:0
+msgid "Request Type"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,active:0
+msgid ""
+"If the active field is set to false, it will allow you to hide the leave "
+"type without removing it."
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.status:0
+msgid "Misc"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "General"
+msgstr ""
+
+#. module: hr_holidays
+#: model:hr.holidays.status,name:hr_holidays.holiday_status_comp
+msgid "Compensatory Days"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,notes:0
+msgid "Reasons"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,name:hr_holidays.action_hr_available_holidays_report
+#: model:ir.ui.menu,name:hr_holidays.menu_hr_available_holidays_report_tree
+msgid "Leaves Analysis"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.summary.dept:0
+#: view:hr.holidays.summary.employee:0
+msgid "Cancel"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,color_name:0
+msgid ""
+"This color will be used in the leaves summary located in Reporting\\Leaves "
+"by Departement"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: selection:hr.holidays.summary.dept,holiday_type:0
+#: selection:hr.holidays.summary.employee,holiday_type:0
+msgid "Validated"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: selection:hr.holidays,type:0
+msgid "Allocation Request"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_resource_calendar_leaves
+msgid "Leave Detail"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,double_validation:0
+#: field:hr.holidays.status,double_validation:0
+msgid "Apply Double Validation"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.summary.dept:0
+#: view:hr.holidays.summary.employee:0
+msgid "Print"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.status:0
+msgid "Details"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_leaves_by_month
+msgid "My Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays,holiday_type:0
+msgid "By Employee Category"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: selection:hr.holidays,type:0
+msgid "Leave Request"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,name:0
+msgid "Description"
+msgstr ""
+
+#. module: hr_holidays
+#: model:hr.holidays.status,name:hr_holidays.holiday_status_cl
+msgid "Legal Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: sql_constraint:hr.holidays:0
+msgid "The number of days must be greater than 0 !"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays,holiday_type:0
+msgid ""
+"By Employee: Allocation/Request for individual Employee, By Employee "
+"Category: Allocation/Request for group of employees in category"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:199
+#, python-format
+msgid "You cannot delete a leave which is not in draft state !"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Search Leave"
+msgstr "Пребарај Отсуство"
+
+#. module: hr_holidays
+#: field:hr.holidays.summary.employee,holiday_type:0
+msgid "Select Holiday Type"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.remaining.leaves.user,no_of_leaves:0
+msgid "Remaining leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.summary.dept,depts:0
+msgid "Department(s)"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,manager_id2:0
+msgid "Second Approval"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,date_to:0
+msgid "End Date"
+msgstr ""
+
+#. module: hr_holidays
+#: model:hr.holidays.status,name:hr_holidays.holiday_status_sl
+msgid "Sick Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,limit:0
+msgid ""
+"If you select this checkbox, the system allows the employees to take more "
+"leaves than the available ones for this type."
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,leaves_taken:0
+msgid ""
+"This value is given by the sum of all holidays requests with a negative "
+"value."
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Violet"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,help:hr_holidays.hr_holidays_leaves_assign_legal
+msgid ""
+"You can assign remaining Legal Leaves for each employee, OpenERP will "
+"automatically create and validate allocation requests."
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,max_leaves:0
+msgid "Maximum Allowed"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays,manager_id2:0
+msgid ""
+"This area is automaticly filled by the user who validate the leave with "
+"second level (If Leave type need second validation)"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Mode"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_hr_holidays_summary_dept
+msgid "HR Holidays Summary Report By Department"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Approve"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,date_from:0
+msgid "Start Date"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: model:ir.actions.act_window,name:hr_holidays.open_allocation_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_open_allocation_holidays
+msgid "Allocation Requests"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Yellow"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Pink"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Manager"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "To Confirm"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Year"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "To Approve"
+msgstr ""
diff --git a/addons/hr_payroll/i18n/es_MX.po b/addons/hr_payroll/i18n/es_MX.po
index a0f4837d947..24b8d615a63 100644
--- a/addons/hr_payroll/i18n/es_MX.po
+++ b/addons/hr_payroll/i18n/es_MX.po
@@ -1,1759 +1,1119 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# Spanish (Mexico) translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-01-18 11:08+0000\n"
-"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
-"<jesteve@zikzakmedia.com>\n"
-"Language-Team: Spanish <es@li.org>\n"
+"POT-Creation-Date: 2012-02-08 01:37+0100\n"
+"PO-Revision-Date: 2012-10-10 21:29+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Mexico) <es_MX@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:46+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
#. module: hr_payroll
-#: report:employees.salary:0
-msgid "E-mail Address"
-msgstr "Dirección de correo electrónico"
-
-#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-msgid "Based"
-msgstr "Basado"
-
-#. module: hr_payroll
-#: field:hr.contract,net:0
-#: field:hr.employee,net:0
-#: field:hr.payroll.register,net:0
-#: field:hr.payslip,net:0
-#: report:salary.structure:0
-msgid "Net Salary"
-msgstr "Salario neto"
-
-#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Recompute Sheet"
-msgstr "Recalcular plantilla"
+#: field:hr.payslip.line,condition_select:0
+#: field:hr.salary.rule,condition_select:0
+msgid "Condition Based on"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Employees Salary Details"
-msgstr "Detalles salario de los empleados"
+#: selection:hr.contract,schedule_pay:0
+msgid "Monthly"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Allowances with Basic:"
-msgstr "Primas con base:"
+#: view:hr.payslip:0 field:hr.payslip,line_ids:0
+#: model:ir.actions.act_window,name:hr_payroll.act_contribution_reg_payslip_lines
+msgid "Payslip Lines"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: report:salary.structure:0
-msgid "Department"
-msgstr "Departamento"
+#: view:hr.payslip.line:0
+#: model:ir.model,name:hr_payroll.model_hr_salary_rule_category
+#: report:paylip.details:0
+msgid "Salary Rule Category"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Deductions:"
-msgstr "Deducciones:"
+#: help:hr.salary.rule.category,parent_id:0
+msgid ""
+"Linking a salary category to its parent is used only for the reporting "
+"purpose."
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,gratuity:0
-msgid "Use for Gratuity ?"
-msgstr "¿Uso de propina?"
+#: view:hr.payslip:0 view:hr.payslip.line:0 view:hr.salary.rule:0
+msgid "Group By..."
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,working_days_per_week:0
-#: field:hr.payslip,working_days:0
-#: report:payslip.pdf:0
-msgid "Working Days"
-msgstr "Días de trabajo"
+#: view:hr.payslip:0
+msgid "States"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Loan"
-msgstr "Préstamo"
+#: field:hr.payslip.line,input_ids:0 view:hr.salary.rule:0
+#: field:hr.salary.rule,input_ids:0
+msgid "Inputs"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Salary Payment Register"
-msgstr "Registro de pago de nómina"
+#: field:hr.payslip.line,parent_rule_id:0
+#: field:hr.salary.rule,parent_rule_id:0
+msgid "Parent Salary Rule"
+msgstr ""
#. module: hr_payroll
-#: field:hr.employee,slip_ids:0
-#: view:hr.payroll.register:0
-#: field:hr.payroll.register,line_ids:0
+#: field:hr.employee,slip_ids:0 view:hr.payslip:0 view:hr.payslip.run:0
+#: field:hr.payslip.run,slip_ids:0
#: model:ir.actions.act_window,name:hr_payroll.act_hr_employee_payslip_list
msgid "Payslips"
-msgstr "Nóminas"
-
-#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.year_salary_report
-msgid "Year Salary Report"
-msgstr "Informe anual de salarios"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Paid Salary"
-msgstr "Nómina pagada"
+#: field:hr.payroll.structure,parent_id:0
+#: field:hr.salary.rule.category,parent_id:0
+msgid "Parent"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
+#: report:paylip.details:0 report:payslip:0
msgid "("
-msgstr "("
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,company_id:0
-#: field:hr.allounce.deduction.categoty,company_id:0
-#: field:hr.contibution.register,company_id:0
-#: field:hr.holidays.status,company_id:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.register,company_id:0
-#: field:hr.payroll.structure,company_id:0
-#: field:hr.payslip,company_id:0
+#: field:hr.contribution.register,company_id:0
+#: field:hr.payroll.structure,company_id:0 field:hr.payslip,company_id:0
+#: field:hr.payslip.line,company_id:0 field:hr.salary.rule,company_id:0
+#: field:hr.salary.rule.category,company_id:0
msgid "Company"
-msgstr "Compañía"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr "El responsable"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr "Detalles de la carta"
+#: view:hr.payslip:0
+msgid "Done Slip"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: report:payslip.pdf:0
+#: report:paylip.details:0 report:payslip:0
msgid ","
-msgstr ","
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.payroll.register:0
-#: view:hr.payslip:0
+#: view:hr.payslip:0 view:hr.payslip.run:0
msgid "Set to Draft"
-msgstr "Cambiar a borrador"
+msgstr ""
#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:180
-#: code:addons/hr_payroll/hr_payroll.py:195
-#: code:addons/hr_payroll/hr_payroll.py:285
-#: code:addons/hr_payroll/hr_payroll.py:835
-#: code:addons/hr_payroll/hr_payroll.py:1111
-#: code:addons/hr_payroll/hr_payroll.py:1126
-#: code:addons/hr_payroll/hr_payroll.py:1410
-#, python-format
-msgid "Variable Error: %s "
-msgstr "Error variable: %s "
+#: model:ir.model,name:hr_payroll.model_hr_salary_rule
+msgid "hr.salary.rule"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Expire"
-msgstr "Vencimiento"
+#: field:hr.payslip,payslip_run_id:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip_run
+msgid "Payslip Batches"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.holidays.status,type:0
-msgid "Half-Pay Holiday"
-msgstr "Vacaciones con media paga"
+#: view:hr.payslip.employees:0
+msgid ""
+"This wizard will generate payslips for all selected employee(s) based on the "
+"dates and credit note specified on Payslips Run."
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: field:hr.payslip,other_pay:0
-msgid "Others"
-msgstr "Otros"
+#: report:contribution.register.lines:0 report:paylip.details:0
+#: report:payslip:0
+msgid "Quantity/Rate"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip.line,slip_id:0
-#: model:ir.model,name:hr_payroll.model_hr_payslip
-#: report:payslip.pdf:0
+#: field:hr.payslip.input,payslip_id:0 field:hr.payslip.line,slip_id:0
+#: field:hr.payslip.worked_days,payslip_id:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip report:payslip:0
msgid "Pay Slip"
-msgstr "Nómina"
-
-#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Contract Detail:"
-msgstr "Detalles del contrato:"
-
-#. module: hr_payroll
-#: field:hr.payslip,igross:0
-#: field:hr.payslip,inet:0
-msgid "Calculaton Field"
-msgstr "Campo de cálculo"
-
-#. module: hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-#: help:hr.payroll.register,bank_id:0
-msgid "Select the Bank Address from whcih the salary is going to be paid"
-msgstr "Seleccione la dirección del banco de donde se pagará la nómina."
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-msgid "Bank Advice"
-msgstr "Aviso bancario"
-
-#. module: hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Reject"
-msgstr "Rechazado"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Leaves"
-msgstr "Ausencias"
+#: view:hr.payslip.employees:0
+msgid "Generate"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register.line,register_id:0
-#: view:hr.payslip:0
-#: field:hr.payslip,register_id:0
-#: report:payslip.pdf:0
-msgid "Register"
-msgstr "Registro"
+#: help:hr.payslip.line,amount_percentage_base:0
+#: help:hr.salary.rule,amount_percentage_base:0
+msgid "result will be affected to a variable"
+msgstr ""
#. module: hr_payroll
-#: constraint:hr.employee:0
-msgid ""
-"Error ! You cannot select a department for which the employee is the manager."
+#: report:contribution.register.lines:0
+msgid "Total:"
msgstr ""
-"¡Error! No puede seleccionar un departamento que tenga el empleado como "
-"responsable."
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Total Deductions"
-msgstr "Total deducciones"
+#: model:ir.actions.act_window,name:hr_payroll.act_children_salary_rules
+msgid "All Children Rules"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution.line,value:0
-#: field:hr.payslip.line.line,value:0
-msgid "Value"
-msgstr "Valor"
+#: view:hr.payslip:0 view:hr.salary.rule:0
+msgid "Input Data"
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employee"
-msgstr "Nombre del empleado"
+#: constraint:hr.payslip:0
+msgid "Payslip 'Date From' must be before 'Date To'."
+msgstr ""
#. module: hr_payroll
-#: view:hr.contibution.register:0
-msgid "Register Lines"
-msgstr "Líneas de registro"
+#: view:hr.payslip:0 view:hr.salary.rule.category:0
+msgid "Notes"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
msgid "Salary Computation"
-msgstr "Cálculo de la nómina"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice.line,amount:0
-#: report:payroll.advice:0
-#: report:salary.structure:0
+#: report:contribution.register.lines:0 field:hr.payslip.input,amount:0
+#: field:hr.payslip.line,amount:0 report:paylip.details:0 report:payslip:0
msgid "Amount"
-msgstr "Importe"
-
-#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:1225
-#, python-format
-msgid "Please check configuration of %s, payroll head is missing"
msgstr ""
-"Por favor, compruebe la configuración de %s, falta la cabecera de la nómina"
-
-#. module: hr_payroll
-#: selection:company.contribution,amount_type:0
-msgid "Percentage"
-msgstr "Porcentaje"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-msgid "Other Information"
-msgstr "Otra información"
-
-#. module: hr_payroll
-#: field:hr.passport,country_id:0
-msgid "Country of Issue"
-msgstr "País de emisión"
-
-#. module: hr_payroll
-#: field:hr.contibution.register.line,emp_deduction:0
-msgid "Employee Deduction"
-msgstr "Deducción del empleado"
-
-#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Other Deduction"
-msgstr "Otras deducciones"
#. module: hr_payroll
-#: selection:hr.holidays.status,type:0
-msgid "Paid Holiday"
-msgstr "Vacaciones pagada"
+#: view:hr.payslip:0 view:hr.payslip.line:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip_line
+msgid "Payslip Line"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: view:hr.passport:0
#: view:hr.payslip:0
-msgid "Group By..."
-msgstr "Agrupar por..."
+msgid "Other Information"
+msgstr ""
#. module: hr_payroll
-#: field:hr.passport,date_expire:0
-msgid "Passport Expire Date"
-msgstr "Fecha expiración pasaporte"
+#: help:hr.payslip.line,amount_select:0 help:hr.salary.rule,amount_select:0
+msgid "The computation method for the rule amount."
+msgstr ""
#. module: hr_payroll
-#: selection:hr.holidays.status,type:0
-msgid "Un-Paid Holiday"
-msgstr "Vacaciones no pagadas"
+#: view:payslip.lines.contribution.register:0
+msgid "Contribution Register's Payslip Lines"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Valid From"
-msgstr "Válido desde"
+#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52
+#, python-format
+msgid "Warning !"
+msgstr ""
#. module: hr_payroll
-#: help:hr.payslip,igross:0
-#: help:hr.payslip,inet:0
-msgid ""
-"Calculation field used for internal calculation, do not place this on form"
-msgstr "Campo usado en cálculos internos, no lo coloque en un formulario."
+#: report:paylip.details:0
+msgid "Details by Salary Rule Category:"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Amount (in words) :"
-msgstr "Importe (en palabras):"
+#: report:paylip.details:0 report:payslip:0
+msgid "Note"
+msgstr ""
#. module: hr_payroll
-#: field:hr.holidays.status,type:0
-msgid "Payment"
-msgstr "Pago"
+#: field:hr.payroll.structure,code:0 field:hr.payslip,number:0
+#: report:paylip.details:0 report:payslip:0
+msgid "Reference"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.structure:0
#: view:hr.payslip:0
-#: field:hr.payslip,line_ids:0
-#: view:hr.payslip.line:0
-#: model:ir.model,name:hr_payroll.model_hr_payslip_line
-msgid "Payslip Line"
-msgstr "Línea de nómina"
+msgid "Draft Slip"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Identification No"
-msgstr "Nº identificación"
+#: code:addons/hr_payroll/hr_payroll.py:422
+#, python-format
+msgid "Normal Working Days paid at 100%"
+msgstr ""
#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.allounce.deduction.categoty,base:0
-msgid "Based on"
-msgstr "Basado en"
+#: field:hr.payslip.line,condition_range_max:0
+#: field:hr.salary.rule,condition_range_max:0
+msgid "Maximum Range"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Wating for Verification"
-msgstr "Esperando verificación"
+#: report:paylip.details:0 report:payslip:0
+msgid "Identification No"
+msgstr ""
#. module: hr_payroll
-#: model:ir.module.module,shortdesc:hr_payroll.module_meta_information
-msgid "Human Resource Payroll"
-msgstr "Nóminas de recursos humanos"
+#: field:hr.payslip,struct_id:0
+msgid "Structure"
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Total:"
-msgstr "Total:"
+#: help:hr.employee,total_wage:0
+msgid "Sum of all current contract's wage of employee."
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
-msgid "Posted"
-msgstr "Fijado"
+msgid "Total Working Days"
+msgstr ""
#. module: hr_payroll
-#: model:ir.module.module,description:hr_payroll.module_meta_information
+#: help:hr.payslip.line,code:0 help:hr.salary.rule,code:0
msgid ""
-"Generic Payroll system\n"
-" * Employee Details\n"
-" * Employee Contracts\n"
-" * Passport based Contract\n"
-" * Allowances / Deductions\n"
-" * Allow to configure Basic / Grows / Net Salary\n"
-" * Employee Payslip\n"
-" * Monthly Payroll Register\n"
-" * Integrated with Holiday Management\n"
-" "
+"The code of salary rules can be used as reference in computation of other "
+"rules. In that case, it is case sensitive."
msgstr ""
-"Sistema de nóminas genérico\n"
-" * Detalles de empleado\n"
-" * Contratos de empleado\n"
-" * Contratos basados en pasaportes\n"
-" * Complementos/deducciones\n"
-" * Permite configurar salario base/bruto/neto\n"
-" * Nómina de empleado\n"
-" * Registro mensual de nóminas\n"
-" * Integrado con la gestión de vacaciones\n"
-" "
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_holidays_status
-msgid "Leave Type"
-msgstr "Tipo de ausencia"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Date :"
-msgstr "Fecha :"
-
-#. module: hr_payroll
-#: field:hr.payslip.line,total:0
-msgid "Sub Total"
-msgstr "Subtotal"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Payments -"
-msgstr "Pagos -"
-
-#. module: hr_payroll
-#: field:hr.contract,visa_no:0
-msgid "Visa No"
-msgstr "Número de Visa"
-
-#. module: hr_payroll
-#: field:company.contribution.line,from_val:0
-#: report:employees.salary:0
-#: field:hr.payslip.line.line,from_val:0
-#: report:year.salary:0
-msgid "From"
-msgstr "Desde"
+#: selection:hr.contract,schedule_pay:0
+msgid "Weekly"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr "Por salario"
+#: field:hr.payslip.line,rate:0
+msgid "Rate (%)"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.employees.detail,date_to:0
-#: field:hr.payroll.year.salary,date_to:0
-#: report:salary.structure:0
-msgid "End Date"
-msgstr "Fecha final"
+#: view:hr.payslip:0
+msgid "Confirm"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.salary_payslip
+#: model:ir.actions.report.xml,name:hr_payroll.payslip_report
msgid "Employee PaySlip"
-msgstr "Nómina del empleado"
-
-#. module: hr_payroll
-#: field:hr.payslip,leaves:0
-msgid "Leave Deductions"
-msgstr "Deducciones por ausencia"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: report:payroll.advice:0
-msgid "Authorised Signature"
-msgstr "Firma autorizada"
+#: help:hr.payslip.line,condition_range_max:0
+#: help:hr.salary.rule,condition_range_max:0
+msgid "The maximum amount, applied for this rule."
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payslip.line,amount_type:0
-msgid "Function Value"
-msgstr "Valor de función"
+#: help:hr.payslip.line,condition_python:0
+#: help:hr.salary.rule,condition_python:0
+msgid ""
+"Applied this rule for calculation if condition is true. You can specify "
+"condition like basic > 1000."
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_contibution_register_line
-msgid "Contribution Register Line"
-msgstr "Línea de registro de contribución"
+#: view:hr.payslip.employees:0
+msgid "Payslips by Employees"
+msgstr ""
#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Notes:"
-msgstr "Notas:"
+#: selection:hr.contract,schedule_pay:0
+msgid "Quarterly"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:hr.payroll.register,state:0
-#: field:hr.payslip,state:0
+#: field:hr.payslip,state:0 field:hr.payslip.run,state:0
msgid "State"
-msgstr "Estado"
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Paymeny Lines"
-msgstr "Líneas de pago"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Other Lines"
-msgstr "Otras líneas"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: view:hr.payroll.structure:0
-#: view:hr.payslip:0
-#: view:hr.payslip.line:0
-msgid "Function Arguments"
-msgstr "Argumentos de la función"
+#: help:hr.salary.rule,quantity:0
+msgid ""
+"It is used in computation for percentage and fixed amount.For e.g. A rule "
+"for Meal Voucher having fixed amount of 1€ per worked day can have its "
+"quantity defined in expression like worked_days.WORK100.number_of_days."
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_hr_company_contribution_tree
-#: model:ir.ui.menu,name:hr_payroll.menu_hr_company_contribution_tree
-msgid "Company Contributions"
-msgstr "Contribuciones de la compañía"
+#: view:hr.salary.rule:0
+msgid "Search Salary Rule"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register.line,employee_id:0
-#: field:hr.passport,employee_id:0
-#: field:hr.payroll.advice.line,employee_id:0
-#: field:hr.payslip,employee_id:0
-#: field:hr.payslip.line,employee_id:0
+#: field:hr.payslip,employee_id:0 field:hr.payslip.line,employee_id:0
#: model:ir.model,name:hr_payroll.model_hr_employee
msgid "Employee"
-msgstr "Empleado"
-
-#. module: hr_payroll
-#: field:hr.payslip.line,base:0
-msgid "Formula"
-msgstr "Fórmula"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr "Líneas de notificación bancaria"
+#: selection:hr.contract,schedule_pay:0
+msgid "Semi-annually"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.allounce.deduction.categoty,type:0
-#: field:hr.payslip.line,type:0
-#: report:salary.structure:0
-msgid "Type"
-msgstr "Tipo"
+#: view:hr.salary.rule:0
+msgid "Children Definition"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
+#: report:paylip.details:0 report:payslip:0
msgid "Email"
-msgstr "Correo electrónico"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "#"
-msgstr "#"
+#: view:hr.payslip.run:0
+msgid "Search Payslip Batches"
+msgstr ""
#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:469
-#: code:addons/hr_payroll/hr_payroll.py:1225
-#, python-format
-msgid "Error !"
-msgstr "¡ Error !"
+#: field:hr.payslip.line,amount_percentage_base:0
+#: field:hr.salary.rule,amount_percentage_base:0
+msgid "Percentage based on"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-#: view:hr.payslip:0
-msgid "Verify Sheet"
-msgstr "Comprobar hoja"
+#: help:hr.payslip.line,amount_percentage:0
+#: help:hr.salary.rule,amount_percentage:0
+msgid "For example, enter 50.0 to apply a percentage of 50%"
+msgstr ""
#. module: hr_payroll
-#: help:hr.contract,working_days_per_week:0
-msgid "No of Working days / week for an employee"
-msgstr "Número de días/semanas trabajados para un empleado."
+#: field:hr.payslip,paid:0
+msgid "Made Payment Order ? "
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "New Slip"
-msgstr "Nuevo justificante"
+#: report:contribution.register.lines:0
+msgid "PaySlip Lines by Contribution Register"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip,basic:0
-msgid "Net Basic"
-msgstr "Base neta"
+#: help:hr.payslip,state:0
+msgid ""
+"* When the payslip is created the state is 'Draft'. \n"
+"* If the payslip is under verification, the state is 'Waiting'. "
+"\n"
+"* If the payslip is confirmed then state is set to 'Done'. \n"
+"* When user cancel payslip the state is 'Rejected'."
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,gross:0
-#: field:hr.employee,gross:0
-#: field:hr.payroll.register,grows:0
-#: field:hr.payslip,grows:0
-#: report:salary.structure:0
-msgid "Gross Salary"
-msgstr "Salario bruto"
+#: field:hr.payslip.worked_days,number_of_days:0
+msgid "Number of Days"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Total Earnings"
-msgstr "Ingresos totales"
+#: selection:hr.payslip,state:0
+msgid "Rejected"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_hr_payroll_employees_detail
-#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_employees_detail
-msgid "Employee Salary Statement"
-msgstr "Declaración salario del empleado"
+#: view:hr.payroll.structure:0 field:hr.payroll.structure,rule_ids:0
+#: view:hr.salary.rule:0
+#: model:ir.actions.act_window,name:hr_payroll.action_salary_rule_form
+#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_salary_rule_form
+msgid "Salary Rules"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Other Payment"
-msgstr "Otros pagos"
+#: code:addons/hr_payroll/hr_payroll.py:337
+#, python-format
+msgid "Refund: "
+msgstr ""
#. module: hr_payroll
-#: field:hr.employee,advantages_net:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
-msgid "Deductions"
-msgstr "Deducciones"
+#: model:ir.model,name:hr_payroll.model_payslip_lines_contribution_register
+msgid "PaySlip Lines by Contribution Registers"
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr "C/D"
+#: view:hr.payslip:0 selection:hr.payslip,state:0 view:hr.payslip.run:0
+msgid "Done"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,permit_no:0
-msgid "Work Permit No"
-msgstr "Nº permiso trabajo"
+#: field:hr.payslip.line,appears_on_payslip:0
+#: field:hr.salary.rule,appears_on_payslip:0
+msgid "Appears on Payslip"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr "Salario empleado"
+#: field:hr.payslip.line,amount_fix:0
+#: selection:hr.payslip.line,amount_select:0 field:hr.salary.rule,amount_fix:0
+#: selection:hr.salary.rule,amount_select:0
+msgid "Fixed Amount"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-msgid "Chaque Nos"
-msgstr "Cada uno de nuestros"
+#: help:hr.payslip.line,active:0 help:hr.salary.rule,active:0
+msgid ""
+"If the active field is set to false, it will allow you to hide the salary "
+"rule without removing it."
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register,monthly_total_by_emp:0
-msgid "Total By Employee"
-msgstr "Total por empleado"
+#: view:hr.payslip:0
+msgid "Worked Days & Inputs"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: selection:company.contribution,amount_type:0
-#: selection:company.contribution.line,amount_type:0
-#: selection:hr.payslip.line,amount_type:0
-#: selection:hr.payslip.line.line,amount_type:0
-msgid "Fixed Amount"
-msgstr "Importe fijo"
+#: field:hr.payslip,details_by_salary_rule_category:0
+msgid "Details by Salary Rule Category"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution.line,to_val:0
-#: report:employees.salary:0
-#: field:hr.payslip.line.line,to_val:0
-#: report:year.salary:0
-msgid "To"
-msgstr "Para"
+#: model:ir.actions.act_window,name:hr_payroll.action_payslip_lines_contribution_register
+msgid "PaySlip Lines"
+msgstr ""
#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:180
-#: code:addons/hr_payroll/hr_payroll.py:195
-#: code:addons/hr_payroll/hr_payroll.py:285
-#: code:addons/hr_payroll/hr_payroll.py:835
-#: code:addons/hr_payroll/hr_payroll.py:1111
-#: code:addons/hr_payroll/hr_payroll.py:1126
-#: code:addons/hr_payroll/hr_payroll.py:1410
-#, python-format
-msgid "Variable Error !"
-msgstr "¡Error de variable!"
+#: help:hr.payslip.line,register_id:0 help:hr.salary.rule,register_id:0
+msgid "Eventual third party involved in the salary payment of the employees."
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payroll_employees_detail
-msgid "hr.payroll.employees.detail"
-msgstr "rrhh.nomina.empleados.detalle"
+#: field:hr.payslip.worked_days,number_of_hours:0
+msgid "Number of Hours"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
#: view:hr.payslip:0
-msgid "Pay Salary"
-msgstr "Pagar nómina"
+msgid "PaySlip Batch"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice.line,name:0
-msgid "Bank Account A/C"
-msgstr "Cuenta bancaria"
+#: field:hr.payslip.line,condition_range_min:0
+#: field:hr.salary.rule,condition_range_min:0
+msgid "Minimum Range"
+msgstr ""
#. module: hr_payroll
-#: view:hr.contibution.register:0
-msgid "Contribution Lines"
-msgstr "Líneas de contribución"
+#: field:hr.payslip.line,child_ids:0 field:hr.salary.rule,child_ids:0
+msgid "Child Salary Rule"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "For the month of"
-msgstr "Para el mes de"
+#: report:contribution.register.lines:0 field:hr.payslip,date_to:0
+#: field:hr.payslip.run,date_end:0 report:paylip.details:0 report:payslip:0
+#: field:payslip.lines.contribution.register,date_to:0
+msgid "Date To"
+msgstr ""
#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-#: selection:hr.allounce.deduction.categoty,type:0
-#: field:hr.payroll.register,deduction:0
-#: report:hr.payroll.register.sheet:0
-#: field:hr.payslip,deduction:0
-#: selection:hr.payslip.line,type:0
-msgid "Deduction"
-msgstr "Deducción"
+#: selection:hr.payslip.line,condition_select:0
+#: selection:hr.salary.rule,condition_select:0
+msgid "Range"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice Note"
-msgstr "Observación aviso bancario"
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_tree
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_structure_tree
+msgid "Salary Structures Hierarchy"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
#: view:hr.payslip:0
msgid "Payslip"
-msgstr "Nómina"
+msgstr ""
#. module: hr_payroll
#: constraint:hr.contract:0
msgid "Error! contract start-date must be lower then contract end-date."
msgstr ""
-"¡Error! La fecha de inicio de contrato debe ser menor que la fecha de "
-"finalización."
-
-#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Loan Installment"
-msgstr "Entrega anticipo"
-
-#. module: hr_payroll
-#: view:hr.payroll.register:0
-msgid "Complete HR Checking"
-msgstr "Comprobación RH completa"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr "Atentamente"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr "Nº SS"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Net Amount"
-msgstr "Importe neto"
-
-#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Salary Structure:"
-msgstr "Estructura salarial:"
-
-#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.year_employees_detail
-msgid "Employees Salary Detail"
-msgstr "Detalle salario empleado"
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payslip_line_line
-msgid "Function Line"
-msgstr "Línea de función"
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Confirm Sheet"
-msgstr "Hoja de confirmación"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Others:"
-msgstr "Otros:"
+#: view:hr.contract:0
+msgid "Payslip Info"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: selection:company.contribution,amount_type:0
-msgid "Function Calculation"
-msgstr "Función de cálculo"
+#: model:ir.actions.act_window,name:hr_payroll.act_payslip_lines
+msgid "Payslip Computation Details"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip,worked_days:0
-#: report:payslip.pdf:0
-msgid "Worked Day"
-msgstr "Días trabajados"
+#: code:addons/hr_payroll/hr_payroll.py:872
+#, python-format
+msgid "Wrong python code defined for salary rule %s (%s) "
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register,monthly_total_by_comp:0
-msgid "Total By Company"
-msgstr "Total por compañía"
+#: model:ir.model,name:hr_payroll.model_hr_payslip_input
+msgid "Payslip Input"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice.line,flag:0
-msgid "D/C"
-msgstr "D/C"
+#: view:hr.salary.rule.category:0
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_salary_rule_category
+msgid "Salary Rule Categories"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Country & Address"
-msgstr "País y Dirección"
+#: help:hr.payslip.input,contract_id:0
+#: help:hr.payslip.worked_days,contract_id:0
+msgid "The contract for which applied this input"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Employee Code"
-msgstr "Código de empleado"
+#: view:hr.salary.rule:0
+msgid "Computation"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Basic Salary – Leaves"
-msgstr "Salario base - Ausencias"
+#: help:hr.payslip.input,amount:0
+msgid ""
+"It is used in computation. For e.g. A rule for sales having 1% commission of "
+"basic salary for per product can defined in expression like result = "
+"inputs.SALEURO.amount * contract.wage*0.01."
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,amount_type:0
-#: field:company.contribution.line,amount_type:0
-#: field:hr.payslip.line,amount_type:0
-#: field:hr.payslip.line.line,amount_type:0
-#: report:salary.structure:0
+#: view:hr.payslip.line:0 field:hr.payslip.line,amount_select:0
+#: field:hr.salary.rule,amount_select:0
msgid "Amount Type"
-msgstr "Tipo de importe"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: field:hr.payslip.line,category_id:0
+#: field:hr.payslip.line,category_id:0 view:hr.salary.rule:0
+#: field:hr.salary.rule,category_id:0
msgid "Category"
-msgstr "Categoría"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.payslip.line,company_contrib:0
-#: model:ir.model,name:hr_payroll.model_company_contribution
-msgid "Company Contribution"
-msgstr "Contribución compañía"
+#: help:hr.payslip.run,credit_note:0
+msgid ""
+"If its checked, indicates that all payslips generated from here are refund "
+"payslips."
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,category_id:0
-msgid "Heads"
-msgstr "Cabeceras"
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_list_form
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_structure_view
+msgid "Salary Structures"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.year_payroll_register
-msgid "Print Statement"
-msgstr "Imprimir declaración"
+#: view:hr.payslip.run:0
+msgid "Draft Payslip Batches"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payslip:0
+#: view:hr.payslip:0 selection:hr.payslip,state:0 view:hr.payslip.run:0
+#: selection:hr.payslip.run,state:0
msgid "Draft"
-msgstr "Borrador"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Earnings"
-msgstr "Ingresos"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: report:salary.structure:0
-msgid "Basic"
-msgstr "Básico"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_hr_passport_tree
-msgid "All Passports"
-msgstr "Todos los pasaportes"
+#: report:contribution.register.lines:0 field:hr.payslip,date_from:0
+#: field:hr.payslip.run,date_start:0 report:paylip.details:0 report:payslip:0
+#: field:payslip.lines.contribution.register,date_from:0
+msgid "Date From"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_hr_payroll_year_salary
-#: model:ir.ui.menu,name:hr_payroll.menu_wizard_print_year_salary
-msgid "Salary Register"
-msgstr "Registro salarial"
+#: view:hr.payslip.run:0
+msgid "Done Payslip Batches"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: report:hr.payroll.register.sheet:0
-msgid "Employee Name"
-msgstr "Nombre del empleado"
+#: report:paylip.details:0
+msgid "Payslip Lines by Contribution Register:"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_passport
-msgid "Passport Detail"
-msgstr "Detalle pasaporte"
+#: view:hr.salary.rule:0
+msgid "Conditions"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payslip.line,amount_type:0
+#: field:hr.payslip.line,amount_percentage:0
+#: selection:hr.payslip.line,amount_select:0
+#: field:hr.salary.rule,amount_percentage:0
+#: selection:hr.salary.rule,amount_select:0
msgid "Percentage (%)"
-msgstr "Porcentaje (%)"
-
-#. module: hr_payroll
-#: field:hr.payroll.advice,register_id:0
-#: view:hr.payroll.register:0
-#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_register_form
-#: model:ir.model,name:hr_payroll.model_hr_payroll_register
-#: model:ir.ui.menu,name:hr_payroll.hr_menu_payroll_register
-msgid "Payroll Register"
-msgstr "Registro de nóminas"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: report:payroll.advice:0
-msgid "For"
-msgstr "Para"
+msgstr ""
#. module: hr_payroll
-#: field:hr.passport,contracts_ids:0
-msgid "Contracts"
-msgstr "Contratos"
+#: view:hr.payslip:0
+msgid "Worked Day"
+msgstr ""
#. module: hr_payroll
#: view:hr.payroll.structure:0
msgid "Employee Function"
-msgstr "Función del empleado"
-
-#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Paid"
-msgstr "Pagado"
-
-#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Approve Sheet"
-msgstr "Aprobar hoja"
-
-#. module: hr_payroll
-#: field:hr.payslip,paid:0
-msgid "Paid ? "
-msgstr "¿Pagado? "
-
-#. module: hr_payroll
-#: view:hr.holidays.status:0
-msgid "Validation"
-msgstr "Validación"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Title"
-msgstr "Título"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-msgid "Search Company Contribution"
-msgstr "Buscar contribución de la compañía"
-
-#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,user_id:0
-msgid "User"
-msgstr "Usuario"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr "Líneas de pago"
+#: field:hr.payslip,credit_note:0 field:hr.payslip.run,credit_note:0
+msgid "Credit Note"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
msgid "Compute Sheet"
-msgstr "Calcular hoja"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,active:0
-#: field:hr.payroll.register,active:0
+#: field:hr.payslip.line,active:0 field:hr.salary.rule,active:0
msgid "Active"
-msgstr "Activo"
-
-#. module: hr_payroll
-#: help:hr.allounce.deduction.categoty,condition:0
-msgid "Applied this head for calculation if condition is true"
-msgstr "Aplicar este encabezado en el cálculo si la condición es verdadera"
+msgstr ""
#. module: hr_payroll
-#: report:year.salary:0
-msgid "Yearly Salary Details"
-msgstr "Detalles del salario anual"
+#: view:hr.salary.rule:0
+msgid "Child Rules"
+msgstr ""
#. module: hr_payroll
#: constraint:hr.employee:0
msgid "Error ! You cannot create recursive Hierarchy of Employees."
-msgstr "¡Error! No se puede crear una jerarquía recursiva de empleados."
-
-#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,condition:0
-msgid "Condition"
-msgstr "Condición"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Wating for HR Verification"
-msgstr "Esperando verificación de RRHH"
+#: model:ir.actions.report.xml,name:hr_payroll.payslip_details_report
+msgid "PaySlip Details"
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice:"
-msgstr "Aviso de pago:"
+#: help:hr.payslip.line,condition_range_min:0
+#: help:hr.salary.rule,condition_range_min:0
+msgid "The minimum amount, applied for this rule."
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-msgid "Compute"
-msgstr "Calcular"
+#: selection:hr.payslip.line,condition_select:0
+#: selection:hr.salary.rule,condition_select:0
+msgid "Python Expression"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: field:hr.payslip,deg_id:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
+#: report:paylip.details:0 report:payslip:0
msgid "Designation"
-msgstr "Designación"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "HR Manager"
-msgstr "Responsable de RRHH"
-
-#. module: hr_payroll
-#: field:hr.contract,basic:0
-#: field:hr.employee,basic:0
-#: field:hr.payslip,basic_before_leaves:0
-#: report:payslip.pdf:0
-msgid "Basic Salary"
-msgstr "Salario base"
-
-#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,code:0
-msgid "Category Code"
-msgstr "Código categoría"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-msgid "Salary Information"
-msgstr "Información del salario"
+#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52
+#, python-format
+msgid "You must select employee(s) to generate payslip(s)"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty
-#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty_line
-msgid "Allowance Deduction Categoty"
-msgstr "Categoría prima/deducción"
+#: code:addons/hr_payroll/hr_payroll.py:861
+#, python-format
+msgid "Wrong quantity defined for salary rule %s (%s)"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
msgid "Companies"
-msgstr "Compañías"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
+#: report:paylip.details:0 report:payslip:0
msgid "Authorized Signature"
-msgstr "Firma autorizada"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip,contract_id:0
+#: field:hr.payslip,contract_id:0 field:hr.payslip.input,contract_id:0
+#: field:hr.payslip.line,contract_id:0
+#: field:hr.payslip.worked_days,contract_id:0
#: model:ir.model,name:hr_payroll.model_hr_contract
msgid "Contract"
-msgstr "Contrato"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.advice,state:0
-msgid "Draft Sheet"
-msgstr "Hoja borrador"
+#: report:paylip.details:0 report:payslip:0
+msgid "Credit"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.year.salary,salary_on:0
-msgid "Next Month Date"
-msgstr "Fecha próximo mes"
+#: field:hr.contract,schedule_pay:0
+msgid "Scheduled Pay"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register.line,date:0
-#: field:hr.payroll.advice,date:0
-#: field:hr.payroll.register,date:0
-#: field:hr.payslip,date:0
-msgid "Date"
-msgstr "Fecha"
+#: code:addons/hr_payroll/hr_payroll.py:861
+#: code:addons/hr_payroll/hr_payroll.py:866
+#: code:addons/hr_payroll/hr_payroll.py:872
+#: code:addons/hr_payroll/hr_payroll.py:889
+#: code:addons/hr_payroll/hr_payroll.py:895
+#, python-format
+msgid "Error"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,visa_expire:0
-msgid "Visa Expire Date"
-msgstr "Fecha expiración visado"
+#: field:hr.payslip.line,condition_python:0
+#: field:hr.salary.rule,condition_python:0
+msgid "Python Condition"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Search Passport"
-msgstr "Buscar pasaporte"
+#: view:hr.contribution.register:0
+msgid "Contribution"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: report:salary.structure:0
-msgid "Phone No."
-msgstr "Nº Teléfono"
+#: code:addons/hr_payroll/hr_payroll.py:347
+#, python-format
+msgid "Refund Payslip"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,contribute_per:0
-#: field:company.contribution.line,contribution_id:0
-#: view:hr.allounce.deduction.categoty:0
-#: view:hr.contibution.register:0
-#: view:hr.contibution.register.line:0
-msgid "Contribution"
-msgstr "Contribución"
+#: field:hr.rule.input,input_id:0
+#: model:ir.model,name:hr_payroll.model_hr_rule_input
+msgid "Salary Rule Input"
+msgstr ""
#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,state:0
-msgid "Label"
-msgstr "Etiqueta"
+#: code:addons/hr_payroll/hr_payroll.py:895
+#, python-format
+msgid "Wrong python condition defined for salary rule %s (%s)"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,quantity:0 field:hr.salary.rule,quantity:0
+msgid "Quantity"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.structure:0
#: view:hr.payslip:0
-#: view:hr.payslip.line:0
-msgid "Company Contribution"
-msgstr "Contribución compañía"
+msgid "Refund"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: report:salary.structure:0
-msgid "Other No."
-msgstr "Otro Nº"
+#: view:hr.salary.rule:0
+msgid "Company Contribution"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,code:0
-#: field:hr.contibution.register.line,code:0
-#: field:hr.holidays.status,code:0
-#: field:hr.payroll.structure,code:0
-#: field:hr.payslip.line,code:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
+#: report:contribution.register.lines:0 field:hr.payslip.input,code:0
+#: field:hr.payslip.line,code:0 field:hr.payslip.worked_days,code:0
+#: field:hr.rule.input,code:0 field:hr.salary.rule,code:0
+#: field:hr.salary.rule.category,code:0 report:paylip.details:0
+#: report:payslip:0
msgid "Code"
-msgstr "Código"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:hr_payroll.hr_menu_payment_advice
-msgid "Payment Advice"
-msgstr "Aviso de pago"
+#: field:hr.payslip.line,amount_python_compute:0
+#: selection:hr.payslip.line,amount_select:0
+#: field:hr.salary.rule,amount_python_compute:0
+#: selection:hr.salary.rule,amount_select:0
+msgid "Python Code"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Number :"
-msgstr "Número :"
+#: field:hr.payslip.input,sequence:0 field:hr.payslip.line,sequence:0
+#: field:hr.payslip.worked_days,sequence:0 field:hr.salary.rule,sequence:0
+msgid "Sequence"
+msgstr ""
#. module: hr_payroll
-#: help:hr.allounce.deduction.categoty,base:0
-msgid ""
-"This will use to computer the % fields values, in general its on basic, but "
-"You can use all heads code field in small letter as a variable name i.e. "
-"hra, ma, lta, etc...., also you can use, static varible basic"
+#: report:contribution.register.lines:0 report:paylip.details:0
+msgid "Register Name"
msgstr ""
-"Esto se utiliza para calcular los valores de los campos %, en general en su "
-"base, pero puede utilizar todas las cabeceras de los campos de código en "
-"letra pequeña como un nombre de variable, por ejemplo hra, ma, lta, etc., "
-"también puede utilizar variable estática básica."
#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Computation Overview"
-msgstr "Resumen del cálculo"
+#: view:hr.salary.rule:0
+msgid "General"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.year.salary,salary_on:0
-msgid "Salary On"
-msgstr "Salario sobre"
+#: code:addons/hr_payroll/hr_payroll.py:664
+#, python-format
+msgid "Salary Slip of %s for %s"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice,number:0
-#: field:hr.payroll.register,number:0
-#: field:hr.payslip,number:0
-msgid "Number"
-msgstr "Número"
+#: model:ir.model,name:hr_payroll.model_hr_payslip_employees
+msgid "Generate payslips for all selected employees"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,struct_id:0
-#: field:hr.employee,line_ids:0
-#: view:hr.payroll.structure:0
-#: field:hr.payroll.structure,line_ids:0
-#: view:hr.payslip:0
+#: field:hr.contract,struct_id:0 view:hr.payroll.structure:0 view:hr.payslip:0
#: view:hr.payslip.line:0
-#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_employee_grade_form
-#: model:ir.actions.report.xml,name:hr_payroll.salary_structure_register
#: model:ir.model,name:hr_payroll.model_hr_payroll_structure
-#: model:ir.ui.menu,name:hr_payroll.menu_hr_employee_function
msgid "Salary Structure"
-msgstr "Estructura salarial"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register,register_line_ids:0
+#: field:hr.contribution.register,register_line_ids:0
msgid "Register Line"
-msgstr "Línea registro"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-#: view:hr.payslip:0
+#: view:hr.payslip:0 view:hr.payslip.employees:0
+#: view:payslip.lines.contribution.register:0
msgid "Cancel"
-msgstr "Cancelar"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.employees.detail:0
-#: view:hr.payroll.year.salary:0
+#: view:hr.payslip.run:0 selection:hr.payslip.run,state:0
msgid "Close"
-msgstr "Cerrar"
-
-#. module: hr_payroll
-#: field:hr.payslip.line,amount:0
-msgid "Amount / Percentage"
-msgstr "Importe / Porcentaje"
-
-#. module: hr_payroll
-#: field:hr.employee,advantages_gross:0
-#: report:hr.payroll.register.sheet:0
-#: report:salary.structure:0
-msgid "Allowances"
-msgstr "Primas"
-
-#. module: hr_payroll
-#: selection:hr.payroll.year.salary,salary_on:0
-msgid "Current Month Date"
-msgstr "Fecha mes actual"
+msgstr ""
#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Salary"
-msgstr "Salario"
+#: help:hr.payslip,struct_id:0
+msgid ""
+"Defines the rules that have to be applied to this payslip, accordingly to "
+"the contract chosen. If you let empty the field contract, this field isn't "
+"mandatory anymore and thus the rules applied will be all the rules set on "
+"the structure of all contracts of the employee valid for the chosen period"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,passport_id:0
-#: field:hr.passport,name:0
-msgid "Passport No"
-msgstr "Número de pasaporte"
+#: field:hr.payroll.structure,children_ids:0
+#: field:hr.salary.rule.category,children_ids:0
+msgid "Children"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Passport"
-msgstr "Pasaporte"
+#: help:hr.payslip,credit_note:0
+msgid "Indicates this payslip has a refund of another"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Total Salary"
-msgstr "Salario total"
+#: selection:hr.contract,schedule_pay:0
+msgid "Bi-monthly"
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "for period"
-msgstr "por periodo"
+#: report:paylip.details:0
+msgid "Pay Slip Details"
+msgstr ""
#. module: hr_payroll
-#: field:hr.holidays.status,head_id:0
-msgid "Payroll Head"
-msgstr "Cabecera nómina"
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payslip_form
+#: model:ir.ui.menu,name:hr_payroll.menu_department_tree
+msgid "Employee Payslips"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,register_id:0
-#: model:ir.actions.act_window,name:hr_payroll.action_contibution_register_form
-#: model:ir.model,name:hr_payroll.model_hr_contibution_register
-#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_contibution_register_form
+#: view:hr.payslip.line:0 field:hr.payslip.line,register_id:0
+#: field:hr.salary.rule,register_id:0
+#: model:ir.model,name:hr_payroll.model_hr_contribution_register
msgid "Contribution Register"
-msgstr "Registro de contribución"
+msgstr ""
#. module: hr_payroll
-#: report:salary.structure:0
-msgid "E-mail"
-msgstr "Correo electrónico"
+#: view:payslip.lines.contribution.register:0
+msgid "Print"
+msgstr ""
#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-#: model:ir.actions.act_window,name:hr_payroll.hr_allounce_deduction_tree
-#: model:ir.ui.menu,name:hr_payroll.menu_hr_allounce_deduction_tree
-msgid "Salary Heads"
-msgstr "Cabeceras salario"
+#: model:ir.actions.act_window,help:hr_payroll.action_contribution_register_form
+msgid ""
+"A contribution register is a third party involved in the salary payment of "
+"the employees. It can be the social security, the estate or anyone that "
+"collect or inject money on payslips."
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.employees.detail:0
-#: view:hr.payroll.year.salary:0
-msgid "Print Report"
-msgstr "Imprimir informe"
+#: code:addons/hr_payroll/hr_payroll.py:889
+#, python-format
+msgid "Wrong range condition defined for salary rule %s (%s)"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,line_ids:0
-#: view:hr.payroll.structure:0
-#: view:hr.payslip:0
#: view:hr.payslip.line:0
-#: field:hr.payslip.line,line_ids:0
msgid "Calculations"
-msgstr "Cálculos"
-
-#. module: hr_payroll
-#: help:company.contribution,contribute_per:0
-msgid ""
-"Define Company contribution ratio 1.00=100% contribution, If Employee "
-"Contribute 5% then company will and here 0.50 defined then company will "
-"contribute 50% on employee 5% contribution"
msgstr ""
-"Define el ratio de contribución de la compañía 1,00=100% de la contribución. "
-"Si el empleado contribuye con el 5%, entonces si aquí la compañía tiene un "
-"ratio de 0.50, la compañía contribuirá con el 50% del 5% de la contribución "
-"del empleado."
-
-#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Other Informations"
-msgstr "Otra información"
#. module: hr_payroll
-#: view:hr.contibution.register:0
-msgid "Month"
-msgstr "Mes"
-
-#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Issue"
-msgstr "Incidencia"
-
-#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-msgid "Dynamic Computation"
-msgstr "Cálculo Dinámico"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Basic Salary without Leave:"
-msgstr "Salario base sin ausencias:"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: view:hr.payroll.structure:0
#: view:hr.payslip:0
-#: view:hr.payslip.line:0
-#: field:hr.payslip.line,function_id:0
-msgid "Function"
-msgstr "Función"
+msgid "Worked Days"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
-msgid "States"
-msgstr "Estados"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Apreciado Sr./Sra.,"
-
-#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty
-msgid "Allowance Deduction Heads"
-msgstr "Cabeceras prima/deducción"
+msgid "Search Payslips"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Gross Sal."
-msgstr "Sal. bruto"
+#: view:hr.payslip.run:0
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_payslip_run_tree
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_payslip_run
+msgid "Payslips Batches"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: field:company.contribution,note:0
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.allounce.deduction.categoty,note:0
-#: view:hr.contibution.register:0
-#: field:hr.contibution.register,note:0
-#: view:hr.passport:0
-#: field:hr.passport,note:0
-#: field:hr.payroll.advice,note:0
-#: field:hr.payroll.register,note:0
-#: view:hr.payroll.structure:0
-#: field:hr.payroll.structure,note:0
-#: view:hr.payslip:0
-#: field:hr.payslip,note:0
-#: view:hr.payslip.line:0
-#: field:hr.payslip.line,note:0
+#: view:hr.contribution.register:0 field:hr.contribution.register,note:0
+#: field:hr.payroll.structure,note:0 field:hr.payslip,name:0
+#: field:hr.payslip,note:0 field:hr.payslip.input,name:0
+#: view:hr.payslip.line:0 field:hr.payslip.line,note:0
+#: field:hr.payslip.worked_days,name:0 field:hr.rule.input,name:0
+#: view:hr.salary.rule:0 field:hr.salary.rule,note:0
+#: field:hr.salary.rule.category,note:0
msgid "Description"
-msgstr "Descripción"
-
-#. module: hr_payroll
-#: field:hr.payroll.employees.detail,date_from:0
-#: field:hr.payroll.year.salary,date_from:0
-#: report:salary.structure:0
-msgid "Start Date"
-msgstr "Fecha inicio"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Deduction -"
-msgstr "Deducción -"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
+#: report:paylip.details:0 report:payslip:0
msgid ")"
-msgstr ")"
+msgstr ""
#. module: hr_payroll
-#: view:hr.contibution.register:0
+#: view:hr.contribution.register:0
+#: model:ir.actions.act_window,name:hr_payroll.action_contribution_register_form
+#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_contribution_register_form
msgid "Contribution Registers"
-msgstr "Registros de contribución"
+msgstr ""
#. module: hr_payroll
#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_reporting
#: model:ir.ui.menu,name:hr_payroll.menu_hr_root_payroll
#: model:ir.ui.menu,name:hr_payroll.payroll_configure
msgid "Payroll"
-msgstr "Nómina"
-
-#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_contract_wage_type
-msgid "Wage Type"
-msgstr "Tipo de salario"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Net Sal."
-msgstr "Sal. neto"
-
-#. module: hr_payroll
-#: sql_constraint:hr.passport:0
-msgid "The Passport No must be unique !"
-msgstr "¡El número de pasaporte debe ser único!"
+msgstr ""
#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,name:0
-msgid "Category Name"
-msgstr "Nombre categoría"
+#: model:ir.actions.report.xml,name:hr_payroll.contribution_register
+msgid "PaySlip Lines By Conribution Register"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payroll_year_salary
-msgid "hr.payroll.year.salary"
-msgstr "hr.nómina.año.salario"
+#: selection:hr.payslip,state:0
+msgid "Waiting"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: field:hr.passport,address_id:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
+#: report:paylip.details:0 report:payslip:0
msgid "Address"
-msgstr "Dirección"
-
-#. module: hr_payroll
-#: field:hr.payslip.line.line,slipline_id:0
-msgid "Slip Line"
-msgstr "Línea justificante"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Number of Leaves"
-msgstr "Número de hojas"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-#: field:hr.payroll.advice,bank_id:0
-#: field:hr.payroll.register,bank_id:0
-#: report:salary.structure:0
-msgid "Bank"
-msgstr "Banco"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Cancel Sheet"
-msgstr "Cancelar hoja"
+#: code:addons/hr_payroll/hr_payroll.py:866
+#, python-format
+msgid "Wrong percentage base or quantity defined for salary rule %s (%s)"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Advance"
-msgstr "Adelanto"
+#: field:hr.payslip,worked_days_line_ids:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip_worked_days
+msgid "Payslip Worked Days"
+msgstr ""
#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Special Allowances and Deductions For Employee:"
-msgstr "Primas y deducciones especiales por empleado:"
+#: view:hr.salary.rule.category:0
+msgid "Salary Categories"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,name:0
-#: field:company.contribution.line,name:0
-#: field:hr.contibution.register,name:0
-#: field:hr.contibution.register.line,name:0
-#: field:hr.payroll.advice,name:0
-#: field:hr.payroll.register,name:0
-#: field:hr.payroll.structure,name:0
-#: field:hr.payslip,name:0
-#: field:hr.payslip.line,name:0
-#: field:hr.payslip.line.line,name:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
-#: report:year.salary:0
+#: report:contribution.register.lines:0 field:hr.contribution.register,name:0
+#: field:hr.payroll.structure,name:0 field:hr.payslip.line,name:0
+#: field:hr.payslip.run,name:0 field:hr.salary.rule,name:0
+#: field:hr.salary.rule.category,name:0 report:paylip.details:0
+#: report:payslip:0
msgid "Name"
-msgstr "Nombre"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Leaved Deduction"
-msgstr "Hojas de deducción"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Country"
-msgstr "País"
+#: view:hr.payroll.structure:0
+msgid "Payroll Structures"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-#: view:hr.payroll.employees.detail:0
-#: field:hr.payroll.employees.detail,employee_ids:0
-#: view:hr.payroll.year.salary:0
-#: field:hr.payroll.year.salary,employee_ids:0
-#: view:hr.payslip:0
+#: view:hr.payslip:0 view:hr.payslip.employees:0
+#: field:hr.payslip.employees,employee_ids:0 view:hr.payslip.line:0
msgid "Employees"
-msgstr "Empleados"
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
+#: report:paylip.details:0 report:payslip:0
msgid "Bank Account"
-msgstr "Cuenta bancaria"
-
-#. module: hr_payroll
-#: help:company.contribution,register_id:0
-msgid "Contribution register based on company"
-msgstr "Registro de contribución basado en la empresa"
+msgstr ""
#. module: hr_payroll
-#: help:hr.allounce.deduction.categoty,sequence:0
+#: help:hr.payslip.line,sequence:0 help:hr.salary.rule,sequence:0
msgid "Use to arrange calculation sequence"
-msgstr "Se utiliza para organizar la secuencia de cálculo"
-
-#. module: hr_payroll
-#: field:hr.payslip,total_pay:0
-msgid "Total Payment"
-msgstr "Pago total"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Leave Deductions Line:"
-msgstr "Línea de deducciones por ausencias:"
-
-#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Wating for Account Verification"
-msgstr "Esperando por verificación de la cuenta"
-
-#. module: hr_payroll
-#: field:hr.contibution.register.line,comp_deduction:0
-msgid "Company Deduction"
-msgstr "Deducción de la Compañía"
-
-#. module: hr_payroll
-#: view:hr.holidays.status:0
-msgid "Payroll Configurtion"
-msgstr "Configuración nómina"
+msgstr ""
#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:469
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr "Por favor, defina la cuenta bancaria para el empleado %s"
+#: help:hr.payslip.line,condition_range:0
+#: help:hr.salary.rule,condition_range:0
+msgid ""
+"This will be used to compute the % fields values; in general it is on basic, "
+"but you can also use categories code fields in lowercase as a variable names "
+"(hra, ma, lta, etc.) and the variable basic."
+msgstr ""
#. module: hr_payroll
-#: field:hr.passport,date_issue:0
-msgid "Passport Issue Date"
-msgstr "Fecha de emisión del pasaporte"
+#: selection:hr.contract,schedule_pay:0
+msgid "Annually"
+msgstr ""
#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-#: selection:hr.allounce.deduction.categoty,type:0
-#: field:hr.payroll.register,allounce:0
-#: field:hr.payslip,allounce:0
-#: selection:hr.payslip.line,type:0
-msgid "Allowance"
-msgstr "Prima"
+#: field:hr.payslip,input_line_ids:0
+msgid "Payslip Inputs"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip,holiday_days:0
-msgid "No of Leaves"
-msgstr "N º de hojas"
+#: field:hr.payslip.line,salary_rule_id:0
+msgid "Rule"
+msgstr ""
#. module: hr_payroll
-#: field:hr.employee,otherid:0
-msgid "Other Id"
-msgstr "Otro id"
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category_tree_view
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_salary_rule_category_tree_view
+msgid "Salary Rule Categories Hierarchy"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Bank Details"
-msgstr "Detalles bancarios"
+#: report:contribution.register.lines:0 field:hr.payslip.line,total:0
+#: report:paylip.details:0 report:payslip:0
+msgid "Total"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Slip ID"
-msgstr "ID justificante"
+#: help:hr.payslip.line,appears_on_payslip:0
+#: help:hr.salary.rule,appears_on_payslip:0
+msgid "Used for the display of rule on payslip"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution.line,sequence:0
-#: field:hr.allounce.deduction.categoty,sequence:0
-#: field:hr.payslip.line,sequence:0
-#: field:hr.payslip.line.line,sequence:0
-msgid "Sequence"
-msgstr "Secuencia"
+#: view:hr.payslip.line:0
+msgid "Search Payslip Lines"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payslip_form
-#: model:ir.ui.menu,name:hr_payroll.menu_department_tree
-msgid "Employee Payslip"
-msgstr "Nómina de los empleados"
+#: view:hr.payslip:0
+msgid "Details By Salary Rule Category"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Content"
-msgstr "Contenido carta"
+#: help:hr.payslip.input,code:0 help:hr.payslip.worked_days,code:0
+#: help:hr.rule.input,code:0
+msgid "The code that can be used in the salary rules"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.employees.detail:0
-#: view:hr.payroll.year.salary:0
-msgid "Year Salary"
-msgstr "Salario anual"
+#: view:hr.payslip.run:0
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_payslip_by_employees
+msgid "Generate Payslips"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-msgid "Allowance / Deduction"
-msgstr "Prima / Deducción"
+#: selection:hr.contract,schedule_pay:0
+msgid "Bi-weekly"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.payroll_advice
-msgid "Bank Payment Advice"
-msgstr "Aviso de pago del banco"
+#: field:hr.employee,total_wage:0
+msgid "Total Basic Salary"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Search Payslips"
-msgstr "Buscar nóminas"
+#: selection:hr.payslip.line,condition_select:0
+#: selection:hr.salary.rule,condition_select:0
+msgid "Always True"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: field:hr.contibution.register.line,total:0
-#: report:year.salary:0
-msgid "Total"
-msgstr "Total"
+#: report:contribution.register.lines:0
+msgid "PaySlip Name"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.allounce.deduction.categoty,contribute_ids:0
-msgid "Contributions"
-msgstr "Contribuciones"
-
-#~ msgid "Categoty Code"
-#~ msgstr "Código de categoría"
-
-#~ msgid "Categoty Name"
-#~ msgstr "Nombre categoría"
-
-#~ msgid "Invalid model name in the action definition."
-#~ msgstr "Nombre del modelo inválido en la definición de acción."
-
-#~ msgid "Analytic Account for Salary Analysis"
-#~ msgstr "Cuenta analítica para análisis de nóminas"
-
-#~ msgid "Employee No"
-#~ msgstr "Núm. trabajador"
-
-#~ msgid "Employee Payable Account"
-#~ msgstr "Cuenta a pagar del trabajador"
-
-#~ msgid "Account"
-#~ msgstr "Cuenta"
-
-#, python-format
-#~ msgid "Warning !"
-#~ msgstr "¡ Aviso !"
-
-#~ msgid "Payment From"
-#~ msgstr "Pago desde"
-
-#~ msgid "Keep empty to use the period of the validation(Payslip) date."
-#~ msgstr ""
-#~ "Deje en blanco para usar el período de la fecha de validación de la nómina"
-
-#~ msgid "Analytic Account"
-#~ msgstr "Cuenta analítica"
-
-#~ msgid "Force Period"
-#~ msgstr "Forzar período"
-
-#~ msgid "Accounting Information"
-#~ msgstr "Información contable"
-
-#, python-format
-#~ msgid "Integrity Error !"
-#~ msgstr "¡Error de integridad!"
-
-#~ msgid "Miscelleanous"
-#~ msgstr "Misceláneos"
-
-#~ msgid "Error! You can not create recursive analytic accounts."
-#~ msgstr "¡Error! No puede crear cuentas analíticas recursivas."
-
-#~ msgid "Account Lines"
-#~ msgstr "Movimientos"
-
-#~ msgid "Accounting Informations"
-#~ msgstr "Información contable"
-
-#~ msgid "Print"
-#~ msgstr "Imprimir"
-
-#~ msgid "Invalid XML for View Architecture!"
-#~ msgstr "¡XML inválido para la definición de la vista!"
-
-#~ msgid "Accounting Lines"
-#~ msgstr "Movimientos contables"
-
-#~ msgid "Bank Journal"
-#~ msgstr "Diario bancario"
-
-#~ msgid "Expense"
-#~ msgstr "Gastos"
-
-#~ msgid "Payment Entries"
-#~ msgstr "Asientos de pago"
-
-#~ msgid "Salary Account"
-#~ msgstr "Cuenta de nómina"
-
-#~ msgid "Employee Contract"
-#~ msgstr "Contrato de trabajador"
-
-#~ msgid ""
-#~ "The Object name must start with x_ and not contain any special character !"
-#~ msgstr ""
-#~ "¡El nombre del objeto debe empezar con x_ y no contener ningún carácter "
-#~ "especial!"
-
-#~ msgid "General Account"
-#~ msgstr "Cuenta general"
-
-#~ msgid "Process"
-#~ msgstr "Proceso"
-
-#~ msgid "Employee Account"
-#~ msgstr "Cuenta trabajador"
-
-#~ msgid "General Information"
-#~ msgstr "Información general"
-
-#~ msgid "Accounting Details"
-#~ msgstr "Detalles de contabilidad"
-
-#~ msgid "Account Information"
-#~ msgstr "Información de la cuenta"
-
-#~ msgid "Generalities"
-#~ msgstr "Generalidades"
-
-#~ msgid "Contract Duration"
-#~ msgstr "Duración del contrato"
-
-#~ msgid "Notes"
-#~ msgstr "Notas"
-
-#~ msgid "Fiscal Year"
-#~ msgstr "Ejercicio fiscal"
+#: field:hr.payslip.line,condition_range:0
+#: field:hr.salary.rule,condition_range:0
+msgid "Range Based on"
+msgstr ""
diff --git a/addons/hr_payroll/report/report_contribution_register.rml b/addons/hr_payroll/report/report_contribution_register.rml
index b3a5de9753d..8a5897c6091 100644
--- a/addons/hr_payroll/report/report_contribution_register.rml
+++ b/addons/hr_payroll/report/report_contribution_register.rml
@@ -206,7 +206,7 @@
<para style="P2">[[ formatLang(r['amount']) ]]</para>
</td>
<td>
- <para style="P3">[[ formatLang(r['total']) ]] [[o.company_id and o.company_id.currency_id.symbol or '']]</para>
+ <para style="P3">[[ formatLang(r['total'], currency_obj = o.company_id and o.company_id.currency_id)]]</para>
</td>
</tr>
</blockTable>
@@ -222,7 +222,7 @@
<para style="P15">Total:</para>
</td>
<td>
- <para style="P11">[[ formatLang(sum_total()) ]] [[o.company_id and o.company_id.currency_id.symbol or '']]</para>
+ <para style="P11">[[ formatLang(sum_total(), currency_obj = o.company_id and o.company_id.currency_id)]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/hr_payroll/report/report_payslip.rml b/addons/hr_payroll/report/report_payslip.rml
index 4d96e4b5ef7..990419ee5f1 100644
--- a/addons/hr_payroll/report/report_payslip.rml
+++ b/addons/hr_payroll/report/report_payslip.rml
@@ -197,7 +197,8 @@
</para>
</td>
<td>
- <para style="P4">[[o.employee_id.address_home_id and o.employee_id.address_home_id.name or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.street or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.street2 or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.zip or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.city or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.state_id and o.employee_id.address_home_id.state_id.name or '' ]] [[o.employee_id.address_home_id and o.employee_id.address_home_id.country_id and o.employee_id.address_home_id.country_id.name or '' ]]</para>
+ <para style="P4">[[o.employee_id.address_home_id and o.employee_id.address_home_id.name or '' ]]
+ [[o.employee_id.address_home_id and display_address(o.employee_id.address_home_id)]]</para>
</td>
</tr>
</blockTable>
@@ -293,7 +294,7 @@
<para style="P4">[[ formatLang(p.amount) ]]</para>
</td>
<td>
- <para style="P5">[[ formatLang(p.total) ]] [[o.company_id and o.company_id.currency_id.symbol or '']]</para>
+ <para style="P5">[[ formatLang(p.total, currency_obj = o.company_id and o.company_id.currency_id)]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/hr_payroll/report/report_payslip_details.rml b/addons/hr_payroll/report/report_payslip_details.rml
index fe6a10dd1f5..4ace0ad2f82 100644
--- a/addons/hr_payroll/report/report_payslip_details.rml
+++ b/addons/hr_payroll/report/report_payslip_details.rml
@@ -234,7 +234,8 @@
</para>
</td>
<td>
- <para style="P5">[[o.employee_id.address_home_id and o.employee_id.address_home_id.name or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.street or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.street2 or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.zip or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.city or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.state_id and o.employee_id.address_home_id.state_id.name or '' ]] [[o.employee_id.address_home_id and o.employee_id.address_home_id.country_id and o.employee_id.address_home_id.country_id.name or '' ]]</para>
+ <para style="P5">[[o.employee_id.address_home_id and o.employee_id.address_home_id.name or '' ]]
+ [[o.employee_id.address_home_id and display_address(o.employee_id.address_home_id)]]</para>
</td>
</tr>
</blockTable>
@@ -334,7 +335,7 @@
<para style="P17"><font face="Helvetica" color="white">[[ '..'*h['level'] ]]</font>[[ h['rule_category'] ]]<font face="Helvetica">[[ h['level']!=0 and ( setTag('para','para',{'style':'terp_default_8'})) or removeParentNode('font') ]]</font></para>
</td>
<td>
- <para style="P6">[[ formatLang(h['total']) ]] [[o.company_id and o.company_id.currency_id.symbol or '']] <font face="Helvetica" size="8.0">[[ h['level']==0 and ( setTag('para','para',{'style':'terp_default_10'})) or removeParentNode('font') ]]</font></para>
+ <para style="P6">[[ formatLang(h['total'], currency_obj = o.company_id and o.company_id.currency_id)]] <font face="Helvetica" size="8.0">[[ h['level']==0 and ( setTag('para','para',{'style':'terp_default_10'})) or removeParentNode('font') ]]</font></para>
</td>
</tr>
</blockTable>
@@ -391,7 +392,7 @@
<para style="P5">[[ formatLang(r['amount']) ]]</para>
</td>
<td>
- <para style="P6">[[ formatLang(r['total']) ]] [[ o.company_id and o.company_id.currency_id.symbol or '']]<font face="Helvetica">[[ r.get('register_name', False) and ( setTag('para','para',{'style':'terp_default_10'})) or removeParentNode('font')]]</font></para>
+ <para style="P6">[[ formatLang(r['total'], currency_obj = o.company_id and o.company_id.currency_id)]]<font face="Helvetica">[[ r.get('register_name', False) and ( setTag('para','para',{'style':'terp_default_10'})) or removeParentNode('font')]]</font></para>
</td>
</tr>
</blockTable>
diff --git a/addons/hr_payroll_account/hr_payroll_account.py b/addons/hr_payroll_account/hr_payroll_account.py
index 184f9a06867..94df47f6e44 100644
--- a/addons/hr_payroll_account/hr_payroll_account.py
+++ b/addons/hr_payroll_account/hr_payroll_account.py
@@ -36,7 +36,7 @@ class hr_payslip(osv.osv):
_columns = {
'period_id': fields.many2one('account.period', 'Force Period',states={'draft': [('readonly', False)]}, readonly=True, domain=[('state','<>','done')], help="Keep empty to use the period of the validation(Payslip) date."),
- 'journal_id': fields.many2one('account.journal', 'Expense Journal',states={'draft': [('readonly', False)]}, readonly=True, required=True),
+ 'journal_id': fields.many2one('account.journal', 'Salary Journal',states={'draft': [('readonly', False)]}, readonly=True, required=True),
'move_id': fields.many2one('account.move', 'Accounting Entry', readonly=True),
}
@@ -215,7 +215,7 @@ class hr_payslip_run(osv.osv):
_inherit = 'hr.payslip.run'
_description = 'Payslip Run'
_columns = {
- 'journal_id': fields.many2one('account.journal', 'Expense Journal', states={'draft': [('readonly', False)]}, readonly=True, required=True),
+ 'journal_id': fields.many2one('account.journal', 'Salary Journal', states={'draft': [('readonly', False)]}, readonly=True, required=True),
}
def _get_default_journal(self, cr, uid, context=None):
diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py
index 31959d7e9c7..56c517620e0 100644
--- a/addons/hr_recruitment/hr_recruitment.py
+++ b/addons/hr_recruitment/hr_recruitment.py
@@ -26,6 +26,7 @@ from base_status.base_stage import base_stage
from datetime import datetime
from osv import fields, osv
from tools.translate import _
+from tools import html2plaintext
AVAILABLE_STATES = [
('draft', 'New'),
@@ -296,7 +297,6 @@ class hr_applicant(base_stage, osv.Model):
res['context'] = {
'default_partner_ids': applicant.partner_id and [applicant.partner_id.id] or False,
'default_user_id': uid,
- 'default_state': 'open',
'default_name': applicant.name,
'default_categ_ids': category and [category.id] or False,
}
@@ -327,9 +327,10 @@ class hr_applicant(base_stage, osv.Model):
This override updates the document according to the email.
"""
if custom_values is None: custom_values = {}
+ desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
custom_values.update({
'name': msg.get('subject') or _("No Subject"),
- 'description': msg.get('body'),
+ 'description': desc,
'email_from': msg.get('from'),
'email_cc': msg.get('cc'),
'user_id': False,
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index 08e5f31a2d2..d6d04c1b969 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -208,7 +208,7 @@
<field name="arch" type="xml">
<search string="Search Jobs">
<field name="partner_name" filter_domain="['|','|',('name','ilike',self),('partner_name','ilike',self),('email_from','ilike',self)]" string="Subject / Applicant"/>
- <filter string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter string="New" domain="[('state','=','draft')]" help="All Initial Jobs"/>
<filter string="In Progress" domain="[('state','=','open')]" help="Open Jobs"/>
@@ -289,7 +289,8 @@
</div>
<div class="oe_kanban_content" tooltip="kanban-tooltip">
<div>
- <b><field name="name"/></b><br/>
+ <t t-if="record.partner_name.raw_value"><b><field name="partner_name"/></b><br/></t>
+ <i><field name="name"/></i><br/>
<field name="job_id"/><br/>
<t t-if="record.partner_mobile.raw_value">Mobile: <field name="partner_mobile"/><br/></t>
<t t-if="record.title_action.raw_value"><field name="title_action"/><br/></t>
@@ -342,8 +343,8 @@
attrs="{'invisible':[('survey_id','=',False)]}"/>
</div>
</field>
- <xpath expr="/form/sheet/h1" version="7.0" position="after">
- <div colspan="4" attrs="{'invisible': [('alias_domain', '=', False)]}">
+ <xpath expr="//div[@class='oe_title']" version="7.0" position="after">
+ <div attrs="{'invisible': [('alias_domain', '=', False)]}">
<field name="alias_id" invisible="1" required="0"/>
<label for="alias_name" class="oe_edit_only"/>
<field name="alias_name" nolabel="1" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" nolabel="1" class="oe_inline"/>
diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
index 1b0b8bfa7c5..b33b2eaa053 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml
+++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
@@ -5,7 +5,7 @@
<field name="name">hr.recruitment.report.tree</field>
<field name="model">hr.recruitment.report</field>
<field name="arch" type="xml">
- <tree string="Recruitment Analysis">
+ <tree string="Recruitment Analysis" create="false">
<field name="date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="job_id"/>
diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
index b9574b553d1..ab76f2b0f64 100644
--- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
+++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
@@ -135,6 +135,8 @@ class account_analytic_line(osv.osv):
def _default_general_account(self, cr, uid, context=None):
proxy = self.pool.get('hr.employee')
record_ids = proxy.search(cr, uid, [('user_id', '=', uid)], context=context)
+ if not record_ids:
+ raise osv.except_osv(_('Error!'), _('Please create an employee associated to this user.'))
employee = proxy.browse(cr, uid, record_ids[0], context=context)
if employee.product_id and employee.product_id.property_account_income:
return employee.product_id.property_account_income.id
diff --git a/addons/hr_timesheet_invoice/i18n/de.po b/addons/hr_timesheet_invoice/i18n/de.po
index 66e115f78ff..676e28fbc1d 100644
--- a/addons/hr_timesheet_invoice/i18n/de.po
+++ b/addons/hr_timesheet_invoice/i18n/de.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-02-08 00:36+0000\n"
-"PO-Revision-Date: 2012-05-10 18:04+0000\n"
-"Last-Translator: Ferdinand-camptocamp <Unknown>\n"
+"PO-Revision-Date: 2012-10-12 23:22+0000\n"
+"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:20+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-14 04:39+0000\n"
+"X-Generator: Launchpad (build 16137)\n"
#. module: hr_timesheet_invoice
#: view:report.timesheet.line:0
@@ -769,7 +769,7 @@ msgstr "Menge"
#. module: hr_timesheet_invoice
#: report:hr.timesheet.invoice.account.analytic.account.cost_ledger:0
msgid "Date/Code"
-msgstr "Datum/Kurzbez."
+msgstr "Dat/Kurzb."
#. module: hr_timesheet_invoice
#: field:report.timesheet.line,general_account_id:0
diff --git a/addons/hr_timesheet_sheet/__openerp__.py b/addons/hr_timesheet_sheet/__openerp__.py
index 9aab412d425..fd025491588 100644
--- a/addons/hr_timesheet_sheet/__openerp__.py
+++ b/addons/hr_timesheet_sheet/__openerp__.py
@@ -65,5 +65,8 @@ The validation can be configured in the company:
'installable': True,
'auto_install': False,
'application': True,
+ 'js': ['static/src/js/timesheet.js',],
+ 'css': ['static/src/css/timesheet.css',],
+ 'qweb': ['static/src/xml/timesheet.xml',],
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index cd58f52f959..96cb15ddce1 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -27,80 +27,6 @@ from osv import fields, osv
from tools.translate import _
import netsvc
-class one2many_mod2(fields.one2many):
- def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
- if context is None:
- context = {}
-
- if values is None:
- values = {}
-
- # res6 = {id: date_current, ...}
- res6 = dict([(rec['id'], rec['date_current'])
- for rec in obj.read(cr, user, ids, ['date_current'], context=context)])
-
- dom = []
- for c, id in enumerate(ids):
- if id in res6:
- if c: # skip first
- dom.insert(0 ,'|')
- dom.append('&')
- dom.append('&')
- dom.append(('name', '>=', res6[id]))
- dom.append(('name', '<=', res6[id]))
- dom.append(('sheet_id', '=', id))
-
- ids2 = obj.pool.get(self._obj).search(cr, user, dom, limit=self._limit)
-
- res = {}
- for i in ids:
- res[i] = []
-
- for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_read'):
- if r[self._fields_id]:
- res[r[self._fields_id][0]].append(r['id'])
- return res
-
- def set(self, cr, obj, id, field, values, user=None, context=None):
- if context is None:
- context = {}
-
- context = context.copy()
- context['sheet_id'] = id
- return super(one2many_mod2, self).set(cr, obj, id, field, values, user=user, context=context)
-
-
-class one2many_mod(fields.one2many):
- def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
- if context is None:
- context = {}
-
- if values is None:
- values = {}
-
-
- res5 = obj.read(cr, user, ids, ['date_current'], context=context)
- res6 = {}
- for r in res5:
- res6[r['id']] = r['date_current']
-
- ids2 = []
- for id in ids:
- dom = []
- if id in res6:
- dom = [('date', '=', res6[id]), ('sheet_id', '=', id)]
- ids2.extend(obj.pool.get(self._obj).search(cr, user,
- dom, limit=self._limit))
- res = {}
- for i in ids:
- res[i] = []
- for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2,
- [self._fields_id], context=context, load='_classic_read'):
- if r[self._fields_id]:
- res[r[self._fields_id][0]].append(r['id'])
-
- return res
-
class hr_timesheet_sheet(osv.osv):
_name = "hr_timesheet_sheet.sheet"
_inherit = "mail.thread"
@@ -111,8 +37,7 @@ class hr_timesheet_sheet(osv.osv):
def _total_attendances(self, cr, uid, ids, name, args, context=None):
""" Get the total attendance for the timesheets
Returns a dict like :
- {id: {'date_current': '2011-06-17',
- 'total_per_day': {day: timedelta, ...},
+ {id: {'total_per_day': {day: timedelta, ...},
},
...
}
@@ -122,7 +47,6 @@ class hr_timesheet_sheet(osv.osv):
res = {}
for sheet_id in ids:
sheet = self.browse(cr, uid, sheet_id, context=context)
- date_current = sheet.date_current
# field attendances_ids of hr_timesheet_sheet.sheet only
# returns attendances of timesheet's current date
attendance_ids = attendance_obj.search(cr, uid, [('sheet_id', '=', sheet_id)], context=context)
@@ -143,20 +67,7 @@ class hr_timesheet_sheet(osv.osv):
else:
total_attendance[day] += attendance_interval
- # if the delta is negative, it means that a sign out is missing
- # in a such case, we want to have the time to the end of the day
- # for a past date, and the time to now for the current date
- if total_attendance[day] < timedelta(0):
- if day == date_current:
- now = datetime.now()
- total_attendance[day] += timedelta(hours=now.hour,
- minutes=now.minute,
- seconds=now.second)
- else:
- total_attendance[day] += timedelta(days=1)
-
- res[sheet_id] = {'date_current': date_current,
- 'total_per_day': total_attendance}
+ res[sheet_id] = {'total_per_day': total_attendance}
return res
def _total_timesheet(self, cr, uid, ids, name, args, context=None):
@@ -210,24 +121,16 @@ class hr_timesheet_sheet(osv.osv):
all_attendances_sheet = all_timesheet_attendances[id]
- date_current = all_attendances_sheet['date_current']
total_attendances_sheet = all_attendances_sheet['total_per_day']
total_attendances_all_days = sum_all_days(total_attendances_sheet)
- total_attendances_day = total_attendances_sheet.get(date_current, timedelta(seconds=0))
total_timesheets_sheet = all_timesheet_lines[id]
total_timesheets_all_days = sum_all_days(total_timesheets_sheet)
- total_timesheets_day = total_timesheets_sheet.get(date_current, timedelta(seconds=0))
total_difference_all_days = total_attendances_all_days - total_timesheets_all_days
- total_difference_day = total_attendances_day - total_timesheets_day
res[id]['total_attendance'] = timedelta_to_hours(total_attendances_all_days)
res[id]['total_timesheet'] = timedelta_to_hours(total_timesheets_all_days)
res[id]['total_difference'] = timedelta_to_hours(total_difference_all_days)
-
- res[id]['total_attendance_day'] = timedelta_to_hours(total_attendances_day)
- res[id]['total_timesheet_day'] = timedelta_to_hours(total_timesheets_day)
- res[id]['total_difference_day'] = timedelta_to_hours(total_difference_day)
return res
def check_employee_attendance_state(self, cr, uid, sheet_id, context=None):
@@ -277,44 +180,6 @@ class hr_timesheet_sheet(osv.osv):
raise osv.except_osv(_('Warning!'), _('Please verify that the total difference of the sheet is lower than %.2f.') %(di,))
return True
- def date_today(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if datetime.today() <= datetime.strptime(sheet.date_from, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context)
- elif datetime.now() >= datetime.strptime(sheet.date_to, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context)
- else:
- self.write(cr, uid, [sheet.id], {'date_current': time.strftime('%Y-%m-%d')}, context=context)
- return True
-
- def date_previous(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if datetime.strptime(sheet.date_current, '%Y-%m-%d') <= datetime.strptime(sheet.date_from, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context)
- else:
- self.write(cr, uid, [sheet.id], {
- 'date_current': (datetime.strptime(sheet.date_current, '%Y-%m-%d') + relativedelta(days=-1)).strftime('%Y-%m-%d'),
- }, context=context)
- return True
-
- def date_next(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if datetime.strptime(sheet.date_current, '%Y-%m-%d') >= datetime.strptime(sheet.date_to, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context)
- else:
- self.write(cr, uid, [sheet.id], {
- 'date_current': (datetime.strptime(sheet.date_current, '%Y-%m-%d') + relativedelta(days=1)).strftime('%Y-%m-%d'),
- }, context=context)
- return True
-
- def button_dummy(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if datetime.strptime(sheet.date_current, '%Y-%m-%d') <= datetime.strptime(sheet.date_from, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context)
- elif datetime.strptime(sheet.date_current, '%Y-%m-%d') >= datetime.strptime(sheet.date_to, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context)
- return True
-
def attendance_action_change(self, cr, uid, ids, context=None):
hr_employee = self.pool.get('hr.employee')
employee_ids = []
@@ -329,14 +194,13 @@ class hr_timesheet_sheet(osv.osv):
'user_id': fields.related('employee_id', 'user_id', type="many2one", relation="res.users", store=True, string="User", required=False, readonly=True),#fields.many2one('res.users', 'User', required=True, select=1, states={'confirm':[('readonly', True)], 'done':[('readonly', True)]}),
'date_from': fields.date('Date from', required=True, select=1, readonly=True, states={'new':[('readonly', False)]}),
'date_to': fields.date('Date to', required=True, select=1, readonly=True, states={'new':[('readonly', False)]}),
- 'date_current': fields.date('Current date', required=True, select=1),
- 'timesheet_ids' : one2many_mod('hr.analytic.timesheet', 'sheet_id',
- 'Timesheet lines', domain=[('date', '=', time.strftime('%Y-%m-%d'))],
+ 'timesheet_ids' : fields.one2many('hr.analytic.timesheet', 'sheet_id',
+ 'Timesheet lines',
readonly=True, states={
'draft': [('readonly', False)],
'new': [('readonly', False)]}
),
- 'attendances_ids' : one2many_mod2('hr.attendance', 'sheet_id', 'Attendances'),
+ 'attendances_ids' : fields.one2many('hr.attendance', 'sheet_id', 'Attendances'),
'state' : fields.selection([
('new', 'New'),
('draft','Open'),
@@ -346,9 +210,6 @@ class hr_timesheet_sheet(osv.osv):
\n* The \'Confirmed\' state is used for to confirm the timesheet by user. \
\n* The \'Done\' state is used when users timesheet is accepted by his/her senior.'),
'state_attendance' : fields.related('employee_id', 'state', type='selection', selection=[('absent', 'Absent'), ('present', 'Present')], string='Current Status', readonly=True),
- 'total_attendance_day': fields.function(_total, method=True, string='Total Attendance', multi="_total"),
- 'total_timesheet_day': fields.function(_total, method=True, string='Total Timesheet', multi="_total"),
- 'total_difference_day': fields.function(_total, method=True, string='Difference', multi="_total"),
'total_attendance': fields.function(_total, method=True, string='Total Attendance', multi="_total"),
'total_timesheet': fields.function(_total, method=True, string='Total Timesheet', multi="_total"),
'total_difference': fields.function(_total, method=True, string='Difference', multi="_total"),
@@ -386,7 +247,6 @@ class hr_timesheet_sheet(osv.osv):
_defaults = {
'date_from' : _default_date_from,
- 'date_current' : lambda *a: time.strftime('%Y-%m-%d'),
'date_to' : _default_date_to,
'state': 'new',
'employee_id': _default_employee,
@@ -406,16 +266,9 @@ class hr_timesheet_sheet(osv.osv):
return False
return True
- def _date_current_check(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if sheet.date_current < sheet.date_from or sheet.date_current > sheet.date_to:
- return False
- return True
-
_constraints = [
(_sheet_date, 'You cannot have 2 timesheets that overlaps !\nPlease use the menu \'My Current Timesheet\' to avoid this problem.', ['date_from','date_to']),
- (_date_current_check, 'You must select a Current date which is in the timesheet dates !', ['date_current']),
]
def action_set_to_draft(self, cr, uid, ids, *args):
@@ -498,7 +351,7 @@ class hr_timesheet_line(osv.osv):
_columns = {
'sheet_id': fields.function(_sheet, string='Sheet',
- type='many2one', relation='hr_timesheet_sheet.sheet',
+ type='many2one', relation='hr_timesheet_sheet.sheet', ondelete="cascade",
store={
'hr_timesheet_sheet.sheet': (_get_hr_timesheet_sheet, ['employee_id', 'date_from', 'date_to'], 10),
'account.analytic.line': (_get_account_analytic_line, ['user_id', 'date'], 10),
@@ -534,6 +387,10 @@ class hr_timesheet_line(osv.osv):
raise osv.except_osv(_('Error!'), _('You cannot modify an entry in a confirmed timesheet.'))
return True
+ def multi_on_change_account_id(self, cr, uid, ids, account_ids, context=None):
+ return dict([(el, self.on_change_account_id(cr, uid, ids, el)) for el in account_ids])
+
+
hr_timesheet_line()
class hr_attendance(osv.osv):
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml
index 42497eb537e..4e0e1becbe9 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml
@@ -6,7 +6,6 @@
<field name="name">Sheet 1</field>
<field name="user_id" ref="base.user_root"/>
<field name="employee_id" ref="hr.employee_fp" />
- <field eval="time.strftime('%Y-%m-%d')" name="date_current"/>
</record>
-->
</data>
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
index 9a7416464af..7dd2b9a1b88 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
@@ -71,20 +71,13 @@
</group>
</group>
<notebook>
+ <page string="Weekly">
+ <widget type="weekly_timesheet">
+ </widget>
+ </page>
<page string="Daily">
- <group>
- <div>
- <button name="button_dummy" class="oe_inline" string="Go to" type="object" icon="terp-gtk-jump-to-ltr"/> :
- <field name="date_current" class="oe_inline"/>
- </div>
- <div align="right">
- <button class="oe_inline" icon="terp-gtk-go-back-ltr" name="date_previous" string="" type="object"/>
- <button class="oe_inline" name="date_today" string="Today" type="object" icon="terp-go-today"/>
- <button class="oe_inline" icon="terp-gtk-go-back-rtl" name="date_next" string="" type="object"/>
- </div>
- </group>
<group colspan="4" col="3">
- <field context="{'name':date_current,'user_id':user_id}" name="attendances_ids" nolabel="1" groups="base.group_hr_attendance">
+ <field context="{'user_id':user_id}" name="attendances_ids" nolabel="1" groups="base.group_hr_attendance">
<tree string="Attendances" editable="bottom">
<field name="name"/>
<field name="action"/>
@@ -101,9 +94,9 @@
<group col="4">
<field name="state_attendance" groups="base.group_hr_attendance"/>
</group>
- <field colspan="4" context="{'date':date_current,'user_id':user_id}" domain="[('name','=',date_current)]" name="timesheet_ids" nolabel="1">
+ <field colspan="4" context="{'user_id':user_id}" name="timesheet_ids" nolabel="1">
<tree editable="top" string="Timesheet Lines">
- <field invisible="1" name="date"/>
+ <field name="date"/>
<field domain="[('type','in',['normal', 'contract']), ('state', '&lt;&gt;', 'close'),('use_timesheets','=',1)]" name="account_id" on_change="on_change_account_id(account_id)" context="{'default_use_timesheets': 1}"/>
<field name="name"/>
<field name="unit_amount" on_change="on_change_unit_amount(product_id, unit_amount, False, product_uom_id,journal_id)" widget="float_time"/>
diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml
index 37c40f60f6d..50a99673e73 100644
--- a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml
+++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml
@@ -15,7 +15,7 @@
<field name="name">hr.timesheet.report.tree</field>
<field name="model">hr.timesheet.report</field>
<field name="arch" type="xml">
- <tree string="Timesheet Analysis">
+ <tree string="Timesheet Analysis" create="false">
<field name="year" invisible="1"/>
<field name="month" invisible="1"/>
<field name="date" invisible="1"/>
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report.py b/addons/hr_timesheet_sheet/report/timesheet_report.py
index 3db7ff8feb2..497fe8da117 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/timesheet_report.py
@@ -46,7 +46,6 @@ class timesheet_report(osv.osv):
'department_id':fields.many2one('hr.department','Department',readonly=True),
'date_from': fields.date('Date from',readonly=True,),
'date_to': fields.date('Date to',readonly=True),
- 'date_current': fields.date('Current date', required=True),
'state' : fields.selection([
('new', 'New'),
('draft','Draft'),
@@ -62,13 +61,9 @@ class timesheet_report(osv.osv):
create or replace view timesheet_report as (
select
min(aal.id) as id,
- htss.date_current,
htss.name,
htss.date_from,
htss.date_to,
- to_char(htss.date_current,'YYYY') as year,
- to_char(htss.date_current,'MM') as month,
- to_char(htss.date_current, 'YYYY-MM-DD') as day,
count(*) as nbr,
aal.unit_amount as quantity,
aal.amount as cost,
@@ -77,18 +72,15 @@ class timesheet_report(osv.osv):
(SELECT sum(day.total_difference)
FROM hr_timesheet_sheet_sheet AS sheet
LEFT JOIN hr_timesheet_sheet_sheet_day AS day
- ON (sheet.id = day.sheet_id
- AND day.name = sheet.date_current) where sheet.id=htss.id) as total_diff,
+ ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_diff,
(SELECT sum(day.total_timesheet)
FROM hr_timesheet_sheet_sheet AS sheet
LEFT JOIN hr_timesheet_sheet_sheet_day AS day
- ON (sheet.id = day.sheet_id
- AND day.name = sheet.date_current) where sheet.id=htss.id) as total_timesheet,
+ ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_timesheet,
(SELECT sum(day.total_attendance)
FROM hr_timesheet_sheet_sheet AS sheet
LEFT JOIN hr_timesheet_sheet_sheet_day AS day
- ON (sheet.id = day.sheet_id
- AND day.name = sheet.date_current) where sheet.id=htss.id) as total_attendance,
+ ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_attendance,
aal.to_invoice,
aal.general_account_id,
htss.user_id,
@@ -99,15 +91,11 @@ class timesheet_report(osv.osv):
left join hr_analytic_timesheet as hat ON (hat.line_id=aal.id)
left join hr_timesheet_sheet_sheet as htss ON (hat.line_id=htss.id)
group by
- to_char(htss.date_current,'YYYY'),
- to_char(htss.date_current,'MM'),
- to_char(htss.date_current, 'YYYY-MM-DD'),
aal.account_id,
htss.date_from,
htss.date_to,
aal.unit_amount,
aal.amount,
- htss.date_current,
aal.to_invoice,
aal.product_id,
aal.general_account_id,
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
index 7b31f72235b..711bbaf2a35 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
+++ b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
@@ -17,7 +17,6 @@
<field name="model">timesheet.report</field>
<field name="arch" type="xml">
<tree colors="blue:state == 'draft';black:state in ('confirm','new');gray:state == 'cancel'" string="Timesheet">
- <field name="date_current" invisible="1"/>
<field name="name" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="date_from" invisible="1"/>
@@ -56,7 +55,6 @@
<field name="product_id"/>
<field name="department_id"/>
<field name="company_id" groups="base.group_multi_company"/>
- <field name="date_current"/>
<field name="date_to"/>
<field name="date_from"/>
</group>
diff --git a/addons/hr_timesheet_sheet/static/src/css/timesheet.css b/addons/hr_timesheet_sheet/static/src/css/timesheet.css
new file mode 100644
index 00000000000..b486f76694d
--- /dev/null
+++ b/addons/hr_timesheet_sheet/static/src/css/timesheet.css
@@ -0,0 +1,79 @@
+
+.openerp .oe_timesheet_weekly {
+ overflow-x: auto;
+}
+
+.openerp .oe_timesheet_weekly table {
+ width: 100%;
+}
+
+.openerp .oe_timesheet_weekly td {
+ padding-top: 15px;
+}
+
+.openerp .oe_timesheet_weekly th {
+ text-align: right;
+ color: #069;
+ font-family: 'Helvetica Neue', Arial, Verdana, 'Nimbus Sans L', sans-serif;
+ font-size: 10px;
+}
+
+.openerp .oe_timesheet_weekly th.oe_timesheet_weekly_date_head {
+ width: 60px;
+}
+
+.openerp .oe_timesheet_weekly td {
+ text-align: right;
+ vertical-align: middle;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_account {
+ text-align: left;
+ padding-right: 30px;
+}
+
+.openerp .oe_timesheet_weekly td input.oe_timesheet_weekly_input {
+ border: 1px solid #CCC;
+ padding: 5px 2px !important;
+ color: #666 !important;
+ font-size: 14px;
+ font-weight: bold;
+ width: 38px;
+ text-align: right;
+ min-width: 0 !important;
+}
+
+.openerp .oe_timesheet_weekly td .oe_timesheet_weekly_box {
+ padding: 5px 2px !important;
+ color: #666 !important;
+ font-size: 14px;
+ font-weight: bold;
+ width: 38px;
+ display: inline-block;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_adding_tot {
+ display: table;
+ width: 100%;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_adding {
+ display: table-cell;
+ text-align: left;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_tottot {
+ display: table-cell;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_add_row td {
+ text-align: left;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_add_row .oe_form_field_many2one {
+ display: inline-block;
+ width: 200px;
+}
+
+.openerp .oe_timesheet_weekly_today {
+}
diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js
new file mode 100644
index 00000000000..1be965fd63d
--- /dev/null
+++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js
@@ -0,0 +1,299 @@
+
+openerp.hr_timesheet_sheet = function(instance) {
+ var QWeb = instance.web.qweb;
+ var _t = instance.web._t;
+
+ instance.hr_timesheet_sheet.WeeklyTimesheet = instance.web.form.FormWidget.extend(instance.web.form.ReinitializeWidgetMixin, {
+ init: function() {
+ this._super.apply(this, arguments);
+ this.set({
+ sheets: [],
+ date_to: false,
+ date_from: false,
+ });
+ this.field_manager.on("field_changed:timesheet_ids", this, this.query_sheets);
+ this.field_manager.on("field_changed:date_from", this, function() {
+ this.set({"date_from": instance.web.str_to_date(this.field_manager.get_field_value("date_from"))});
+ });
+ this.field_manager.on("field_changed:date_to", this, function() {
+ this.set({"date_to": instance.web.str_to_date(this.field_manager.get_field_value("date_to"))});
+ });
+ this.field_manager.on("field_changed:user_id", this, function() {
+ this.set({"user_id": this.field_manager.get_field_value("user_id")});
+ });
+ this.on("change:sheets", this, this.update_sheets);
+ this.res_o2m_drop = new instance.web.DropMisordered();
+ this.render_drop = new instance.web.DropMisordered();
+ this.description_line = _t("/");
+ },
+ query_sheets: function() {
+ var self = this;
+ if (self.updating)
+ return;
+ var commands = this.field_manager.get_field_value("timesheet_ids");
+ this.res_o2m_drop.add(new instance.web.Model(this.view.model).call("resolve_2many_commands", ["timesheet_ids", commands, [],
+ new instance.web.CompoundContext()]))
+ .then(function(result) {
+ self.querying = true;
+ self.set({sheets: result});
+ self.querying = false;
+ });
+ },
+ update_sheets: function() {
+ var self = this;
+ if (self.querying)
+ return;
+ self.updating = true;
+ self.field_manager.set_values({timesheet_ids: self.get("sheets")}).then(function() {
+ self.updating = false;
+ });
+ },
+ initialize_field: function() {
+ instance.web.form.ReinitializeWidgetMixin.initialize_field.call(this);
+ var self = this;
+ self.on("change:sheets", self, self.initialize_content);
+ self.on("change:date_to", self, self.initialize_content);
+ self.on("change:date_from", self, self.initialize_content);
+ self.on("change:user_id", self, self.initialize_content);
+ },
+ initialize_content: function() {
+ var self = this;
+ if (self.setting)
+ return;
+ // don't render anything until we have date_to and date_from
+ if (!self.get("date_to") || !self.get("date_from"))
+ return;
+ this.destroy_content();
+
+ // it's important to use those vars to avoid race conditions
+ var dates;
+ var accounts;
+ var account_names;
+ var default_get;
+ return this.render_drop.add(new instance.web.Model("hr.analytic.timesheet").call("default_get", [
+ ['account_id','general_account_id', 'journal_id','date','name','user_id','product_id','product_uom_id','to_invoice','amount','unit_amount'],
+ new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(result) {
+ default_get = result;
+ // calculating dates
+ dates = [];
+ var start = self.get("date_from");
+ var end = self.get("date_to");
+ while (start <= end) {
+ dates.push(start);
+ start = start.clone().addDays(1);
+ }
+ // group by account
+ accounts = _(self.get("sheets")).chain()
+ .map(function(el) {
+ // much simpler to use only the id in all cases
+ if (typeof(el.account_id) === "object")
+ el.account_id = el.account_id[0];
+ return el;
+ })
+ .groupBy("account_id").value();
+
+ var account_ids = _.map(_.keys(accounts), function(el) { return el === "false" ? false : Number(el) });
+
+ return new instance.web.Model("hr.analytic.timesheet").call("multi_on_change_account_id", [[], account_ids,
+ new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(accounts_defaults) {
+ accounts = _(accounts).chain().map(function(lines, account_id) {
+ account_defaults = _.extend({}, default_get, accounts_defaults[account_id]);
+ // group by days
+ account_id = account_id === "false" ? false : Number(account_id);
+ var index = _.groupBy(lines, "date");
+ var days = _.map(dates, function(date) {
+ var day = {day: date, lines: index[instance.web.date_to_str(date)] || []};
+ // add line where we will insert/remove hours
+ var to_add = _.find(day.lines, function(line) { return line.name === self.description_line });
+ if (to_add) {
+ day.lines = _.without(day.lines, to_add);
+ day.lines.unshift(to_add);
+ } else {
+ day.lines.unshift(_.extend(_.clone(account_defaults), {
+ name: self.description_line,
+ unit_amount: 0,
+ date: instance.web.date_to_str(date),
+ account_id: account_id,
+ }));
+ }
+ return day;
+ });
+ return {account: account_id, days: days, account_defaults: account_defaults};
+ }).value();
+
+ // we need the name_get of the analytic accounts
+ return new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(accounts, "account"),
+ new instance.web.CompoundContext()]).pipe(function(result) {
+ account_names = {};
+ _.each(result, function(el) {
+ account_names[el[0]] = el[1];
+ });
+ accounts = _.sortBy(accounts, function(el) {
+ return account_names[el.account];
+ });
+ });;
+ });
+ })).pipe(function(result) {
+ // we put all the gathered data in self, then we render
+ self.dates = dates;
+ self.accounts = accounts;
+ self.account_names = account_names;
+ self.default_get = default_get;
+ //real rendering
+ self.display_data();
+ });
+ },
+ destroy_content: function() {
+ if (this.dfm) {
+ this.dfm.destroy();
+ this.dfm = undefined;
+ }
+ },
+ display_data: function() {
+ var self = this;
+ self.$el.html(QWeb.render("hr_timesheet_sheet.WeeklyTimesheet", {widget: self}));
+ _.each(self.accounts, function(account) {
+ _.each(_.range(account.days.length), function(day_count) {
+ if (!self.get('effective_readonly')) {
+ self.get_box(account, day_count).val(self.sum_box(account, day_count)).change(function() {
+ var num = Number($(this).val());
+ if (isNaN(num)) {
+ $(this).val(self.sum_box(account, day_count));
+ } else {
+ account.days[day_count].lines[0].unit_amount += num - self.sum_box(account, day_count);
+ self.display_totals();
+ self.sync();
+ }
+ });
+ } else {
+ self.get_box(account, day_count).html(self.sum_box(account, day_count));
+ }
+ });
+ });
+ self.display_totals();
+ self.$(".oe_timesheet_weekly_adding button").click(_.bind(this.init_add_account, this));
+ },
+ init_add_account: function() {
+ var self = this;
+ if (self.dfm)
+ return;
+ self.$(".oe_timesheet_weekly_add_row").show();
+ self.dfm = new instance.web.form.DefaultFieldManager(self);
+ self.dfm.extend_field_desc({
+ account: {
+ relation: "account.analytic.account",
+ },
+ });
+ self.account_m2o = new instance.web.form.FieldMany2One(self.dfm, {
+ attrs: {
+ name: "account",
+ type: "many2one",
+ domain: [
+ ['type','in',['normal', 'contract']],
+ ['state', '<>', 'close'],
+ ['use_timesheets','=',1],
+ ['id', 'not in', _.pluck(self.accounts, "account")],
+ ],
+ modifiers: '{"required": true}',
+ },
+ });
+ self.account_m2o.prependTo(self.$(".oe_timesheet_weekly_add_row td"));
+ self.$(".oe_timesheet_weekly_add_row button").click(function() {
+ var id = self.account_m2o.get_value();
+ if (id === false) {
+ self.dfm.set({display_invalid_fields: true});
+ return;
+ }
+ var ops = self.generate_o2m_value();
+ new instance.web.Model("hr.analytic.timesheet").call("on_change_account_id", [[], id]).pipe(function(res) {
+ var def = _.extend({}, self.default_get, res.value, {
+ name: self.description_line,
+ unit_amount: 0,
+ date: instance.web.date_to_str(self.dates[0]),
+ account_id: id,
+ });
+ ops.push(def);
+ self.set({"sheets": ops});
+ });
+ });
+ },
+ get_box: function(account, day_count) {
+ return this.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]');
+ },
+ get_total: function(account) {
+ return this.$('[data-account-total="' + account.account + '"]');
+ },
+ get_day_total: function(day_count) {
+ return this.$('[data-day-total="' + day_count + '"]');
+ },
+ get_super_total: function() {
+ return this.$('.oe_timesheet_weekly_supertotal');
+ },
+ sum_box: function(account, day_count) {
+ var line_total = 0;
+ _.each(account.days[day_count].lines, function(line) {
+ line_total += line.unit_amount;
+ });
+ return line_total;
+ },
+ display_totals: function() {
+ var self = this;
+ var day_tots = _.map(_.range(self.dates.length), function() { return 0 });
+ var super_tot = 0;
+ _.each(self.accounts, function(account) {
+ var acc_tot = 0;
+ _.each(_.range(self.dates.length), function(day_count) {
+ var sum = self.sum_box(account, day_count);
+ acc_tot += sum;
+ day_tots[day_count] += sum;
+ super_tot += sum;
+ });
+ self.get_total(account).html(acc_tot);
+ });
+ _.each(_.range(self.dates.length), function(day_count) {
+ self.get_day_total(day_count).html(day_tots[day_count]);
+ });
+ self.get_super_total().html(super_tot);
+ },
+ sync: function() {
+ var self = this;
+ self.setting = true;
+ self.set({sheets: this.generate_o2m_value()});
+ self.setting = false;
+ },
+ generate_o2m_value: function() {
+ var self = this;
+ var ops = [];
+
+ _.each(self.accounts, function(account) {
+ var auth_keys = _.extend(_.clone(account.account_defaults), {
+ name: true, unit_amount: true, date: true, account_id:true,
+ });
+ _.each(account.days, function(day) {
+ _.each(day.lines, function(line) {
+ if (line.unit_amount !== 0) {
+ var tmp = _.clone(line);
+ tmp.id = undefined;
+ _.each(line, function(v, k) {
+ if (v instanceof Array) {
+ tmp[k] = v[0];
+ }
+ });
+ // we have to remove some keys, because analytic lines are shitty
+ _.each(_.keys(tmp), function(key) {
+ if (auth_keys[key] === undefined) {
+ tmp[key] = undefined;
+ }
+ });
+ ops.push(tmp);
+ }
+ });
+ });
+ });
+ return ops;
+ },
+ });
+
+ instance.web.form.custom_widgets.add('weekly_timesheet', 'instance.hr_timesheet_sheet.WeeklyTimesheet');
+
+};
diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml
new file mode 100644
index 00000000000..0c4ad857d3b
--- /dev/null
+++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates>
+ <t t-name="hr_timesheet_sheet.WeeklyTimesheet">
+ <div class="oe_timesheet_weekly">
+ <table>
+ <tr>
+ <th> </th>
+ <t t-foreach="widget.dates" t-as="date">
+ <th t-att-class="'oe_timesheet_weekly_date_head' + (Date.compare(date, Date.today()) === 0 ? ' oe_timesheet_weekly_today' : '')">
+ <t t-esc="date.toString('ddd')"/><br />
+ <t t-esc="date.toString('MMM d')"/>
+ </th>
+ </t>
+ <th class="oe_timesheet_weekly_date_head">TOTAL</th>
+ </tr>
+ <tr t-foreach="widget.accounts" t-as="account">
+ <td class="oe_timesheet_weekly_account"><t t-esc="widget.account_names[account.account]"/></td>
+ <t t-set="day_count" t-value="0"/>
+ <t t-foreach="account.days" t-as="day">
+ <td t-att-class="(Date.compare(day.day, Date.today()) === 0 ? 'oe_timesheet_weekly_today' : '')">
+ <input t-if="!widget.get('effective_readonly')" class="oe_timesheet_weekly_input" t-att-data-account="account.account"
+ t-att-data-day-count="day_count" type="text"/>
+ <span t-if="widget.get('effective_readonly')" t-att-data-account="account.account"
+ t-att-data-day-count="day_count" class="oe_timesheet_weekly_box"/>
+ <t t-set="day_count" t-value="day_count + 1"/>
+ </td>
+ </t>
+ <td t-att-data-account-total="account.account"> </td>
+ </tr>
+ <tr class="oe_timesheet_weekly_add_row" style="display: none">
+ <td t-att-colspan="widget.dates.length + 2">
+ <button>Add</button>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div class="oe_timesheet_weekly_adding_tot">
+ <div class="oe_timesheet_weekly_adding"><button>Add Row</button></div>
+ <div class="oe_timesheet_weekly_tottot"><span>TOTAL</span></div>
+ </div>
+ </td>
+ <t t-set="day_count" t-value="0"/>
+ <t t-foreach="widget.dates" t-as="date">
+ <td t-att-class="(Date.compare(date, Date.today()) === 0 ? 'oe_timesheet_weekly_today' : '')">
+ <span class="oe_timesheet_weekly_box" t-att-data-day-total="day_count">
+ </span>
+ <t t-set="day_count" t-value="day_count + 1"/>
+ </td>
+ </t>
+ <td class="oe_timesheet_weekly_supertotal"> </td>
+ </tr>
+ </table>
+ </div>
+ </t>
+</templates> \ No newline at end of file
diff --git a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
index 070079a4b80..71776af61ba 100644
--- a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
+++ b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
@@ -16,7 +16,6 @@
I create a timesheet for employee "Quentin Paolinon".
-
!record {model: hr_timesheet_sheet.sheet, id: hr_timesheet_sheet_sheet_deddk0}:
- date_current: !eval time.strftime('%Y-%m-%d')
date_from: !eval time.strftime('%Y-%m-01')
name: Quentin Paolinon
state: new
@@ -35,30 +34,6 @@
!assert {model: hr.employee, id: hr.employee_qdp}:
- state == 'present'
-
- I want to check attendance and work of yesterday. I click on <- button.
--
- !python {model: hr_timesheet_sheet.sheet}: |
- date_prev = self.date_previous(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None)
- assert date_prev == True, "I See Previous Date Timesheet"
--
- Then I click on "Today" button to fill today's timesheet.
--
- !python {model: hr_timesheet_sheet.sheet}: |
- date_to = self.date_today(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None)
- assert date_to == True, "I See Today Date Timesheet"
--
- I can also move to next day by clicking on -> button.
--
- !python {model: hr_timesheet_sheet.sheet}: |
- date_next = self.date_next(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None)
- assert date_next == True, "I See Next Date Timesheet"
--
- I want to go to a particular date and see attendance then I select the date and click on "Go to:" button.
--
- !python {model: hr_timesheet_sheet.sheet}: |
- button_dumy = self.button_dummy(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None)
- assert button_dumy == True, "I See Particular Date Attendance"
--
At the time of logout, I create attendance and perform "Sign Out".
-
!record {model: hr.attendance, id: hr_attendance_2}:
diff --git a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
index a6974fc2ccf..2af8792472e 100644
--- a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
+++ b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
@@ -35,14 +35,13 @@ class hr_timesheet_current_open(osv.osv_memory):
user_ids = self.pool.get('hr.employee').search(cr, uid, [('user_id','=',uid)], context=context)
if not len(user_ids):
- raise osv.except_osv(_('Error!'), _('Please define employee for your user!'))
+ raise osv.except_osv(_('Error!'), _('Please create an employee and associate it with this user.'))
ids = ts.search(cr, uid, [('user_id','=',uid),('state','=','draft'),('date_from','<=',time.strftime('%Y-%m-%d')), ('date_to','>=',time.strftime('%Y-%m-%d'))], context=context)
if len(ids) > 1:
view_type = 'tree,form'
domain = "[('id','in',["+','.join(map(str, ids))+"]),('user_id', '=', uid)]"
elif len(ids)==1:
- ts.write(cr, uid, ids, {'date_current': time.strftime('%Y-%m-%d')}, context=context)
domain = "[('user_id', '=', uid)]"
else:
domain = "[('user_id', '=', uid)]"
diff --git a/addons/l10n_be/wizard/l10n_be_vat_intra_print.rml b/addons/l10n_be/wizard/l10n_be_vat_intra_print.rml
index 415f3a08f1f..ff1a2c2064d 100644
--- a/addons/l10n_be/wizard/l10n_be_vat_intra_print.rml
+++ b/addons/l10n_be/wizard/l10n_be_vat_intra_print.rml
@@ -108,7 +108,7 @@
<para style="terp_default_9">[[ l['code'] (l['intra_code']) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ l['amount'] or O.OO ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(l['amount'], currency_obj=company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -129,7 +129,7 @@
<para style="terp_tblheader_General_Right">Total:</para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ data['form']['amountsum'] or 0.00 ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(data['form']['amountsum'], currency_obj=company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/l10n_fr_hr_payroll/report/fiche_paye.rml b/addons/l10n_fr_hr_payroll/report/fiche_paye.rml
index 5221b00c462..76c6eb9dedf 100644
--- a/addons/l10n_fr_hr_payroll/report/fiche_paye.rml
+++ b/addons/l10n_fr_hr_payroll/report/fiche_paye.rml
@@ -290,9 +290,7 @@
<tr>
<td>
<para style="terp_default_Bold_8">[[o.employee_id.name or '_']]</para>
- <para style="terp_default_Bold_8">[[o.employee_id.address_home_id.street or '_' ]]</para>
- <para style="terp_default_Bold_8">[[o.employee_id.address_home_id.street2 or '' ]]</para>
- <para style="terp_default_Bold_8">[[o.employee_id.address_home_id.zip or '_' ]] [[o.employee_id.address_home_id.city or '' ]]</para>
+ <para style="terp_default_Bold_8">[[display_address(o.employee_id.address_home_id) or '_' ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/l10n_in_hr_payroll/i18n/bn.po b/addons/l10n_in_hr_payroll/i18n/bn.po
index ea9fcfd7bb3..0fd88c3813e 100644
--- a/addons/l10n_in_hr_payroll/i18n/bn.po
+++ b/addons/l10n_in_hr_payroll/i18n/bn.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"Language-Team: Bengali <bn@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr "" \ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/i18n/gu.po b/addons/l10n_in_hr_payroll/i18n/gu.po
index 2c321b13191..844c492e28b 100644
--- a/addons/l10n_in_hr_payroll/i18n/gu.po
+++ b/addons/l10n_in_hr_payroll/i18n/gu.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"Language-Team: Gujarati <gu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr "" \ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/i18n/hi.po b/addons/l10n_in_hr_payroll/i18n/hi.po
index d7cc9dc1519..b13e24e05f9 100644
--- a/addons/l10n_in_hr_payroll/i18n/hi.po
+++ b/addons/l10n_in_hr_payroll/i18n/hi.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"Language-Team: Hindi <hi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr "" \ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/i18n/ta.po b/addons/l10n_in_hr_payroll/i18n/ta.po
index 98d00c76a33..dbe0e244bee 100644
--- a/addons/l10n_in_hr_payroll/i18n/ta.po
+++ b/addons/l10n_in_hr_payroll/i18n/ta.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"Language-Team: Tamil <ta@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr "" \ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/i18n/te.po b/addons/l10n_in_hr_payroll/i18n/te.po
index 0c6f6127c4d..47ea35552f8 100644
--- a/addons/l10n_in_hr_payroll/i18n/te.po
+++ b/addons/l10n_in_hr_payroll/i18n/te.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"Language-Team: Telugu <te@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr "" \ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml b/addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml
index 4d7dbe91ee1..38f1272718b 100644
--- a/addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml
+++ b/addons/l10n_in_hr_payroll/report/payment_advice_report_view.xml
@@ -6,7 +6,7 @@
<field name="name">payment.advice.report.tree</field>
<field name="model">payment.advice.report</field>
<field name="arch" type="xml">
- <tree colors="blue:state == 'draft';black:state == 'confirm';gray:state == 'cancel' " string="Advices Analysis">
+ <tree colors="blue:state == 'draft';black:state == 'confirm';gray:state == 'cancel' " create="false" string="Advices Analysis">
<field name="nbr" sum="# Payment Lines"/>
<field name="name" invisible="1"/>
<field name="employee_id" invisible="1"/>
diff --git a/addons/l10n_in_hr_payroll/report/payslip_report_view.xml b/addons/l10n_in_hr_payroll/report/payslip_report_view.xml
index 92eaf3ec4a9..d71cb283336 100644
--- a/addons/l10n_in_hr_payroll/report/payslip_report_view.xml
+++ b/addons/l10n_in_hr_payroll/report/payslip_report_view.xml
@@ -6,7 +6,7 @@
<field name="name">payslip.report.tree</field>
<field name="model">payslip.report</field>
<field name="arch" type="xml">
- <tree colors="blue:state == 'draft';black:state == 'done';gray:state == 'cancel' " string="Payslip Analysis">
+ <tree colors="blue:state == 'draft';black:state == 'done';gray:state == 'cancel' " create="false" string="Payslip Analysis">
<field name="nbr" sum="# Payslip Lines"/>
<field name="name"/>
<field name="employee_id" invisible="1"/>
diff --git a/addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.rml b/addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.rml
index 8f2a57d2018..6368a644f4b 100644
--- a/addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.rml
+++ b/addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.rml
@@ -234,7 +234,7 @@
</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(e[13]) ]] [[company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(e[13],currency_obj= company.currency_id)]] </para>
</td>
</tr>
</blockTable>
@@ -248,43 +248,43 @@
<para style="terp_tblheader_Details">Total</para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[1]) or removeParentNode('para') ]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[1],currency_obj= company.currency_id) or removeParentNode('para') ]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[2]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[2],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[3]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[3],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[4]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[4],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[5]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[5],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[6]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[6],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[7]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[7],currency_obj= company.currency_id) or removeParentNode('para')]] ]</para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[8]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[8],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[9]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[9],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[10]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[10],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[11]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[11],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(t[12]) or removeParentNode('para')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(t[12],currency_obj= company.currency_id) or removeParentNode('para')]] </para>
</td>
<td>
- <para style="terp_tblheader_General_Right">[[ formatLang(get_total()) ]] [[company.currency_id.symbol]]</para>
+ <para style="terp_tblheader_General_Right">[[ formatLang(get_total(), currency_obj = company.currency_id)]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.rml b/addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.rml
index 7fa127b0bd3..502eaa7b0ff 100644
--- a/addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.rml
+++ b/addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.rml
@@ -478,7 +478,7 @@
</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(e1[13]) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(e1[13],currency_obj= company.currency_id) ]] </para>
</td>
</tr>
</blockTable>
@@ -571,7 +571,7 @@
</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(e2[13]) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(e2[13],currency_obj= company.currency_id) ]] </para>
</td>
</tr>
</blockTable>
diff --git a/addons/l10n_in_hr_payroll/report/report_payroll_advice.rml b/addons/l10n_in_hr_payroll/report/report_payroll_advice.rml
index 8ca1bae5ba5..879314a24d9 100644
--- a/addons/l10n_in_hr_payroll/report/report_payroll_advice.rml
+++ b/addons/l10n_in_hr_payroll/report/report_payroll_advice.rml
@@ -247,7 +247,7 @@
<para style="P5">[[ line['acc_no'] ]]</para>
</td>
<td>
- <para style="P8">[[formatLang(line['bysal'])]] [[ (company.currency_id and company.currency_id.symbol) or '' ]]</para>
+ <para style="P8">[[formatLang(line['bysal'], currency_obj = company.currency_id) ]]</para>
</td>
<td>
<para style="P5">[[ line['debit_credit'] ]]</para>
@@ -296,7 +296,7 @@
<para style="P5">[[ line['ifsc_code'] ]]</para>
</td>
<td>
- <para style="P8">[[formatLang(line['bysal'])]] [[ (company.currency_id and company.currency_id.symbol) or '' ]]</para>
+ <para style="P8">[[formatLang(line['bysal'], currency_obj = company.currency_id) ]]</para>
</td>
<td>
<para style="P5">[[ line['debit_credit'] ]]</para>
@@ -321,7 +321,7 @@
<para style="P4"/>
</td>
<td>
- <para style="P4"><font face="Helvetica" size="6.0">[[ o.line_ids==[] and removeParentNode('para') ]]</font>[[ formatLang(get_bysal_total()) ]] [[ (company.currency_id and company.currency_id.symbol) or '' ]]</para>
+ <para style="P4"><font face="Helvetica" size="6.0">[[ o.line_ids==[] and removeParentNode('para') ]]</font>[[ formatLang(get_bysal_total(), currency_obj = company.currency_id) ]]</para>
</td>
<td>
<para style="P4">
@@ -347,7 +347,7 @@
<para style="P4"/>
</td>
<td>
- <para style="P4"><font face="Helvetica" size="6.0">[[ o.line_ids==[] and removeParentNode('para') ]]</font>[[ formatLang(get_bysal_total()) ]] [[ (company.currency_id and company.currency_id.symbol) or '' ]]</para>
+ <para style="P4"><font face="Helvetica" size="6.0">[[ o.line_ids==[] and removeParentNode('para') ]]</font>[[ formatLang(get_bysal_total(), currency_obj = company.currency_id) ]]</para>
</td>
<td>
<para style="P4">
diff --git a/addons/l10n_in_hr_payroll/report/report_payslip_details.rml b/addons/l10n_in_hr_payroll/report/report_payslip_details.rml
index a7ab3db3185..c4ce55bfa41 100644
--- a/addons/l10n_in_hr_payroll/report/report_payslip_details.rml
+++ b/addons/l10n_in_hr_payroll/report/report_payslip_details.rml
@@ -234,7 +234,7 @@
</para>
</td>
<td>
- <para style="P5">[[o.employee_id.address_home_id and o.employee_id.address_home_id.name or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.street or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.street2 or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.zip or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.city or '' ]],[[o.employee_id.address_home_id and o.employee_id.address_home_id.state_id and o.employee_id.address_home_id.state_id.name or '' ]] [[o.employee_id.address_home_id and o.employee_id.address_home_id.country_id and o.employee_id.address_home_id.country_id.name or '' ]]</para>
+ <para style="P5">[[o.employee_id.address_home_id and o.employee_id.address_home_id.name or '' ]],[[o.employee_id.address_home_id and display_address(o.employee_id.address_home_id)]]</para>
</td>
</tr>
</blockTable>
@@ -334,7 +334,7 @@
<para style="P17"><font face="Helvetica" color="white">[[ '..'*h['level'] ]]</font>[[ h['rule_category'] ]]<font face="Helvetica">[[ h['level']!=0 and ( setTag('para','para',{'style':'terp_default_8'})) or removeParentNode('font') ]]</font></para>
</td>
<td>
- <para style="P6">[[ formatLang(h['total']) ]] [[o.company_id and o.company_id.currency_id.symbol or '']] <font face="Helvetica" size="8.0">[[ h['level']==0 and ( setTag('para','para',{'style':'terp_default_10'})) or removeParentNode('font') ]]</font></para>
+ <para style="P6">[[ formatLang(h['total'], currency_obj = o.company_id and o.company_id.currency_id)]] <font face="Helvetica" size="8.0">[[ h['level']==0 and ( setTag('para','para',{'style':'terp_default_10'})) or removeParentNode('font') ]]</font></para>
</td>
</tr>
</blockTable>
diff --git a/addons/l10n_uk/data/account.account.type.csv b/addons/l10n_uk/data/account.account.type.csv
index 0827975b22f..379656ece39 100644
--- a/addons/l10n_uk/data/account.account.type.csv
+++ b/addons/l10n_uk/data/account.account.type.csv
@@ -10,4 +10,4 @@
"account_type_output_tax","Output Tax","Output Tax","liability","Unreconciled"
"account_type_input_tax","Input Tax","Input Tax","asset","Unreconciled"
"account_type_profit_and_loss","Profit and Loss","Profit and Loss","none","None"
-"account_type_view","View","view",,"None"
+"account_type_view","View","view","none","None"
diff --git a/addons/lunch/report/order.rml b/addons/lunch/report/order.rml
index b09b59bb96b..0a13beb622c 100644
--- a/addons/lunch/report/order.rml
+++ b/addons/lunch/report/order.rml
@@ -137,7 +137,7 @@
</para>
</td>
<td>
- <para style="terp_default_9_right_bold"><u>[[ formatLang(get_total(o,objects)) ]] [[ (o.company_id and o.company_id.currency_id and o.company_id.currency_id.symbol) or '' ]]</u></para>
+ <para style="terp_default_9_right_bold"><u>[[ formatLang(get_total(o,objects), currency_obj = o.company_id and o.company_id.currency_id) ]]</u></para>
</td>
</tr>
</blockTable>
@@ -155,7 +155,7 @@
<para style="terp_default_9">[[ lines.descript]]</para>
</td>
<td>
- <para style="terp_default_9_right">[[ lines.price ]] [[ (o.company_id and o.company_id.currency_id and o.company_id.currency_id.symbol) or '' ]]</para>
+ <para style="terp_default_9_right">[[ formatLang(lines.price , currency_obj = o.company_id and o.company_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -172,7 +172,7 @@
<para style="terp_tbl_detail_header">Total :</para>
</td>
<td>
- <para style="terp_default_9_right_bold">[[ formatLang(get_nettotal()) ]] [[ (o.company_id and o.company_id.currency_id and o.company_id.currency_id.symbol) or '' ]]</para>
+ <para style="terp_default_9_right_bold">[[ formatLang(get_nettotal(), currency_obj = o.company_id and o.company_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/mail/__init__.py b/addons/mail/__init__.py
index 92e882ae6d8..abf714ad534 100644
--- a/addons/mail/__init__.py
+++ b/addons/mail/__init__.py
@@ -33,6 +33,7 @@ import report
import wizard
import res_config
import mail_group_menu
+import update
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mail/data/mail_data.xml b/addons/mail/data/mail_data.xml
index 5fe1ee45b1d..522cbe8c7a7 100644
--- a/addons/mail/data/mail_data.xml
+++ b/addons/mail/data/mail_data.xml
@@ -13,6 +13,20 @@
<field eval="'()'" name="args"/>
</record>
+ <record id="ir_cron_module_update_notification" model="ir.cron">
+ <field name="name">Update Notification</field>
+ <field eval="True" name="active" />
+ <field name="user_id" ref="base.user_root" />
+ <field name="interval_number">1</field>
+ <field name="interval_type">weeks</field>
+ <field name="numbercall">-1</field>
+ <field eval="False" name="doall" />
+ <field eval="'ir.module.module'" name="model" />
+ <field eval="'update_notification'" name="function" />
+ <field eval="'(None,)'" name="args" />
+ <field name="priority">1000</field>
+ </record>
+
<record id="mt_comment" model="mail.message.subtype">
<field name="name">comment</field>
</record>
diff --git a/addons/mail/data/mail_demo.xml b/addons/mail/data/mail_demo.xml
index 1350fd33547..7bda32c002b 100644
--- a/addons/mail/data/mail_demo.xml
+++ b/addons/mail/data/mail_demo.xml
@@ -42,10 +42,5 @@ This month you also get 250 EUR of eco-vouchers if you have been in the company
<field name="type">comment</field>
</record>
- <record model="ir.config_parameter" id="user_mail_alias">
- <field name="key">mail.catchall.domain</field>
- <field name="value">demo.openerp.com</field>
- </record>
-
</data>
</openerp>
diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index e9a569a8192..741184ef7a3 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -63,10 +63,12 @@ class mail_mail(osv.Model):
}
def _get_default_from(self, cr, uid, context=None):
- cur = self.pool.get('res.users').browse(cr, uid, uid, context=context)
- if not cur.alias_domain:
- raise osv.except_osv(_('Invalid Action!'), _('Unable to send email, set an alias domain in your server settings.'))
- return cur.alias_name + '@' + cur.alias_domain
+ this = self.pool.get('res.users').browse(cr, uid, uid, context=context)
+ if this.alias_domain:
+ return '%s@%s' % (this.alias_name, this.alias_domain)
+ elif this.email:
+ return this.email
+ raise osv.except_osv(_('Invalid Action!'), _("Unable to send email, please configure the sender's email address or alias."))
_defaults = {
'state': 'outgoing',
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index bbf68509277..9631918050a 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -134,6 +134,7 @@ class mail_message(osv.Model):
'subtype_id': fields.many2one('mail.message.subtype', 'Subtype'),
'vote_user_ids': fields.many2many('res.users', 'mail_vote', 'message_id', 'user_id', string='Votes',
help='Users that voted for this message'),
+ 'is_private': fields.boolean('Private message'),
}
def _needaction_domain_get(self, cr, uid, context=None):
@@ -150,6 +151,7 @@ class mail_message(osv.Model):
'date': lambda *a: fields.datetime.now(),
'author_id': lambda self, cr, uid, ctx={}: self._get_default_author(cr, uid, ctx),
'body': '',
+ 'is_private': True,
}
#------------------------------------------------------
@@ -180,7 +182,6 @@ class mail_message(osv.Model):
fields allow to have the foreign record name without having
to check external access rights).
"""
- child_nbr = len(msg.child_ids)
has_voted = False
vote_ids = self.pool.get('res.users').name_get(cr, SUPERUSER_ID, [user.id for user in msg.vote_user_ids], context=context)
for vote in vote_ids:
@@ -194,7 +195,7 @@ class mail_message(osv.Model):
try:
author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0]
is_author = uid == msg.author_id.user_ids[0].id
- except (orm.except_orm, osv.except_osv):
+ except Exception:
author_id = False
is_author = False
try:
@@ -221,70 +222,67 @@ class mail_message(osv.Model):
'unread': msg.unread and msg.unread['unread'] or False
}
- def message_read_tree_get_expandable(self, cr, uid, parent_message, last_message, domain=[], current_level=0, level=0, context=None):
- """ . """
- base_domain = [('id', '<', last_message['id'])]
- if parent_message and current_level < level:
- base_domain += [('parent_id', '=', parent_message['id'])]
- elif parent_message:
- base_domain += [('id', 'child_of', parent_message['id']), ('id', '!=', parent_message['id'])]
- if domain:
- base_domain += domain
- extension = { 'type': 'expandable',
- 'domain': base_domain,
- 'thread_level': current_level,
- 'context': context,
- 'id': -1,
- }
- return extension
-
- def message_read_tree_flatten(self, cr, uid, parent_message, messages, domain=[], level=0, current_level=0, context=None, limit=None, add_expandable=True):
- """ Given a tree with several roots of following structure :
- [ {'id': 1, 'child_ids': [
- {'id': 11, 'child_ids': [...] },],
- {...} ]
- Flatten it to have a maximum number of levels, 0 being flat and
- sort messages in a level according to a key of the messages.
- Perform the flattening at leafs if above the maximum depth, then get
- back in the tree.
- :param context: ``sort_key``: key for sorting (id by default)
- :param context: ``sort_reverse``: reverser order for sorting (True by default)
+ def _message_read_expandable(self, cr, uid, tree, result, message_loaded, domain, context, parent_id, limit):
+ """
+ create the expandable message for all parent message read
+ this function is used by message_read
"""
- def _flatten(msg_dict):
- """ from {'id': x, 'child_ids': [{child1}, {child2}]}
- get [{'id': x, 'child_ids': []}, {child1}, {child2}]
- """
- child_ids = msg_dict.pop('child_ids', [])
- msg_dict['child_ids'] = []
- return [msg_dict] + child_ids
- context = context or {}
- limit = limit or self._message_read_limit
+ tree_not = []
+ # expandable for not show message
+ for id_msg in tree:
+ # get all childs
+ not_loaded_ids = self.search(cr, SUPERUSER_ID, [['parent_id','=',id_msg],['id','not in',message_loaded]], None, limit=1000)
+ # group childs not read
+ id_min=None
+ id_max=None
+ nb=0
+ for not_loaded_id in not_loaded_ids:
+ if not_loaded_id not in tree:
+ nb+=1
+ if id_min==None or id_min>not_loaded_id:
+ id_min=not_loaded_id
+ if id_max==None or id_max<not_loaded_id:
+ id_max=not_loaded_id
+ tree_not.append(not_loaded_id)
+ else:
+ if nb>0:
+ result.append({
+ 'domain': [['id','>=',id_min],['id','<=',id_max],['parent_id','=',id_msg]],
+ 'nb_messages': nb,
+ 'type': 'expandable',
+ 'parent_id': id_msg,
+ 'id': id_min
+ })
+ id_min=None
+ id_max=None
+ nb=0
+ if nb>0:
+ result.append({
+ 'domain': [['id','>=',id_min],['id','<=',id_max],['parent_id','=',id_msg]],
+ 'nb_messages': nb,
+ 'type': 'expandable',
+ 'parent_id': id_msg,
+ 'id': id_min
+ })
- # Depth-first flattening
- for message in messages:
- if message.get('type') == 'expandable':
- continue
- message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], domain, level, current_level + 1, context=context, limit=limit)
- for child in message['child_ids']:
- if child.get('type') == 'expandable':
- continue
- message['child_nbr'] += child['child_nbr']
- # Flatten if above maximum depth
- if current_level < level:
- return_list = messages
- else:
- return_list = [flat_message for message in messages for flat_message in _flatten(message)]
-
- # Add expandable
- return_list = sorted(return_list, key=itemgetter(context.get('sort_key', 'id')), reverse=context.get('sort_reverse', True))
- if return_list and current_level == 0 and add_expandable:
- expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, domain, current_level, level, context=context)
- return_list.append(expandable)
- elif return_list and current_level <= level and add_expandable:
- expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, domain, current_level, level, context=context)
- return_list.append(expandable)
- return return_list
+
+ # expandable for limit max
+ ids = self.search(cr, SUPERUSER_ID, domain+[['id','not in',message_loaded+tree+tree_not]], context=context, limit=1)
+ if len(ids) > 0:
+ result.append(
+ {
+ 'domain': domain,
+ 'nb_messages': 0,
+ 'type': 'expandable',
+ 'parent_id': parent_id,
+ 'id': -1
+ });
+
+
+ result = sorted(result, key=lambda k: k['id'])
+
+ return result
def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, parent_id=False, limit=None):
""" Read messages from mail.message, and get back a structured tree
@@ -294,13 +292,11 @@ class mail_message(osv.Model):
well formed threads.
:param domain: optional domain for searching ids
- :param level: level of threads to display, 0 being flat
:param limit: number of messages to fetch
:param parent_id: if parent_id reached, stop searching for
further parents
:return list: list of trees of messages
"""
-
message_loaded = context and context.get('message_loaded') or [0]
# don't read the message display by .js, in context message_loaded list
@@ -315,7 +311,7 @@ class mail_message(osv.Model):
record = None
# select ids
- if ids:
+ if ids and ids!=[None]:
for msg in self.browse(cr, uid, ids, context=context):
result.append(self._message_dict_get(cr, uid, msg, context=context))
return result
@@ -341,60 +337,19 @@ class mail_message(osv.Model):
result = sorted(result, key=lambda k: k['id'])
+ result = self._message_read_expandable(cr, uid, tree, result, message_loaded, domain, context, parent_id, limit)
- tree_not = []
- # expandable for not show message
- for id_msg in tree:
- # get all childs
- not_loaded_ids = self.search(cr, SUPERUSER_ID, [['parent_id','=',id_msg],['id','not in',message_loaded]], None, limit=1000)
- # group childs not read
- id_min=None
- id_max=None
- nb=0
- for not_loaded_id in not_loaded_ids:
- if not_loaded_id not in tree:
- nb+=1
- if id_min==None or id_min>not_loaded_id:
- id_min=not_loaded_id
- if id_max==None or id_max<not_loaded_id:
- id_max=not_loaded_id
- tree_not.append(not_loaded_id)
- else:
- if nb>0:
- result.append({
- 'domain': [['id','>=',id_min],['id','<=',id_max],['parent_id','=',id_msg]],
- 'nb_messages': nb,
- 'type': 'expandable',
- 'parent_id': id_msg,
- 'id': id_min
- })
- nb=0
- if nb>0:
- result.append({
- 'domain': [['id','>=',id_min],['parent_id','=',id_msg]],
- 'nb_messages': nb,
- 'type': 'expandable',
- 'parent_id': id_msg,
- 'id': id_min
- })
-
-
- # expandable for limit max
- ids = self.search(cr, SUPERUSER_ID, domain+[['id','not in',message_loaded+tree+tree_not]], context=context, limit=1)
- if len(ids) > 0:
- result.append(
- {
- 'domain': domain,
- 'nb_messages': 0,
- 'type': 'expandable',
- 'parent_id': parent_id,
- 'id': -1
- });
+ return result
+ def user_free_attachment(self, cr, uid, context=None):
+ attachment_list = []
- result = sorted(result, key=lambda k: k['id'])
+ attachment = self.pool.get('ir.attachment')
+ attachment_ids = attachment.search(cr, uid, [('res_model','=',''),('create_uid','=',uid)])
+ if len(attachment_ids):
+ attachment_list = [{'id': attach.id, 'name': attach.name, 'date': attach.create_date} for attach in attachment.browse(cr, uid, attachment_ids, context=context)]
- return result
+ return attachment_list
#------------------------------------------------------
# Email api
@@ -502,9 +457,9 @@ class mail_message(osv.Model):
def create(self, cr, uid, values, context=None):
if not values.get('message_id') and values.get('res_id') and values.get('model'):
- values['message_id'] = tools.generate_tracking_message_id('%(model)s-%(res_id)s' % values)
+ values['message_id'] = tools.generate_tracking_message_id('%(res_id)s-%(model)s' % values)
newid = super(mail_message, self).create(cr, uid, values, context)
- self._notify(cr, 1, newid, context=context)
+ self._notify(cr, SUPERUSER_ID, newid, context=context)
return newid
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
@@ -526,11 +481,9 @@ class mail_message(osv.Model):
self.pool.get('ir.attachment').unlink(cr, uid, attachments_to_delete, context=context)
return super(mail_message, self).unlink(cr, uid, ids, context=context)
- def _notify(self, cr, uid, newid, context=None):
+ def _notify_followers(self, cr, uid, newid, message, context=None):
""" Add the related record followers to the destination partner_ids.
- Call mail_notification.notify to manage the email sending
"""
- message = self.browse(cr, uid, newid, context=context)
partners_to_notify = set([])
# message has no subtype_id: pure log message -> no partners, no one notified
if not message.subtype_id:
@@ -551,6 +504,14 @@ class mail_message(osv.Model):
self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(4, p_id) for p_id in missing_notified]}, context=context)
partners_to_notify |= extra_notified
+ def _notify(self, cr, uid, newid, context=None):
+ """ Add the related record followers to the destination partner_ids if is not a private message.
+ Call mail_notification.notify to manage the email sending
+ """
+ message = self.browse(cr, uid, newid, context=context)
+ if message and (message.is_private!=False and message.is_private!=None):
+ self._notify_followers(cr, uid, newid, message, context=context)
+
# add myself if I wrote on my wall,
# unless remove myself author
if ((message.model=="res.partner" and message.res_id==message.author_id.id)):
diff --git a/addons/mail/mail_message_view.xml b/addons/mail/mail_message_view.xml
index cc0419352af..0c572384bb4 100644
--- a/addons/mail/mail_message_view.xml
+++ b/addons/mail/mail_message_view.xml
@@ -88,21 +88,21 @@
<field name="name">Inbox</field>
<field name="tag">mail.wall</field>
<field name="params" eval="&quot;{'domain': [('notification_ids.partner_id.user_ids', 'in', [uid]),('unread', '=', True)],
- 'context': {'default_model': 'res.users', 'default_res_id': uid} }&quot;"/>
+ 'context': {'default_model': 'res.partner'} }&quot;"/>
</record>
<record id="action_mail_archives_feeds" model="ir.actions.client">
<field name="name">Archives</field>
<field name="tag">mail.wall</field>
<field name="params" eval="&quot;{'domain': [('notification_ids.partner_id.user_ids', 'in', [uid]),('unread', '=', False)],
- 'context': {'default_model': 'res.users', 'default_res_id': uid} }&quot;"/>
+ 'context': {'default_model': 'res.partner'} }&quot;"/>
</record>
<record id="action_mail_sent_feeds" model="ir.actions.client">
<field name="name">Sent</field>
<field name="tag">mail.wall</field>
<field name="params" eval="&quot;{'domain': [('author_id.user_ids', 'in', [uid])],
- 'context': {'default_model': 'res.users', 'default_res_id': uid} }&quot;"/>
+ 'context': {'default_model': 'res.partner'} }&quot;"/>
</record>
</data>
</openerp>
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index 9f53b4c08b1..e5b93ac4000 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -39,63 +39,6 @@ _logger = logging.getLogger(__name__)
def decode_header(message, header, separator=' '):
return separator.join(map(decode, message.get_all(header, [])))
-class many2many_reference(fields.many2many):
- """ many2many_reference manages many2many fields where one id is found
- by a reference-like key (a char column in addition to the foreign id).
- The reference_column attribute on the many2many fields is used;
- if not defined, ``res_model`` is used. """
-
- def _get_query_and_where_params(self, cr, model, ids, values, where_params):
- """ Add in where condition like mail_followers.res_model = 'crm.lead' """
- reference_column = self.reference_column if self.reference_column else 'res_model'
- values.update(reference_column=reference_column, reference_value=model._name)
- query = 'SELECT %(rel)s.%(id2)s, %(rel)s.%(id1)s \
- FROM %(rel)s, %(from_c)s \
- WHERE %(rel)s.%(id1)s IN %%s \
- AND %(rel)s.%(id2)s = %(tbl)s.id \
- AND %(rel)s.%(reference_column)s = \'%(reference_value)s\' \
- %(where_c)s \
- %(order_by)s \
- %(limit)s \
- OFFSET %(offset)d' \
- % values
- return query, where_params
-
- def set(self, cr, model, id, name, values, user=None, context=None):
- """ Override to add the reference field in queries. """
- if not values: return
- rel, id1, id2 = self._sql_names(model)
- obj = model.pool.get(self._obj)
- # reference column name: given by attribute or res_model
- reference_column = self.reference_column if self.reference_column else 'res_model'
- for act in values:
- if not (isinstance(act, list) or isinstance(act, tuple)) or not act:
- continue
- if act[0] == 0:
- idnew = obj.create(cr, user, act[2], context=context)
- cr.execute('INSERT INTO '+rel+' ('+id1+','+id2+','+reference_column+') VALUES (%s,%s,%s)', (id, idnew, model._name))
- elif act[0] == 3:
- cr.execute('DELETE FROM '+rel+' WHERE '+id1+'=%s AND '+id2+'=%s AND '+reference_column+'=%s', (id, act[1], model._name))
- elif act[0] == 4:
- # following queries are in the same transaction - so should be relatively safe
- cr.execute('SELECT 1 FROM '+rel+' WHERE '+id1+'=%s AND '+id2+'=%s AND '+reference_column+'=%s', (id, act[1], model._name))
- if not cr.fetchone():
- cr.execute('INSERT INTO '+rel+' ('+id1+','+id2+','+reference_column+') VALUES (%s,%s,%s)', (id, act[1], model._name))
- elif act[0] == 5:
- cr.execute('delete from '+rel+' where '+id1+' = %s AND '+reference_column+'=%s', (id, model._name))
- elif act[0] == 6:
- d1, d2,tables = obj.pool.get('ir.rule').domain_get(cr, user, obj._name, context=context)
- if d1:
- d1 = ' and ' + ' and '.join(d1)
- else:
- d1 = ''
- cr.execute('DELETE FROM '+rel+' WHERE '+id1+'=%s AND '+reference_column+'=%s AND '+id2+' IN (SELECT '+rel+'.'+id2+' FROM '+rel+', '+','.join(tables)+' WHERE '+rel+'.'+id1+'=%s AND '+rel+'.'+id2+' = '+obj._table+'.id '+ d1 +')', [id, model._name, id]+d2)
- for act_nbr in act[2]:
- cr.execute('INSERT INTO '+rel+' ('+id1+','+id2+','+reference_column+') VALUES (%s,%s,%s)', (id, act_nbr, model._name))
- # cases 1, 2: performs write and unlink -> default implementation is ok
- else:
- return super(many2many_reference, self).set(cr, model, id, name, values, user, context)
-
class mail_thread(osv.AbstractModel):
''' mail_thread model is meant to be inherited by any model that needs to
@@ -186,6 +129,64 @@ class mail_thread(osv.AbstractModel):
res[notif.message_id.res_id] = True
return [('id', 'in', res.keys())]
+ def _get_followers(self, cr, uid, ids, name, arg, context=None):
+ fol_obj = self.pool.get('mail.followers')
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID, [('res_model', '=', self._name), ('res_id', 'in', ids)])
+ res = dict((res_id, []) for res_id in ids)
+ for fol in fol_obj.browse(cr, SUPERUSER_ID, fol_ids):
+ res[fol.res_id].append(fol.partner_id.id)
+ return res
+
+ def _set_followers(self, cr, uid, id, name, value, arg, context=None):
+ if not value:
+ return
+ partner_obj = self.pool.get('res.partner')
+ fol_obj = self.pool.get('mail.followers')
+
+ # read the old set of followers, and determine the new set of followers
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID, [('res_model', '=', self._name), ('res_id', '=', id)])
+ old = set(fol.partner_id.id for fol in fol_obj.browse(cr, SUPERUSER_ID, fol_ids))
+ new = set(old)
+
+ for command in value:
+ if isinstance(command, (int, long)):
+ new.add(command)
+ elif command[0] == 0:
+ new.add(partner_obj.create(cr, uid, command[2], context=context))
+ elif command[0] == 1:
+ partner_obj.write(cr, uid, [command[1]], command[2], context=context)
+ new.add(command[1])
+ elif command[0] == 2:
+ partner_obj.unlink(cr, uid, [command[1]], context=context)
+ new.discard(command[1])
+ elif command[0] == 3:
+ new.discard(command[1])
+ elif command[0] == 4:
+ new.add(command[1])
+ elif command[0] == 5:
+ new.clear()
+ elif command[0] == 6:
+ new = set(command[2])
+
+ # remove partners that are no longer followers
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID,
+ [('res_model', '=', self._name), ('res_id', '=', id), ('partner_id', 'not in', list(new))])
+ fol_obj.unlink(cr, SUPERUSER_ID, fol_ids)
+
+ # add new followers
+ for partner_id in new - old:
+ fol_obj.create(cr, SUPERUSER_ID, {'res_model': self._name, 'res_id': id, 'partner_id': partner_id})
+
+ def _search_followers(self, cr, uid, obj, name, args, context):
+ fol_obj = self.pool.get('mail.followers')
+ res = []
+ for field, operator, value in args:
+ assert field == name
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID, [('res_model', '=', self._name), ('partner_id', operator, value)])
+ res_ids = [fol.res_id for fol in fol_obj.browse(cr, SUPERUSER_ID, fol_ids)]
+ res.append(('id', 'in', res_ids))
+ return res
+
_columns = {
'message_is_follower': fields.function(_get_subscription_data,
type='boolean', string='Is a Follower', multi='_get_subscription_data,'),
@@ -194,9 +195,8 @@ class mail_thread(osv.AbstractModel):
help="Holds data about the subtypes. The content of this field "\
"is a structure holding the current model subtypes, and the "\
"current document followed subtypes."),
- 'message_follower_ids': many2many_reference('res.partner',
- 'mail_followers', 'res_id', 'partner_id',
- reference_column='res_model', string='Followers'),
+ 'message_follower_ids': fields.function(_get_followers, fnct_inv=_set_followers,
+ fnct_search=_search_followers, type='many2many', obj='res.partner', string='Followers'),
'message_comment_ids': fields.one2many('mail.message', 'res_id',
domain=lambda self: [('model', '=', self._name), ('type', 'in', ('comment', 'email'))],
string='Comments and emails',
@@ -422,12 +422,12 @@ class mail_thread(osv.AbstractModel):
model_pool = self.pool.get(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" % \
- (msg['message-id'], model)
+ (msg['message_id'], model)
if thread_id and hasattr(model_pool, 'message_update'):
model_pool.message_update(cr, user_id, [thread_id], msg, context=context)
else:
thread_id = model_pool.message_new(cr, user_id, msg, custom_values, context=context)
- self.message_post(cr, uid, [thread_id], context=context, **msg)
+ model_pool.message_post(cr, uid, [thread_id], context=context, **msg)
return thread_id
def message_new(self, cr, uid, msg_dict, custom_values=None, context=None):
@@ -538,7 +538,7 @@ class mail_thread(osv.AbstractModel):
field may not be present if missing in original
message::
- { 'message-id': msg_id,
+ { 'message_id': msg_id,
'subject': subject,
'from': from,
'to': to,
@@ -623,11 +623,10 @@ class mail_thread(osv.AbstractModel):
:param str subject: optional subject
:param str type: mail_message.type
:param int parent_id: optional ID of parent message in this thread
- :param tuple(str,str) attachments: list of attachment tuples in the form
+ :param tuple(str,str) attachments or list id: list of attachment tuples in the form
``(name,content)``, where content is NOT base64 encoded
:return: ID of newly created mail.message
"""
-
context = context or {}
attachments = attachments or []
assert (not thread_id) or isinstance(thread_id, (int, long)) or \
@@ -635,7 +634,7 @@ class mail_thread(osv.AbstractModel):
if isinstance(thread_id, (list, tuple)):
thread_id = thread_id and thread_id[0]
- attachment_ids = []
+ attachment_ids=[]
for name, content in attachments:
if isinstance(content, unicode):
content = content.encode('utf-8')
@@ -679,6 +678,13 @@ class mail_thread(osv.AbstractModel):
'attachment_ids': attachment_ids,
'subtype_id': subtype_id,
})
+
+ # if the parent is private, the message must be private
+ if parent_id:
+ msg = messages.browse(cr, uid, parent_id, context=context)
+ if msg.is_private:
+ values["is_private"] = msg.is_private
+
# Avoid warnings about non-existing fields
for x in ('from', 'to', 'cc'):
values.pop(x, None)
@@ -691,10 +697,23 @@ class mail_thread(osv.AbstractModel):
def message_post_api(self, cr, uid, thread_id, body='', subject=False, type='notification',
subtype=None, parent_id=False, attachments=None, context=None, **kwargs):
+ # if the user write on his wall
+ if self._name=='res.partner' and not thread_id:
+ user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
+ thread_id = user.partner_id.id
+
added_message_id = self.message_post(cr, uid, thread_id=thread_id, body=body, subject=subject, type=type,
- subtype=subtype, parent_id=parent_id, attachments=attachments, context=context)
+ subtype=subtype, parent_id=parent_id, context=context)
+
+ attachment_ids=[]
+ if attachments:
+ ir_attachment = self.pool.get('ir.attachment')
+ attachment_ids = ir_attachment.search(cr, 1, [('res_model', '=', ""), ('res_id', '=', ""), ('user_id', '=', uid), ('id', 'in', attachments)], context=context)
+ if attachment_ids:
+ self.pool.get('ir.attachment').write(cr, 1, attachment_ids, { 'res_model': self._name, 'res_id': thread_id }, context=context)
+ self.pool.get('mail.message').write(cr, 1, [added_message_id], {'attachment_ids': [(6, 0, [pid for pid in attachment_ids])]} )
+
added_message = self.pool.get('mail.message').message_read(cr, uid, [added_message_id])
-
return added_message
def get_message_subtypes(self, cr, uid, ids, context=None):
diff --git a/addons/mail/mail_thread_view.xml b/addons/mail/mail_thread_view.xml
index 3507e7c449f..696edde0e15 100644
--- a/addons/mail/mail_thread_view.xml
+++ b/addons/mail/mail_thread_view.xml
@@ -20,13 +20,13 @@
</record>
<record id="mail_archivesfeeds" model="ir.ui.menu">
<field name="name">Archives</field>
- <field name="sequence" eval="11"/>
+ <field name="sequence" eval="12"/>
<field name="action" ref="action_mail_archives_feeds"/>
<field name="parent_id" ref="mail_feeds"/>
</record>
<record id="mail_sentfeeds" model="ir.ui.menu">
<field name="name">Sent</field>
- <field name="sequence" eval="12"/>
+ <field name="sequence" eval="13"/>
<field name="action" ref="action_mail_sent_feeds"/>
<field name="parent_id" ref="mail_feeds"/>
</record>
diff --git a/addons/mail/res_config.py b/addons/mail/res_config.py
index ce2f75687ba..91606e1c720 100644
--- a/addons/mail/res_config.py
+++ b/addons/mail/res_config.py
@@ -19,6 +19,8 @@
#
##############################################################################
+import urlparse
+
from openerp.osv import osv, fields
class project_configuration(osv.TransientModel):
@@ -31,9 +33,16 @@ class project_configuration(osv.TransientModel):
}
def get_default_alias_domain(self, cr, uid, ids, context=None):
- return {'alias_domain': self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context)}
+ alias_domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context)
+ if not alias_domain:
+ domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "web.base.url", context=context)
+ try:
+ alias_domain = urlparse.urlsplit(domain).netloc.split(':')[0]
+ except Exception:
+ pass
+ return {'alias_domain': alias_domain}
def set_alias_domain(self, cr, uid, ids, context=None):
config_parameters = self.pool.get("ir.config_parameter")
for record in self.browse(cr, uid, ids, context=context):
- config_parameters.set_param(cr, uid, "mail.catchall.domain", record.alias_domain or '', context=context) \ No newline at end of file
+ config_parameters.set_param(cr, uid, "mail.catchall.domain", record.alias_domain or '', context=context)
diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py
index 545198f4c7f..f870604b03a 100644
--- a/addons/mail/res_users.py
+++ b/addons/mail/res_users.py
@@ -110,9 +110,19 @@ class res_users(osv.Model):
alias_pool.unlink(cr, uid, alias_ids, context=context)
return res
- def message_post(self, cr, uid, thread_id, **kwargs):
- partner_id = self.pool.get('res.users').browse(cr, uid, thread_id)[0].partner_id.id
- return self.pool.get('res.partner').message_post(cr, uid, partner_id, **kwargs)
+ def message_post(self, cr, uid, thread_id, context=None, **kwargs):
+ assert thread_id, "res.users does not support posting global messages"
+ if context and 'thread_model' in context:
+ context['thread_model'] = 'res.partner'
+ if isinstance(thread_id, (list, tuple)):
+ thread_id = thread_id[0]
+ partner_id = self.pool.get('res.users').browse(cr, uid, thread_id).partner_id.id
+ return self.pool.get('res.partner').message_post(cr, uid, partner_id, context=context, **kwargs)
+
+ def message_update(self, cr, uid, ids, msg_dict, update_vals=None, context=None):
+ partner_id = self.pool.get('res.users').browse(cr, uid, ids)[0].partner_id.id
+ return self.pool.get('res.partner').message_update(cr, uid, [partner_id], msg_dict,
+ update_vals=update_vals, context=context)
class res_users_mail_group(osv.Model):
""" Update of res.users class
diff --git a/addons/mail/security/mail_security.xml b/addons/mail/security/mail_security.xml
index b503565bd11..be3bb667628 100644
--- a/addons/mail/security/mail_security.xml
+++ b/addons/mail/security/mail_security.xml
@@ -7,7 +7,7 @@
<field name="name">Mail.group: access only public and joined groups</field>
<field name="model_id" ref="model_mail_group"/>
<!-- This rule has to be improved for employee only groups -->
- <field name="domain_force">['|', '|', ('public', '=', 'public'), ('message_follower_ids', 'in', [user.id]), '&amp;', ('public','=','groups'), ('group_public_id','in', [x.id for x in user.groups_id])]</field>
+ <field name="domain_force">['|', '|', ('public', '=', 'public'), ('message_follower_ids', 'in', [user.partner_id.id]), '&amp;', ('public','=','groups'), ('group_public_id','in', [g.id for g in user.groups_id])]</field>
</record>
<!--
diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css
index 364ac7e3165..1592d79e18d 100644
--- a/addons/mail/static/src/css/mail.css
+++ b/addons/mail/static/src/css/mail.css
@@ -82,9 +82,13 @@
overflow: auto;
}
+.openerp .oe_mail_record_wall {
+ margin: auto;
+ width: 560px;
+}
+
.openerp .oe_mail_record_wall > .oe_mail_wall_threads {
float: left;
- width: 560px;
}
.openerp div.oe_mail_recthread_aside {
@@ -145,6 +149,10 @@
z-index: 5;
}
.openerp .oe_mouse_subtypes .oe_recthread_subtypes {
+ background: #fff;
+ padding: 2px;
+ border: 1px solid #aaaaaa;
+ border-top: 0px;
position: absolute;
z-index: 2;
}
@@ -160,7 +168,6 @@
/* ------------------------------------------------------------ */
.openerp div.oe_mail_thread_action {
- display: none;
white-space: normal;
padding: 8px;
z-index:5;
@@ -174,16 +181,6 @@
}
/* default textarea (oe_mail_compose_textarea), and body textarea for compose form view */
-.openerp .oe_mail_msg_content textarea.oe_mail_compose_textarea,
-.openerp .oe_mail_msg_content div.oe_mail_compose_message_body textarea {
- width: 474px;
- height: 60px;
- padding: 4px;
- font-size: 12px;
- border: 1px solid #cccccc;
-}
-
-/* default textarea (oe_mail_compose_textarea), and body textarea for compose form view */
.openerp .oe_mail_msg_content textarea.oe_mail_compose_textarea:focus,
.openerp .oe_mail_msg_content div.oe_mail_compose_message_body textarea:focus {
outline: 0;
@@ -206,6 +203,10 @@
margin-left: 66px;
}
+.openerp li.oe_mail_thread_msg {
+ width: 560px;
+}
+
.openerp div.oe_thread_placeholder li.oe_mail_thread_msg:last-child {
margin-bottom: 8px;
}
@@ -223,13 +224,18 @@
.openerp li.oe_mail_thread_msg.oe_mail_read,
.openerp li.oe_mail_thread_msg.oe_mail_read div {
- background-color: #F0F0F0;
+ border-left: #F0F0F0;
}
.openerp li.oe_mail_thread_msg.oe_mail_read li.oe_mail_thread_msg.oe_mail_unread,
.openerp li.oe_mail_thread_msg.oe_mail_read li.oe_mail_thread_msg.oe_mail_unread div {
background-color: #F6F6F6;
}
+.openerp li.oe_mail_thread_msg.oe_mail_unread>div>ul>li.oe_unread,
+.openerp li.oe_mail_thread_msg.oe_mail_read>div>ul>li.oe_read {
+ display: none;
+}
+
.openerp li.oe_mail_thread_msg > div:after {
content: "";
display: block;
@@ -247,7 +253,7 @@
.openerp .oe_mail_msg_email {
padding: 8px;
background: white;
- border-top: 1px solid #ebebeb;
+ position: relative;
}
.openerp .oe_mail_msg_notification:after,
@@ -259,7 +265,7 @@
}
.openerp div.oe_mail_msg_content {
- float: right;
+ float: left;
position: relative;
width: 486px;
}
@@ -310,76 +316,6 @@
}
/* ------------------------------------------------------------ */
-/* mail.compose.message form view & OpenERP hacks
-/* ------------------------------------------------------------ */
-
-/* form_view: delete white background */
-.openerp .oe_mail_msg_content div.oe_formview {
- background-color: transparent;
-}
-
-.openerp .oe_mail_msg_content div.oe_form_nosheet {
- margin: 0px;
-}
-
-.openerp .oe_mail_msg_content table.oe_form_group {
- margin: 0px;
-}
-
-.openerp .oe_mail_msg_content table.oe_form_field,
-.openerp .oe_mail_msg_content div.oe_form_field {
- padding: 0px;
-}
-
-.openerp .oe_mail_msg_content td.oe_form_group_cell {
- vertical-align: bottom;
-}
-
-/* subject: change width */
-.openerp .oe_mail_msg_content .oe_form .oe_form_field input {
- width: 472px;
-}
-
-/* body_html: cleditor */
-.openerp .oe_mail_msg_content div.cleditorMain {
- border: 1px solid #cccccc;
-}
-
-/* destination_partner_ids */
-.openerp .oe_mail_msg_content div.text-core {
- height: 22px !important;
- width: 472px;
-}
-
-/* buttons */
-.openerp .oe_mail_msg_content .oe_mail_compose_message_icons button.oe_form_button {
- padding: 1px;
-}
-
-/* attachment button: override of openerp values */
-.openerp .oe_mail_msg_content .oe_mail_compose_message_icons div.oe_hidden_input_file {
- display: inline-block;
- width: 24px;
- height: 24px;
- margin: 2px;
-}
-.openerp .oe_mail_msg_content .oe_mail_compose_message_icons div.oe_hidden_input_file button {
- margin: 0px;
-}
-.openerp .oe_mail_msg_content .oe_mail_compose_message_icons input.oe_form_binary_file {
- bottom: 0px;
- top: auto;
- left: auto;
- right: 28px;
- height: 26px;
- width: 26px;
- min-width: 22px;
- font-size: 0px;
- margin: 0px;
- padding: 0px;
-}
-
-/* ------------------------------------------------------------ */
/* Messages layout
/* ------------------------------------------------------------ */
@@ -413,39 +349,27 @@
}
/* Dropdown menu */
-/*.openerp .oe_mail_msg_content .oe_dropdown_toggle {
- position: absolute;
- top: 0px;
- right: 3px;
-}*/
-.openerp .oe_mail .oe_semantic_html_override {
+.openerp .oe_mail ul.oe_mail_thread_display ul.oe_mail_thread_display {
position: relative;
+ border-left: 1px #DDD dashed;
}
.openerp .oe_mail ul.oe_header {
position: absolute;
right: 3px;
top: -6px;
- display: none;
z-index: 10;
- height: 18px;
}
.openerp .oe_mail ul.oe_header a {
text-decoration: none;
}
-.openerp .oe_mail .oe_semantic_html_override:hover > ul.oe_header {
- display: block;
-}
-
.openerp .oe_mail ul.oe_header>li {
display: inline-block;
-}
-
-.openerp .oe_mail_msg_content .oe_dropdown_arrow:after {
- border-top: 4px solid #404040;
+ height: 20px;
+ text-align: right;
}
/* Message footer */
@@ -465,16 +389,36 @@
/* Attachments list */
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments {
- display: none;
width: 100%;
- border-top: 1px solid #CCC;
margin: .5em 0 0 0;
padding: .5em 0;
list-style-position: inside;
}
+.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments.oe_hidden {
+ display: none;
+}
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments li {
float: none;
+ height: 20px;
+ line-height: 20px;
margin: 0;
padding: 0;
list-style-type: square;
}
+.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments .oe_upload_in_process {
+ float: right;
+ width: 200px;
+ height: 16px;
+}
+.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments .oe_upload_in_process div {
+ float: left;
+ width: 38px;
+ height: 16px;
+ margin-right: 2px;
+ background: #66FF66;
+}
+.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments .oe_upload_in_process span {
+ color: #aaaaaa;
+ position: absolute;
+}
+
diff --git a/addons/mail/static/src/css/mail_compose_message.css b/addons/mail/static/src/css/mail_compose_message.css
index ba7ed36a695..e2f136eb755 100644
--- a/addons/mail/static/src/css/mail_compose_message.css
+++ b/addons/mail/static/src/css/mail_compose_message.css
@@ -1,12 +1,166 @@
/* ------------------------------ */
-/* Compose Message Wizard Form */
+/* Compose Message */
/* ------------------------------ */
-.openerp .oe_mail_compose_message_icons {
- text-align: right;
+.openerp .oe_mail_msg_content .oe_mail_compose_message_footer {
+ height: 24px;
}
-.openerp .oe_mail_compose_message_icons img {
- width: 20px;
- height: 20px;
+.openerp .oe_mail_msg_content .oe_mail_compose_message_footer button.oe_mail_compose_message_button_send {
+ float: left;
}
+
+.openerp .oe_mail .oe_mail_compose_textarea
+{
+ display: none;
+}
+
+.openerp .oe_mail .oe_mail_compose_textarea .oe_mail_post_header,
+.openerp .oe_mail .oe_mail_compose_textarea .oe_mail_post_footer,
+{
+ position: relative;
+}
+
+.openerp .oe_mail .oe_mail_compose_textarea a.oe_cancel {
+ position: absolute;
+ right: -8px;
+ top: -8px;
+}
+.openerp .oe_mail .oe_mail_compose_textarea a.oe_cancel:first-of-type {
+ display:none;
+}
+
+.openerp .oe_mail .oe_mail_compose_textarea button.oe_full {
+ float: right;
+ position: relative;
+ right: -10px;
+}
+
+/* ------------------------------------------------------------ */
+/* mail.compose.message : list_recipients
+/* ------------------------------------------------------------ */
+
+.openerp .oe_mail .oe_mail_list_recipients {
+ display: inline;
+}
+.openerp .oe_mail .oe_mail_list_recipients .oe_all_follower {
+ color: blue;
+}
+.openerp .oe_mail .oe_mail_list_recipients .oe_partner_follower a {
+ color: red;
+}
+.openerp .oe_mail .oe_mail_list_recipients .oe_hidden,
+.openerp .oe_mail .oe_mail_list_recipients .oe_more_hidden {
+ display: none;
+}
+
+/* ------------------------------------------------------------ */
+/* mail.compose.message : attachment
+/* ------------------------------------------------------------ */
+
+.openerp .oe_mail .oe_attachment_file {
+ display: inline-block;
+}
+
+.openerp .oe_mail .oe_attachment_file .oe_add {
+ float: left;
+ width: 24px;
+ height: 24px;
+ position: relative;
+ z-index: 10;
+ left: +2px;
+ top: +7px;
+ overflow: hidden;
+}
+
+/* attachment button: override of openerp values */
+.openerp .oe_mail .oe_attachment_file .oe_add button,
+.openerp .oe_mail .oe_attachment_file .oe_add input.oe_insert_file {
+ position: absolute;
+ bottom: +0px;
+ left: +0px;
+ height: 24px;
+ width: 24px;
+ margin: 0px;
+ padding: 0px;
+}
+.openerp .oe_mail .oe_attachment_file .oe_add input.oe_insert_file {
+ z-index:2;
+ width: 300px;
+ left: -100px;
+ background: transparent;
+ border: 0;
+ color: transparent;
+}
+.openerp .oe_mail .oe_attachment_file .oe_add button span {
+ position: relative;
+ bottom: +4px;
+ font-size: 30px;
+}
+
+.openerp .oe_mail .oe_mail_msg_attachments input {
+ visibility: hidden;
+}
+
+.openerp .oe_mail .oe_mail_compose_attachment_list {
+ clear: both;
+}
+
+/* ------------------------------------------------------------ */
+/* mail.compose.message
+/* ------------------------------------------------------------ */
+
+
+/* default textarea (oe_mail_compose_textarea), and body textarea for compose form view */
+.openerp .oe_mail.oe_semantic_html_override .oe_mail_compose_textarea textarea.field_text,
+.openerp .oe_mail div.oe_mail_compose_message_body textarea.field_text {
+ width: 100%;
+ min-height: 120px;
+ height: auto;
+ padding: 4px;
+ font-size: 12px;
+ border: 1px solid #cccccc;
+}
+
+/* not top textarea */
+.openerp .oe_mail.oe_semantic_html_override .oe_semantic_html_override .oe_mail_compose_textarea textarea.field_text {
+ height: 60px;
+}
+
+/* form_view: delete white background */
+.openerp .oe_mail_msg_content div.oe_formview {
+ background-color: transparent;
+}
+
+.openerp .oe_mail_msg_content div.oe_form_nosheet {
+ margin: 0px;
+}
+
+.openerp .oe_mail_msg_content table.oe_form_group {
+ margin: 0px;
+}
+
+.openerp .oe_mail_msg_content table.oe_form_field,
+.openerp .oe_mail_msg_content div.oe_form_field {
+ padding: 0px;
+}
+
+.openerp .oe_mail_msg_content td.oe_form_group_cell {
+ vertical-align: bottom;
+}
+
+/* subject: change width */
+.openerp .oe_mail_msg_content .oe_form .oe_form_field input[type='text'] {
+ width: 472px;
+}
+
+/* body_html: cleditor */
+.openerp .oe_mail_msg_content div.cleditorMain {
+ border: 1px solid #cccccc;
+}
+
+/* destination_partner_ids */
+.openerp .oe_mail_msg_content div.text-core {
+ height: 22px !important;
+ width: 472px;
+} \ No newline at end of file
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index e0c9ac9b7fc..15a81be4c54 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -18,17 +18,33 @@ openerp.mail = function(session) {
session.web.FormView = session.web.FormView.extend({
do_action: function(action, on_close) {
- if (action.res_model == 'mail.compose.message' &&
- action.context && action.context.redirect == true &&
- this.fields && this.fields.message_ids && this.fields.message_ids.view.get("actual_mode") != 'create') {
- var thread = this.fields.message_ids.thread;
+ if (action.res_model == 'mail.compose.message') {
+
+ /* hack for stop context propagation of wrong value
+ * delete this hack when a global method to clean context is create
+ */
+ for(var key in action.context){
+ if( key!='default_template_id' &&
+ key!='default_use_template' &&
+ key!='default_is_private' &&
+ key!='default_model' &&
+ key!='default_res_id' &&
+ key!='default_subtype' &&
+ key!='active_id' &&
+ key!='lang' &&
+ key!='bin_raw' &&
+ key!='tz' &&
+ key!='active_model' &&
+ key!='edi_web_url_view' &&
+ key!='active_ids')
+ action.context[key]=null;
+ };
+ /* end hack */
+
+ $('.openerp .oe_mail_wall_threads .oe_mail_thread button.oe_mail_wall_button_fetch').click();
- thread.refresh(action.context);
- return false;
- }
- else {
- return this._super(action, on_close);
}
+ return this._super(action, on_close);
},
});
@@ -73,6 +89,15 @@ openerp.mail = function(session) {
}
return string;
},
+
+ /* replace textarea text into html text
+ * (add <p>, <a>)
+ */
+ get_text2html: function(text){
+ return text
+ .replace(/[\n\r]/g,'<br/>')
+ .replace(/((?:https?|ftp):\/\/[\S]+)/g,'<a href="$1">$1</a> ')
+ }
};
@@ -84,160 +109,301 @@ openerp.mail = function(session) {
* This widget handles the display of a form to compose a new message.
* This form is a mail.compose.message form_view.
*/
-
- mail.ComposeMessage = session.web.Widget.extend({
+
+ mail.ThreadComposeMessage = session.web.Widget.extend({
template: 'mail.compose_message',
-
+
/**
* @param {Object} parent parent
* @param {Object} [options]
- * @param {Object} [options.context] context passed to the
- * mail.compose.message DataSetSearch. Please refer to this model
- * for more details about fields and default values.
+ * @param {Object} [context] context passed to the
+ * mail.compose.message DataSetSearch. Please refer to this model
+ * for more details about fields and default values.
+ * @param {Boolean} [show_attachment_delete]
*/
init: function (parent, options) {
var self = this;
this._super(parent);
this.attachment_ids = [];
- // options
- this.options = options || {};
- this.options.context = options.context || {};
- this.options.form_xml_id = options.form_xml_id || 'email_compose_message_wizard_form_chatter';
- this.options.form_view_id = options.form_view_id || false;
- this.show_attachment_delete = true;
+
+ this.context = options.context || {};
+
+ this.id = options.parameters.id;
+ this.model = options.parameters.model;
+ this.res_id = options.parameters.res_id;
+ this.is_private = options.parameters.is_private;
+ this.partner_ids = options.parameters.partner_ids;
+ this.options={thread:{}};
+ this.options.thread.show_header_compose = options.parameters.options.thread.show_header_compose;
+ this.options.thread.display_on_flat = options.parameters.options.thread.display_on_flat;
+
+ this.attachment_ids = [];
+ this.options.thread.show_attachment_delete = true;
+ this.options.thread.show_attachment_link = true;
+
+ this.parent_thread= parent.messages!= undefined ? parent : false;
+
+
+ this.ds_attachment = new session.web.DataSetSearch(this, 'ir.attachment');
+ this.fileupload_id = _.uniqueId('oe_fileupload_temp');
+ $(window).on(self.fileupload_id, self.on_attachment_loaded);
},
- start: function () {
- this._super.apply(this, arguments);
- // customize display: add avatar, clean previous content
+ start: function(){
+ this.display_attachments();
+ this.bind_events();
+
+ //load avatar img
var user_avatar = mail.ChatterUtils.get_image(this.session, 'res.users', 'image_small', this.session.uid);
this.$('img.oe_mail_icon').attr('src', user_avatar);
- this.$('div.oe_mail_msg_content').empty();
- // create a context for the dataset and default_get of the wizard
- var context = _.extend({}, this.options.context);
- this.ds_compose = new session.web.DataSetSearch(this, 'mail.compose.message', context);
- // find the id of the view to display in the chatter form
- if (this.options.form_view_id) {
- return this.create_form_view();
- }
- else {
- var data_ds = new session.web.DataSetSearch(this, 'ir.model.data');
- return data_ds.call('get_object_reference', ['mail', this.options.form_xml_id]).pipe(this.proxy('create_form_view'));
- }
},
- /** Create a FormView, then append it to the to widget DOM. */
- create_form_view: function (new_form_view_id) {
+ /* upload the file on the server, add in the attachments list and reload display
+ */
+ display_attachments: function(){
var self = this;
- this.options.form_view_id = (new_form_view_id && new_form_view_id[1]) || this.options.form_view_id;
- // destroy previous form_view if any
- if (this.form_view) { this.form_view.destroy(); }
- // create the FormView
- this.form_view = new session.web.FormView(this, this.ds_compose, this.options.form_view_id, {
- action_buttons: false,
- pager: false,
- initial_mode: 'edit',
- disable_autofocus: true,
- });
- // add the form, bind events, activate the form
- var msg_node = this.$('div.oe_mail_msg_content');
- return $.when(this.form_view.appendTo(msg_node)).pipe(this.proxy('postprocess_create_form_view'));
- },
+ var render = $(session.web.qweb.render('mail.thread.message.attachments', {'widget': self}));
+ if(!this.list_attachment){
+ this.$('.oe_mail_compose_attachment_list').replaceWith( render );
+ } else {
+ this.list_attachment.replaceWith( render );
+ }
+ this.list_attachment = this.$("ul.oe_mail_msg_attachments");
- postprocess_create_form_view: function () {
- // handle attachment button
- this.fileupload_id = _.uniqueId('oe_fileupload');
- var button_attach = this.$('button.oe_mail_compose_message_attachment');
- var rendered = session.web.qweb.render('mail.compose_message.add_attachment', {'widget': this});
- $(rendered).insertBefore(button_attach);
- // move the button inside div.oe_hidden_input_file
- var input_node = this.$('input[name=ufile]');
- button_attach.detach().insertAfter(input_node);
- // set the function called when attachments are added
- this.$('input.oe_form_binary_file').change(this.on_attachment_change);
- this.bind_events();
- this.form_view.do_show();
+ // event: delete an attachment
+ this.$el.on('click', '.oe_mail_attachment_delete', self.on_attachment_delete);
},
-
on_attachment_change: function (event) {
+ event.stopPropagation();
+ var self = this;
var $target = $(event.target);
if ($target.val() !== '') {
- this.$('form.oe_form_binary_form').submit();
- session.web.blockUI();
+
+ var filename = $target.val().replace(/.*[\\\/]/,'');
+
+ // if the files exits for this answer, delete the file before upload
+ var attachments=[];
+ for(var i in this.attachment_ids){
+ if((this.attachment_ids[i].filename || this.attachment_ids[i].name) == filename){
+ if(this.attachment_ids[i].upload){
+ return false;
+ }
+ this.ds_attachment.unlink([this.attachment_ids[i].id]);
+ } else {
+ attachments.push(this.attachment_ids[i]);
+ }
+ }
+ this.attachment_ids = attachments;
+
+ // submit file
+ //session.web.blockUI();
+ self.$('form.oe_form_binary_form').submit();
+ //self.submit_ajax_attachment();
+
+ this.$(".oe_attachment_file").hide();
+
+ this.attachment_ids.push({
+ 'id': 0,
+ 'name': filename,
+ 'filename': filename,
+ 'url': '',
+ 'upload': true
+ });
+ this.display_attachments();
}
},
+
+ submit_ajax_attachment: function(){
+ var self=this;
+ var $form = self.$('form.oe_form_binary_form');
+ var filename = this.$('input.oe_form_binary_file').val().replace(/.*[\\\/]/,'');
+
+ // create form data
+ var fomdata = new FormData();
+ $.each($form.find('input'), function(i, field) {
+ var $field=$(field);
+ if($field.attr('type')!='file'){
+ fomdata.append($field.attr('name'), $field.val());
+ } else {
+ fomdata.append($field.attr('name'), field.files[0]);
+ }
+ });
+
+ var progress=function(event) {
+ self.$("span[name='"+filename+"'] div:lt("+Math.floor(event.loaded / event.total*5)+")").show();
+ };
+
+ $.ajax({
+ url: $form.attr("action"),
+ data: fomdata,
+ cache: false,
+ contentType: false,
+ processData: false,
+ type: 'POST',
+ enctype: 'multipart/form-data',
+ xhr: function() {
+ // custom xhr
+ myXhr = $.ajaxSettings.xhr();
+ if(myXhr.upload){
+ // for handling the progress of the upload
+ myXhr.upload.addEventListener('progress', progress, false);
+ }
+ myXhr.addEventListener('progress', progress, false);
+ return myXhr;
+ },
+ success: function(data){
+ $iframe=$('<iframe style="display:none;"/>').html(data);
+ $iframe.appendTo(self.$el);
+ $iframe.remove();
+ }
+ });
+ },
+
+ on_attachment_loaded: function (event, result) {
+ //session.web.unblockUI();
+ for(var i in this.attachment_ids){
+ if(this.attachment_ids[i].filename == result.filename && this.attachment_ids[i].upload){
+ this.attachment_ids[i]={
+ 'id': result.id,
+ 'name': result.name,
+ 'filename': result.filename,
+ 'url': mail.ChatterUtils.get_attachment_url(this.session, result)
+ };
+ }
+ }
+ this.display_attachments();
+ var $input = this.$('input.oe_form_binary_file');
+ $input.after($input.clone(true)).remove();
+ this.$(".oe_attachment_file").show();
+ },
+ /* unlink the file on the server and reload display
+ */
on_attachment_delete: function (event) {
- if (event.target.dataset && event.target.dataset.id) {
- var attachment_id = parseInt(event.target.dataset.id);
- var idx = _.pluck(this.attachment_ids, 'id').indexOf(attachment_id);
- if (idx == -1) return false;
- new session.web.DataSetSearch(this, 'ir.attachment').unlink(attachment_id);
- this.attachment_ids.splice(idx, 1);
+ event.stopPropagation();
+ var attachment_id=$(event.target).data("id");
+ if (attachment_id) {
+ var attachments=[];
+ for(var i in this.attachment_ids){
+ if(attachment_id!=this.attachment_ids[i].id){
+ attachments.push(this.attachment_ids[i]);
+ }
+ else {
+ this.ds_attachment.unlink([attachment_id]);
+ }
+ }
+ this.attachment_ids = attachments;
this.display_attachments();
}
},
- display_attachments: function () {
- var attach_node = this.$('div.oe_mail_compose_message_attachments');
- var rendered = session.web.qweb.render('mail.thread.message.attachments', {'record': this});
- attach_node.empty();
- $(rendered).appendTo(attach_node);
- this.$('.oe_mail_msg_attachments').show();
- var composer_attachment_ids = _.pluck(this.attachment_ids, 'id');
- var onchange_like = {'value': {'attachment_ids': composer_attachment_ids}}
- this.form_view.on_processed_onchange(onchange_like, []);
- },
-
- /**
- * Reinitialize the widget field values to the default values obtained
- * using default_get on mail.compose.message. This allows to reinitialize
- * the widget without having to rebuild a complete form view.
- * @param {Object} new_context: context of the refresh */
- refresh: function (new_context) {
- if (! this.form_view) return;
- var self = this;
- this.attachments = [];
- this.options.context = _.extend(this.options.context, new_context || {});
- this.ds_compose.context = _.extend(this.ds_compose.context, this.options.context);
- return this.ds_compose.call('default_get', [
- ['subject', 'body_text', 'body', 'partner_ids', 'composition_mode',
- 'use_template', 'template_id', 'model', 'res_id', 'parent_id', 'content_subtype'],
- this.ds_compose.get_context(),
- ]).then( function (result) {
- self.form_view.on_processed_onchange({'value': result}, []);
- self.attachment_ids = [];
+ /* to avoid having unsorted file on the server.
+ we will show the users files of the first message post
+ */
+ set_free_attachments: function(){
+ var self=this;
+ this.parent_thread.ds_message.call('user_free_attachment').then(function(attachments){
+ this.attachment_ids=[];
+ for(var i in attachments){
+ self.attachment_ids[i]={
+ 'id': attachments[i].id,
+ 'name': attachments[i].name,
+ 'filename': attachments[i].filename,
+ 'url': mail.ChatterUtils.get_attachment_url(self.session, attachments[i])
+ };
+ }
self.display_attachments();
});
},
- /**
- * Bind events in the widget. Each event is slightly described
- * in the function. */
bind_events: function() {
var self = this;
- // event: add a new attachment
- $(window).on(this.fileupload_id, function() {
- var args = [].slice.call(arguments).slice(1);
- var attachment = args[0];
- attachment['url'] = mail.ChatterUtils.get_attachment_url(self.session, attachment);
- self.attachment_ids.push(attachment);
- self.display_attachments();
- session.web.unblockUI();
- });
- // event: delete an attachment
- this.$el.on('click', '.oe_mail_attachment_delete', self.on_attachment_delete);
+
+ // set the function called when attachments are added
+ this.$el.on('change', 'input.oe_form_binary_file', self.on_attachment_change );
+ this.$el.on('click', 'a.oe_cancel', self.on_cancel );
+ this.$el.on('click', 'button.oe_post', function(){self.on_message_post()} );
+ this.$el.on('click', 'button.oe_full', function(){self.on_compose_fullmail()} );
},
- }),
-
+
+ on_compose_fullmail: function(){
+ var attachments=[];
+ for(var i in this.attachment_ids){
+ attachments.push(this.attachment_ids[i].id);
+ }
+ var action = {
+ type: 'ir.actions.act_window',
+ res_model: 'mail.compose.message',
+ view_mode: 'form',
+ view_type: 'form',
+ action_from: 'mail.ThreadComposeMessage',
+ views: [[false, 'form']],
+ target: 'new',
+ context: {
+ 'default_res_model': this.context.default_res_model,
+ 'default_res_id': this.context.default_res_id,
+ 'default_content_subtype': 'html',
+ 'default_is_private': true,
+ 'default_parent_id': this.id,
+ 'default_body': mail.ChatterUtils.get_text2html(this.$('textarea').val() || ''),
+ 'default_attachment_ids': attachments
+ },
+ };
+ this.do_action(action);
+ },
+
+ on_cancel: function(){
+ event.stopPropagation();
+ this.$('textarea').val("");
+ this.$('input[data-id]').remove();
+ //this.attachment_ids=[];
+ this.display_attachments();
+ if(!this.options.thread.show_header_compose || !this.options.thread.display_on_flat){
+ this.$el.hide();
+ }
+ },
+
+ /*post a message and fetch the message*/
+ on_message_post: function (body) {
+
+ if (! body) {
+ var comment_node = this.$('textarea');
+ var body = comment_node.val();
+ comment_node.val('');
+ }
+
+ var attachments=[];
+ for(var i in this.attachment_ids){
+ if(this.attachment_ids[i].upload){
+ session.web.dialog($('<div>' + session.web.qweb.render('CrashManager.warning', {message: 'Please, wait while the file is uploading.'}) + '</div>'));
+ return false;
+ }
+ attachments.push(this.attachment_ids[i].id);
+ }
+
+ if(body.match(/\S+/)) {
+ this.parent_thread.ds_thread.call('message_post_api', [
+ this.context.default_res_id,
+ mail.ChatterUtils.get_text2html(body),
+ false,
+ 'comment',
+ false,
+ this.context.default_parent_id,
+ attachments]
+ ).then(this.parent_thread.proxy('switch_new_message'));
+ this.attachment_ids=[];
+ this.on_cancel();
+ return true;
+ }
+ },
+ });
/**
* ------------------------------------------------------------
* Thread Message Expandable Widget
* ------------------------------------------------------------
*
- * This widget handles the display the expandable message in a thread. The
- * [thread_level] parameter sets the thread level number:
+ * This widget handles the display the expandable message in a thread.
* - thread
* - - visible message
* - - expandable
@@ -256,14 +422,13 @@ openerp.mail = function(session) {
default_res_id: 0,
default_parent_id: false }, options.context || {});
- this.id = -1;
+ this.id = options.parameters.id || -1;
this.parent_id= options.parameters.parent_id || false;
this.nb_messages = options.parameters.nb_messages || 0;
- this.type = options.parameters.type || false;
+ this.type = 'expandable';
// record options and data
this.parent_thread= parent.messages!= undefined ? parent : options.options.thread._parents[0] ;
-
},
@@ -285,8 +450,8 @@ openerp.mail = function(session) {
* @param {object} mouse envent
*/
on_expandable: function (event) {
- event.stopPropagation();
- this.parent_thread.message_fletch(false, this.domain, this.context);
+ if(event)event.stopPropagation();
+ this.parent_thread.message_fetch(false, this.domain, this.context);
this.destroy();
return false;
},
@@ -302,7 +467,7 @@ openerp.mail = function(session) {
* - record.timerelative: relative time givein by timeago lib
* - record.avatar: image url
* - record.attachment_ids[].url: url of each attachmentThe
- * [thread_level] parameter sets the thread level number:
+ * thread view :
* - root thread
* - - sub message (parent_id = root message)
* - - - sub thread
@@ -322,45 +487,24 @@ openerp.mail = function(session) {
* @param {Object} [options]
* @param {Object} [thread] read obout mail.Thread object
* @param {Object} [message]
- * @param {Number} [message_ids=null] ids for message_fletch
+ * @param {Number} [message_ids=null] ids for message_fetch
* @param {Number} [message_data=null] already formatted message data,
* for subthreads getting data from their parent
* @param {Number} [truncate_limit=250] number of character to
* display before having a "show more" link; note that the text
* will not be truncated if it does not have 110% of the parameter
* @param {Boolean} [show_record_name]
- * @param {Boolean} [show_reply]
- * @param {Boolean} [show_reply_by_email]
* @param {Boolean} [show_dd_delete]
* @param {Boolean} [show_dd_hide]
*/
init: function(parent, options) {
this._super(parent);
- this.domain = options.domain || [];
- this.context = _.extend({
- default_model: 'mail.thread',
- default_res_id: 0,
- default_parent_id: false }, options.context || {});
- // options
- this.options={
- 'thread' : options.options.thread,
- 'message' : {
- 'message_ids': options.options.message.message_ids || null,
- 'message_data': options.options.message.message_data || null,
- 'show_record_name': options.options.message.show_record_name != undefined ? options.options.message.show_record_name: true,
- 'show_reply': options.options.message.show_reply || false,
- 'show_reply_by_email': options.options.message.show_reply_by_email || false,
- 'show_dd_delete': options.options.message.show_dd_delete || false,
- 'show_dd_hide': options.options.message.show_dd_hide || false,
- 'truncate_limit': options.options.message.truncate_limit || 250,
- }
- };
- // record options and data
- this.parent_thread= parent.messages!= undefined ? parent : options.options.thread._parents[0] ;
-
- var param = options.parameters;
// record parameters
+ var param = options.parameters;
+ for(var i in param){
+ this[i] = param[i];
+ }
this.id = param.id || -1;
this.model = param.model || false;
this.parent_id= param.parent_id || false;
@@ -372,7 +516,7 @@ openerp.mail = function(session) {
this.record_name = param.record_name || false;
this.body = param.body || false;
this.vote_user_ids =param.vote_user_ids || [];
- this.has_voted = param.has_voted || false;
+ this.has_voted = param.has_voted || false;
this.vote_user_ids = param.vote_user_ids || [];
@@ -381,6 +525,28 @@ openerp.mail = function(session) {
this.author_id = param.author_id || [];
this.attachment_ids = param.attachment_ids || [];
+ // record domain and context
+ this.domain = options.domain || [];
+ this.context = _.extend({
+ default_model: 'mail.thread',
+ default_res_id: 0,
+ default_parent_id: false }, options.context || {});
+
+ // record options
+ this.options={
+ 'thread' : options.options.thread,
+ 'message' : {
+ 'message_ids': options.options.message.message_ids || null,
+ 'message_data': options.options.message.message_data || null,
+ 'show_record_name': options.options.message.show_record_name != undefined ? options.options.message.show_record_name: true,
+ 'show_dd_delete': options.options.message.show_dd_delete || false,
+ 'show_dd_hide': options.options.message.show_dd_hide || false,
+ 'truncate_limit': options.options.message.truncate_limit || 250,
+ }
+ };
+
+ // record options and data
+ this.parent_thread= parent.messages!= undefined ? parent : options.options.thread._parents[0];
this.thread = false;
if( param.id > 0 ) {
@@ -420,10 +586,10 @@ openerp.mail = function(session) {
* in the function. */
bind_events: function() {
var self = this;
+
// event: click on 'Attachment(s)' in msg
- this.$el.on('click', 'a.oe_mail_msg_view_attachments', function (event) {
- var act_dom = $(this).parent().parent().parent().find('.oe_mail_msg_attachments');
- act_dom.toggle();
+ this.$('a.oe_mail_msg_view_attachments:first').on('click', function (event) {
+ self.$('.oe_mail_msg_attachments:first').toggle();
});
// event: click on icone 'Read' in header
this.$el.on('click', 'a.oe_read', this.on_message_read_unread);
@@ -434,21 +600,13 @@ openerp.mail = function(session) {
// event: click on 'Reply' in msg
this.$el.on('click', 'a.oe_reply', this.on_message_reply);
- // event: click on 'Reply by email' in msg side menu
- this.$el.on('click', 'a.oe_reply_by_email', this.on_message_reply_by_mail);
// event: click on 'Vote' button
this.$el.on('click', 'button.oe_mail_msg_vote', this.on_vote);
},
on_message_reply:function(event){
event.stopPropagation();
- this.thread.on_compose_message($(event.srcElement).hasClass("oe_full_reply"), false);
- return false;
- },
-
- on_message_reply_by_mail:function(event){
- event.stopPropagation();
- this.thread.on_compose_message(true, true);
+ this.thread.on_compose_message();
return false;
},
@@ -468,6 +626,7 @@ openerp.mail = function(session) {
if(this.thread){
return false;
}
+ var param = _.extend(self, {'parent_id': self.id});
/*create thread*/
self.thread = new mail.Thread(self, {
'domain': self.domain,
@@ -480,11 +639,7 @@ openerp.mail = function(session) {
'thread' : self.options.thread,
'message' : self.options.message
},
- 'parameters':{
- 'model': self.model,
- 'id': self.id,
- 'parent_id': self.id
- }
+ 'parameters': param
}
);
/*insert thread in parent message*/
@@ -501,9 +656,6 @@ openerp.mail = function(session) {
} else {
self.destroy();
}
- for(var i in this.thread.messages){
- this.thread.messages[i].animated_destroy({fadeTime:0});
- }
},
on_message_delete: function (event) {
@@ -523,10 +675,17 @@ openerp.mail = function(session) {
*/
on_message_read_unread: function (event) {
event.stopPropagation();
- this.animated_destroy({fadeTime:250});
+ if($(event.srcElement).hasClass("oe_read")) this.animated_destroy({fadeTime:250});
// if this message is read, all childs message display is read
var ids = [this.id].concat( this.get_child_ids() );
- this.ds_notification.call('set_message_read', [ids,$(event.srcElement).hasClass("oe_read")]);
+
+ if($(event.srcElement).hasClass("oe_read")) {
+ this.ds_notification.call('set_message_read', [ids,true]);
+ this.$el.removeClass("oe_mail_unread").addClass("oe_mail_read");
+ } else {
+ this.ds_notification.call('set_message_read', [ids,false]);
+ this.$el.removeClass("oe_mail_read").addClass("oe_mail_unread");
+ }
return false;
},
@@ -598,8 +757,8 @@ openerp.mail = function(session) {
display_vote: function () {
var self = this;
var vote_element = session.web.qweb.render('mail.thread.message.vote', {'widget': self});
- self.$(".placeholder-mail-vote").empty();
- self.$(".placeholder-mail-vote").html(vote_element);
+ self.$(".placeholder-mail-vote:first").empty();
+ self.$(".placeholder-mail-vote:first").html(vote_element);
},
});
@@ -609,11 +768,13 @@ openerp.mail = function(session) {
* ------------------------------------------------------------
*
* This widget handles the display of a thread of messages. The
- * [thread_level] parameter sets the thread level number:
- * - root message
+ * thread view:
+ * - root thread
* - - sub message (parent_id = root message)
- * - - - sub sub message (parent id = sub message)
+ * - - - sub thread
+ * - - - - sub sub message (parent id = sub thread)
* - - sub message (parent_id = root message)
+ * - - - sub thread
*/
mail.Thread = session.web.Widget.extend({
template: 'mail.thread',
@@ -627,7 +788,6 @@ openerp.mail = function(session) {
* @param {Object} [options]
* @param {Object} [message] read about mail.ThreadMessage object
* @param {Object} [thread]
- * @param {Number} [thread_level=0] number of thread levels
* @param {Boolean} [use_composer] use the advanced composer, or
* the default basic textarea if not set
* @param {Number} [expandable_number=5] number message show
@@ -637,7 +797,7 @@ openerp.mail = function(session) {
* @param {Boolean} [display_on_flat] display all thread
* on the wall thread level (no hierarchy)
* @param {Array} [parents] liked with the parents thread
- * use with browse, fletch... [O]= top parent
+ * use with browse, fetch... [O]= top parent
*/
init: function(parent, options) {
this._super(parent);
@@ -650,7 +810,7 @@ openerp.mail = function(session) {
// options
this.options={
'thread' : {
- 'thread_level': options.options.thread.thread_level || 0,
+ 'thread_level': (options.options.thread.thread_level+1) || 0,
'show_header_compose': (options.options.thread.show_header_compose != undefined ? options.options.thread.show_header_compose: false),
'use_composer': options.options.thread.use_composer || false,
'expandable_number': options.options.thread.expandable_number || 5,
@@ -670,6 +830,14 @@ openerp.mail = function(session) {
this.id= param.id || false;
this.model= param.model || false;
this.parent_id= param.parent_id || false;
+ this.is_private = param.is_private || false;
+ this.author_id = param.author_id || false;
+ this.partner_ids = [];
+ for(var i in param.partner_ids){
+ if(param.partner_ids[i][0]!=(param.author_id ? param.author_id[0] : -1)){
+ this.partner_ids.push(param.partner_ids[i]);
+ }
+ }
this.messages = [];
@@ -687,8 +855,7 @@ openerp.mail = function(session) {
this.display_user_avatar();
var display_done = compose_done = false;
- // add message composition form view
- compose_done = this.instantiate_composition_form();
+ this.instantiate_ComposeMessage();
this.bind_events();
@@ -699,23 +866,57 @@ openerp.mail = function(session) {
return display_done && compose_done;
},
- /**
- * Override-hack of do_action: automatically load message on the chatter.
- * Normally it should be called only when clicking on 'Post/Send'
- * in the composition form. */
- do_action: function(action, on_close) {
- this.instantiate_composition_form();
- this.message_fletch(false, false, false, [action.id]);
- return this._super(action, on_close);
+ instantiate_ComposeMessage: function(){
+ // add message composition form view
+ this.ComposeMessage = new mail.ThreadComposeMessage(this,{
+ 'context': this.context,
+ 'parameters': this,
+ 'show_attachment_delete': true,
+ });
+ this.ComposeMessage.appendTo(this.$(".oe_mail_thread_action:first"));
},
/* this method is runing for first parent thread
*/
on_first_thread: function(){
+ var self=this;
// fetch and display message, using message_ids if set
- display_done = this.message_fletch(true);
- //show the first write message
- this.$(">.oe_mail_thread_action").show();
+ this.message_fetch();
+
+ $(document).scroll( self.on_scroll );
+ window.setTimeout( self.on_scroll, 500 );
+
+ $(session.web.qweb.render('mail.wall_no_message', {})).appendTo(this.$('ul.oe_mail_thread_display'));
+
+ if(this.options.thread.show_header_compose){
+ this.ComposeMessage.$el.show();
+ //this.ComposeMessage.set_free_attachments();
+ }
+
+ var button_fetch = $('<button style="display:none;" class="oe_mail_wall_button_fetch"/>').click(function(event){
+ if(event)event.stopPropagation();
+ self.message_fetch();
+ });
+ this.$el.prepend(button_fetch);
+ this.$el.addClass("oe_mail_wall_first_thread");
+ },
+
+ /* When the expandable object is visible on screen (with scrolling)
+ * then the on_expandable function is launch
+ */
+ on_scroll: function(event){
+ if(event)event.stopPropagation();
+ var last=this.messages[0];
+ if(last && last.type=="expandable"){
+ var pos = last.$el.position();
+ if(pos.top){
+ /* bottom of the screen */
+ var bottom = $(window).scrollTop()+$(window).height()+100;
+ if(bottom - pos.top > 0){
+ last.on_expandable();
+ }
+ }
+ }
},
/**
@@ -723,17 +924,8 @@ openerp.mail = function(session) {
* in the function. */
bind_events: function() {
var self = this;
- // event: writing in basic textarea of composition form (quick reply)
- // event: onblur for hide 'Reply'
- this.$('.oe_mail_compose_textarea:first textarea')
- .keyup(function (event) {
- var charCode = (event.which) ? event.which : window.event.keyCode;
- if (event.shiftKey && charCode == 13) { this.value = this.value+"\n"; }
- else if (charCode == 13) { return self.message_post(); }
- })
- .blur(function (event) {
- $(this).parents('.oe_mail_thread_action:first').hide();
- });
+ self.$('.oe_mail_compose_textarea .oe_more').click(function () { var p=$(this).parent(); p.find('.oe_more_hidden, .oe_hidden').show(); p.find('.oe_more').hide(); });
+ self.$('.oe_mail_compose_textarea .oe_more_hidden').click(function () { var p=$(this).parent(); p.find('.oe_more_hidden, .oe_hidden').hide(); p.find('.oe_more').show(); });
},
/* get all child message/thread id linked
@@ -796,71 +988,13 @@ openerp.mail = function(session) {
return this.options.thread._parents[0].messages[0].browse_message(options);
},
- /** Instantiate the composition form, with every parameters in context
- * or in the widget context.
- * @param {object}
- * @param {boolean} show_header_compose, force to instantiate form
- */
- instantiate_composition_form: function(context) {
- // add message composition form view
- if ((!context || !context.show_header_compose) &&
- (!this.options.thread.show_header_compose || !this.options.thread.use_composer ||
- (this.options.thread.show_header_compose <= this.options.thread._parents.length && this.options.thread._parents[0]!=this))) {
- this.$("textarea:first").val("");
- return false;
- }
- if (this.compose_message_widget) {
- this.compose_message_widget.refresh();
- } else {
- var context = _.extend(context || {}, this.context);
- this.compose_message_widget = new mail.ComposeMessage(this, {'context': context});
- var composition_node = this.$('div.oe_mail_thread_action');
- composition_node.empty();
- return this.compose_message_widget.appendTo(composition_node);
- }
- },
-
/* this function is launch when a user click on "Reply" button
*/
- on_compose_message: function(full_reply, by_mail){
- if(full_reply){
- this.instantiate_composition_form({'show_header_compose':true});
- }
- if(by_mail){
- if (!this.compose_message_widget) return true;
- this.compose_message_widget.refresh({
- 'default_composition_mode': 'reply',
- 'default_parent_id': this.id,
- 'default_content_subtype': 'html'} );
- }
- this.$('div.oe_mail_thread_action:first').toggle();
+ on_compose_message: function(){
+ this.ComposeMessage.$el.toggle();
return false;
},
- refresh: function (action_context) {
- var self=this;
- _(this.messages).each(function(){ self.destroy(); });
- self.message_fletch();
- },
-
- /*post a message and fletch the message*/
- message_post: function (body) {
- var self = this;
- if (! body) {
- var comment_node = this.$('textarea');
- var body = comment_node.val();
- comment_node.val('');
- }
- if(body.match(/\S+/)) {
- this.ds_thread.call('message_post_api', [
- [this.context.default_res_id], body, false, 'comment', false, this.context.default_parent_id, undefined])
- .then(this.proxy('switch_new_message'));
- }
- else {
- return false;
- }
- },
-
/** Fetch messages
* @param {Bool} initial_mode: initial mode: try to use message_data or
* message_ids, if nothing available perform a message_read; otherwise
@@ -868,7 +1002,7 @@ openerp.mail = function(session) {
* @param {Array} replace_domain: added to this.domain
* @param {Object} replace_context: added to this.context
*/
- message_fletch: function (initial_mode, replace_domain, replace_context, ids) {
+ message_fetch: function (initial_mode, replace_domain, replace_context, ids) {
var self = this;
// initial mode: try to use message_data or message_ids
@@ -879,8 +1013,8 @@ openerp.mail = function(session) {
fetch_domain = replace_domain ? replace_domain : this.domain;
fetch_context = replace_context ? replace_context : this.context;
fetch_context.message_loaded= [this.id||0].concat( self.options.thread._parents[0].get_child_ids() );
-
- return this.ds_message.call('message_read', [ids, fetch_domain, (this.options.thread.thread_level+1), fetch_context, this.context.default_parent_id || undefined]
+
+ return this.ds_message.call('message_read', [ids, fetch_domain, fetch_context, 0, this.context.default_parent_id || undefined]
).then(this.proxy('switch_new_message'));
},
@@ -906,6 +1040,8 @@ openerp.mail = function(session) {
insert_message: function (message) {
var self=this;
+ this.$("li.oe_wall_no_message").remove();
+
if(message.type=='expandable'){
var message = new mail.ThreadExpandable(self, {
'domain': message.domain,
@@ -930,42 +1066,46 @@ openerp.mail = function(session) {
});
}
- var thread = self.options.thread.display_on_flat ? self.options.thread._parents[0] : this;
+ var thread_messages = (self.options.thread.display_on_flat && self.options.thread.thread_level ? self.options.thread._parents[0].messages : []).concat(self.messages);
+ var thread = (self.options.thread.display_on_flat && self.options.thread.thread_level ? self.options.thread._parents[0] : self);
// check older and newer message for insert
var parent_newer = false;
var parent_older = false;
- for(var i in thread.messages){
- if(thread.messages[i].id > message.id){
- if(!parent_newer || parent_newer.id>thread.messages[i].id)
- parent_newer = thread.messages[i];
- } else if(thread.messages[i].id>0 && thread.messages[i].id < message.id) {
- if(!parent_older || parent_older.id<thread.messages[i].id)
- parent_older = thread.messages[i];
+ for(var i in thread_messages){
+ if(thread_messages[i].id > message.id){
+ if(!parent_newer || parent_newer.id>=thread_messages[i].id)
+ parent_newer = thread_messages[i];
+ } else if(thread_messages[i].id>0 && thread_messages[i].id < message.id) {
+ if(!parent_older || parent_older.id<thread_messages[i].id)
+ parent_older = thread_messages[i];
}
}
- if(parent_newer)
- message.insertAfter(parent_newer.$el);
- else if(parent_older)
- message.insertBefore(parent_older.$el);
- else
- message.prependTo(thread.list_ul);
+ var sort = self.options.thread.thread_level==0 || (self.options.thread.display_on_flat && self.options.thread.thread_level<=1);
- return message
- },
-
- /* Hide messages if they are more message that _expandable_max
- * display "show more messages"
- */
- display_expandable: function(){
- if(this.messages.length>this.options._expandable_max){
- this.list_ul.find('>li:gt('+(this.options._expandable_max-1)+')').hide();
- this.more_msg.show();
- } else {
- this.list_ul.find('>li').show();
- this.more_msg.hide();
+ if(parent_older){
+ if(sort){
+ message.insertBefore(parent_older.$el);
+ } else {
+ message.insertAfter(parent_older.$el);
+ }
+ }
+ else if(parent_newer){
+ if(sort){
+ message.insertAfter(parent_newer.$el);
+ } else {
+ message.insertBefore(parent_newer.$el);
+ }
}
+ else {
+ if(sort){
+ message.prependTo(thread.list_ul);
+ } else {
+ message.appendTo(thread.list_ul);
+ }
+ }
+ return message
},
display_user_avatar: function () {
@@ -1003,7 +1143,6 @@ openerp.mail = function(session) {
this._super.apply(this, arguments);
this.options.domain = this.options.domain || [];
this.options.context = {'default_model': 'mail.thread', 'default_res_id': false};
- this.options.thread_level = this.options.thread_level || 0;
},
start: function() {
@@ -1017,6 +1156,10 @@ openerp.mail = function(session) {
this.$el.toggle(this.view.get("actual_mode") !== "create");
},
+ /**
+ * Reinitialize the widget field and Display the threads
+ * @param {Object} new_context: context of the refresh
+ */
set_value: function() {
var self = this;
this._super.apply(this, arguments);
@@ -1034,30 +1177,26 @@ openerp.mail = function(session) {
var show_header_compose = this.view.is_action_enabled('edit') ||
(this.getParent().fields.message_is_follower && this.getParent().fields.message_is_follower.get_value());
+ if(this.thread){
+ this.thread.destroy();
+ }
this.thread = new mail.Thread(self, {
'domain': domain,
'context': this.options.context,
'options':{
'thread':{
- 'thread_level': this.options.thread_level,
'show_header_compose': show_header_compose,
'use_composer': show_header_compose,
'display_on_flat':true
},
'message':{
- 'show_dd_delete': true,
- 'show_reply_by_email': show_header_compose,
+ 'show_dd_delete': true
}
},
'parameters': {},
}
);
-
- this.$('ul.oe_mail_wall_threads').empty();
- var render_res = session.web.qweb.render('mail.wall_thread_container', {});
- $(render_res).appendTo(this.$('ul.oe_mail_wall_threads'));
-
- return this.thread.appendTo( this.$('li.oe_mail_wall_thread:last') );
+ return this.thread.appendTo( this.$('.oe_mail_wall_threads:first') );
},
});
@@ -1089,7 +1228,6 @@ openerp.mail = function(session) {
this.options = options || {};
this.options.domain = options.domain || [];
this.options.context = options.context || {};
- this.options.thread_level = options.thread_level || 1;
this.search_results = {'domain': [], 'context': {}, 'groupby': {}}
this.ds_msg = new session.web.DataSetSearch(this, 'mail.message');
},
@@ -1098,6 +1236,8 @@ openerp.mail = function(session) {
this._super.apply(this, arguments);
var searchview_ready = this.load_searchview({}, false);
var thread_displayed = this.message_render();
+ this.options.domain = this.options.domain.concat(this.search_results['domain']);
+ this.bind_events();
return (searchview_ready && thread_displayed);
},
@@ -1135,36 +1275,36 @@ openerp.mail = function(session) {
});
},
- /** Clean and display the threads */
- message_render: function (search) {
- var domain = this.options.domain.concat(this.search_results['domain']);
-
- var domain = _.extend(this.options.domain, search&&search.domain? search.domain : {});
- var context = _.extend(this.options.context, search&&search.context ? search.context : {});
+ /**
+ * Display the threads
+ */
+ message_render: function (search) {
this.thread = new mail.Thread(this, {
- 'domain' : domain,
- 'context' : context,
+ 'domain' : this.options.domain.concat(this.search_results['domain']),
+ 'context' : _.extend(this.options.context, search&&search.search_results['context'] ? search.search_results['context'] : {}),
'options': {
'thread' :{
- 'thread_level': this.options.thread_level,
'use_composer': true,
- 'show_header_compose': 1,
+ 'show_header_compose': false,
},
'message': {
- 'show_reply': this.options.thread_level > 0,
+ 'show_reply': true,
'show_dd_hide': true,
+ 'show_dd_delete': true,
},
},
'parameters': {},
}
);
+ return this.thread.appendTo( this.$('.oe_mail_wall_threads:first') );
- this.$('ul.oe_mail_wall_threads').empty();
- var render_res = session.web.qweb.render('mail.wall_thread_container', {});
- $(render_res).appendTo(this.$('ul.oe_mail_wall_threads'));
-
- return this.thread.appendTo( this.$('li.oe_mail_wall_thread:last') );
},
+
+ bind_events: function(){
+ var self=this;
+ this.$("button.oe_write_full:first").click(function(){ self.thread.ComposeMessage.on_compose_fullmail(); });
+ this.$("button.oe_write_onwall:first").click(function(){ self.thread.ComposeMessage.$el.toggle(); });
+ }
});
};
diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js
index 953b8cd9fc8..236e3081136 100644
--- a/addons/mail/static/src/js/mail_followers.js
+++ b/addons/mail/static/src/js/mail_followers.js
@@ -40,6 +40,7 @@ openerp_mail_followers = function(session, mail) {
this._check_visibility();
this.reinit();
this.bind_events();
+ this.display_subtypes();
},
_check_visibility: function() {
@@ -53,31 +54,15 @@ openerp_mail_followers = function(session, mail) {
bind_events: function() {
var self = this;
- this.$('div.oe_mouse_subtypes')
- .on('mouseover', function () {
- $(this).removeClass('oe_mouseout').addClass('oe_mouseover');
- self.display_subtypes();
- })
- .on('mouseleave', function () {
- $(this).removeClass('oe_mouseover').addClass('oe_mouseout');
- self.display_subtypes();
- });
-
this.$('button.oe_follower')
.on('click', function () {
if($(this).hasClass('oe_notfollow'))
self.do_follow();
else
self.do_unfollow();
- })
- .on('mouseover', function () {
- $(this).removeClass('oe_mouseout').addClass('oe_mouseover');
- })
- .on('mouseleave', function () {
- $(this).removeClass('oe_mouseover').addClass('oe_mouseout');
});
- this.$el.on('click', 'ul.oe_subtypes input', function () { self.do_update_subscription(); })
+ this.$el.on('click', 'ul.oe_subtypes input', self.do_update_subscription );
this.$el.on('click', 'button.oe_invite', function(event) {
action = {
@@ -149,7 +134,6 @@ openerp_mail_followers = function(session, mail) {
var self = this;
var node_user_list = this.$('ul.oe_mail_followers_display').empty();
this.$('div.oe_mail_recthread_followers h4').html(this.options.title + (records.length>=5 ? ' (' + records.length + ')' : '') );
- console.log(records);
for(var i=0; i<records.length&&i<5; i++) {
var record=records[i];
record.avatar_url = mail.ChatterUtils.get_image(self.session, 'res.partner', 'image_small', record.id);
@@ -174,7 +158,8 @@ openerp_mail_followers = function(session, mail) {
set_subtypes:function(data){
var self = this;
- var records = data[this.view.datarecord.id].message_subtype_data;
+ var records = (data[this.view.datarecord.id] || data[null]).message_subtype_data;
+
_(records).each(function (record, record_name) {
record.name = record_name;
record.followed = record.followed || undefined;
@@ -195,16 +180,10 @@ openerp_mail_followers = function(session, mail) {
},
do_follow: function () {
- var self =this;
_(this.$('.oe_msg_subtype_check')).each(function(record){
$(record).attr('checked','checked');
});
- var context = new session.web.CompoundContext(this.build_context(), {});
- return this.ds_model.call('message_subscribe_users', [[this.view.datarecord.id], undefined, undefined, context]).pipe(function(value_){
- self.read_value(value_);
- if(!self.$('.oe_recthread_subtypes').is(":visible"))
- self.display_subtypes(true);
- });
+ this.do_update_subscription();
},
do_unfollow: function () {
@@ -212,23 +191,28 @@ openerp_mail_followers = function(session, mail) {
$(record).attr('checked',false);
});
var context = new session.web.CompoundContext(this.build_context(), {});
- return this.ds_model.call('message_unsubscribe_users', [[this.view.datarecord.id], undefined, context]).pipe(this.proxy('read_value'));
+ return this.ds_model.call('message_unsubscribe_users', [[this.view.datarecord.id], [this.session.uid], context]).pipe(this.proxy('read_value'));
},
- do_update_subscription: function () {
- var context = new session.web.CompoundContext(this.build_context(), {});
+ do_update_subscription: function (event) {
var self = this;
var checklist = new Array();
- _(this.$('.oe_msg_subtype_check')).each(function(record){
+ _(this.$('.oe_mail_recthread_actions input[type="checkbox"]')).each(function(record){
if($(record).is(':checked')) {
checklist.push(parseInt($(record).data('id')))}
});
if(!checklist.length)
return this.do_unfollow();
- else
- return this.ds_model.call('message_subscribe_users',[[self.view.datarecord.id], undefined, checklist, context]).pipe(this.proxy('read_value'));
+ else{
+ var context = new session.web.CompoundContext(this.build_context(), {});
+ return this.ds_model.call('message_subscribe_users', [[this.view.datarecord.id], [this.session.uid], undefined, context]).pipe(function(value_){
+ self.read_value(value_);
+ self.display_subtypes(true);
+ });
+ }
+
},
});
diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml
index 07c9b406cdc..7941925415d 100644
--- a/addons/mail/static/src/xml/mail.xml
+++ b/addons/mail/static/src/xml/mail.xml
@@ -1,11 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<template>
+ <!--
+ mail.compose_message template
+ This template holds the composition form to write a note or send
+ an e-mail. It contains by default a textarea, that will be replaced
+ by another composition form in the main wall composition form, or
+ for main thread composition form in document form view.
+ -->
+ <t t-name="mail.compose_message">
+ <div class="oe_mail_compose_textarea">
+ <img class="oe_mail_icon oe_mail_frame oe_left" alt="User img"/>
+ <div class="oe_mail_msg_content">
+ <!-- contains the composition form -->
+ <!-- default content: old basic textarea -->
+ <div class="oe_mail_post_header">
+ <t t-call="mail.thread.list_recipients"/>
+ <a class="oe_cancel oe_e">X</a>
+ </div>
+ <textarea class="field_text" placeholder="Add your comment here..."/>
+ <div class="oe_mail_post_footer">
+ <div class="oe_mail_compose_attachment_list"/>
+ <button class="oe_full">Full mail message</button>
+ <button class="oe_post">Post message</button>
+ <t t-call="mail.compose_message.add_attachment"/>
+ </div>
+ </div>
+ <div class="oe_clear"/>
+ </div>
+ </t>
+
+ <!--
+ mail.compose_message.add_attachment template
+ Small template to be inserted in the composition for add attachments
+ -->
+ <t t-name="mail.compose_message.add_attachment">
+ <div class="oe_attachment_file">
+ <div class="oe_add">
+ <!-- uploader of file -->
+ <button><span class="oe_e">p</span></button>
+ <t t-call="HiddenInputFile">
+ <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
+ <t t-set="fileupload_action">/web/binary/upload_attachment</t>
+ <input type="hidden" name="model" value=""/>
+ <input type="hidden" name="id" value="0"/>
+ <input type="hidden" name="session_id" t-att-value="widget.session.session_id"/>
+ </t>
+ </div>
+ </div>
+ </t>
+
+ <!--
+ mail.thread.message.attachments template
+ Template used to display attachments in a mail.message
+ -->
+ <t t-name="mail.thread.message.attachments">
+ <ul t-attf-class="oe_mail_msg_attachments #{widget.attachment_ids[0] and widget.options.thread.show_attachment_link?'':'oe_hidden'}">
+ <t t-foreach="widget.attachment_ids" t-as="attachment">
+ <li>
+ <span t-if="(attachment.upload or attachment.percent_loaded&lt;100)" t-attf-title="{(attachment.name || attachment.filename) + (attachment.date?' \n('+attachment.date+')':'' )}" t-attf-name="{attachment.name || attachment.filename}">
+ <div class="oe_upload_in_process">
+ <span>Upload in progress...</span>
+ <div t-attf-style="{attachment.percent_loaded&gt;0?'':'display:none;'}"/>
+ <div t-attf-style="{attachment.percent_loaded&gt;20?'':'display:none;'}"/>
+ <div t-attf-style="{attachment.percent_loaded&gt;40?'':'display:none;'}"/>
+ <div t-attf-style="{attachment.percent_loaded&gt;60?'':'display:none;'}"/>
+ <div t-attf-style="{attachment.percent_loaded&gt;80?'':'display:none;'}"/>
+ </div>
+ <t t-raw="attachment.name || attachment.filename"/>
+ </span>
+ <a t-if="(!attachment.upload or attachment.percent_loaded&gt;=100)" t-att-href="attachment.url" t-attf-title="{(attachment.name || attachment.filename) + (attachment.date?' \n('+attachment.date+')':'' )}">
+ <t t-raw="attachment.name || attachment.filename"/>
+ </a>
+ <t t-if="widget.options.thread.show_attachment_delete and (!attachment.upload or attachment.percent_loaded&gt;=100)">
+ <a class="oe_right oe_mail_attachment_delete" title="Delete this attachment" t-attf-data-id="{attachment.id}">x</a>
+ </t>
+
+ </li>
+ </t>
+ </ul>
+ </t>
+
+ <t t-name="mail.thread.message.private">
+ <div>
+ <span class="oe_placeholder_checkbox_private"/>
+ <span class="oe_send_private">This email is private.</span>
+ <span class="oe_send_public">I wrote for contacts and all my followers.</span>
+ </div>
+ </t>
+
+ <!--
+ template to the recipients list
+ -->
+ <t t-name="mail.thread.list_recipients">
+ <div class="oe_mail_list_recipients">
+ Post to:
+ <span t-if="!widget.is_private" class="oe_all_follower">All Followers</span>
+ <t t-if="!widget.is_private and widget.partner_ids.length"> and </t>
+ <t t-set="inc" t-value="0"/>
+ <t t-if="widget.partner_ids.length" t-foreach="widget.partner_ids" t-as="partner"><span t-attf-class="oe_partner_follower #{inc>=3?'oe_hidden':''}"><t t-if="inc" t-raw="', '"/><a t-attf-href="#model=res.partner&amp;id=#{partner[0]}"><t t-raw="partner[1]"/></a></span><t t-set="inc" t-value="inc+1"/>
+ </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>
+ <a class="oe_more_hidden">&lt;&lt;&lt;</a>
+ </t>
+ </div>
+ </t>
+
<!--
wall main template
Template used to display the communication history in the wall.
-->
- <div t-name="mail.wall" class="oe_view_manager oe_mail_wall oe_view_manager_current">
+ <div t-name="mail.wall" class="oe_view_manager oe_mail_wall oe_view_manag
+ er_current">
<table class="oe_view_manager_header">
<colgroup>
<col width="33%"/>
@@ -25,21 +132,30 @@
</td>
<td><div class="oe_view_manager_view_search" t-opentag="true"/></td>
</tr>
+ <tr class="oe_header_row">
+ <td colspan="2">
+ <button type="button" class="oe_write_full oe_highlight">
+ Compose a new message
+ </button>
+ <button type="button" class="oe_write_onwall" help="Your followers can read this message">
+ Write to your followers
+ </button>
+ </td>
+ </tr>
</tbody>
</table>
- <ul class="oe_mail_wall_threads">
- <!-- contains threads -->
- </ul>
+ <!-- placeholder for the wall threads -->
+ <div class="oe_mail_wall_threads"/>
<div class="oe_mail_wall_aside">
<!-- contains currently nothing -->
</div>
</div>
<!--
- wall_thread_container template for the wall
- Each discussion thread is contained inside this template
+ display message on the wall when there are no message
-->
- <li t-name="mail.wall_thread_container" class="oe_mail_wall_thread">
+ <li t-name="mail.wall_no_message" class="oe_wall_no_message">
+ You have no messages
</li>
<!--
@@ -55,39 +171,6 @@
</div>
<!--
- mail.compose_message template
- This template holds the composition form to write a note or send
- an e-mail. It contains by default a textarea, that will be replaced
- by another composition form in the main wall composition form, or
- for main thread composition form in document form view.
- -->
- <t t-name="mail.compose_message">
- <div class="oe_mail_compose_textarea">
- <img class="oe_mail_icon oe_mail_frame oe_left" alt="User img"/>
- <div class="oe_mail_msg_content">
- <!-- contains the composition form -->
- <!-- default content: old basic textarea -->
- <textarea placeholder="Add your comment here..."/>
- </div>
- <div class="oe_clear"/>
- </div>
- </t>
-
- <!--
- mail.compose_message.add_attachment template
- Small template to be inserted in the composition form to add attachments
- -->
- <t t-name="mail.compose_message.add_attachment">
- <t t-call="HiddenInputFile">
- <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
- <t t-set="fileupload_action">/web/binary/upload_attachment</t>
- <input type="hidden" name="model" t-att-value="widget.form_view.model"/>
- <input type="hidden" name="id" t-att-value="widget.form_view.datarecord.id || 0"/>
- <input type="hidden" name="session_id" t-att-value="widget.session.session_id"/>
- </t>
- </t>
-
- <!--
thread template
This template holds a thread of comments. It begins with an actions
container, holding the composition form. Then come the various
@@ -96,7 +179,6 @@
<div t-name="mail.thread" class="oe_mail oe_mail_thread oe_semantic_html_override">
<div class="oe_mail_thread_action">
<!-- contains the composition box (form + image) -->
- <t t-call="mail.compose_message"/>
</div>
<ul class="oe_mail_thread_display">
<!-- contains the threads -->
@@ -104,16 +186,15 @@
</div>
<!-- default layout -->
- <li t-name="mail.thread.message" t-attf-class="oe_mail oe_mail_thread_msg #{widget.unread?'oe_mail_unread':'oe_mail_read'}" t-attf-data-msg_id="{widget.id}">
+ <li t-name="mail.thread.message" t-attf-class="oe_mail oe_mail_thread_msg #{widget.unread?'oe_mail_unread':'oe_mail_read'}">
<div t-attf-class="oe_mail_msg_#{widget.type} oe_semantic_html_override">
<!-- message actions (read/unread, reply, delete...) -->
<ul class="oe_header">
<li class="placeholder-mail-vote"><t t-call="mail.thread.message.vote"/></li>
- <li t-if="!widget.options.thread.display_on_flat and widget.unread" title="Read"><a class="oe_read oe_e">W</a></li>
- <li t-if="!widget.options.thread.display_on_flat and !widget.unread" title="Set back to unread"><a class="oe_unread oe_e">h</a></li>
- <li t-if="!widget.options.message.show_reply_by_email" title="Reply"><a class="oe_reply oe_e">)</a></li>
- <li t-if="widget.options.message.show_reply_by_email"><a class="oe_reply_by_email oe_e" title="Reply by mail">)</a></li>
- <t t-if="(widget.options.message.show_reply || widget.options.message.show_reply_by_email || (widget.is_author and widget.options.message.show_dd_delete) || widget.type == 'email')">
+ <li t-if="!widget.options.thread.display_on_flat" title="Read" class="oe_read"><a class="oe_read oe_e">W</a></li>
+ <li t-if="!widget.options.thread.display_on_flat" title="Set back to unread" class="oe_unread"><a class="oe_unread oe_e">h</a></li>
+ <li title="Quick reply"><a class="oe_reply oe_e">)</a></li>
+ <t t-if="(widget.is_author and widget.options.message.show_dd_delete) or widget.type == 'email'">
<li>
<span class="oe_dropdown_toggle">
<a class="oe_e" title="More options">í</a>
@@ -123,8 +204,6 @@
<li t-if="display['show_hide']">
<a href="#" class="oe_mail_msg_hide_type" t-attf-data-subtype='{widget.subtype}'>Hide '<t t-esc="widget.subtype"/>' for this document</a>
</li> -->
- <li t-if="widget.options.message.show_reply" title="Reply"><a class="oe_reply oe_full_reply">Full reply</a></li>
- <li t-if="widget.options.message.show_reply_by_email"><a class="oe_reply_by_email oe_full_reply" title="Reply by mail">Full reply</a></li>
<li t-if="widget.type == 'email'"><a class="oe_mail_msg_details" t-attf-href="#model=mail.message&amp;id=#{widget.id}" >Details</a></li>
</ul>
</span>
@@ -145,7 +224,6 @@
<ul class="oe_mail_msg_footer">
<li t-if="widget.author_id"><a t-attf-href="#model=res.partner&amp;id=#{widget.author_id[0]}"><t t-raw="widget.author_id[1]"/></a></li>
<li><span t-att-title="widget.date"><t t-raw="widget.timerelative"/></span></li>
-
<li t-if="widget.attachment_ids.length > 0">
<a class="oe_mail_msg_view_attachments">
<t t-if="widget.attachment_ids.length == 1">1 Attachment</t>
@@ -155,7 +233,7 @@
</ul>
<div class="oe_clear"/>
<div class="oe_mail_msg_body">
- <t t-if="widget.options.message.show_record_name and widget.record_name and (!widget.subject) and widget.options.thread._parents.length&lt;=widget.options.thread.thread_level and widget.model!='res.partner'">
+ <t t-if="widget.options.message.show_record_name and widget.record_name and (!widget.subject) and !widget.options.thread.thread_level and !widget.options.thread.display_on_flat and widget.model!='res.partner'">
<a class="oe_mail_action_model" t-attf-href="#model=#{widget.model}&amp;id=#{widget.res_id}"><t t-raw="widget.record_name"/></a>
</t>
<t t-raw="widget.body"/>
@@ -171,7 +249,7 @@
</li>
<!-- expandable message layout -->
- <li t-name="mail.thread.expandable" t-attf-class="oe_mail oe_mail_thread_msg oe_mail_unread" t-attf-data-thread_id="{widget.id}">
+ <li t-name="mail.thread.expandable" class="oe_mail oe_mail_thread_msg oe_mail_unread">
<div t-attf-class="oe_mail_msg_#{widget.type} oe_semantic_html_override">
<div class="oe_mail_msg_content oe_mail_msg_more_message">
<a class="oe_mail_fetch_more">Load more messages <span t-if="widget.nb_messages>0">(<t t-raw="widget.nb_messages"/> messages not display)</span>...</a>
@@ -179,23 +257,6 @@
</div>
</li>
- <!--
- mail.thread.message.attachments template
- Template used to display attachments in a mail.message
- -->
- <t t-name="mail.thread.message.attachments">
- <ul class="oe_mail_msg_attachments">
- <t t-foreach="record.attachment_ids" t-as="attachment">
- <li>
- <a t-att-href="attachment.url"><t t-raw="attachment.name || attachment.filename"/></a>
- <t t-if="record.show_attachment_delete">
- <a class="oe_right oe_mail_attachment_delete" title="Delete this attachmentt" t-attf-data-id="{attachment.id}">x</a>
- </t>
- </li>
- </t>
- </ul>
- </t>
-
<!-- mail.thread.message.vote
Template used to display Like/Unlike in a mail.message
-->
@@ -215,7 +276,7 @@
<button t-attf-class="oe_mail_msg_vote oe_tag">
<span>
<t t-if="!widget.has_voted">Agree</t>
- <t t-if="widget.has_voted">Unagree</t>
+ <t t-if="widget.has_voted">Undo</t>
</span>
</button>
</span>
diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml
index a6df1f0fe8c..f78c91c6305 100644
--- a/addons/mail/static/src/xml/mail_followers.xml
+++ b/addons/mail/static/src/xml/mail_followers.xml
@@ -13,9 +13,9 @@
<span class="oe_unfollow">Unfollow</span>
<span class="oe_following">Following</span>
</button>
- <div class="oe_recthread_subtypes">
- <ul class="oe_subtypes"></ul>
- </div>
+ </div>
+ <div class="oe_recthread_subtypes">
+ <ul class="oe_subtypes"></ul>
</div>
</div>
<div class="oe_grey">
diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py
index 7ec37d952bc..a94c4fc2c8a 100644
--- a/addons/mail/tests/test_mail.py
+++ b/addons/mail/tests/test_mail.py
@@ -194,7 +194,7 @@ class test_mail(TestMailMockups):
'plaintext mail incorrectly parsed')
def test_10_many2many_reference_field(self):
- """ Tests designed for the many2many_reference field (follower_ids).
+ """ Tests designed for the many2many function field 'follower_ids'.
We will test to perform writes using the many2many commands 0, 3, 4,
5 and 6. """
cr, uid = self.cr, self.uid
@@ -529,109 +529,6 @@ class test_mail(TestMailMockups):
self.assertEqual(message2.subject, _subject, 'mail.message subject incorrect')
self.assertEqual(message2.body, group_bird.description, 'mail.message body incorrect')
- # FP Note: to be reviewed to be more generic, not depending on the algorythm of
- # message_read
- #def test_30_message_read(self):
- # """ Tests designed for message_read. """
- # # TDE NOTE: this test is not finished, as the message_read method is not fully specified.
- # # It will be updated as soon as we have fixed specs !
- # cr, uid = self.cr, self.uid
- # group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
-
- # def _compare_structures(struct1, struct2, n=0):
- # # print '%scompare structure' % ('\t' * n)
- # # self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect')
-
- # for x in range(len(struct1)):
- # if struct1[x].get('type') == 'expandable':
- # continue
- # # print '%s' % ('\t' * n), struct1[x]['id'], struct1[x]['child_nbr'], struct2[x]['id'], struct2[x].get('child_nbr', 'XX'), struct1[x].get('subject') or ''
- # self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject'))
- # _compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1)
- # # print '%send compare' % ('\t' * n)
-
- # # ----------------------------------------
- # # CASE1: Flattening test
- # # ----------------------------------------
-
- # # Create dummy message structure
- # import copy
- # tree = [{'id': 2, 'child_nbr': 1, 'child_ids': [
- # {'id': 6, 'child_nbr': 1, 'child_ids': [
- # {'id': 8, 'child_nbr': 0, 'child_ids': []},
- # ]},
- # ]},
- # {'id': 1, 'child_nbr': 3, 'child_ids':[
- # {'id': 7, 'child_nbr': 1, 'child_ids': [
- # {'id': 9, 'child_nbr': 0, 'child_ids': []},
- # ]},
- # {'id': 4, 'child_nbr': 2, 'child_ids': [
- # {'id': 10, 'child_nbr': 0, 'child_ids': []},
- # {'id': 5, 'child_nbr': 0, 'child_ids': []},
- # ]},
- # {'id': 3, 'child_nbr': 0, 'child_ids': []},
- # ]},
- # ]
- # # Test: completely flat
- # new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 0, limit=15, add_expandable=False)
- # _compare_structures(new_tree, new_tree)
- # self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat')
- # # Test: 1 thread level
- # tree_test = [{'id': 2, 'child_ids': [
- # {'id': 8, 'child_ids': []}, {'id': 6, 'child_ids': []},
- # ]},
- # {'id': 1, 'child_ids': [
- # {'id': 10, 'child_ids': []}, {'id': 9, 'child_ids': []},
- # {'id': 7, 'child_ids': []}, {'id': 5, 'child_ids': []},
- # {'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []},
- # ]},
- # ]
- # new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 1, limit=15, add_expandable=False)
- # _compare_structures(new_tree, tree_test)
- # # Test: 2 thread levels
- # new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 2, limit=15, add_expandable=False)
- # _compare_structures(new_tree, tree)
-
- # # ----------------------------------------
- # # CASE2: message_read test
- # # ----------------------------------------
-
- # # 1. Add a few messages to pigs group
- # msgid1 = group_pigs.message_post(body='1', subject='1', parent_id=False)
- # msgid2 = group_pigs.message_post(body='2', subject='1-1', parent_id=msgid1)
- # msgid3 = group_pigs.message_post(body='3', subject='1-2', parent_id=msgid1)
- # msgid4 = group_pigs.message_post(body='4', subject='2', parent_id=False)
- # msgid5 = group_pigs.message_post(body='5', subject='1-1-1', parent_id=msgid2)
- # msgid6 = group_pigs.message_post(body='6', subject='2-1', parent_id=msgid4)
-
- # # Test: read all messages flat
- # tree_test = [{'id': msgid6, 'child_ids': []}, {'id': msgid5, 'child_ids': []},
- # {'id': msgid4, 'child_ids': []}, {'id': msgid3, 'child_ids': []},
- # {'id': msgid2, 'child_ids': []}, {'id': msgid1, 'child_ids': []}]
- # tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=0, limit=15)
- # _compare_structures(tree, tree_test)
- # # Test: read with 1 level of thread
- # tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]},
- # {'id': msgid1, 'child_ids': [
- # {'id': msgid5, 'child_ids': []}, {'id': msgid3, 'child_ids': []},
- # {'id': msgid2, 'child_ids': []},
- # ]},
- # ]
- # tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=1, limit=15)
- # _compare_structures(tree, tree_test)
- # # Test: read with 2 levels of thread
- # tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]},
- # {'id': msgid1, 'child_ids': [
- # {'id': msgid3, 'child_ids': []},
- # {'id': msgid2, 'child_ids': [{'id': msgid5, 'child_ids': []}, ]},
- # ]},
- # ]
- # tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=2, limit=15)
- # _compare_structures(tree, tree_test)
-
- # # 2. Test expandables
- # # TDE FIXME: add those tests when expandables are specified and implemented
-
def test_40_needaction(self):
""" Tests for mail.message needaction. """
cr, uid = self.cr, self.uid
diff --git a/addons/mail/update.py b/addons/mail/update.py
new file mode 100644
index 00000000000..0e10ee0a7f1
--- /dev/null
+++ b/addons/mail/update.py
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*-
+import datetime
+import logging
+import sys
+import urllib
+import urllib2
+
+import pooler
+import release
+from osv import osv, fields
+from tools.translate import _
+from tools.safe_eval import safe_eval
+from tools.config import config
+from tools import misc
+
+_logger = logging.getLogger(__name__)
+
+"""
+Time interval that will be used to determine up to which date we will
+check the logs to see if a message we just received was already logged.
+@type: datetime.timedelta
+"""
+_PREVIOUS_LOG_CHECK = datetime.timedelta(days=365)
+
+def get_sys_logs(cr, uid):
+ """
+ Utility method to send a publisher warranty get logs messages.
+ """
+ pool = pooler.get_pool(cr.dbname)
+
+ dbuuid = pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
+ db_create_date = pool.get('ir.config_parameter').get_param(cr, uid, 'database.create_date')
+ limit_date = datetime.datetime.now()
+ limit_date = limit_date - datetime.timedelta(15)
+ limit_date_str = limit_date.strftime(misc.DEFAULT_SERVER_DATETIME_FORMAT)
+ nbr_users = pool.get("res.users").search(cr, uid, [], count=True)
+ nbr_active_users = pool.get("res.users").search(cr, uid, [("date", ">=", limit_date_str)], count=True)
+ nbr_share_users = False
+ nbr_active_share_users = False
+ if "share" in pool.get("res.users")._all_columns:
+ nbr_share_users = pool.get("res.users").search(cr, uid, [("share", "=", True)], count=True)
+ nbr_active_share_users = pool.get("res.users").search(cr, uid, [("share", "=", True), ("date", ">=", limit_date_str)], count=True)
+ user = pool.get("res.users").browse(cr, uid, uid)
+ msg = {
+ "dbuuid": dbuuid,
+ "nbr_users": nbr_users,
+ "nbr_active_users": nbr_active_users,
+ "nbr_share_users": nbr_share_users,
+ "nbr_active_share_users": nbr_active_share_users,
+ "dbname": cr.dbname,
+ "db_create_date": db_create_date,
+ "version": release.version,
+ "language": user.lang,
+ }
+ msg.update(pool.get("res.company").read(cr,uid,[1],["name","email","phone"])[0])
+
+ add_arg = {"timeout":30} if sys.version_info >= (2,6) else {}
+ arguments = {'arg0': msg, "action": "update",}
+ arguments_raw = urllib.urlencode(arguments)
+
+ url = config.get("publisher_warranty_url")
+ uo = urllib2.urlopen(url, arguments_raw, **add_arg)
+ result = {}
+ try:
+ submit_result = uo.read()
+ result = safe_eval(submit_result)
+ finally:
+ uo.close()
+ return result
+
+class publisher_warranty_contract(osv.osv):
+ _name = "publisher_warranty.contract"
+
+ def update_notification(self, cr, uid, ids, cron_mode=True, context=None):
+ """
+ Send a message to OpenERP's publisher warranty server to check the
+ validity of the contracts, get notifications, etc...
+
+ @param cron_mode: If true, catch all exceptions (appropriate for usage in a cron).
+ @type cron_mode: boolean
+ """
+ try:
+ try:
+ result = get_sys_logs(cr, uid)
+ except Exception:
+ if cron_mode: # we don't want to see any stack trace in cron
+ return False
+ _logger.debug("Exception while sending a get logs messages", exc_info=1)
+ raise osv.except_osv(_("Error"), _("Error during communication with the publisher warranty server."))
+ limit_date = (datetime.datetime.now() - _PREVIOUS_LOG_CHECK).strftime(misc.DEFAULT_SERVER_DATETIME_FORMAT)
+ # old behavior based on res.log; now on mail.message, that is not necessarily installed
+ proxy = self.pool.get('mail.message')
+
+ model, res_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', 'group_all_employees')
+
+ for message in result["messages"]:
+ values = {
+ 'body' : message,
+ 'model' : 'mail.group',
+ 'res_id' : res_id,
+ 'user_id' : False,
+ }
+ proxy.create(cr, uid, values, context=context)
+ except Exception:
+ if cron_mode:
+ return False # we don't want to see any stack trace in cron
+ else:
+ raise
+ return True
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index 3baf3ff9023..7d75c67b942 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -81,7 +81,11 @@ class mail_compose_message(osv.TransientModel):
elif composition_mode == 'comment' and model and res_id:
vals = self.get_record_data(cr, uid, model, res_id, context=context)
elif composition_mode == 'mass_mail' and model and active_ids:
- vals = {'model': model, 'res_id': res_id, 'content_subtype': 'html'}
+ if context.get('default_template_id'):
+ vals = self.pool.get('email.template').generate_email(cr, uid, context.get('default_template_id'), res_id, context=context)
+ vals.update({'content_subtype': 'html'})
+ else:
+ vals = {'model': model, 'res_id': res_id, 'content_subtype': 'html'}
else:
vals = {'model': model, 'res_id': res_id}
if composition_mode:
@@ -121,7 +125,7 @@ class mail_compose_message(osv.TransientModel):
'partner_ids': lambda self, cr, uid, ctx={}: [],
}
- def notify(self, cr, uid, newid, context=None):
+ def _notify(self, cr, uid, newid, context=None):
""" Override specific notify method of mail.message, because we do
not want that feature in the wizard. """
return
@@ -219,7 +223,6 @@ class mail_compose_message(osv.TransientModel):
email(s), rendering any template patterns on the fly if needed. """
if context is None:
context = {}
- print '**', context
active_ids = context.get('active_ids')
for wizard in self.browse(cr, uid, ids, context=context):
diff --git a/addons/mail/wizard/mail_compose_message_view.xml b/addons/mail/wizard/mail_compose_message_view.xml
index 0f384dc5a0d..7329992f8ed 100644
--- a/addons/mail/wizard/mail_compose_message_view.xml
+++ b/addons/mail/wizard/mail_compose_message_view.xml
@@ -16,13 +16,11 @@
<field name="partner_ids" widget="many2many_tags" placeholder="Add contacts to notify..."
context="{'force_email':True}"
on_change="onchange_partner_ids(partner_ids)"/>
+ <field name="is_private" help="If this message is not private, this message will send to all your followers or all followers of the parented message."/>
</group>
<notebook>
<page string="Body">
- <field name="body_text" nolabel="1"
- attrs="{'invisible':[('content_subtype', '=', 'html')]}"/>
- <field name="body" nolabel="1"
- attrs="{'invisible':[('content_subtype', '=', 'plain')]}"/>
+ <field name="body" nolabel="1"/>
</page>
<page string="Attachments">
<field name="attachment_ids" colspan="4" nolabel="1"/>
@@ -32,10 +30,10 @@
<button string="Send" name="send_mail" type="object" class="oe_highlight" />
or
<button string="Cancel" class="oe_link" special="cancel" />
- <div class="oe_right">
+ <!--div class="oe_right">
<button string="" name="toggle_content_subtype" type="object" icon="/mail/static/src/img/formatting.png"
help="Toggle advanced formatting mode"/>
- </div>
+ </div-->
</footer>
</form>
</field>
@@ -68,6 +66,7 @@
context="{'force_email':True}"
on_change="onchange_partner_ids(partner_ids)"
class="oe_mail_compose_message_partner_ids"/>
+ <!--field name="is_private" help="If this message is not private, this message will send to all your followers or all followers of the parented message."/-->
<field name="attachment_ids" colspan="2" nolabel="1" widget="many2many_tags"
placeholder="Add attachments..." invisible="1"
class="oe_mail_compose_message_attachment_ids"/>
diff --git a/addons/marketing_campaign/i18n/ar.po b/addons/marketing_campaign/i18n/ar.po
index 141a567ac52..7f7ee498416 100644
--- a/addons/marketing_campaign/i18n/ar.po
+++ b/addons/marketing_campaign/i18n/ar.po
@@ -8,19 +8,19 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
-"PO-Revision-Date: 2012-01-12 05:49+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"PO-Revision-Date: 2012-10-08 15:06+0000\n"
+"Last-Translator: kifcaliph <Unknown>\n"
"Language-Team: Arabic <ar@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: 2012-08-28 06:38+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: marketing_campaign
#: view:marketing.campaign:0
msgid "Manual Mode"
-msgstr ""
+msgstr "النمط اليدوي"
#. module: marketing_campaign
#: field:marketing.campaign.transition,activity_from_id:0
@@ -31,12 +31,12 @@ msgstr "النشاط السابق"
#: code:addons/marketing_campaign/marketing_campaign.py:818
#, python-format
msgid "The current step for this item has no email or report to preview."
-msgstr ""
+msgstr "الخطوة الحالية لهذا الصنف لا تملك بريد إلكتروني أو تقرير للمعاينة"
#. module: marketing_campaign
#: constraint:marketing.campaign.transition:0
msgid "The To/From Activity of transition must be of the same Campaign "
-msgstr ""
+msgstr "الإنتقال من / إلى النشاط يجب أن يكون من نفس الحملة "
#. module: marketing_campaign
#: selection:marketing.campaign.transition,trigger:0
@@ -46,7 +46,7 @@ msgstr "الوقت"
#. module: marketing_campaign
#: selection:marketing.campaign.activity,type:0
msgid "Custom Action"
-msgstr ""
+msgstr "تخصيص إجراء"
#. module: marketing_campaign
#: view:campaign.analysis:0
@@ -63,11 +63,13 @@ msgid ""
"reached this point has generated a certain revenue. You can get revenue "
"statistics in the Reporting section"
msgstr ""
+"تعيين الإيرادات المتوقعة إذا كنت ترى أن كل بند من بنود الحملة وصلت الى تلك "
+"النقطة وولدت عائد معين. يمكنك الحصول على إحصاءات الإيرادات في قسم التقارير"
#. module: marketing_campaign
#: field:marketing.campaign.transition,trigger:0
msgid "Trigger"
-msgstr ""
+msgstr "زر"
#. module: marketing_campaign
#: field:campaign.analysis,count:0
@@ -77,7 +79,7 @@ msgstr ""
#. module: marketing_campaign
#: view:marketing.campaign:0
msgid "Campaign Editor"
-msgstr ""
+msgstr "محرر الحملة"
#. module: marketing_campaign
#: view:campaign.analysis:0
@@ -106,13 +108,13 @@ msgstr "كائن"
#. module: marketing_campaign
#: view:marketing.campaign.segment:0
msgid "Sync mode: only records created after last sync"
-msgstr ""
+msgstr "نمط المزامنة: السجلات فقط التي تم إنشاؤها بعد آخر المزامنة"
#. module: marketing_campaign
#: model:email.template,body_text:marketing_campaign.email_template_2
msgid ""
"Hello, We are happy to announce that you now become our Silver Partner."
-msgstr ""
+msgstr "مرحبا، ونحن سعداء أن نعلن أنك أصبحت الآن شريكاً فضياً لدينا."
#. module: marketing_campaign
#: view:marketing.campaign:0
@@ -123,7 +125,7 @@ msgstr "حفظ كمسودة"
#. module: marketing_campaign
#: field:marketing.campaign.activity,to_ids:0
msgid "Next Activities"
-msgstr ""
+msgstr "النشاطات التالية"
#. module: marketing_campaign
#: view:marketing.campaign.segment:0
@@ -133,7 +135,7 @@ msgstr "مزامنة"
#. module: marketing_campaign
#: sql_constraint:marketing.campaign.transition:0
msgid "The interval must be positive or zero"
-msgstr ""
+msgstr "الفترة يجب أن تكون إيجابية أو صفر"
#. module: marketing_campaign
#: code:addons/marketing_campaign/marketing_campaign.py:818
@@ -145,7 +147,7 @@ msgstr "لا معاينة"
#: view:marketing.campaign.segment:0
#: field:marketing.campaign.segment,date_run:0
msgid "Launch Date"
-msgstr ""
+msgstr "تاريخ الإنشاء"
#. module: marketing_campaign
#: view:campaign.analysis:0
@@ -156,7 +158,7 @@ msgstr "يوم"
#. module: marketing_campaign
#: view:marketing.campaign.activity:0
msgid "Outgoing Transitions"
-msgstr ""
+msgstr "التنقلات الصادرة"
#. module: marketing_campaign
#: view:marketing.campaign.workitem:0
@@ -166,18 +168,18 @@ msgstr "إستعادة"
#. module: marketing_campaign
#: help:marketing.campaign,object_id:0
msgid "Choose the resource on which you want this campaign to be run"
-msgstr ""
+msgstr "اختيار المورد الذي تريده ليتم تشغيله لهذه الحملة"
#. module: marketing_campaign
#: field:marketing.campaign.segment,sync_last_date:0
msgid "Last Synchronization"
-msgstr ""
+msgstr "التزامن الأخير"
#. module: marketing_campaign
#: code:addons/marketing_campaign/marketing_campaign.py:214
#, python-format
msgid "You can not duplicate a campaign, it's not supported yet."
-msgstr ""
+msgstr "لا يمكنك تكرار الحملة، انها غير مدعومة حتى الآن."
#. module: marketing_campaign
#: selection:marketing.campaign.transition,interval_type:0
@@ -189,7 +191,7 @@ msgstr "سنة/سنين"
msgid ""
"Date on which this segment was synchronized last time (automatically or "
"manually)"
-msgstr ""
+msgstr "التاريخ الذي تزامن هذا القطاع آخر مرة (آليا أو يدويا)"
#. module: marketing_campaign
#: selection:campaign.analysis,state:0
@@ -216,11 +218,19 @@ msgid ""
"Normal - the campaign runs normally and automatically sends all emails and "
"reports (be very careful with this mode, you're live!)"
msgstr ""
+"اختبار - وهو يخلق ويعالج كافة الأنشطة مباشرة (دون انتظار تأخير على التحولات) "
+"ولكن لا يرسل رسائل البريد الإلكتروني أو يعد التقارير.\n"
+" اختبار في الوقت الحقيقي - وهو يخلق ويعالج جميع الأنشطة بشكل مباشر ولكن لا "
+"يرسل رسائل البريد الإلكتروني أو يعد التقارير.\n"
+" مع التأكيد اليدوي - يعمل الحملات عادة، ولكن المستخدم لديه للتحقق من صحة كل "
+"بنود العمل يدويا.\n"
+" طبيعي - يعمل الحملة بشكل طبيعي يرسل تلقائيا جميع رسائل البريد الإلكتروني "
+"والتقارير (نكون حذرين للغاية مع هذا الوضع، أنت على الهواء!)"
#. module: marketing_campaign
#: help:marketing.campaign.segment,date_run:0
msgid "Initial start date of this segment."
-msgstr ""
+msgstr "تاريخ بدء الأولي لهذا القطاع."
#. module: marketing_campaign
#: view:campaign.analysis:0
@@ -237,7 +247,7 @@ msgstr "حملة"
#. module: marketing_campaign
#: model:email.template,subject:marketing_campaign.email_template_3
msgid "Congratulation! You become our Gold Partner."
-msgstr ""
+msgstr "تهنئة! لقد أصبحت شريكاً ذهبياً الآن."
#. module: marketing_campaign
#: view:campaign.analysis:0
@@ -251,7 +261,7 @@ msgstr "قطعة"
#. module: marketing_campaign
#: view:marketing.campaign.activity:0
msgid "Cost / Revenue"
-msgstr ""
+msgstr "التكلفة/العائد"
#. module: marketing_campaign
#: help:marketing.campaign.activity,type:0
@@ -313,7 +323,7 @@ msgstr ""
#. module: marketing_campaign
#: view:campaign.analysis:0
msgid "Marketing Reports"
-msgstr ""
+msgstr "تقارير التسويق"
#. module: marketing_campaign
#: selection:marketing.campaign,state:0
@@ -342,7 +352,7 @@ msgstr ""
#. module: marketing_campaign
#: field:marketing.campaign.segment,sync_mode:0
msgid "Synchronization mode"
-msgstr ""
+msgstr "نمط التزامن"
#. module: marketing_campaign
#: view:marketing.campaign:0
@@ -353,7 +363,7 @@ msgstr ""
#. module: marketing_campaign
#: field:marketing.campaign.activity,from_ids:0
msgid "Previous Activities"
-msgstr ""
+msgstr "النشاطات السابقة"
#. module: marketing_campaign
#: help:marketing.campaign.segment,date_done:0
@@ -363,7 +373,7 @@ msgstr ""
#. module: marketing_campaign
#: view:marketing.campaign.workitem:0
msgid "Marketing Campaign Activities"
-msgstr ""
+msgstr "نشاطات حملة التسويق"
#. module: marketing_campaign
#: view:marketing.campaign.workitem:0
@@ -427,7 +437,7 @@ msgstr ""
#. module: marketing_campaign
#: model:ir.model,name:marketing_campaign.model_marketing_campaign_segment
msgid "Campaign Segment"
-msgstr ""
+msgstr "حملة القطاع"
#. module: marketing_campaign
#: view:marketing.campaign:0
@@ -456,7 +466,7 @@ msgstr ""
#. module: marketing_campaign
#: field:marketing.campaign,fixed_cost:0
msgid "Fixed Cost"
-msgstr ""
+msgstr "التكلفة الثابتة"
#. module: marketing_campaign
#: model:email.template,subject:marketing_campaign.email_template_2
@@ -466,12 +476,12 @@ msgstr ""
#. module: marketing_campaign
#: view:marketing.campaign.segment:0
msgid "Newly Modified"
-msgstr ""
+msgstr "تم التعديل حديثاً"
#. module: marketing_campaign
#: field:marketing.campaign.transition,interval_nbr:0
msgid "Interval Value"
-msgstr ""
+msgstr "قيمة الفترة"
#. module: marketing_campaign
#: field:campaign.analysis,revenue:0
@@ -512,22 +522,22 @@ msgstr ""
#. module: marketing_campaign
#: model:ir.actions.act_window,name:marketing_campaign.act_marketing_campaing_followup
msgid "Campaign Follow-up"
-msgstr ""
+msgstr "متابعة الحملة"
#. module: marketing_campaign
#: help:marketing.campaign.activity,email_template_id:0
msgid "The e-mail to send when this activity is activated"
-msgstr ""
+msgstr "بريد إلكتروني للإرسال عندما يتم تنشيط المنشط"
#. module: marketing_campaign
#: view:marketing.campaign:0
msgid "Test Mode"
-msgstr ""
+msgstr "نمط الإختبار"
#. module: marketing_campaign
#: selection:marketing.campaign.segment,sync_mode:0
msgid "Only records modified after last sync (no duplicates)"
-msgstr ""
+msgstr "فقط السجلات المعدلة بعد آخر مزامنة (بدون تكرار)"
#. module: marketing_campaign
#: model:ir.model,name:marketing_campaign.model_ir_actions_report_xml
diff --git a/addons/marketing_campaign/report/campaign_analysis_view.xml b/addons/marketing_campaign/report/campaign_analysis_view.xml
index db79ce44132..d3693497408 100644
--- a/addons/marketing_campaign/report/campaign_analysis_view.xml
+++ b/addons/marketing_campaign/report/campaign_analysis_view.xml
@@ -5,7 +5,7 @@
<field name="name">campaign.analysis.tree</field>
<field name="model">campaign.analysis</field>
<field name="arch" type="xml">
- <tree string="Marketing Reports">
+ <tree string="Marketing Reports" create="false">
<field name="year" invisible="1"/>
<field name="month" invisible="1"/>
<field name="day" invisible="1"/>
diff --git a/addons/membership/report/report_membership_view.xml b/addons/membership/report/report_membership_view.xml
index 81e1a3db97c..99dcc73ceba 100644
--- a/addons/membership/report/report_membership_view.xml
+++ b/addons/membership/report/report_membership_view.xml
@@ -8,7 +8,7 @@
<field name="name">report.membership.tree</field>
<field name="model">report.membership</field>
<field name="arch" type="xml">
- <tree colors="blue:membership_state == 'draft';black:membership_state in ('open','free');gray:membership_state in ('done','cancel') " string="Membership">
+ <tree colors="blue:membership_state == 'draft';black:membership_state in ('open','free');gray:membership_state in ('done','cancel') " create="false" string="Membership">
<field name="partner_id"/>
<field name="membership_state"/>
<field name="associate_member_id" invisible="1"/>
diff --git a/addons/mrp/__openerp__.py b/addons/mrp/__openerp__.py
index 73564f2b460..66806c4f350 100644
--- a/addons/mrp/__openerp__.py
+++ b/addons/mrp/__openerp__.py
@@ -29,7 +29,7 @@
'sequence': 18,
'summary': 'Manufacturing Orders, Bill of Materials, Routing',
'images': ['images/bill_of_materials.jpeg', 'images/manufacturing_order.jpeg', 'images/planning_manufacturing_order.jpeg', 'images/production_analysis.jpeg', 'images/production_dashboard.jpeg','images/routings.jpeg','images/work_centers.jpeg'],
- 'depends': ['procurement', 'stock', 'resource', 'purchase', 'product','process'],
+ 'depends': ['product','procurement', 'stock', 'resource', 'purchase','process'],
'description': """
Manage the Manufacturing process in OpenERP
===========================================
diff --git a/addons/mrp/i18n/de.po b/addons/mrp/i18n/de.po
index 8c4a422fd10..aed215fe6e7 100644
--- a/addons/mrp/i18n/de.po
+++ b/addons/mrp/i18n/de.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-02-08 00:49+0000\n"
-"PO-Revision-Date: 2012-02-22 07:45+0000\n"
+"PO-Revision-Date: 2012-10-12 23:20+0000\n"
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-09-13 04:38+0000\n"
-"X-Generator: Launchpad (build 15944)\n"
+"X-Launchpad-Export-Date: 2012-10-14 04:39+0000\n"
+"X-Generator: Launchpad (build 16137)\n"
#. module: mrp
#: view:mrp.routing.workcenter:0
@@ -956,7 +956,7 @@ msgstr "Bezeichnung Arbeitsplatz"
#. module: mrp
#: field:mrp.routing,code:0
msgid "Code"
-msgstr "Kurzbezeichnung"
+msgstr "Kurzbez."
#. module: mrp
#: report:mrp.production.order:0
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index cf203a60c7f..ecac11f856a 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -910,12 +910,11 @@ class mrp_production(osv.osv):
# Internal shipment is created for Stockable and Consumer Products
if production_line.product_id.type not in ('product', 'consu'):
return False
- move_name = _('PROD: %s') % production.name
source_location_id = production.location_src_id.id
if not destination_location_id:
destination_location_id = source_location_id
return stock_move.create(cr, uid, {
- 'name': move_name,
+ 'name': production.name,
'picking_id': shipment_id,
'product_id': production_line.product_id.id,
'product_qty': production_line.product_qty,
@@ -965,9 +964,8 @@ class mrp_production(osv.osv):
stock_move = self.pool.get('stock.move')
source_location_id = production.product_id.product_tmpl_id.property_stock_production.id
destination_location_id = production.location_dest_id.id
- move_name = _('PROD: %s') + production.name
data = {
- 'name': move_name,
+ 'name': production.name,
'date': production.date_planned,
'product_id': production.product_id.id,
'product_qty': production.product_qty,
@@ -990,12 +988,11 @@ class mrp_production(osv.osv):
# Internal shipment is created for Stockable and Consumer Products
if production_line.product_id.type not in ('product', 'consu'):
return False
- move_name = _('PROD: %s') % production.name
destination_location_id = production.product_id.product_tmpl_id.property_stock_production.id
if not source_location_id:
source_location_id = production.location_src_id.id
move_id = stock_move.create(cr, uid, {
- 'name': move_name,
+ 'name': production.name,
'date': production.date_planned,
'product_id': production_line.product_id.id,
'product_qty': production_line.product_qty,
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index abf0f823e5c..a144897b1b6 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -952,6 +952,7 @@
<data>
<xpath expr="//field[@name='move_id']" position="before">
<field name="bom_id" domain="[('product_id','=',product_id),('bom_id','=',False)]"/>
+ <field name="production_id" attrs="{'invisible': [('production_id','=',False)]}"/>
</xpath>
<xpath expr="//field[@name='close_move']" position="after">
<group colspan="4" groups="product.group_mrp_properties">
@@ -961,21 +962,21 @@
</data>
</field>
</record>
- <record id="product.product_normal_form_supply_view" model="ir.ui.view">
+ <record id="product_product_normal_form_supply_view" model="ir.ui.view">
<field name="name">product.normal.form.mrp.inherit</field>
<field name="model">product.product</field>
- <field name="inherit_id" ref="product.product_normal_form_view"/>
+ <field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='supply_method']" position="attributes">
<attribute name="invisible">False</attribute>
</xpath>
<group name="procurement_help" position="inside">
- <p attrs="{'invisible': [('type','=','service'),('procure_method','&lt;&gt;','make_to_order'),('supply_method','&lt;&gt;','produce')]}">
+ <p attrs="{'invisible': ['|','|',('type','=','service'),('procure_method','&lt;&gt;','make_to_order'),('supply_method','&lt;&gt;','produce')]}">
When you sell this product, OpenERP will trigger <b>a manufacturing
order</b> using the bill of materials assigned to this product.
The delivery order will be ready once the production is done.
</p>
-</group>
+ </group>
</field>
</record>
@@ -1037,6 +1038,7 @@
<record model="ir.actions.act_window" id="product_open_bom">
<field name="context">{'default_product_id': active_id, 'search_default_product_id': active_id}</field>
<field name="name">Bill of Materials</field>
+ <field name="domain">[('bom_id','=',False)]</field>
<field name="res_model">mrp.bom</field>
</record>
@@ -1050,7 +1052,5 @@
</xpath>
</field>
</record>
-
-
</data>
</openerp>
diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py
index 795ac5453fb..19f8a48b6fe 100644
--- a/addons/mrp/procurement.py
+++ b/addons/mrp/procurement.py
@@ -31,6 +31,7 @@ class procurement_order(osv.osv):
_columns = {
'bom_id': fields.many2one('mrp.bom', 'BoM', ondelete='cascade', select=True),
'property_ids': fields.many2many('mrp.property', 'procurement_property_rel', 'procurement_id','property_id', 'Properties'),
+ 'production_id': fields.many2one('mrp.production', 'Manufacturing Order'),
}
def check_produce_product(self, cr, uid, procurement, context=None):
@@ -95,16 +96,22 @@ class procurement_order(osv.osv):
'move_prod_id': res_id,
'company_id': procurement.company_id.id,
})
+
res[procurement.id] = produce_id
- self.write(cr, uid, [procurement.id], {'state': 'running'})
- self.running_send_note(cr, uid, ids, context=context)
+ self.write(cr, uid, [procurement.id], {'state': 'running', 'production_id': produce_id})
bom_result = production_obj.action_compute(cr, uid,
[produce_id], properties=[x.id for x in procurement.property_ids])
wf_service.trg_validate(uid, 'mrp.production', produce_id, 'button_confirm', cr)
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
+
+ def production_order_create_note(self, cr, uid, ids, context=None):
+ for procurement in self.browse(cr, uid, ids, context=context):
+ body = _("Manufacturing Order created.")
+ self.message_post(cr, uid, [procurement.id], body=body, context=context)
procurement_order()
diff --git a/addons/mrp_operations/report/mrp_workorder_analysis_view.xml b/addons/mrp_operations/report/mrp_workorder_analysis_view.xml
index cca9a7e3b24..de486face78 100644
--- a/addons/mrp_operations/report/mrp_workorder_analysis_view.xml
+++ b/addons/mrp_operations/report/mrp_workorder_analysis_view.xml
@@ -9,7 +9,7 @@
<field name="name">mrp.workorder.tree</field>
<field name="model">mrp.workorder</field>
<field name="arch" type="xml">
- <tree string="Work Orders">
+ <tree string="Work Orders" create="false">
<field name="date" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="product_qty" sum="Product Qty"/>
diff --git a/addons/mrp_repair/report/order.rml b/addons/mrp_repair/report/order.rml
index be5737d4b85..202ed6e4684 100644
--- a/addons/mrp_repair/report/order.rml
+++ b/addons/mrp_repair/report/order.rml
@@ -312,7 +312,7 @@
<para style="terp_default_Right_9">[[ formatLang(line.price_unit) ]] </para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line.price_subtotal) ]] [[ o.pricelist_id.currency_id. symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(line.price_subtotal, currency_obj = o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -337,7 +337,7 @@
<para style="terp_default_Right_9">[[ formatLang(fees.price_unit) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(fees.price_subtotal) ]] [[ o.pricelist_id.currency_id. symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(fees.price_subtotal, currency_obj = o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -353,7 +353,7 @@
<para style="terp_default_9">Net Total :</para>
</td>
<td>
- <para style="P26">[[ formatLang(o.amount_untaxed, dp='Sale Price')]] [[ o.pricelist_id.currency_id. symbol ]]</para>
+ <para style="P26">[[ formatLang(o.amount_untaxed, dp='Sale Price', currency_obj=o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
@@ -367,7 +367,7 @@
<para style="terp_default_9">Taxes:</para>
</td>
<td>
- <para style="P26">[[ formatLang(o.amount_tax, dp='Account')]] [[ o.pricelist_id.currency_id. symbol ]]</para>
+ <para style="P26">[[ formatLang(o.amount_tax, dp='Account', currency_obj=o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -380,7 +380,7 @@
<para style="terp_tblheader_Details">Total :</para>
</td>
<td>
- <para style="terp_default_right_bold_9">[[ formatLang(total(o), dp='Sale Price') ]] [[ o.pricelist_id.currency_id. symbol ]]</para>
+ <para style="terp_default_right_bold_9">[[ formatLang(total(o), dp='Sale Price', currency_obj=o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/note/note_view.xml b/addons/note/note_view.xml
index 19eff9bc250..2f85e832b7d 100644
--- a/addons/note/note_view.xml
+++ b/addons/note/note_view.xml
@@ -78,6 +78,7 @@
<!-- title -->
<field name="name"/>
</div>
+ <div class="oe_clear"></div>
<field name="tag_ids"/>
<div class="oe_right">
<t t-foreach="record.message_follower_ids.raw_value" t-as="follower">
diff --git a/addons/point_of_sale/controllers/main.py b/addons/point_of_sale/controllers/main.py
index 3d80fd53e24..b189c8f204a 100644
--- a/addons/point_of_sale/controllers/main.py
+++ b/addons/point_of_sale/controllers/main.py
@@ -4,16 +4,12 @@ import simplejson
import os
import openerp
-try:
- import openerp.addons.web.common.http as openerpweb
- from openerp.addons.web.controllers.main import manifest_list, module_boot, html_template
-except ImportError:
- import web.common.http as openerpweb
+from openerp.addons.web.controllers.main import manifest_list, module_boot, html_template
-class PointOfSaleController(openerpweb.Controller):
+class PointOfSaleController(openerp.addons.web.http.Controller):
_cp_path = '/pos'
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def app(self, req, s_action=None, **kw):
js = "\n ".join('<script type="text/javascript" src="%s"></script>' % i for i in manifest_list(req, None, 'js'))
css = "\n ".join('<link rel="stylesheet" href="%s">' % i for i in manifest_list(req, None, 'css'))
@@ -29,7 +25,7 @@ class PointOfSaleController(openerpweb.Controller):
}
return r
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def manifest(self, req, **kwargs):
""" This generates a HTML5 cache manifest files that preloads the categories and products thumbnails
and other ressources necessary for the point of sale to work offline """
@@ -66,12 +62,12 @@ class PointOfSaleController(openerpweb.Controller):
return m
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def dispatch(self, request, iface, **kwargs):
method = 'iface_%s' % iface
return getattr(self, method)(request, **kwargs)
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def scan_item_success(self, request, ean):
"""
A product has been scanned with success
@@ -79,7 +75,7 @@ class PointOfSaleController(openerpweb.Controller):
print 'scan_item_success: ' + str(ean)
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def scan_item_error_unrecognized(self, request, ean):
"""
A product has been scanned without success
@@ -87,7 +83,7 @@ class PointOfSaleController(openerpweb.Controller):
print 'scan_item_error_unrecognized: ' + str(ean)
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def help_needed(self, request):
"""
The user wants an help (ex: light is on)
@@ -95,7 +91,7 @@ class PointOfSaleController(openerpweb.Controller):
print "help_needed"
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def help_canceled(self, request):
"""
The user stops the help request
@@ -103,22 +99,22 @@ class PointOfSaleController(openerpweb.Controller):
print "help_canceled"
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def weighting_start(self, request):
print "weighting_start"
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def weighting_read_kg(self, request):
print "weighting_read_kg"
return 0.0
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def weighting_end(self, request):
print "weighting_end"
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def payment_request(self, request, price):
"""
The PoS will activate the method payment
@@ -126,47 +122,47 @@ class PointOfSaleController(openerpweb.Controller):
print "payment_request: price:"+str(price)
return 'ok'
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def payment_status(self, request):
print "payment_status"
return { 'status':'waiting' }
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def payment_cancel(self, request):
print "payment_cancel"
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def transaction_start(self, request):
print 'transaction_start'
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def transaction_end(self, request):
print 'transaction_end'
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def cashier_mode_activated(self, request):
print 'cashier_mode_activated'
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def cashier_mode_deactivated(self, request):
print 'cashier_mode_deactivated'
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def open_cashbox(self, request):
print 'open_cashbox'
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def print_receipt(self, request, receipt):
print 'print_receipt' + str(receipt)
return
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def print_pdf_invoice(self, request, pdfinvoice):
print 'print_pdf_invoice' + str(pdfinvoice)
return
diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py
index dfd0d73ad55..788c301a04f 100644
--- a/addons/point_of_sale/point_of_sale.py
+++ b/addons/point_of_sale/point_of_sale.py
@@ -1300,7 +1300,7 @@ class product_product(osv.osv):
'expense_pdt': fields.boolean('Point of Sale Cash Out', help="This is a product you can use to take cash from a statement for the point of sale backend, exemple: money lost, transfer to bank, etc."),
'pos_categ_id': fields.many2one('pos.category','Point of Sale Category',
help="If you want to sell this product through the point of sale, select the category it belongs to."),
- 'to_weight' : fields.boolean('To Weight', help="This category contains products that should be weighted, mainly used for the self-checkout interface"),
+ 'to_weight' : fields.boolean('To Weigh', help="This category contains products that should to be weighed, mainly used for the self-checkout interface"),
}
def _default_pos_categ_id(self, cr, uid, context=None):
diff --git a/addons/point_of_sale/report/account_statement.rml b/addons/point_of_sale/report/account_statement.rml
index dc6e6c5e64c..0b633f3f7c4 100644
--- a/addons/point_of_sale/report/account_statement.rml
+++ b/addons/point_of_sale/report/account_statement.rml
@@ -214,10 +214,10 @@
<para style="terp_default_Centre_8">[[ formatLang(statement.closing_date,date_time=True)]]</para>
</td>
<td>
- <para style="terp_default_Centre_8">[[ formatLang(statement.balance_start, dp='Account') ]][[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Centre_8">[[ formatLang(statement.balance_start, dp='Account', currency_obj = company.currency_id) ]]</para>
</td>
<td>
- <para style="terp_default_Centre_8">[[ formatLang(statement.balance_end_real, dp='Account') ]][[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Centre_8">[[ formatLang(statement.balance_end_real, dp='Account', currency_obj = company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -250,7 +250,7 @@
<para style="terp_default_9">[[ line_ids.partner_id.name ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line_ids.amount, dp='Account') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(line_ids.amount, dp='Account', currency_obj=company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -267,7 +267,7 @@
<para style="terp_tblheader_Details">Total :</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(get_total(statement.line_ids), dp='Account') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(get_total(statement.line_ids), dp='Account', currency_obj = company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/report/all_closed_cashbox_of_the_day.py b/addons/point_of_sale/report/all_closed_cashbox_of_the_day.py
index 0e75e7f7ae1..dc3b432728f 100644
--- a/addons/point_of_sale/report/all_closed_cashbox_of_the_day.py
+++ b/addons/point_of_sale/report/all_closed_cashbox_of_the_day.py
@@ -73,7 +73,7 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse):
if res:
return res[0]['bal']
else:
- return False
+ return 0
def _get_sub_total(self, user, data, date):
res={}
diff --git a/addons/point_of_sale/report/all_closed_cashbox_of_the_day.rml b/addons/point_of_sale/report/all_closed_cashbox_of_the_day.rml
index bb58c5e823d..4f16031c8b3 100644
--- a/addons/point_of_sale/report/all_closed_cashbox_of_the_day.rml
+++ b/addons/point_of_sale/report/all_closed_cashbox_of_the_day.rml
@@ -183,10 +183,10 @@
</para>
</td>
<td>
- <para style="terp_tblheader_General_Right"><u>[[ formatLang(get_net_total_starting(user)[1]) ]] [[company.currency_id.symbol]]</u></para>
+ <para style="terp_tblheader_General_Right"><u>[[ formatLang(get_net_total_starting(user)[1], currency_obj = company.currency_id)]]</u></para>
</td>
<td>
- <para style="terp_tblheader_General_Right"><u>[[ formatLang(get_net_total(user)) ]] [[company.currency_id.symbol]]</u></para>
+ <para style="terp_tblheader_General_Right"><u>[[ formatLang(get_net_total(user), currency_obj = company.currency_id)]]</u></para>
</td>
</tr>
</blockTable>
@@ -207,10 +207,10 @@
<para style="terp_default_Bold_8">[[ statement['closing_date'] ]]</para>
</td>
<td>
- <para style="P1"><u>[[ (get_bal(statement)) or '0.00' ]] [[company.currency_id.symbol]]</u></para>
+ <para style="P1"><u>[[ formatLang(get_bal(statement), currency_obj = company.currency_id)]]</u></para>
</td>
<td>
- <para style="P1"><u>[[ formatLang(get_sub_total(user,statement['journal_id'],statement['date'])) ]] [[company.currency_id.symbol]]</u></para>
+ <para style="P1"><u>[[ formatLang(get_sub_total(user,statement['journal_id'],statement['date']), currency_obj = company.currency_id )]]</u></para>
</td>
</tr>
</blockTable>
@@ -236,7 +236,7 @@
</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line_ids['amount']) ]] [[company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(line_ids['amount'], currency_obj = company.currency_id)]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/report/pos_details.rml b/addons/point_of_sale/report/pos_details.rml
index b0019133009..e7c4c756e64 100644
--- a/addons/point_of_sale/report/pos_details.rml
+++ b/addons/point_of_sale/report/pos_details.rml
@@ -252,7 +252,7 @@
<para style="terp_default_9">[ [[ line_ids['code'] ]] ] [[ line_ids['name'] ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line_ids['price_unit'], dp='Sale Price') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(line_ids['price_unit'], dp='Sale Price', currency_obj = company.currency_id) ]]</para>
</td>
<td>
<para style="terp_default_Centre_9">[[ formatLang(line_ids['qty']) ]] [[ line_ids['uom'] ]]</para>
@@ -289,7 +289,7 @@
<para style="terp_default_9">[[ p['name'] or removeParentNode('para') ]]</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(p['amount']) or removeParentNode('tr') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(p['amount'], currency_obj = company.currency_id) or removeParentNode('tr') ]]</para>
</td>
</tr>
</blockTable>
@@ -320,7 +320,7 @@
<para style="terp_default_9">[[ p['name'] or removeParentNode('para') ]]</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(p['sum'], dp='Account') or removeParentNode('tr') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(p['sum'], dp='Account', currency_obj = company.currency_id) or removeParentNode('tr') ]]</para>
</td>
</tr>
</blockTable>
@@ -349,7 +349,7 @@
<para style="terp_default_Bold_9">Sales total(Revenue)</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(getsalestotal2(), dp='Sale Price') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(getsalestotal2(), dp='Sale Price', currency_obj = company.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -365,7 +365,7 @@
<para style="terp_default_Bold_9">Total invoiced</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(getsuminvoice2(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(getsuminvoice2(data['form']), dp='Sale Price', currency_obj = company.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -373,7 +373,7 @@
<para style="terp_default_Bold_9">Total discount</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(getsumdisc(), dp='Sale Price') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(getsumdisc(), dp='Sale Price', currency_obj = company.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -381,7 +381,7 @@
<para style="terp_default_Bold_9">Total paid</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(getpaidtotal2(), dp='Sale Price') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(getpaidtotal2(), dp='Sale Price', currency_obj = company.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -389,7 +389,7 @@
<para style="terp_default_Bold_9">Total of the day</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(gettotalofthaday(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(gettotalofthaday(data['form']), dp='Sale Price', currency_obj = company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/report/pos_details_summary.rml b/addons/point_of_sale/report/pos_details_summary.rml
index d12cdec2598..b1c71db7d40 100644
--- a/addons/point_of_sale/report/pos_details_summary.rml
+++ b/addons/point_of_sale/report/pos_details_summary.rml
@@ -204,7 +204,7 @@
<para style="P1">[[ p[0] ]]</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ p[1] ]] [[company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(p[1], currency_obj=company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -235,7 +235,7 @@
<para style="P2">[[ t[0] ]]</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ '%.2f' % (t[1],) ]] [[company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(t[1], currency_obj=company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -280,7 +280,7 @@
<para style="terp_default_Bold_9">Total invoiced</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ '%.2f' % getsuminvoice(objects) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(getsuminvoice(objects), currency_obj=company.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -288,7 +288,7 @@
<para style="terp_default_Bold_9">Total discount</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ '%.2f' % getsumdisc(objects) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(getsumdisc(objects), currency_obj=company.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -296,7 +296,7 @@
<para style="terp_default_Bold_9">Total paid</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ '%.2f' % getpaidtotal(objects) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(getpaidtotal(objects), currency_obj=company.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -304,7 +304,7 @@
<para style="terp_default_Bold_9">Total of the day</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ '%.2f' % gettotalofthaday(objects) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(gettotalofthaday(objects), currency_obj=company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/report/pos_lines.rml b/addons/point_of_sale/report/pos_lines.rml
index be394ed4f16..1ed8e33eede 100644
--- a/addons/point_of_sale/report/pos_lines.rml
+++ b/addons/point_of_sale/report/pos_lines.rml
@@ -186,7 +186,7 @@
<para style="terp_default_Centre_9">[[ formatLang(l.discount) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(l.price_subtotal) ]] [[o.pricelist_id.currency_id. symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(l.price_subtotal, currency_obj=o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -202,7 +202,7 @@
<para style="terp_default_9">Net Total :</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(o.amount_total) ]] [[o.pricelist_id.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(o.amount_total, currency_obj=o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -215,7 +215,7 @@
<para style="terp_default_9">Taxes :</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(o.amount_tax) ]] [[o.pricelist_id.currency_id. symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(o.amount_tax, currency_obj=o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -228,7 +228,7 @@
<para style="terp_default_Bold_9">Total:</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(o.amount_total + o.amount_tax) ]] [[o.pricelist_id.currency_id. symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(o.amount_total + o.amount_tax, currency_obj=o.pricelist_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/report/pos_order_report_view.xml b/addons/point_of_sale/report/pos_order_report_view.xml
index fee47312610..8d7bf84171a 100644
--- a/addons/point_of_sale/report/pos_order_report_view.xml
+++ b/addons/point_of_sale/report/pos_order_report_view.xml
@@ -5,7 +5,7 @@
<field name="name">report.pos.order.tree</field>
<field name="model">report.pos.order</field>
<field name="arch" type="xml">
- <tree string="Point of Sale Analysis">
+ <tree string="Point of Sale Analysis" create="false">
<field name="date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="year" invisible="1"/>
diff --git a/addons/point_of_sale/report/pos_payment_report.rml b/addons/point_of_sale/report/pos_payment_report.rml
index 757de687ee0..bcc4b9ec261 100644
--- a/addons/point_of_sale/report/pos_payment_report.rml
+++ b/addons/point_of_sale/report/pos_payment_report.rml
@@ -183,7 +183,7 @@
<para style="terp_default_Right_9">[[ formatLang(line_ids['price_unit']) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line_ids['total']) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(line_ids['total'], currency_obj = company.currency_id) ]]</para>
</td>
</tr>
@@ -201,7 +201,7 @@
<para style="terp_tblheader_Details">Net Total:</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(pos_payment_total(o)) or removeParentNode('blockTable')]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(pos_payment_total(o), currency_obj = company.currency_id) or removeParentNode('blockTable')]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/report/pos_payment_report_user.rml b/addons/point_of_sale/report/pos_payment_report_user.rml
index 3105441aa0c..1d89d28c5f9 100644
--- a/addons/point_of_sale/report/pos_payment_report_user.rml
+++ b/addons/point_of_sale/report/pos_payment_report_user.rml
@@ -168,7 +168,7 @@
<para style="terp_default_Right_9">[[ formatLang(line_ids['price_unit']) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line_ids['total']) ]] [[company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(line_ids['total'], currency_obj = company.currency_id)]]</para>
</td>
</tr>
</blockTable>
@@ -194,7 +194,7 @@
<para style="terp_tblheader_General_Right">Total:</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(pos_payment_user_total(data['form'])) or removeParentNode('blockTable')]] [[company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(pos_payment_user_total(data['form'], currency_obj = company.currency_id)) or removeParentNode('blockTable')]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/report/pos_receipt.rml b/addons/point_of_sale/report/pos_receipt.rml
index 55873887210..d7b8b08ad29 100644
--- a/addons/point_of_sale/report/pos_receipt.rml
+++ b/addons/point_of_sale/report/pos_receipt.rml
@@ -72,8 +72,7 @@
<story>
<para style="terp_default_8">[[ repeatIn(objects,'o') ]]</para>
<para style="terp_header_Centre">[[o.user_id.company_id.name]]</para>
- <para style="terp_default_Centre_9">[[ address and address.street ]], [[ address and address.zip ]] [[ address and address.city ]]</para>
- <para style="terp_default_Centre_9">[[ address and address.country_id.name ]]</para>
+ <para style="terp_default_Centre_9">[[ address and display_address(address)]]</para>
<para style="terp_default_Centre_9">Tel : [[ address and address.phone ]]</para>
<para style="terp_default_Centre_9">User : [[ o.user_id.name ]]</para>
<para style="terp_default_Centre_9">Shop : [[ o.shop_id.name ]]</para>
@@ -109,7 +108,7 @@
<para style="terp_default_Right_9">[[o.state=='cancel' and o.statement_ids and '-' or '']][['%.f' % line.qty ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[o.state=='cancel' and o.statement_ids and '-' or '']][[ '%.2f' % net(line.id) ]] [[company.currency_id.symbol]] <font face="Helvetica">[[ line and line.discount == 0.0 and removeParentNode('font') ]] ([[ '%.2f' % line.discount ]]%) [[company.currency_id.symbol]]</font></para>
+ <para style="terp_default_Right_9">[[o.state=='cancel' and o.statement_ids and '-' or '']][[ formatLang(net(line.id), currency_obj=company.currency_id) ]] <font face="Helvetica">[[ line and line.discount == 0.0 and removeParentNode('font') ]] ([[ formatLang(line.discount, currency_obj=company.currency_id) ]])</font></para>
</td>
</tr>
</blockTable>
@@ -119,7 +118,7 @@
<para style="P6a">Taxes :</para>
</td>
<td>
- <para style="terp_default_Right_9">[[o.state=='cancel' and o.statement_ids and '-' or '']][['%.2f' % o.amount_tax]] [[company.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9">[[o.state=='cancel' and o.statement_ids and '-' or '']][[formatLang(o.amount_tax, currency_obj=company.currency_id)]]</para>
</td>
</tr>
</blockTable>
@@ -129,7 +128,7 @@
<para style="P6">Total :</para>
</td>
<td>
- <para style="terp_default_Bold_9_Right2">[[o.state=='cancel' and o.statement_ids and '-' or '']][['%.2f' % o.amount_total]] [[company.currency_id.symbol]]</para>
+ <para style="terp_default_Bold_9_Right2">[[o.state=='cancel' and o.statement_ids and '-' or '']][[formatLang(o.amount_total, currency_obj=company.currency_id)]]</para>
</td>
</tr>
</blockTable>
@@ -158,7 +157,7 @@
</para>
</td>
<td>
- <para style="P8">[[ '%.2f' %(d['amt'] or 0) ]] [[company.currency_id.symbol]]</para>
+ <para style="P8">[[ formatLang(d['amt'] or 0, currency_obj=company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/report/pos_users_product.rml b/addons/point_of_sale/report/pos_users_product.rml
index f3a8cfd77e8..9758e924ada 100644
--- a/addons/point_of_sale/report/pos_users_product.rml
+++ b/addons/point_of_sale/report/pos_users_product.rml
@@ -191,7 +191,7 @@
<para style="terp_default_Right_9">[[ formatLang(line_ids['qty']) ]] [[line_ids['uom'] ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line_ids['amt']) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(line_ids['amt'], currency_obj = company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -208,7 +208,7 @@
<para style="terp_tblheader_General_Right">Total :</para>
</td>
<td>
- <para style="terp_default_Right_9_Bold">[[ formatLang(get_total(statement)) ]] [[ company.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9_Bold">[[ formatLang(get_total(statement), currency_obj = company.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/point_of_sale/res_users_view.xml b/addons/point_of_sale/res_users_view.xml
index 2a510b1d575..89daeaa29a1 100644
--- a/addons/point_of_sale/res_users_view.xml
+++ b/addons/point_of_sale/res_users_view.xml
@@ -19,7 +19,7 @@
<field name="inherit_id" ref="base.view_users_form" />
<field name="arch" type="xml">
<notebook position="inside">
- <page string="Point Of Sale">
+ <page string="Point of Sale">
<group>
<field name="pos_config" />
<field name="ean13" />
diff --git a/addons/portal/__openerp__.py b/addons/portal/__openerp__.py
index d7356fc9ce5..66a736c6048 100644
--- a/addons/portal/__openerp__.py
+++ b/addons/portal/__openerp__.py
@@ -25,7 +25,6 @@
'depends': [
'base',
'share',
- 'auth_anonymous',
'auth_signup',
],
'author': 'OpenERP SA',
diff --git a/addons/portal/mail_mail.py b/addons/portal/mail_mail.py
index a41c28f15e2..f57170ed67b 100644
--- a/addons/portal/mail_mail.py
+++ b/addons/portal/mail_mail.py
@@ -19,34 +19,22 @@
#
##############################################################################
-import tools
from osv import osv
+import tools
-
-class mail_mail_portal(osv.Model):
- """ Update of mail_mail class, to add the signin URL to notifications.
- """
- _name = 'mail.mail'
- _inherit = ['mail.mail']
-
- def _generate_signin_url(self, cr, uid, partner_id, portal_group_id, key, context=None):
- """ Generate the signin url """
- base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='', context=context)
- return base_url + '/login?action=signin&partner_id=%s&group=%s&key=%s' % (partner_id, portal_group_id, key)
+class mail_mail(osv.Model):
+ """ Update of mail_mail class, to add the signin URL to notifications. """
+ _inherit = 'mail.mail'
def send_get_mail_body(self, cr, uid, mail, partner=None, context=None):
- """ Return a specific ir_email body. The main purpose of this method
- is to be inherited by Portal, to add a link for signing in, in
- each notification email a partner receives.
-
+ """ add a signin link inside the body of a mail.mail
:param mail: mail.mail browse_record
:param partner: browse_record of the specific recipient partner
+ :return: the resulting body_html
"""
+ body = super(mail_mail, self).send_get_mail_body(cr, uid, mail, partner, context=context)
if partner:
- portal_ref = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_portal')
- portal_id = portal_ref and portal_ref[1] or False
- url = self._generate_signin_url(cr, uid, partner.id, portal_id, 1234, context=context)
- body = tools.append_content_to_html(mail.body_html, url)
- return body
- else:
- return super(mail_mail_portal, self).send_get_mail_body(cr, uid, mail, partner=partner, context=context)
+ context = dict(context or {}, signup_valid=True)
+ partner = self.pool.get('res.partner').browse(cr, uid, partner.id, context)
+ body = tools.append_content_to_html(body, "Log in our portal at: %s" % partner.signup_url)
+ return body
diff --git a/addons/portal/portal_view.xml b/addons/portal/portal_view.xml
index 16e8a86b27e..5b39ea89525 100644
--- a/addons/portal/portal_view.xml
+++ b/addons/portal/portal_view.xml
@@ -5,7 +5,7 @@
<!-- Top menu item -->
<menuitem name="Portal"
id="portal_menu"
- groups="base.group_no_one,portal.group_portal,auth_anonymous.group_anonymous"
+ groups="base.group_no_one,portal.group_portal"
sequence="20"/>
<menuitem name="Our company" id="portal_company" parent="portal_menu" sequence="10"/>
diff --git a/addons/portal/tests/test_portal.py b/addons/portal/tests/test_portal.py
index 653a05d40aa..83b10b39c28 100644
--- a/addons/portal/tests/test_portal.py
+++ b/addons/portal/tests/test_portal.py
@@ -33,6 +33,7 @@ class test_portal(test_mail.TestMailMockups):
self.mail_group = self.registry('mail.group')
self.mail_mail = self.registry('mail.mail')
self.mail_message = self.registry('mail.message')
+ self.mail_invite = self.registry('mail.wizard.invite')
self.res_users = self.registry('res.users')
self.res_partner = self.registry('res.partner')
@@ -41,19 +42,20 @@ class test_portal(test_mail.TestMailMockups):
{'name': 'Pigs', 'description': 'Fans of Pigs, unite !'})
# Find Portal group
- group_portal_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_portal')
- self.group_portal_id = group_portal_ref and group_portal_ref[1] or False
+ group_portal = self.registry('ir.model.data').get_object(cr, uid, 'portal', 'group_portal')
+ self.group_portal_id = group_portal.id
# Create Chell (portal user)
self.user_chell_id = self.res_users.create(cr, uid, {'name': 'Chell Gladys', 'login': 'chell', 'groups_id': [(6, 0, [self.group_portal_id])]})
- self.user_chell = self.res_users.browse(cr, uid, self.user_chell_id)
- self.partner_chell_id = self.user_chell.partner_id.id
+ user_chell = self.res_users.browse(cr, uid, self.user_chell_id)
+ self.partner_chell_id = user_chell.partner_id.id
+
+ # Set an email address for the user running the tests, used as Sender for outgoing mails
+ self.res_users.write(cr, uid, uid, {'email': 'test@localhost'})
def test_00_access_rights(self):
""" Test basic mail_message and mail_group access rights for portal users. """
cr, uid = self.cr, self.uid
- partner_chell_id = self.partner_chell_id
- user_chell_id = self.user_chell_id
# Prepare group: Pigs (portal)
self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message')
@@ -64,56 +66,56 @@ class test_portal(test_mail.TestMailMockups):
# ----------------------------------------
# Do: Chell reads Pigs messages, ok because restricted to portal group
- message_ids = self.mail_group.read(cr, user_chell_id, self.group_pigs_id, ['message_ids'])['message_ids']
- self.mail_message.read(cr, user_chell_id, message_ids)
+ message_ids = self.mail_group.read(cr, self.user_chell_id, self.group_pigs_id, ['message_ids'])['message_ids']
+ self.mail_message.read(cr, self.user_chell_id, message_ids)
+
# Do: Chell posts a message on Pigs, crash because can not write on group or is not in the followers
- self.assertRaises(except_orm,
- self.mail_group.message_post,
- cr, user_chell_id, self.group_pigs_id, body='Message')
+ with self.assertRaises(except_orm):
+ self.mail_group.message_post(cr, self.user_chell_id, self.group_pigs_id, body='Message')
+
# Do: Chell is added to Pigs followers
- self.mail_group.message_subscribe(cr, uid, [self.group_pigs_id], [partner_chell_id])
+ self.mail_group.message_subscribe(cr, uid, [self.group_pigs_id], [self.partner_chell_id])
+
# Test: Chell posts a message on Pigs, ok because in the followers
- self.mail_group.message_post(cr, user_chell_id, self.group_pigs_id, body='Message')
+ self.mail_group.message_post(cr, self.user_chell_id, self.group_pigs_id, body='Message')
def test_50_mail_invite(self):
cr, uid = self.cr, self.uid
user_admin = self.res_users.browse(cr, uid, uid)
- self.mail_invite = self.registry('mail.wizard.invite')
base_url = self.registry('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='')
- portal_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_portal')
- portal_id = portal_ref and portal_ref[1] or False
-
# 0 - Admin
- p_a_id = user_admin.partner_id.id
+ partner_admin_id = user_admin.partner_id.id
# 1 - Bert Tartopoils, with email, should receive emails for comments and emails
- p_b_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'})
-
- # ----------------------------------------
- # CASE1: generated URL
- # ----------------------------------------
-
- url = self.mail_mail._generate_signin_url(cr, uid, p_b_id, portal_id, 1234)
- self.assertEqual(url, base_url + '/login?action=signin&partner_id=%s&group=%s&key=%s' % (p_b_id, portal_id, 1234),
- 'generated signin URL incorrect')
+ partner_bert_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'})
# ----------------------------------------
- # CASE2: invite Bert
+ # CASE: invite Bert to follow Pigs
# ----------------------------------------
- _sent_email_subject = 'Invitation to follow Pigs'
- _sent_email_body = append_content_to_html('<div>You have been invited to follow Pigs.</div>', url)
-
# Do: create a mail_wizard_invite, validate it
self._init_mock_build_email()
- mail_invite_id = self.mail_invite.create(cr, uid, {'partner_ids': [(4, p_b_id)]}, {'default_res_model': 'mail.group', 'default_res_id': self.group_pigs_id})
+ context = {'default_res_model': 'mail.group', 'default_res_id': self.group_pigs_id}
+ mail_invite_id = self.mail_invite.create(cr, uid, {'partner_ids': [(4, partner_bert_id)]}, context)
self.mail_invite.add_followers(cr, uid, [mail_invite_id])
- group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
# Test: Pigs followers should contain Admin and Bert
+ group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
follower_ids = [follower.id for follower in group_pigs.message_follower_ids]
- self.assertEqual(set(follower_ids), set([p_a_id, p_b_id]), 'Pigs followers after invite is incorrect')
- # Test: sent email subject, body
+ self.assertEqual(set(follower_ids), set([partner_admin_id, partner_bert_id]), 'Pigs followers after invite is incorrect')
+
+ # Test: partner must have been prepared for signup
+ partner_bert = self.res_partner.browse(cr, uid, partner_bert_id)
+ self.assertTrue(partner_bert.signup_valid, 'partner has not been prepared for signup')
+ self.assertTrue(base_url in partner_bert.signup_url, 'signup url is incorrect')
+ self.assertTrue(cr.dbname in partner_bert.signup_url, 'signup url is incorrect')
+ self.assertTrue(partner_bert.signup_token in partner_bert.signup_url, 'signup url is incorrect')
+
+ # Test: (pretend to) send email and check subject, body
self.assertEqual(len(self._build_email_kwargs_list), 1, 'sent email number incorrect, should be only for Bert')
for sent_email in self._build_email_kwargs_list:
- self.assertEqual(sent_email.get('subject'), _sent_email_subject, 'sent email subject incorrect')
- self.assertEqual(sent_email.get('body'), _sent_email_body, 'sent email body incorrect')
+ self.assertEqual(sent_email.get('subject'), 'Invitation to follow Pigs',
+ 'subject of invitation email is incorrect')
+ self.assertTrue('You have been invited to follow Pigs' in sent_email.get('body'),
+ 'body of invitation email is incorrect')
+ self.assertTrue(partner_bert.signup_url in sent_email.get('body'),
+ 'body of invitation email does not contain signup url')
diff --git a/addons/portal/wizard/portal_wizard.py b/addons/portal/wizard/portal_wizard.py
index 3cc706c2129..c94d6509f63 100644
--- a/addons/portal/wizard/portal_wizard.py
+++ b/addons/portal/wizard/portal_wizard.py
@@ -30,47 +30,31 @@ from openerp import SUPERUSER_ID
from base.res.res_partner import _lang_get
_logger = logging.getLogger(__name__)
-# welcome/goodbye email sent to portal users
+# welcome email sent to portal users
# (note that calling '_' has no effect except exporting those strings for translation)
WELCOME_EMAIL_SUBJECT = _("Your OpenERP account at %(company)s")
WELCOME_EMAIL_BODY = _("""Dear %(name)s,
-You have been given access to %(portal)s at %(url)s.
+You have been given access to %(portal)s.
Your login account data is:
Database: %(db)s
-User: %(login)s
-Password: %(password)s
+Username: %(login)s
-%(welcome_message)s
-
---
-OpenERP - Open Source Business Applications
-http://www.openerp.com
-""")
-
-GOODBYE_EMAIL_SUBJECT = _("Your OpenERP account at %(company)s")
-GOODBYE_EMAIL_BODY = _("""Dear %(name)s,
+In order to complete the signin process, click on the following url:
+%(url)s
-Your access to %(portal)s has been withdrawn.
-
-%(goodbye_message)s
+%(welcome_message)s
--
OpenERP - Open Source Business Applications
http://www.openerp.com
""")
-# character sets for passwords, excluding 0, O, o, 1, I, l
-_PASSU = 'ABCDEFGHIJKLMNPQRSTUVWXYZ'
-_PASSL = 'abcdefghijkmnpqrstuvwxyz'
-_PASSD = '23456789'
-
def random_password():
- # get 3 uppercase letters, 3 lowercase letters, 2 digits, and shuffle them
- chars = map(random.choice, [_PASSU] * 3 + [_PASSL] * 3 + [_PASSD] * 2)
- random.shuffle(chars)
- return ''.join(chars)
+ # temporary random stuff; user password is reset by signup process
+ chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
+ return ''.join(random.choice(chars) for i in xrange(12))
def extract_email(email):
""" extract the email address from a user-friendly email address """
@@ -92,8 +76,6 @@ class wizard(osv.osv_memory):
'user_ids': fields.one2many('portal.wizard.user', 'wizard_id', string='Users'),
'welcome_message': fields.text(string='Invitation Message',
help="This text is included in the email sent to new users of the portal."),
- 'goodbye_message': fields.text(string='Withdrawal Message',
- help="This text is included in the email sent to users withdrawn from the portal."),
}
def _default_portal(self, cr, uid, context):
@@ -164,6 +146,8 @@ class wizard_user(osv.osv_memory):
user = self._create_user(cr, SUPERUSER_ID, wizard_user, context)
if (not user.active) or (portal not in user.groups_id):
user.write({'active': True, 'groups_id': [(4, portal.id)]})
+ # prepare for the signup process
+ user.partner_id.signup_prepare()
wizard_user = self.browse(cr, SUPERUSER_ID, wizard_user.id, context)
self._send_email(cr, uid, wizard_user, context)
else:
@@ -174,8 +158,6 @@ class wizard_user(osv.osv_memory):
user.write({'groups_id': [(3, portal.id)], 'active': False})
else:
user.write({'groups_id': [(3, portal.id)]})
- wizard_user = self.browse(cr, SUPERUSER_ID, wizard_user.id, context)
- self._send_email(cr, uid, wizard_user, context)
def _retrieve_user(self, cr, uid, wizard_user, context=None):
""" retrieve the (possibly inactive) user corresponding to wizard_user.partner_id
@@ -208,7 +190,7 @@ class wizard_user(osv.osv_memory):
return res_users.browse(cr, uid, user_id, context)
def _send_email(self, cr, uid, wizard_user, context=None):
- """ send notification email to a new/former portal user
+ """ send notification email to a new portal user
@param wizard_user: browse record of model portal.wizard.user
@return: the id of the created mail.mail record
"""
@@ -219,33 +201,23 @@ class wizard_user(osv.osv_memory):
_('You must have an email address in your User Preferences to send emails.'))
# determine subject and body in the portal user's language
- url = self.pool.get('ir.config_parameter').get_param(cr, SUPERUSER_ID, 'web.base.url', context=this_context)
user = self._retrieve_user(cr, SUPERUSER_ID, wizard_user, context)
context = dict(this_context or {}, lang=user.lang)
data = {
'company': this_user.company_id.name,
'portal': wizard_user.wizard_id.portal_id.name,
'welcome_message': wizard_user.wizard_id.welcome_message or "",
- 'goodbye_message': wizard_user.wizard_id.goodbye_message or "",
- 'url': url or _("(missing url)"),
'db': cr.dbname,
+ 'name': user.name,
'login': user.login,
- 'password': user.password,
- 'name': user.name
+ 'url': user.signup_url,
}
- if wizard_user.in_portal:
- subject = _(WELCOME_EMAIL_SUBJECT) % data
- body = _(WELCOME_EMAIL_BODY) % data
- else:
- subject = _(GOODBYE_EMAIL_SUBJECT) % data
- body = _(GOODBYE_EMAIL_BODY) % data
-
mail_mail = self.pool.get('mail.mail')
mail_values = {
'email_from': this_user.email,
'email_to': user.email,
- 'subject': subject,
- 'body_html': '<pre>%s</pre>' % body,
+ 'subject': _(WELCOME_EMAIL_SUBJECT) % data,
+ 'body_html': '<pre>%s</pre>' % (_(WELCOME_EMAIL_BODY) % data),
'state': 'outgoing',
}
return mail_mail.create(cr, uid, mail_values, context=this_context)
diff --git a/addons/portal/wizard/portal_wizard_view.xml b/addons/portal/wizard/portal_wizard_view.xml
index c8e3f30b128..373b4ad8e7a 100644
--- a/addons/portal/wizard/portal_wizard_view.xml
+++ b/addons/portal/wizard/portal_wizard_view.xml
@@ -27,8 +27,6 @@
<field name="user_ids"/>
<field name="welcome_message"
placeholder="This text is included in the email sent to new portal users."/>
- <field name="goodbye_message"
- placeholder="This text is included in the email sent to users withdrawn from the portal."/>
<footer>
<button string="Apply" name="action_apply" type="object" class="oe_highlight"/>
or
diff --git a/addons/portal_crm/wizard/contact_view.xml b/addons/portal_crm/wizard/contact_view.xml
index 1776632d7ab..778e7f9562e 100644
--- a/addons/portal_crm/wizard/contact_view.xml
+++ b/addons/portal_crm/wizard/contact_view.xml
@@ -35,8 +35,8 @@
<field name="street2"/>
<field name="zip"/>
<field name="city"/>
- <field name="country_id" options='{"no_open": true}'/>
- <field name="state_id" options='{"no_open": true}'/>
+ <field name="country_id" options='{"no_open": True}'/>
+ <field name="state_id" options='{"no_open": True}'/>
<templates>
<t t-name="kanban-box">
<h4><field name="name"/></h4>
diff --git a/addons/process/static/src/js/process.js b/addons/process/static/src/js/process.js
index 2b543484f2e..547bf48b9f3 100644
--- a/addons/process/static/src/js/process.js
+++ b/addons/process/static/src/js/process.js
@@ -6,7 +6,6 @@ instance.web.ViewManager.include({
var self = this;
var _super = this._super();
this.process_help = this.action ? this.action.help : '';
- self.process_help = $(this.process_help).text();
if(this.action) {
this.process_model = this.action.res_model;
} else {
@@ -239,9 +238,7 @@ instance.web.ViewManager.include({
title: _t('Process')
});
var form_controller = pop.view_form;
- pop.on_write_completed.add_last(function() {
- self.initialize_process_view();
- });
+ pop.on('write_completed', self, self.initialize_process_view);
}
});
};
diff --git a/addons/procurement/__openerp__.py b/addons/procurement/__openerp__.py
index a1aed1dfba8..48569fa76c4 100644
--- a/addons/procurement/__openerp__.py
+++ b/addons/procurement/__openerp__.py
@@ -57,7 +57,7 @@ depending on the product's configuration.
'company_view.xml',
'board_mrp_procurement_view.xml',
],
- 'demo': ['stock_orderpoint.xml'],
+ 'demo': ['stock_orderpoint.xml','procurement_demo.xml'],
'test': ['test/procurement.yml'],
'installable': True,
'auto_install': True,
diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py
index 5d81bcbb9ba..b21cef30773 100644
--- a/addons/procurement/procurement.py
+++ b/addons/procurement/procurement.py
@@ -102,7 +102,6 @@ class procurement_order(osv.osv):
'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
readonly=True, required=True, help="If you encode manually a Procurement, you probably want to use" \
" a make to order method."),
-
'note': fields.text('Note'),
'message': fields.char('Latest error', size=124, help="Exception occurred while computing procurement orders."),
'state': fields.selection([
@@ -362,11 +361,10 @@ class procurement_order(osv.osv):
""" Changes procurement state to Running and writes message.
@return: True
"""
- message = _('From stock: products assigned.')
+ message = _('Products reserved from stock.')
self.write(cr, uid, ids, {'state': 'running',
'message': message}, context=context)
self.message_post(cr, uid, ids, body=message, context=context)
- self.running_send_note(cr, uid, ids, context=context)
return True
def _check_make_to_stock_service(self, cr, uid, procurement, context=None):
@@ -390,8 +388,6 @@ class procurement_order(osv.osv):
order_point_id = self.pool.get('stock.warehouse.orderpoint').search(cr, uid, [('product_id', '=', procurement.product_id.id)], context=context)
if not order_point_id and not ok:
message = _("Not enough stock and no minimum orderpoint rule defined.")
- elif not order_point_id:
- message = _("No minimum orderpoint rule defined.")
elif not ok:
message = _("Not enough stock.")
@@ -407,7 +403,6 @@ class procurement_order(osv.osv):
"""
for procurement in self.browse(cr, uid, ids, context=context):
self.write(cr, uid, [procurement.id], {'state': 'running'})
- self.running_send_note(cr, uid, ids, context=None)
return True
def action_produce_assign_product(self, cr, uid, ids, context=None):
@@ -469,7 +464,6 @@ class procurement_order(osv.osv):
@return: True
"""
res = self.write(cr, uid, ids, {'state': 'ready'})
- self.ready_send_note(cr, uid, ids, context=None)
return res
def action_done(self, cr, uid, ids):
@@ -503,12 +497,6 @@ class procurement_order(osv.osv):
def confirm_send_note(self, cr, uid, ids, context=None):
self.message_post(cr, uid, ids, body=_("Procurement <b>confirmed</b>."), context=context)
- def running_send_note(self, cr, uid, ids, context=None):
- self.message_post(cr, uid, ids, body=_("Procurement set to <b>running</b>."), context=context)
-
- def ready_send_note(self, cr, uid, ids, context=None):
- self.message_post(cr, uid, ids, body=_("Procurement set to <b>ready</b>."), context=context)
-
def cancel_send_note(self, cr, uid, ids, context=None):
self.message_post(cr, uid, ids, body=_("Procurement <b>cancelled</b>."), context=context)
@@ -641,7 +629,18 @@ class stock_warehouse_orderpoint(osv.osv):
})
return super(stock_warehouse_orderpoint, self).copy(cr, uid, id, default, context=context)
-stock_warehouse_orderpoint()
+class product_template(osv.osv):
+ _inherit="product.template"
+
+ _columns = {
+ 'type': fields.selection([('product','Stockable Product'),('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Will change the way procurements are processed. Consumable are product where you don't manage stock, a service is a non-material product provided by a company or an individual."),
+ 'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', required=True, help="'Make to Stock': When needed, take from the stock or wait until re-supplying. 'Make to Order': When needed, purchase or produce for the procurement request."),
+ 'supply_method': fields.selection([('produce','Manufacture'),('buy','Buy')], 'Supply Method', required=True, help="Produce will generate production order or tasks, according to the product type. Buy will trigger purchase orders when requested."),
+ }
+ _defaults = {
+ 'procure_method': 'make_to_stock',
+ 'supply_method': 'buy',
+ }
class product_product(osv.osv):
_inherit="product.product"
@@ -649,6 +648,6 @@ class product_product(osv.osv):
'orderpoint_ids': fields.one2many('stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'),
}
-product_product()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/procurement/procurement_demo.xml b/addons/procurement/procurement_demo.xml
new file mode 100644
index 00000000000..608eb56f3ba
--- /dev/null
+++ b/addons/procurement/procurement_demo.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data noupdate="1">
+
+ <record id="product.product_product_1" model="product.product">
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_2" model="product.product">
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_3" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_4" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+
+ </record>
+ <record id="product.product_product_5" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_6" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_7" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_8" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_9" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ </record>
+
+ <record id="product.product_product_10" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_11" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_12" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ </record>
+
+ <record id="product.product_product_13" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_14" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_15" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_16" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_17" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_18" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_19" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_20" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_21" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_22" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_23" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_24" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_25" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_26" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_27" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_28" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_29" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_30" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_31" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_32" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_33" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ </record>
+
+ <record id="product.product_product_34" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_35" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_36" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_37" model="product.product">
+ <field name="type">product</field>
+ <field name="procure_method">make_to_order</field>
+ </record>
+
+ <record id="product.product_product_38" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_39" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_44" model="product.product">
+ <field name="procure_method">make_to_order</field>
+ <field name="supply_method">produce</field>
+ </record>
+
+ <record id="product.product_product_45" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_46" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_47" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ <record id="product.product_product_48" model="product.product">
+ <field name="type">product</field>
+ </record>
+
+ </data>
+</openerp>
+ \ No newline at end of file
diff --git a/addons/procurement/procurement_view.xml b/addons/procurement/procurement_view.xml
index bf73b383216..973a09477fc 100644
--- a/addons/procurement/procurement_view.xml
+++ b/addons/procurement/procurement_view.xml
@@ -294,6 +294,29 @@
<field name="res_model">stock.warehouse.orderpoint</field>
</record>
+ <record model="ir.ui.view" id="product_template_form_view_procurement">
+ <field name="name">product.template.procurement</field>
+ <field name="model">product.template</field>
+ <field name="inherit_id" ref="product.product_template_form_view"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='type']" position="after">
+ <field name="procure_method"/>
+ <field name="supply_method"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="product_search_form_view_procurment" model="ir.ui.view">
+ <field name="name">product.search.procurment.form</field>
+ <field name="model">product.product</field>
+ <field name="inherit_id" ref="product.product_search_form_view"/>
+ <field name="arch" type="xml">
+ <filter name="consumable" position="before">
+ <filter string="Products" icon="terp-accessories-archiver" domain="[('type','=','product')]" help="Stockable products"/>
+ </filter>
+ </field>
+ </record>
+
<record model="ir.ui.view" id="product_form_view_procurement_button">
<field name="name">product.product.procurement</field>
<field name="model">product.product</field>
@@ -303,6 +326,33 @@
<button string="Request Procurement" name="%(act_make_procurement)d" type="action"/>
<button string="Orderpoints" name="%(product_open_orderpoint)d" type="action"/>
</xpath>
+ <xpath expr="//field[@name='cost_method']" position="before">
+ <field name="procure_method" groups="base.group_user"/>
+ <field name="supply_method" groups="base.group_user"/>
+ </xpath>
+ <xpath expr="//group[@name='general']" position="after" >
+ <group name="procurement_help" class="oe_grey" col="1" groups="base.group_user">
+ <p attrs="{'invisible': ['|','|',('type','&lt;&gt;','service'),('procure_method','&lt;&gt;','make_to_stock')]}">
+ When you sell this service, nothing special will be triggered
+ to deliver the customer, as you set the procurement method as
+ 'Make to Stock'.
+ </p>
+ <p attrs="{'invisible': ['|','|',('type','&lt;&gt;','product'),('procure_method','&lt;&gt;','make_to_stock')]}">
+ When you sell this product, OpenERP will <b>use the available
+ inventory</b> for the delivery order.
+ <br/><br/>
+ If there are not enough quantities available, the delivery order
+ will wait for new products. To fulfill the inventory, you should
+ create others rules like orderpoints.
+ </p>
+ <p attrs="{'invisible': ['|','|',('type','&lt;&gt;','consu'),('procure_method','&lt;&gt;','make_to_stock')]}">
+ When you sell this product, a delivery order will be created.
+ OpenERP will consider that the <b>required quantities are always
+ available</b> as it's a consumable (as a result of this, the quantity
+ on hand may become negative).
+ </p>
+ </group>
+ </xpath>
</field>
</record>
diff --git a/addons/product/product.py b/addons/product/product.py
index d5acee0333b..6c6c5f2650c 100644
--- a/addons/product/product.py
+++ b/addons/product/product.py
@@ -109,8 +109,8 @@ class product_uom(osv.osv):
_order = "name"
_columns = {
- 'name': fields.char('Name', size=64, required=True, translate=True),
- 'category_id': fields.many2one('product.uom.categ', 'Unit of Measure Category', required=True, ondelete='cascade',
+ 'name': fields.char('Unit of Measure', size=64, required=True, translate=True),
+ 'category_id': fields.many2one('product.uom.categ', 'Category', required=True, ondelete='cascade',
help="Quantity conversions may happen automatically between Units of Measure in the same category, according to their respective ratios."),
'factor': fields.float('Ratio', required=True,digits=(12, 12),
help='How many times this Unit of Measure is smaller than the reference Unit of Measure in this category:\n'\
@@ -126,7 +126,7 @@ class product_uom(osv.osv):
'active': fields.boolean('Active', help="By unchecking the active field you can disable a unit of measure without deleting it."),
'uom_type': fields.selection([('bigger','Bigger than the reference Unit of Measure'),
('reference','Reference Unit of Measure for this category'),
- ('smaller','Smaller than the reference Unit of Measure')],'Unit of Measure Type', required=1),
+ ('smaller','Smaller than the reference Unit of Measure')],'Type', required=1),
}
_defaults = {
@@ -280,11 +280,8 @@ class product_template(osv.osv):
'description': fields.text('Description',translate=True),
'description_purchase': fields.text('Purchase Description',translate=True),
'description_sale': fields.text('Sale Description',translate=True),
- 'type': fields.selection([('product','Stockable Product'),('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Will change the way procurements are processed. Consumable are product where you don't manage stock."),
- 'supply_method': fields.selection([('produce','Manufacture'),('buy','Buy')], 'Supply Method', required=True, help="Produce will generate production order or tasks, according to the product type. Buy will trigger purchase orders when requested."),
- 'sale_delay': fields.float('Customer Lead Time', help="This is the average delay in days between the confirmation of the customer order and the delivery of the finished products. It's the time you promise to your customers."),
+ 'type': fields.selection([('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Consumable are product where you don't manage stock, a service is a non-material product provided by a company or an individual."),
'produce_delay': fields.float('Manufacturing Lead Time', help="Average delay in days to produce this product. This is only for the production order and, if it is a multi-level bill of material, it's only for the level of this product. Different lead times will be summed for all levels and purchase orders."),
- 'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', required=True, help="'Make to Stock': When needed, take from the stock or wait until re-supplying. 'Make to Order': When needed, purchase or produce for the procurement request."),
'rental': fields.boolean('Can be Rent'),
'categ_id': fields.many2one('product.category','Category', required=True, change_default=True, domain="[('type','=','normal')]" ,help="Select category for the current product"),
'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Product Price'), help="Base price for computing the customer price. Sometimes called the catalog price."),
@@ -296,7 +293,6 @@ class product_template(osv.osv):
help="Standard Price: the cost price is fixed and recomputed periodically (usually at the end of the year), Average Price: the cost price is recomputed at each reception of products."),
'warranty': fields.float('Warranty'),
'sale_ok': fields.boolean('Can be Sold', help="Determines if the product can be visible in the list of product within a selection from a sale order line."),
- 'purchase_ok': fields.boolean('Can be Purchased', help="Determine if the product is visible in the list of products within a selection from a purchase order line."),
'state': fields.selection([('',''),
('draft', 'In Development'),
('sellable','Normal'),
@@ -309,11 +305,8 @@ class product_template(osv.osv):
'uos_coeff': fields.float('Unit of Measure -> UOS Coeff', digits_compute= dp.get_precision('Product UoS'),
help='Coefficient to convert Unit of Measure to UOS\n'
' uos = uom * coeff'),
- 'mes_type': fields.selection((('fixed', 'Fixed'), ('variable', 'Variable')), 'Measure Type', required=True),
+ 'mes_type': fields.selection((('fixed', 'Fixed'), ('variable', 'Variable')), 'Measure Type'),
'seller_ids': fields.one2many('product.supplierinfo', 'product_id', 'Partners'),
- 'loc_rack': fields.char('Rack', size=16),
- 'loc_row': fields.char('Row', size=16),
- 'loc_case': fields.char('Case', size=16),
'company_id': fields.many2one('res.company', 'Company', select=1),
}
@@ -351,21 +344,17 @@ class product_template(osv.osv):
_defaults = {
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'product.template', context=c),
- 'list_price': lambda *a: 1,
- 'cost_method': lambda *a: 'standard',
- 'supply_method': lambda *a: 'buy',
- 'standard_price': lambda *a: 0.0,
- 'sale_ok': lambda *a: 1,
- 'sale_delay': lambda *a: 7,
- 'produce_delay': lambda *a: 1,
- 'purchase_ok': lambda *a: 1,
- 'procure_method': lambda *a: 'make_to_stock',
+ 'list_price': 1,
+ 'cost_method': 'standard',
+ 'standard_price': 0.0,
+ 'sale_ok': 1,
+ 'produce_delay': 1,
'uom_id': _get_uom_id,
'uom_po_id': _get_uom_id,
- 'uos_coeff' : lambda *a: 1.0,
- 'mes_type' : lambda *a: 'fixed',
+ 'uos_coeff' : 1.0,
+ 'mes_type' : 'fixed',
'categ_id' : _default_category,
- 'type' : lambda *a: 'consu',
+ 'type' : 'consu',
}
def _check_uom(self, cursor, user, ids, context=None):
diff --git a/addons/product/product_data.xml b/addons/product/product_data.xml
index 9808fa732e9..8e5280d036a 100644
--- a/addons/product/product_data.xml
+++ b/addons/product/product_data.xml
@@ -40,7 +40,7 @@
<record id="product_uom_dozen" model="product.uom">
<field name="category_id" ref="product.product_uom_categ_unit"/>
<field name="name">Dozen</field>
- <field name="factor" eval="0.083"/>
+ <field name="factor_inv" eval="12"/>
<field name="uom_type">bigger</field>
</record>
<record id="product_uom_kgm" model="product.uom">
@@ -70,7 +70,7 @@
<!-- 'tonne' is the most common spelling in english-speaking countries,
the alternative is 'metric ton' in the US, abbreviated as 'mt' -->
<field name="name">t</field>
- <field name="factor" eval="0.001"/>
+ <field name="factor_inv" eval="1000"/>
<field name="uom_type">bigger</field>
</record>
<record id="product_uom_meter" model="product.uom">
@@ -81,7 +81,7 @@
<record id="product_uom_km" model="product.uom">
<field name="category_id" ref="uom_categ_length"/>
<field name="name">km</field>
- <field name="factor" eval="0.001"/>
+ <field name="factor_inv" eval="1000"/>
<field name="uom_type">bigger</field>
</record>
<record id="product_uom_cm" model="product.uom">
@@ -197,7 +197,6 @@ parameter) will see those record just disappear.
<field name="name">Service</field>
<field name="categ_id" ref="product.product_category_all"/>
<field name="type">service</field>
- <field eval="False" name="purchase_ok"/>
</record>
</data>
</openerp>
diff --git a/addons/product/product_demo.xml b/addons/product/product_demo.xml
index 66b86fc7b63..14477d2401a 100644
--- a/addons/product/product_demo.xml
+++ b/addons/product/product_demo.xml
@@ -70,8 +70,6 @@
<field name="standard_price">20.5</field>
<field name="list_price">30.75</field>
<field name="type">service</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
<field name="uom_id" ref="product_uom_hour"/>
<field name="uom_po_id" ref="product_uom_hour"/>
<field name="description">This type of service include basic monitoring of products.</field>
@@ -84,8 +82,6 @@
<field name="standard_price">25.5</field>
<field name="list_price">38.25</field>
<field name="type">service</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
<field name="uom_id" ref="product_uom_hour"/>
<field name="uom_po_id" ref="product_uom_hour"/>
<field name="description">This type of service include assistance for security questions, system configuration requirements, implementation or special needs.</field>
@@ -97,9 +93,7 @@
<field name="categ_id" ref="product_category_4"/>
<field name="list_price">450.0</field>
<field name="standard_price">300.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="sale_delay">4.0</field>
@@ -115,9 +109,8 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_4"/>
<field name="standard_price">500.0</field>
<field name="list_price">750.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
+ <field name="type">consu</field>
+
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="sale_delay">4.0</field>
@@ -133,9 +126,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_4"/>
<field name="standard_price">600.0</field>
<field name="list_price">900.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="sale_delay">7.0</field>
@@ -148,7 +139,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">800.0</field>
<field name="list_price">1200.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -158,7 +149,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">880.0</field>
<field name="list_price">1350.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -168,7 +159,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">10.0</field>
<field name="list_price">13.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -178,8 +169,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">10.0</field>
<field name="list_price">13.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -189,7 +179,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">12.50</field>
<field name="list_price">14</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -199,7 +189,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">14</field>
<field name="list_price">16.50</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -209,8 +199,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">18</field>
<field name="list_price">12.50</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -220,7 +209,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">78.0</field>
<field name="list_price">85.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -230,7 +219,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">87.0</field>
<field name="list_price">95.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -240,7 +229,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">80.0</field>
<field name="list_price">85.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -250,9 +239,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">20.0</field>
<field name="list_price">25.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -262,7 +249,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">860.0</field>
<field name="list_price">975.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -272,9 +259,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">1020.0</field>
<field name="list_price">1150.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -284,9 +269,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">1100.0</field>
<field name="list_price">1250.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">On demand hard-disk having capacity based on requirement.</field>
@@ -297,7 +280,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">1700.0</field>
<field name="list_price">1950.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -307,7 +290,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">1790.0</field>
<field name="list_price">2000.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -317,7 +300,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">2010.0</field>
<field name="list_price">2100.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -327,7 +310,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">1910.0</field>
<field name="list_price">1980.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -337,7 +320,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_8"/>
<field name="standard_price">876.0</field>
<field name="list_price">885.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -347,7 +330,7 @@ HDD SH-1</field>
<field name="categ_id" ref="product_category_4"/>
<field name="standard_price">2870.0</field>
<field name="list_price">2950.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">17" Monitor
@@ -361,7 +344,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_4"/>
<field name="standard_price">3000.0</field>
<field name="list_price">3245.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">17" Monitor
@@ -375,9 +358,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_4"/>
<field name="standard_price">3300.0</field>
<field name="list_price">3645.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">Custom Laptop based on customer's requirement.</field>
@@ -388,7 +369,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_6"/>
<field name="standard_price">390.0</field>
<field name="list_price">405.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -399,7 +380,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_7"/>
<field name="standard_price">90.0</field>
<field name="list_price">100.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -410,7 +391,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_7"/>
<field name="standard_price">126.0</field>
<field name="list_price">145.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -420,7 +401,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_7"/>
<field name="standard_price">134.0</field>
<field name="list_price">150.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">.</field>
@@ -431,7 +412,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_7"/>
<field name="standard_price">57.0</field>
<field name="list_price">62.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">Hands free headset for laptop PC with in-line microphone and headphone plug.</field>
@@ -442,8 +423,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_7"/>
<field name="standard_price">60.0</field>
<field name="list_price">65.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">Headset for laptop PC with USB connector.</field>
@@ -455,7 +435,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_7"/>
<field name="standard_price">38.0</field>
<field name="list_price">45.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -466,7 +446,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_7"/>
<field name="standard_price">18.40</field>
<field name="list_price">20.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_dozen"/>
<field name="uom_po_id" ref="product_uom_dozen"/>
</record>
@@ -477,7 +457,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_7"/>
<field name="standard_price">21.60</field>
<field name="list_price">24.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_dozen"/>
<field name="uom_po_id" ref="product_uom_dozen"/>
</record>
@@ -488,8 +468,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_6"/>
<field name="standard_price">4258.0</field>
<field name="list_price">4410.0</field>
- <field name="type">product</field>
- <field name="procure_method">make_to_order</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">All in one hi-speed printer with fax and scanner.</field>
@@ -501,7 +480,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_6"/>
<field name="standard_price">60.0</field>
<field name="list_price">65.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -512,7 +491,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_6"/>
<field name="standard_price">66.0</field>
<field name="list_price">70.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -569,8 +548,6 @@ QWERTY keyboard</field>
<field name="standard_price">155.0</field>
<field name="list_price">173.0</field>
<field name="type">consu</field>
- <field name="procure_method">make_to_order</field>
- <field name="supply_method">produce</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
<field name="description_sale">Full featured image editing software.</field>
@@ -582,7 +559,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_6"/>
<field name="standard_price">55.0</field>
<field name="list_price">60.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -593,7 +570,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_6"/>
<field name="standard_price">35.0</field>
<field name="list_price">40.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -604,7 +581,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_6"/>
<field name="standard_price">55.0</field>
<field name="list_price">70.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
@@ -615,7 +592,7 @@ QWERTY keyboard</field>
<field name="categ_id" ref="product_category_6"/>
<field name="standard_price">13.0</field>
<field name="list_price">18.0</field>
- <field name="type">product</field>
+ <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/>
</record>
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index 8c19aee026f..748d6c5d7cf 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -10,11 +10,9 @@
<search string="Product">
<field name="name" string="Product" filter_domain="['|',('name','ilike',self),('default_code','ilike',self)]"/>
<filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
- <filter string="Products" icon="terp-accessories-archiver" domain="['|',('type','=','product'),('type','=','consu')]" help="Both stockable and consumable products"/>
+ <filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
<separator/>
- <filter name="filter_to_purchase" string="To Purchase" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
<filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
- <filter name="filter_to_purchase" string="Can be Purchased" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
<field name="categ_id" operator="child_of"/>
<group expand="0" string="Context...">
<field name="pricelist_id" context="{'pricelist': self}" groups="product.group_sale_pricelist"/>
@@ -60,7 +58,7 @@
<field name="arch" type="xml">
<form string="Product" version="7.0">
<sheet>
- <field name="image_medium" widget="image" class="oe_avatar oe_right"/>
+ <field name="image_medium" widget="image" class="oe_avatar oe_left"/>
<div class="oe_title">
<div class="oe_edit_only">
<label for="name" string="Product Name"/>
@@ -73,8 +71,6 @@
<div name="options" groups="base.group_user">
<field name="sale_ok"/>
<label for="sale_ok"/>
- <field name="purchase_ok"/>
- <label for="purchase_ok"/>
</div>
</div>
<div class="oe_right oe_button_box" name="buttons">
@@ -104,38 +100,15 @@
</page>
<page string="Procurements" groups="base.group_user">
<group name="procurement">
- <group>
- <field name="procure_method" groups="base.group_user"/>
- <field name="supply_method" groups="base.group_user" invisible="1"/>
+ <group name="general">
<field name="cost_method" groups="product.group_costing_method"/>
<field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"/>
</group>
- <group name="procurement_help" class="oe_grey" col="1" groups="base.group_user">
- <p attrs="{'invisible': [('type','&lt;&gt;','service'),('procure_method','&lt;&gt;','make_to_stock')]}">
- When you sell this service, nothing special will be trigered
- to deliver the customer, as you set the procurement method as
- 'Make to Stock'.
- </p>
- <p attrs="{'invisible': [('type','&lt;&gt;','product'),('procure_method','&lt;&gt;','make_to_stock')]}">
- When you sell this product, OpenERP will <b>use the available
- inventory</b> for the delivery order.
- <br/><br/>
- If there are not enough quantities available, the delivery order
- will wait for new products. To fulfill the inventory, you should
- create others rules like orderpoints.
- </p>
- <p attrs="{'invisible': [('type','&lt;&gt;','consu'),('procure_method','&lt;&gt;','make_to_stock')]}">
- When you sell this product, a delivery order will be created.
- OpenERP will consider that the <b>required quantities are always
- available</b> as it's a consumable (as a result of this, the quantity
- on hand may become negative).
- </p>
- </group>
- <group groups="product.group_uom">
+ <group name="procurement_uom" groups="product.group_uom" string="Purchase">
<field name="uom_po_id"/>
</group>
</group>
- <separator string="Notes for Suppliers"/>
+ <separator string="Description for Suppliers"/>
<field name="description_purchase" placeholder="This note will be displayed on requests for quotation..."/>
</page>
<page string="Inventory" groups="base.group_user">
@@ -144,13 +117,7 @@
<field name="state"/>
<field name="product_manager"/>
</group>
- <group name="store" string="Storage Localisation">
- <field name="company_id" groups="base.group_multi_company" widget="selection"/>
- <field name="loc_rack" attrs="{'invisible':[('type','=','service')]}"/>
- <field name="loc_row" attrs="{'invisible':[('type','=','service')]}"/>
- <field name="loc_case" attrs="{'invisible':[('type','=','service')]}"/>
- </group>
- <group groups="product.group_stock_packaging" string="Weights">
+ <group name="Weights" groups="product.group_stock_packaging" string="Weights">
<field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
<field name="weight" attrs="{'readonly':[('type','=','service')]}"/>
<field name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
@@ -160,10 +127,6 @@
<page string="Sales" attrs="{'readonly':[('sale_ok','=',0)]}">
<group name="sale">
<group string="Sale Conditions">
- <label for="sale_delay"/>
- <div>
- <field name="sale_delay" class="oe_inline"/> days
- </div>
<label for="warranty"/>
<div>
<field name="warranty" class="oe_inline"/> months
@@ -197,7 +160,7 @@
<field name="name"/>
</form>
</field>
- <separator string="Notes on Quotations"/>
+ <separator string="Description for Quotations"/>
<field name="description_sale" placeholder="note to be displayed on quotations..."/>
</page>
</notebook>
@@ -449,7 +412,6 @@
<tree string="Units of Measure">
<field name="name"/>
<field name="category_id"/>
- <field name="factor"/>
</tree>
</field>
</record>
@@ -463,19 +425,22 @@
<group>
<field name="name"/>
<field name="category_id"/>
- <field name="active"/>
+ <field name="uom_type" on_change="onchange_type(uom_type)"/>
+ <label for="factor"/>
+ <div>
+ <field name="factor" attrs="{'invisible':[('uom_type','!=','smaller')]}"/>
+ <field name="factor_inv" attrs="{'invisible':[('uom_type','!=','bigger')]}"/>
+ <p attrs="{'invisible':[('uom_type','!=','smaller')]}" class="oe_grey">
+ e.g: 1 * (reference unit) = ratio * (this unit)
+ </p>
+ <p attrs="{'invisible':[('uom_type','!=','bigger')]}" class="oe_grey">
+ e.g: 1 * (this unit) = ratio * (reference unit)
+ </p>
+ </div>
</group>
<group>
- <field name="uom_type" on_change="onchange_type(uom_type)"/>
- <p attrs="{'invisible':[('uom_type','!=','smaller')]}" colspan="2">
- e.g: 1 * (reference unit) = ratio * (this unit)
- </p>
- <p attrs="{'invisible':[('uom_type','!=','bigger')]}" colspan="2">
- e.g: 1 * (this unit) = ratio * (reference unit)
- </p>
+ <field name="active"/>
<field name="rounding"/>
- <field name="factor" attrs="{'invisible':[('uom_type','!=','smaller')]}"/>
- <field name="factor_inv" attrs="{'invisible':[('uom_type','!=','bigger')]}"/>
</group>
</group>
</form>
@@ -715,12 +680,9 @@
<group>
<group string="Product Type">
<field name="sale_ok"/>
- <field name="purchase_ok"/>
</group>
<group string="Procurement">
<field name="type"/>
- <field name="procure_method"/>
- <field name="supply_method"/>
</group>
<group string="Base Prices">
@@ -733,7 +695,7 @@
<field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
<field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/>
<field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
- </group>
+ </group>
<group name="status" string="Status">
<field name="categ_id"/>
@@ -756,18 +718,12 @@
<page string="Procurement &amp; Locations">
<group>
<group name="delay" string="Delays">
- <field name="sale_delay" attrs="{'readonly':[('sale_ok','=',0)]}"/>
<label for="produce_delay"/>
<div>
<field name="produce_delay" class="oe_inline"/> days
</div>
<field name="warranty"/>
</group>
- <group name="store" string="Storage Localisation">
- <field name="loc_rack"/>
- <field name="loc_row"/>
- <field name="loc_case"/>
- </group>
</group>
</page>
diff --git a/addons/product_expiry/product_expiry_view.xml b/addons/product_expiry/product_expiry_view.xml
index 88ea6f365e8..d6dfb22b317 100644
--- a/addons/product_expiry/product_expiry_view.xml
+++ b/addons/product_expiry/product_expiry_view.xml
@@ -19,9 +19,9 @@
<record model="ir.ui.view" id="view_product_form_expiry">
<field name="name">product.normal.form</field>
<field name="model">product.product</field>
- <field name="inherit_id" ref="product.product_normal_form_view" />
+ <field name="inherit_id" ref="stock.view_normal_procurement_locations_form" />
<field name="arch" type="xml">
- <group name="inventory">
+ <group name="Weights" position="after">
<group string="Dates">
<field name="life_time" />
<field name="use_time" />
diff --git a/addons/project/project.py b/addons/project/project.py
index 6b02a018293..9a022fffa90 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -19,12 +19,14 @@
#
##############################################################################
-from base_status.base_stage import base_stage
-from datetime import datetime, date
+import time
from lxml import etree
+from datetime import datetime, date
+
+import tools
+from base_status.base_stage import base_stage
from osv import fields, osv
from openerp.addons.resource.faces import task as Task
-import time
from tools.translate import _
from openerp import SUPERUSER_ID
@@ -508,8 +510,7 @@ def Project():
model_name=vals.get('alias_model', 'project.task'),
context=context)
vals['alias_id'] = alias_id
- if vals.get('partner_id', False):
- vals['type'] = 'contract'
+ vals['type'] = 'contract'
project_id = super(project, self).create(cr, uid, vals, context)
mail_alias.write(cr, uid, [vals['alias_id']], {'alias_defaults': {'project_id': project_id} }, context)
self.create_send_note(cr, uid, [project_id], context=context)
@@ -1099,7 +1100,7 @@ class task(base_stage, osv.osv):
task_record = self.browse(cr, uid, task_id, context=context)
if task_record.project_id:
project_follower_ids = [follower.id for follower in task_record.project_id.message_follower_ids]
- self.message_subscribe(cr, uid, [task_id], project_follower_ids,
+ self.message_subscribe(cr, uid, [task_id], project_follower_ids,
context=context)
self._store_history(cr, uid, [task_id], context=context)
self.create_send_note(cr, uid, [task_id], context=context)
@@ -1173,11 +1174,10 @@ class task(base_stage, osv.osv):
""" Override to updates the document according to the email. """
if custom_values is None: custom_values = {}
custom_values.update({
- 'name': subject,
+ 'name': msg.get('subject'),
'planned_hours': 0.0,
- 'subject': msg.get('subject'),
})
- return super(project_tasks,self).message_new(cr, uid, msg, custom_values=custom_values, context=context)
+ return super(task,self).message_new(cr, uid, msg, custom_values=custom_values, context=context)
def message_update(self, cr, uid, ids, msg, update_vals=None, context=None):
""" Override to update the task according to the email. """
@@ -1202,7 +1202,7 @@ class task(base_stage, osv.osv):
act = 'do_%s' % res.group(2).lower()
if act:
getattr(self,act)(cr, uid, ids, context=context)
- return super(project_tasks,self).message_update(cr, uid, msg, update_vals=update_vals, context=context)
+ return super(task,self).message_update(cr, uid, msg, update_vals=update_vals, context=context)
# ---------------------------------------------------
# OpenChatter methods and notifications
@@ -1353,16 +1353,15 @@ class project_project(osv.osv):
'use_tasks': True
}
-
-#
-# Tasks History, used for cumulative flow charts (Lean/Agile)
-#
-
class project_task_history(osv.osv):
+ """
+ Tasks History, used for cumulative flow charts (Lean/Agile)
+ """
_name = 'project.task.history'
_description = 'History of Tasks'
_rec_name = 'task_id'
_log_access = False
+
def _get_date(self, cr, uid, ids, name, arg, context=None):
result = {}
for history in self.browse(cr, uid, ids, context=context):
@@ -1414,35 +1413,40 @@ class project_task_history(osv.osv):
'date': fields.date.context_today,
}
-
class project_task_history_cumulative(osv.osv):
_name = 'project.task.history.cumulative'
_table = 'project_task_history_cumulative'
_inherit = 'project.task.history'
_auto = False
+
_columns = {
'end_date': fields.date('End Date'),
- 'project_id': fields.related('task_id', 'project_id', string='Project', type='many2one', relation='project.project')
+ 'project_id': fields.many2one('project.project', 'Project'),
}
+
def init(self, cr):
- cr.execute(""" CREATE OR REPLACE VIEW project_task_history_cumulative AS (
+ tools.drop_view_if_exists(cr, 'project_task_history_cumulative')
+
+ cr.execute(""" CREATE VIEW project_task_history_cumulative AS (
SELECT
- history.date::varchar||'-'||history.history_id::varchar as id,
- history.date as end_date,
+ history.date::varchar||'-'||history.history_id::varchar AS id,
+ history.date AS end_date,
*
FROM (
SELECT
- id as history_id,
- date+generate_series(0, CAST((coalesce(end_date,DATE 'tomorrow')::date - date)AS integer)-1) as date,
- task_id, type_id, user_id, kanban_state, state,
- greatest(remaining_hours,1) as remaining_hours, greatest(planned_hours,1) as planned_hours
+ h.id AS history_id,
+ h.date+generate_series(0, CAST((coalesce(h.end_date, DATE 'tomorrow')::date - h.date) AS integer)-1) AS date,
+ h.task_id, h.type_id, h.user_id, h.kanban_state, h.state,
+ greatest(h.remaining_hours, 1) AS remaining_hours, greatest(h.planned_hours, 1) AS planned_hours,
+ t.project_id
FROM
- project_task_history
- ) as history
+ project_task_history AS h
+ JOIN project_task AS t ON (h.task_id = t.id)
+
+ ) AS history
)
""")
-
class project_category(osv.osv):
""" Category of project's task (or issue) """
_name = "project.category"
diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml
index 9cfe3dccd2f..560c1c3552a 100644
--- a/addons/project/project_data.xml
+++ b/addons/project/project_data.xml
@@ -72,7 +72,7 @@
</record>
<record id="project_tt_deployment" model="project.task.type">
<field name="sequence">7</field>
- <field name="name">Deployment</field>
+ <field name="name">Done</field>
<field name="state">done</field>
<field name="case_default" eval="True"/>
</record>
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index bd63eec84c5..4c6d3b6ac09 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -63,7 +63,7 @@
<field name="arch" type="xml">
<form string="Project" version="7.0">
<header>
- <button name="set_done" string="Done" type="object" states="open,pending"/>
+ <button name="set_done" string="Close Project" type="object" states="open,pending"/>
<button name="set_open" string="Re-open project" type="object" states="pending" class="oe_highlight"/>
<button name="set_open" string="Re-open project" type="object" states="cancelled,close"/>
<button name="set_pending" string="Pending" type="object" states="open"/>
@@ -163,7 +163,7 @@
<field name="arch" type="xml">
<search string="Search Project">
<field name="complete_name" string="Project Name"/>
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter icon="terp-check" string="Open" name="Current" domain="[('state', '=','open')]" help="Open Projects"/>
<filter icon="gtk-media-pause" string="Pending" name="Pending" domain="[('state', '=','pending')]" help="Pending Projects"/>
@@ -311,7 +311,7 @@
<field colspan="4" name="name"/>
<field name="hours" widget="float_time"/>
<field name="date"/>
- <field name="user_id" options='{"no_open": true}'/>
+ <field name="user_id" options='{"no_open": True}'/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
</form>
@@ -401,7 +401,7 @@
<group>
<group>
<field name="project_id" on_change="onchange_project(project_id)" context="{'default_use_tasks':1}"/>
- <field name="user_id" attrs="{'readonly':[('state','in',['done', 'cancelled'])]}" options='{"no_open": true}'/>
+ <field name="user_id" attrs="{'readonly':[('state','in',['done', 'cancelled'])]}" options='{"no_open": True}'/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
<group>
@@ -619,7 +619,7 @@
<field name="arch" type="xml">
<search string="Tasks">
<field name="name" string="Tasks"/>
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter name="draft" string="New" domain="[('state','=','draft')]" help="New Tasks" icon="terp-check"/>
<filter name="open" string="In Progress" domain="[('state','=','open')]" help="In Progress Tasks" icon="terp-camera_test"/>
diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml
index 8fd9c3ee1b6..c30c91fe6c0 100644
--- a/addons/project/report/project_cumulative.xml
+++ b/addons/project/report/project_cumulative.xml
@@ -18,10 +18,12 @@
</tree>
</field>
</record>
+
<record id="view_task_history_graph" model="ir.ui.view">
<field name="name">project.task.history.cumulative.graph</field>
<field name="model">project.task.history.cumulative</field>
<field name="arch" type="xml">
+ <!-- <field name="project_id"/> -->
<graph string="Project Tasks" type="bar">
<field name="date"/>
<field name="planned_hours" operator="+"/>
@@ -29,21 +31,6 @@
</graph>
</field>
</record>
-
- <!-- Where is this object in py file ? -->
-
- <!--<record id="view_task_history_burndown_graph" model="ir.ui.view">-->
- <!-- <field name="name">project.task.history.burndown.graph</field>-->
- <!-- <field name="model">project.task.history.burndown</field>-->
- <!-- <field name="arch" type="xml">-->
- <!-- <graph string="Burndown Chart of Tasks" type="bar">-->
- <!-- <field name="date"/>-->
- <!-- <field name="remaining_hours" operator="+"/>-->
- <!-- <field name="type_id" group="True"/>-->
- <!-- </graph>-->
- <!-- </field>-->
- <!--</record>-->
-
<record id="view_task_history_search" model="ir.ui.view">
<field name="name">project.task.history.cumulative.search</field>
@@ -51,18 +38,18 @@
<field name="arch" type="xml">
<search string="Task's Analysis">
<field name="date"/>
- <filter name="open" string="In Progress" domain="[('state','in',('open','draft'))]" help="In Progress Tasks" icon="terp-camera_test"/>
- <filter string="Pending" domain="[('state','=','pending')]" context="{'show_delegated':False}" help="Pending Tasks" icon="terp-gtk-media-pause"/>
+ <field name="project_id"/>
+ <field name="user_id"/>
+ <filter name="open" string="In Progress Tasks" domain="[('state','in',('open','draft'))]"/>
+ <filter string="Pending Tasks" domain="[('state','=','pending')]" context="{'show_delegated':False}"/>
<separator/>
- <filter name="kanban_blocked" string="Blocked" domain="[('kanban_state','=','blocked')]" icon="terp-gtk-media-pause"/>
- <filter name="kanban_ready" string="Ready" domain="[('kanban_state','=','done')]" icon="terp-camera_test"/>
+ <filter name="kanban_blocked" string="Blocked" domain="[('kanban_state','=','blocked')]"/>
+ <filter name="kanban_ready" string="Ready" domain="[('kanban_state','=','done')]"/>
<separator/>
- <filter string="My Tasks" domain="[('user_id','=',uid)]" help="My Tasks" icon="terp-personal" />
- <filter string="Unassigned Tasks" domain="[('user_id','=',False)]" help="Unassigned Tasks" icon="terp-personal-" />
+ <filter string="My Tasks" domain="[('user_id','=',uid)]"/>
+ <filter string="Unassigned Tasks" domain="[('user_id','=',False)]"/>
<separator/>
- <filter string="My Projects" domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-personal"/>
- <field name="project_id"/>
- <field name="user_id"/>
+ <filter string="My Projects" domain="[('project_id.user_id','=',uid)]"/>
</search>
</field>
</record>
@@ -73,27 +60,12 @@
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="view_id" ref="view_task_history_graph"/>
- <field eval="False" name="filter"/>
+ <field name="filter" eval="False"/>
<field name="context">{"search_default_open":1, "search_default_this_month": 1}</field>
</record>
<menuitem action="action_view_task_history_cumulative"
id="menu_action_view_task_history_cumulative"
- parent="base.menu_project_report" />
-
-
- <!--<record id="action_view_task_history_burndown" model="ir.actions.act_window">-->
- <!-- <field name="name">Burndown Chart</field>-->
- <!-- <field name="res_model">project.task.history.cumulative</field>-->
- <!-- <field name="view_type">form</field>-->
- <!-- <field name="view_mode">graph,tree</field>-->
- <!-- <field name="view_id" ref="view_task_history_burndown_graph"/>-->
- <!-- <field eval="False" name="filter"/>-->
- <!-- <field name="context">{"search_default_open":1, "search_default_this_month": 1, "search_default_project_id": project_id}</field>-->
- <!--</record>-->
- <!--<menuitem action="action_view_task_history_burndown"-->
- <!-- id="menu_action_view_task_history_burndown"-->
- <!-- parent="project_report_task" />-->
-
+ parent="base.menu_project_report"/>
</data>
</openerp>
diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml
index 1d60479f65c..10f3f4a8c7c 100644
--- a/addons/project/report/project_report_view.xml
+++ b/addons/project/report/project_report_view.xml
@@ -10,7 +10,7 @@
<field name="name">report.project.task.user.tree</field>
<field name="model">report.project.task.user</field>
<field name="arch" type="xml">
- <tree string="Tasks Analysis">
+ <tree string="Tasks Analysis" create="false">
<field name="name" invisible="1"/>
<field name="project_id" invisible="1"/>
<field name="user_id" invisible="1"/>
diff --git a/addons/project_gtd/project_gtd_view.xml b/addons/project_gtd/project_gtd_view.xml
index fdb8ae8495c..a7026da8854 100644
--- a/addons/project_gtd/project_gtd_view.xml
+++ b/addons/project_gtd/project_gtd_view.xml
@@ -92,8 +92,8 @@
<field name="inherit_id" ref="project.view_task_form2" />
<field name="arch" type="xml">
<field name="progress" position="after">
- <field name="context_id" widget="selection" options='{"no_open": true}'/>
- <field name="timebox_id" widget="selection" options='{"no_open": true}'/>
+ <field name="context_id" widget="selection" options='{"no_open": True}'/>
+ <field name="timebox_id" widget="selection" options='{"no_open": True}'/>
</field>
</field>
</record>
diff --git a/addons/project_gtd/wizard/project_gtd_fill_view.xml b/addons/project_gtd/wizard/project_gtd_fill_view.xml
index 8807c00a76b..626dfb699b8 100644
--- a/addons/project_gtd/wizard/project_gtd_fill_view.xml
+++ b/addons/project_gtd/wizard/project_gtd_fill_view.xml
@@ -8,7 +8,7 @@
<field name="arch" type="xml">
<form string="Plannify Timebox" version="7.0">
<group col="4">
- <field name="timebox_id" widget="selection" options='{"no_open": true}'/>
+ <field name="timebox_id" widget="selection" options='{"no_open": True}'/>
<field name="timebox_to_id" widget="selection"/>
</group>
<field name="task_ids" domain="[('timebox_id','=',timebox_id),('state','=','open')]" />
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index f72ce8e9b2d..9e434078d2f 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -27,6 +27,7 @@ from tools.translate import _
import binascii
import time
import tools
+from tools import html2plaintext
class project_issue_version(osv.osv):
_name = "project.issue.version"
@@ -279,7 +280,7 @@ class project_issue(base_stage, osv.osv):
'section_id': lambda s, cr, uid, c: s._get_default_section_id(cr, uid, c),
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c),
'priority': crm.AVAILABLE_PRIORITIES[2][0],
- }
+ }
_group_by_full = {
'stage_id': _read_group_stage_ids
@@ -462,9 +463,11 @@ class project_issue(base_stage, osv.osv):
if context is None: context = {}
context['state_to'] = 'draft'
+ desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
+
custom_values.update({
'name': msg.get('subject') or _("No Subject"),
- 'description': msg.get('body'),
+ 'description': desc,
'email_from': msg.get('from'),
'email_cc': msg.get('cc'),
'user_id': False,
@@ -486,7 +489,6 @@ class project_issue(base_stage, osv.osv):
if update_vals is None: update_vals = {}
# Update doc values according to the message
- update_vals['description'] = msg.get('body', '')
if msg.get('priority'):
update_vals['priority'] = msg.get('priority')
# Parse 'body' to find values to update
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 3214b93c8d3..4cd9e2c19ff 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -198,7 +198,7 @@
<search string="Issue Tracker Search">
<field name="name" string="Issue" filter_domain="['|', '|',('partner_id','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
<field name="id"/>
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter string="New" icon="terp-document-new" domain="[('state','=','draft')]" help="New Issues"/>
<filter string="To Do" domain="[('state','=','open')]" help="To Do Issues" icon="terp-check"/>
diff --git a/addons/project_issue/report/project_issue_report_view.xml b/addons/project_issue/report/project_issue_report_view.xml
index f90f349ea3b..6bee4e38842 100644
--- a/addons/project_issue/report/project_issue_report_view.xml
+++ b/addons/project_issue/report/project_issue_report_view.xml
@@ -6,7 +6,7 @@
<field name="name">project.issue.report.tree</field>
<field name="model">project.issue.report</field>
<field name="arch" type="xml">
- <tree string="Issues Analysis">
+ <tree string="Issues Analysis" create="false">
<field name="name" invisible="1"/>
<field name="month" invisible="1"/>
<field name="project_id" invisible="1"/>
diff --git a/addons/project_long_term/project_long_term_demo.xml b/addons/project_long_term/project_long_term_demo.xml
index bca8231fdaa..fda481d5a11 100644
--- a/addons/project_long_term/project_long_term_demo.xml
+++ b/addons/project_long_term/project_long_term_demo.xml
@@ -7,6 +7,7 @@
<record id="project.project_project_1" model="project.project">
<field name="resource_calendar_id" ref="resource.timesheet_group1"/>
+ <field name="use_phases" eval="True"/>
</record>
<!-- Project Phases -->
diff --git a/addons/project_mrp/project_mrp_view.xml b/addons/project_mrp/project_mrp_view.xml
index 51de9dd5cf3..be6bae8ca61 100644
--- a/addons/project_mrp/project_mrp_view.xml
+++ b/addons/project_mrp/project_mrp_view.xml
@@ -31,16 +31,16 @@
</field>
</field>
</record>
- <record id="product.product_normal_form_supply_view" model="ir.ui.view">
+ <record id="product_product_normal_form_supply_view" model="ir.ui.view">
<field name="name">product.normal.form.project_mrp.inherit</field>
<field name="model">product.product</field>
- <field name="inherit_id" ref="product.product_normal_form_view"/>
+ <field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='supply_method']" position="attributes">
<attribute name="invisible">False</attribute>
</xpath>
<group name="procurement_help" position="inside">
- <p attrs="{'invisible': [('type','&lt;&gt;','service'),('procure_method','&lt;&gt;','make_to_order'),('supply_method','&lt;&gt;','produce')]}">
+ <p attrs="{'invisible': ['|','|',('type','&lt;&gt;','service'),('procure_method','&lt;&gt;','make_to_order'),('supply_method','&lt;&gt;','produce')]}">
When you sell this service to a customer, <b>a task</b> will be
created to follow up the job to do. This task will appear
in the project related to the contract of the sale order.
diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py
index ae5e1ccbf15..6948f54ec09 100644
--- a/addons/project_mrp/project_procurement.py
+++ b/addons/project_mrp/project_procurement.py
@@ -20,6 +20,7 @@
##############################################################################
from osv import fields, osv
+from tools.translate import _
class procurement_order(osv.osv):
_name = "procurement.order"
@@ -83,10 +84,15 @@ class procurement_order(osv.osv):
'project_id': project and project.id or False,
'company_id': procurement.company_id.id,
},context=context)
- self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running', 'message':'from project: task created.'}, context=context)
- self.running_send_note(cr, uid, ids, context=None)
+ self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running', 'message':_('Task created.')}, context=context)
+ self.project_task_create_note(cr, uid, ids, context=context)
return task_id
+ def project_task_create_note(self, cr, uid, ids, context=None):
+ for procurement in self.browse(cr, uid, ids, context=context):
+ body = _("Task created")
+ self.message_post(cr, uid, [procurement.id], body=body, context=context)
+
procurement_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py
index 4036217b886..12fac7802c6 100644
--- a/addons/project_timesheet/project_timesheet.py
+++ b/addons/project_timesheet/project_timesheet.py
@@ -28,6 +28,7 @@ from tools.translate import _
class project_project(osv.osv):
_inherit = 'project.project'
+
def onchange_partner_id(self, cr, uid, ids, part=False, context=None):
res = super(project_project, self).onchange_partner_id(cr, uid, ids, part, context)
if part and res and ('value' in res):
@@ -68,6 +69,7 @@ class project_project(osv.osv):
'nodestroy': True,
'help': help
}
+
project_project()
class project_work(osv.osv):
@@ -81,7 +83,7 @@ class project_work(osv.osv):
user_name = self.pool.get('res.users').read(cr, uid, [user_id], ['name'])[0]['name']
raise osv.except_osv(_('Bad Configuration !'),
_('Please define employee for user "%s". You must create one.')% (user_name,))
- emp = self.pool.get('hr.employee').browse(cr, uid, emp_id[0])
+ emp = emp_obj.browse(cr, uid, emp_id[0])
if not emp.product_id:
raise osv.except_osv(_('Bad Configuration !'),
_('Please define product on the related employee.\nFill in the timesheet tab of the employee form.'))
@@ -90,44 +92,44 @@ class project_work(osv.osv):
raise osv.except_osv(_('Bad Configuration !'),
_('Please define journal on the related employee.\nFill in the timesheet tab of the employee form.'))
- a = emp.product_id.product_tmpl_id.property_account_expense.id
- if not a:
- a = emp.product_id.categ_id.property_account_expense_categ.id
- if not a:
+ acc_id = emp.product_id.product_tmpl_id.property_account_expense.id
+ if not acc_id:
+ acc_id = emp.product_id.categ_id.property_account_expense_categ.id
+ if not acc_id:
raise osv.except_osv(_('Bad Configuration !'),
_('Please define product and product category property account on the related employee.\nFill in the timesheet tab of the employee form.'))
+
res['product_id'] = emp.product_id.id
res['journal_id'] = emp.journal_id.id
- res['general_account_id'] = a
+ res['general_account_id'] = acc_id
res['product_uom_id'] = emp.product_id.uom_id.id
return res
def create(self, cr, uid, vals, *args, **kwargs):
- obj_timesheet = self.pool.get('hr.analytic.timesheet')
- project_obj = self.pool.get('project.project')
+ timesheet_obj = self.pool.get('hr.analytic.timesheet')
task_obj = self.pool.get('project.task')
uom_obj = self.pool.get('product.uom')
vals_line = {}
context = kwargs.get('context', {})
if not context.get('no_analytic_entry',False):
- obj_task = task_obj.browse(cr, uid, vals['task_id'])
+ task_obj = task_obj.browse(cr, uid, vals['task_id'])
result = self.get_user_related_details(cr, uid, vals.get('user_id', uid))
- vals_line['name'] = '%s: %s' % (tools.ustr(obj_task.name), tools.ustr(vals['name']) or '/')
+ vals_line['name'] = '%s: %s' % (tools.ustr(task_obj.name), tools.ustr(vals['name']) or '/')
vals_line['user_id'] = vals['user_id']
vals_line['product_id'] = result['product_id']
vals_line['date'] = vals['date'][:10]
- #calculate quantity based on employee's product's uom
+ # Calculate quantity based on employee's product's uom
vals_line['unit_amount'] = vals['hours']
default_uom = self.pool.get('res.users').browse(cr, uid, uid).company_id.project_time_mode_id.id
if result['product_uom_id'] != default_uom:
vals_line['unit_amount'] = uom_obj._compute_qty(cr, uid, default_uom, vals['hours'], result['product_uom_id'])
- acc_id = obj_task.project_id and obj_task.project_id.analytic_account_id.id or False
+ acc_id = task_obj.project_id and task_obj.project_id.analytic_account_id.id or False
if acc_id:
vals_line['account_id'] = acc_id
- res = obj_timesheet.on_change_account_id(cr, uid, False, acc_id)
+ res = timesheet_obj.on_change_account_id(cr, uid, False, acc_id)
if res.get('value'):
vals_line.update(res['value'])
vals_line['general_account_id'] = result['general_account_id']
@@ -137,27 +139,29 @@ class project_work(osv.osv):
amount = vals_line['unit_amount']
prod_id = vals_line['product_id']
unit = False
- timeline_id = obj_timesheet.create(cr, uid, vals=vals_line, context=context)
+ timeline_id = timesheet_obj.create(cr, uid, vals=vals_line, context=context)
# Compute based on pricetype
- amount_unit = obj_timesheet.on_change_unit_amount(cr, uid, timeline_id,
+ amount_unit = timesheet_obj.on_change_unit_amount(cr, uid, timeline_id,
prod_id, amount, False, unit, vals_line['journal_id'], context=context)
if amount_unit and 'amount' in amount_unit.get('value',{}):
updv = { 'amount': amount_unit['value']['amount'] }
- obj_timesheet.write(cr, uid, [timeline_id], updv, context=context)
+ timesheet_obj.write(cr, uid, [timeline_id], updv, context=context)
vals['hr_analytic_timesheet_id'] = timeline_id
return super(project_work,self).create(cr, uid, vals, *args, **kwargs)
def write(self, cr, uid, ids, vals, context=None):
+ """
+ When a project task work gets updated, handle its hr analytic timesheet.
+ """
if context is None:
context = {}
timesheet_obj = self.pool.get('hr.analytic.timesheet')
- project_obj = self.pool.get('project.project')
uom_obj = self.pool.get('product.uom')
result = {}
if isinstance(ids, (long, int)):
- ids = [ids,]
+ ids = [ids]
for task in self.browse(cr, uid, ids, context=context):
line_id = task.hr_analytic_timesheet_id
@@ -165,25 +169,28 @@ class project_work(osv.osv):
# if a record is deleted from timesheet, the line_id will become
# null because of the foreign key on-delete=set null
continue
+
vals_line = {}
if 'name' in vals:
vals_line['name'] = '%s: %s' % (tools.ustr(task.task_id.name), tools.ustr(vals['name']) or '/')
if 'user_id' in vals:
vals_line['user_id'] = vals['user_id']
- result = self.get_user_related_details(cr, uid, vals.get('user_id', task.user_id.id))
- for fld in ('product_id', 'general_account_id', 'journal_id', 'product_uom_id'):
- if result.get(fld, False):
- vals_line[fld] = result[fld]
-
if 'date' in vals:
vals_line['date'] = vals['date'][:10]
if 'hours' in vals:
- default_uom = self.pool.get('res.users').browse(cr, uid, uid).company_id.project_time_mode_id.id
vals_line['unit_amount'] = vals['hours']
prod_id = vals_line.get('product_id', line_id.product_id.id) # False may be set
- if result.get('product_uom_id',False) and (not result['product_uom_id'] == default_uom):
- vals_line['unit_amount'] = uom_obj._compute_qty(cr, uid, default_uom, vals['hours'], result['product_uom_id'])
+ # Put user related details in analytic timesheet values
+ details = self.get_user_related_details(cr, uid, vals.get('user_id', task.user_id.id))
+ for field in ('product_id', 'general_account_id', 'journal_id', 'product_uom_id'):
+ if details.get(field, False):
+ vals_line[field] = details[field]
+
+ # Check if user's default UOM differs from product's UOM
+ user_default_uom_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.project_time_mode_id.id
+ if details.get('product_uom_id', False) and details['product_uom_id'] != user_default_uom_id:
+ vals_line['unit_amount'] = uom_obj._compute_qty(cr, uid, user_default_uom_id, vals['hours'], details['product_uom_id'])
# Compute based on pricetype
amount_unit = timesheet_obj.on_change_unit_amount(cr, uid, line_id.id,
@@ -203,7 +210,7 @@ class project_work(osv.osv):
for task in self.browse(cr, uid, ids):
if task.hr_analytic_timesheet_id:
hat_ids.append(task.hr_analytic_timesheet_id.id)
-# delete entry from timesheet too while deleting entry to task.
+ # Delete entry from timesheet too while deleting entry to task.
if hat_ids:
hat_obj.unlink(cr, uid, hat_ids, *args, **kwargs)
return super(project_work,self).unlink(cr, uid, ids, *args, **kwargs)
@@ -231,12 +238,11 @@ class task(osv.osv):
if vals.get('project_id',False) or vals.get('name',False):
vals_line = {}
hr_anlytic_timesheet = self.pool.get('hr.analytic.timesheet')
- task_obj_l = self.browse(cr, uid, ids, context=context)
if vals.get('project_id',False):
project_obj = self.pool.get('project.project').browse(cr, uid, vals['project_id'], context=context)
acc_id = project_obj.analytic_account_id.id
- for task_obj in task_obj_l:
+ for task_obj in self.browse(cr, uid, ids, context=context):
if len(task_obj.work_ids):
for task_work in task_obj.work_ids:
if not task_work.hr_analytic_timesheet_id:
@@ -253,16 +259,19 @@ task()
class res_partner(osv.osv):
_inherit = 'res.partner'
+
def unlink(self, cursor, user, ids, context=None):
parnter_id=self.pool.get('project.project').search(cursor, user, [('partner_id', 'in', ids)])
if parnter_id:
raise osv.except_osv(_('Invalid Action!'), _('You cannot delete a partner which is assigned to project, but you can uncheck the active box.'))
return super(res_partner,self).unlink(cursor, user, ids,
context=context)
+
res_partner()
class account_analytic_line(osv.osv):
_inherit = "account.analytic.line"
+
def on_change_account_id(self, cr, uid, ids, account_id):
res = {}
if not account_id:
@@ -274,5 +283,7 @@ class account_analytic_line(osv.osv):
if acc.state == 'close' or acc.state == 'cancelled':
raise osv.except_osv(_('Invalid Analytic Account !'), _('You cannot select a Analytic Account which is in Close or Cancelled state.'))
return res
+
account_analytic_line()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml
index 497ec9e3597..3efd133ffb6 100644
--- a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml
+++ b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml
@@ -45,7 +45,6 @@
Create a timesheet sheet for HR manager
-
!record {model: hr_timesheet_sheet.sheet, id: hr_timesheet_sheet_sheet_sheetforhrmanager0}:
- date_current: !eval time.strftime('%Y-05-%d')
date_from: !eval "'%s-05-01' %(datetime.now().year)"
date_to: !eval "'%s-05-31' %(datetime.now().year)"
name: Sheet for hr manager
diff --git a/addons/purchase/i18n/ar.po b/addons/purchase/i18n/ar.po
index 378d405db66..f839347add1 100644
--- a/addons/purchase/i18n/ar.po
+++ b/addons/purchase/i18n/ar.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
-"PO-Revision-Date: 2012-02-08 02:55+0000\n"
+"PO-Revision-Date: 2012-10-08 16:00+0000\n"
"Last-Translator: kifcaliph <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-09-07 04:56+0000\n"
-"X-Generator: Launchpad (build 15914)\n"
+"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: purchase
#: model:process.transition,note:purchase.process_transition_confirmingpurchaseorder0
@@ -45,7 +45,7 @@ msgstr "المقصد"
#: code:addons/purchase/purchase.py:236
#, python-format
msgid "In order to delete a purchase order, it must be cancelled first!"
-msgstr ""
+msgstr "من أجل حذف أمر الشراء، يجب الإلغاء أولاً!"
#. module: purchase
#: help:purchase.report,date:0
@@ -87,7 +87,7 @@ msgstr ""
#. module: purchase
#: view:purchase.order:0
msgid "Approved purchase order"
-msgstr ""
+msgstr "الموافقة على أمر الشراء"
#. module: purchase
#: view:purchase.order:0 field:purchase.order,partner_id:0
@@ -149,7 +149,7 @@ msgstr "لا يوجد قائمة اسعار !"
#. module: purchase
#: model:ir.model,name:purchase.model_purchase_config_wizard
msgid "purchase.config.wizard"
-msgstr ""
+msgstr "شراء.ضبط.صندوق حوار"
#. module: purchase
#: view:board.board:0 model:ir.actions.act_window,name:purchase.purchase_draft
@@ -249,7 +249,7 @@ msgstr "يوم"
#. module: purchase
#: selection:purchase.order,invoice_method:0
msgid "Based on generated draft invoice"
-msgstr ""
+msgstr "على أساس توليد مسودة فاتورة"
#. module: purchase
#: view:purchase.report:0
@@ -259,7 +259,7 @@ msgstr "ترتيب اليوم"
#. module: purchase
#: view:board.board:0
msgid "Monthly Purchases by Category"
-msgstr ""
+msgstr "مشتريات شهرية حسب الفئة"
#. module: purchase
#: model:ir.actions.act_window,name:purchase.action_purchase_line_product_tree
@@ -269,7 +269,7 @@ msgstr "المشتريات"
#. module: purchase
#: view:purchase.order:0
msgid "Purchase order which are in draft state"
-msgstr ""
+msgstr "أمر الشراء التي هي في حالة مسودة"
#. module: purchase
#: view:purchase.order:0
@@ -392,7 +392,7 @@ msgstr "حركة مخزن"
#: code:addons/purchase/purchase.py:419
#, python-format
msgid "You must first cancel all invoices related to this purchase order."
-msgstr ""
+msgstr "يجب عليك أولا إلغاء جميع الفواتير المتعلقة بهذا أمر الشراء."
#. module: purchase
#: field:purchase.report,dest_address_id:0
@@ -436,13 +436,13 @@ msgstr "تم التحقق من الصلاحية عن طريق"
#. module: purchase
#: view:purchase.report:0
msgid "Order in last month"
-msgstr ""
+msgstr "طلب في الشهر الماضي"
#. module: purchase
#: code:addons/purchase/purchase.py:412
#, python-format
msgid "You must first cancel all receptions related to this purchase order."
-msgstr ""
+msgstr "يجب عليك أولا إلغاء جميع حفلات الاستقبال المتعلقة بهذا أمر الشراء."
#. module: purchase
#: selection:purchase.order.line,state:0
@@ -467,7 +467,7 @@ msgstr "توضح انه قد تم عمل الاختيار"
#. module: purchase
#: view:purchase.order:0
msgid "Purchase orders which are in exception state"
-msgstr ""
+msgstr "أوامر الشراء التي هي في حالة الاستثناء"
#. module: purchase
#: report:purchase.order:0 field:purchase.report,validator:0
@@ -506,7 +506,7 @@ msgstr "تأكيد"
#: model:ir.ui.menu,name:purchase.menu_action_picking_tree4_picking_to_invoice
#: selection:purchase.order,invoice_method:0
msgid "Based on receptions"
-msgstr ""
+msgstr "استناداً على ما تم استقباله"
#. module: purchase
#: constraint:res.company:0
@@ -541,7 +541,7 @@ msgstr ""
#. module: purchase
#: view:purchase.order:0
msgid "Purchase order which are in the exception state"
-msgstr ""
+msgstr "أمر الشراء التي هي في حالة استثناء"
#. module: purchase
#: model:ir.actions.act_window,help:purchase.action_stock_move_report_po
@@ -597,7 +597,7 @@ msgstr "السعر الإجمالي"
#. module: purchase
#: model:ir.actions.act_window,name:purchase.action_import_create_supplier_installer
msgid "Create or Import Suppliers"
-msgstr ""
+msgstr "إنشاء أو استيراد الموردون"
#. module: purchase
#: view:stock.picking:0
@@ -662,7 +662,7 @@ msgstr ""
#. module: purchase
#: report:purchase.order:0
msgid "Purchase Order Confirmation N°"
-msgstr ""
+msgstr "تأكيد أمر الشراء ن°"
#. module: purchase
#: model:ir.actions.act_window,help:purchase.action_purchase_order_report_all
@@ -748,7 +748,7 @@ msgstr "الاستقبالات"
#: code:addons/purchase/purchase.py:285
#, python-format
msgid "You cannot confirm a purchase order without any lines."
-msgstr ""
+msgstr "لا يمكنك تأكيد أمر الشراء دون أية أسطر."
#. module: purchase
#: model:ir.actions.act_window,help:purchase.action_invoice_pending
@@ -784,7 +784,7 @@ msgstr "يناير"
#. module: purchase
#: model:ir.actions.server,name:purchase.ir_actions_server_edi_purchase
msgid "Auto-email confirmed purchase orders"
-msgstr ""
+msgstr "البريد التلقائي لتأكيد طلبات الشراء"
#. module: purchase
#: model:process.transition,name:purchase.process_transition_approvingpurchaseorder0
@@ -840,7 +840,7 @@ msgstr "دمج امر الشراء"
#. module: purchase
#: view:purchase.report:0
msgid "Order in current month"
-msgstr ""
+msgstr "طلب في الشهر الحالي"
#. module: purchase
#: view:purchase.report:0 field:purchase.report,delay_pass:0
@@ -881,7 +881,7 @@ msgstr "خطوط الاوامر الكلية للمستخدم لكل شهر"
#. module: purchase
#: view:purchase.order:0
msgid "Approved purchase orders"
-msgstr ""
+msgstr "تأكيد أوامر الشراء"
#. module: purchase
#: view:purchase.report:0 field:purchase.report,month:0
@@ -891,7 +891,7 @@ msgstr "شهر"
#. module: purchase
#: model:email.template,subject:purchase.email_template_edi_purchase
msgid "${object.company_id.name} Order (Ref ${object.name or 'n/a' })"
-msgstr ""
+msgstr "${object.company_id.name} أمر (Ref ${object.name or 'n/a' })"
#. module: purchase
#: report:purchase.quotation:0
@@ -932,7 +932,7 @@ msgstr "ـكون هذه القائمة المختارة التي تم جمعها
#. module: purchase
#: view:stock.picking:0
msgid "Is a Back Order"
-msgstr ""
+msgstr "طلب عودة"
#. module: purchase
#: model:process.node,note:purchase.process_node_invoiceafterpacking0
@@ -984,7 +984,7 @@ msgstr ""
#. module: purchase
#: selection:purchase.config.wizard,default_method:0
msgid "Pre-Generate Draft Invoices based on Purchase Orders"
-msgstr ""
+msgstr "قبل انشاء مسودة فاتورة على طلبات الشراء"
#. module: purchase
#: model:ir.actions.act_window,name:purchase.action_view_purchase_line_invoice
@@ -1010,7 +1010,7 @@ msgstr "عرض النتيجة"
#. module: purchase
#: selection:purchase.config.wizard,default_method:0
msgid "Based on Purchase Order Lines"
-msgstr ""
+msgstr "اعتماداً على سطور طلب الشراء"
#. module: purchase
#: help:purchase.order,amount_untaxed:0
@@ -1130,7 +1130,7 @@ msgstr "مرشحات مفصلة..."
#. module: purchase
#: view:purchase.config.wizard:0
msgid "Invoicing Control on Purchases"
-msgstr ""
+msgstr "التحكم في الفاتورة عند الشراء"
#. module: purchase
#: code:addons/purchase/wizard/purchase_order_group.py:48
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index d654078a055..db6ed8b80be 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -166,6 +166,7 @@ class purchase_order(osv.osv):
'warehouse_id': fields.many2one('stock.warehouse', 'Destination Warehouse', states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}),
'location_id': fields.many2one('stock.location', 'Destination', required=True, domain=[('usage','<>','view')]),
'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}, help="The pricelist sets the currency used for this purchase order. It also computes the supplier price for the selected products/quantities."),
+ 'currency_id': fields.related('pricelist_id', 'currency_id', type="many2one", relation="res.currency", readonly=True, required=True),
'state': fields.selection(STATE_SELECTION, 'Status', readonly=True, help="The state of the purchase order or the quotation request. A quotation is a purchase order in a 'Draft' state. Then the order has to be confirmed by the user, the state switch to 'Confirmed'. Then the supplier must confirm the order to change the state to 'Approved'. When the purchase order is paid and received, the state becomes 'Done'. If a cancel action occurs in the invoice or in the reception of goods, the state becomes in exception.", select=True),
'order_line': fields.one2many('purchase.order.line', 'order_id', 'Order Lines', states={'approved':[('readonly',True)],'done':[('readonly',True)]}),
'validator' : fields.many2one('res.users', 'Validated by', readonly=True),
@@ -246,6 +247,11 @@ class purchase_order(osv.osv):
def button_dummy(self, cr, uid, ids, context=None):
return True
+ def onchange_pricelist(self, cr, uid, ids, pricelist_id, context=None):
+ if not pricelist_id:
+ return {}
+ return {'value': {'currency_id': self.pool.get('product.pricelist').browse(cr, uid, pricelist_id, context=context).currency_id.id}}
+
def onchange_dest_address_id(self, cr, uid, ids, address_id):
if not address_id:
return {}
@@ -1078,9 +1084,14 @@ class procurement_order(osv.osv):
}
res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=new_context)
self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': res[procurement.id]})
- self.running_send_note(cr, uid, [procurement.id], context=context)
+ self.purchase_order_create_note(cr, uid, ids, context=context)
return res
+ def purchase_order_create_note(self, cr, uid, ids, context=None):
+ for procurement in self.browse(cr, uid, ids, context=context):
+ body = _("Draft Purchase Order created")
+ self.message_post(cr, uid, [procurement.id], body=body, context=context)
+
procurement_order()
class mail_mail(osv.osv):
@@ -1095,4 +1106,16 @@ class mail_mail(osv.osv):
mail_mail()
+class product_template(osv.osv):
+ _name = 'product.template'
+ _inherit = 'product.template'
+ _columns = {
+ 'purchase_ok': fields.boolean('Can be Purchased', help="Determine if the product is visible in the list of products within a selection from a purchase order line."),
+ }
+ _defaults = {
+ 'purchase_ok': 1,
+ }
+
+product_template()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase/purchase_demo.xml b/addons/purchase/purchase_demo.xml
index 17f51bb1004..c68ee8775bb 100644
--- a/addons/purchase/purchase_demo.xml
+++ b/addons/purchase/purchase_demo.xml
@@ -14,6 +14,9 @@
<field eval="80.0" name="schedule_range"/>
</record>
+ <record id="product.product_product_consultant" model="product.product">
+ <field eval="False" name="purchase_ok"/>
+ </record>
</data>
</openerp>
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index 7702d182b09..4d273d90b32 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -198,8 +198,9 @@
<field name="arch" type="xml">
<form string="Purchase Order" version="7.0">
<header>
- <button name="purchase_confirm" states="draft,sent" string="Confirm Order" class="oe_highlight"/>
- <button name="wkf_send_rfq" states="draft" string="Send RFQ" type="object" context="{'send_rfq':True}"/>
+ <button name="wkf_send_rfq" states="draft" string="Send RFQ" type="object" context="{'send_rfq':True}" class="oe_highlight"/>
+ <button name="purchase_confirm" states="draft" string="Confirm Order"/>
+ <button name="purchase_confirm" states="sent" string="Confirm Order" class="oe_highlight"/>
<button name="wkf_send_rfq" states="confirmed" string="Resend Purchase Order" type="object" class="oe_highlight"/>
<button name="action_cancel" states="except_picking,except_invoice" string="Cancel" type="object" />
<button name="picking_ok" states="except_picking" string="Manually Corrected"/>
@@ -223,7 +224,8 @@
<group>
<field name="partner_id" on_change="onchange_partner_id(partner_id)" context="{'search_default_supplier':1,'default_supplier':1,'default_customer':0}" domain="[('supplier','=',True)]"/>
<field name="partner_ref"/>
- <field domain="[('type','=','purchase')]" name="pricelist_id" groups="product.group_purchase_pricelist"/>
+ <field domain="[('type','=','purchase')]" name="pricelist_id" groups="product.group_purchase_pricelist" on_change="onchange_pricelist(pricelist_id, context)"/>
+ <field name="currency_id" invisible='1'/>
</group>
<group>
<field name="date_order"/>
@@ -249,14 +251,14 @@
</tree>
</field>
<group class="oe_subtotal_footer oe_right">
- <field name="amount_untaxed"/>
- <field name="amount_tax"/>
+ <field name="amount_untaxed" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="amount_tax" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<div class="oe_subtotal_footer_separator oe_inline">
<label for="amount_total"/>
<button name="button_dummy"
states="draft" string="(update)" type="object" class="oe_edit_only oe_link"/>
</div>
- <field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator"/>
+ <field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator" widget="monetary" options="{'currency_field': 'currency_id'}"/>
</group>
<div class="oe_clear"/>
<label for="notes"/>
@@ -323,7 +325,7 @@
<field name="arch" type="xml">
<search string="Search Purchase Order">
<field name="name" string="Reference"/>
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter icon="terp-document-new" name="draft" string="Quotations" domain="[('state','=','draft')]" help="Purchase orders which are in draft state"/>
<filter icon="terp-check" name="approved" string="Purchase Orders" domain="[('state','not in',('draft','cancel'))]" help="Approved purchase orders"/>
@@ -589,18 +591,30 @@
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
+ <div name="options" position="inside">
+ <field name="purchase_ok"/>
+ <label for="purchase_ok"/>
+ </div>
<group name="procurement" position="after">
<separator string="Suppliers"/>
<field name="seller_ids" context="{'uom_id': uom_id}"/>
</group>
+ </field>
+ </record>
+
+ <record id="product_product_normal_form_procurement_help_view" model="ir.ui.view">
+ <field name="name">product.normal.form.procurement.help.inherit</field>
+ <field name="model">product.product</field>
+ <field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
+ <field name="arch" type="xml">
<group name="procurement_help" position="inside">
- <p attrs="{'invisible': [('type','&lt;&gt;','service'),('procure_method','&lt;&gt;','make_to_order'),('supply_method','&lt;&gt;','buy')]}">
+ <p attrs="{'invisible': ['|','|',('type','&lt;&gt;','service'),('procure_method','&lt;&gt;','make_to_order'),('supply_method','&lt;&gt;','buy')]}">
When you sell this service to a customer, <b>a draft purchase order</b>
will be created in order to subcontract the job
<i attrs="{'invisible': [('seller_id','=',False)]}">to
<field name="seller_id" class="oe_inline"/></i>.
</p>
- <p attrs="{'invisible': [('type','=','service'),('procure_method','&lt;&gt;','make_to_order'),('supply_method','&lt;&gt;','buy')]}">
+ <p attrs="{'invisible': ['|','|',('type','=','service'),('procure_method','&lt;&gt;','make_to_order'),('supply_method','&lt;&gt;','buy')]}">
When you sell this product, OpenERP will trigger <b>a draft
purchase order</b> to buy the required quantities to the supplier.
The delivery order will be ready after having received the
@@ -609,5 +623,45 @@
</group>
</field>
</record>
+
+ <record id="product_search_form_view_purchase" model="ir.ui.view">
+ <field name="name">product.search.purchase.form</field>
+ <field name="model">product.product</field>
+ <field name="inherit_id" ref="product.product_search_form_view"/>
+ <field name="arch" type="xml">
+ <filter name="filter_to_sell" position="before">
+ <filter name="filter_to_purchase" string="To Purchase" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
+ </filter>
+ <filter name="filter_to_sell" position="after">
+ <filter name="filter_to_purchase" string="Can be Purchased" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
+ </filter>
+ </field>
+ </record>
+
+ <record id="view_template_purchase_ok_form" model="ir.ui.view">
+ <field name="name">product.template.purchase.ok.form.inherit</field>
+ <field name="model">product.template</field>
+ <field name="inherit_id" ref="product.product_template_form_view"/>
+ <field name="arch" type="xml">
+ <field name="sale_ok" position="after">
+ <field name="purchase_ok"/>
+ </field>
+ </field>
+ </record>
+
+ <record id="view_product_account_purchase_ok_form" model="ir.ui.view">
+ <field name="name">product.account.purchase.ok.form.inherit</field>
+ <field name="model">product.product</field>
+ <field name="inherit_id" ref="account.product_normal_form_view"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='property_account_expense']" position="replace" >
+ <field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
+ </xpath>
+ <xpath expr="//field[@name='supplier_taxes_id']" position="replace" >
+ <field name="supplier_taxes_id" colspan="2" widget="many2many_tags" attrs="{'readonly':[('purchase_ok','=',0)]}"/>
+ </xpath>
+ </field>
+ </record>
+
</data>
</openerp>
diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml
index 80685249849..909663f43bb 100644
--- a/addons/purchase/report/purchase_report_view.xml
+++ b/addons/purchase/report/purchase_report_view.xml
@@ -16,7 +16,7 @@
<field name="name">purchase.order.tree</field>
<field name="model">purchase.report</field>
<field name="arch" type="xml">
- <tree string="Purchase Orders Statistics">
+ <tree string="Purchase Orders Statistics" create="false">
<field name="date" invisible="1"/>
<field name="date_approve" invisible="1"/>
<field name="expected_date" invisible="1"/>
diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml
index 80bdd9aa95b..c4c2702d99c 100644
--- a/addons/purchase_requisition/purchase_requisition_view.xml
+++ b/addons/purchase_requisition/purchase_requisition_view.xml
@@ -180,7 +180,7 @@
<record model="ir.ui.view" id="product_normal_form_view_inherit">
<field name="name">product.form.inherit</field>
<field name="model">product.product</field>
- <field name="inherit_id" ref="product.product_normal_form_view"/>
+ <field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
<field name="arch" type="xml">
<field name="procure_method" position="before">
<field name="purchase_requisition"/>
diff --git a/addons/report_intrastat/report/invoice.rml b/addons/report_intrastat/report/invoice.rml
index c07bd06f402..fc410e04ce0 100644
--- a/addons/report_intrastat/report/invoice.rml
+++ b/addons/report_intrastat/report/invoice.rml
@@ -245,7 +245,7 @@
<para style="terp_default_Centre_9">[[ l.discount and formatLang (l.discount) or '' ]] </para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(l.price_subtotal) ]] [[ o.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(l.price_subtotal, currency_obj=o.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -301,7 +301,7 @@
<para style="terp_default_9">Total (excl. taxes):</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(o.amount_untaxed) ]] [[ o.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(o.amount_untaxed, currency_obj=o.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -314,7 +314,7 @@
<para style="terp_default_9">Taxes:</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(o.amount_tax) ]] [[ o.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(o.amount_tax, currency_obj=o.currency_id) ]]</para>
</td>
</tr>
<tr>
@@ -327,7 +327,7 @@
<para style="terp_default_Bold_9">Total (inclu. taxes):</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(o.amount_total) ]] [[ o.currency_id.symbol ]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(o.amount_total, currency_obj=o.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -360,10 +360,10 @@
<para style="terp_default_8">[[ t.name ]]</para>
</td>
<td>
- <para style="terp_default_Right_8">[[ formatLang(t.base, digits=get_digits(dp='Account')) ]] [[ o.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_8">[[ formatLang(t.base, digits=get_digits(dp='Account'), currency_obj = o.currency_id) ]]</para>
</td>
<td>
- <para style="terp_default_Right_8">[[ (t.tax_code_id and t.tax_code_id.notprintable) and removeParentNode('blockTable') or '' ]] [[ formatLang(t.amount, digits=get_digits(dp='Account')) ]] [[ o.currency_id.symbol ]]</para>
+ <para style="terp_default_Right_8">[[ (t.tax_code_id and t.tax_code_id.notprintable) and removeParentNode('blockTable') or '' ]] [[ formatLang(t.amount, digits=get_digits(dp='Account'), currency_obj=o.currency_id) ]]</para>
</td>
<td>
<para style="terp_default_8">
diff --git a/addons/report_intrastat/report_intrastat_view.xml b/addons/report_intrastat/report_intrastat_view.xml
index 8d8da4a078f..bcbd19d8bd8 100644
--- a/addons/report_intrastat/report_intrastat_view.xml
+++ b/addons/report_intrastat/report_intrastat_view.xml
@@ -75,7 +75,7 @@
<field name="name">report.intrastat.view</field>
<field name="model">report.intrastat</field>
<field name="arch" type="xml">
- <tree string="Intrastat Data">
+ <tree string="Intrastat Data" create="false">
<field name="name" />
<field name="month"/>
<field name="code"/>
diff --git a/addons/sale/report/sale_report_view.xml b/addons/sale/report/sale_report_view.xml
index a7153f57a9e..8f725a9eacb 100644
--- a/addons/sale/report/sale_report_view.xml
+++ b/addons/sale/report/sale_report_view.xml
@@ -7,7 +7,7 @@
<field name="name">sale.report.tree</field>
<field name="model">sale.report</field>
<field name="arch" type="xml">
- <tree string="Sales Analysis">
+ <tree string="Sales Analysis" create="false">
<field name="date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="year" invisible="1"/>
diff --git a/addons/sale/res_config.py b/addons/sale/res_config.py
index 843e1fd3343..4f1a7ce9083 100644
--- a/addons/sale/res_config.py
+++ b/addons/sale/res_config.py
@@ -48,9 +48,6 @@ class sale_configuration(osv.osv_memory):
'group_uom':fields.boolean("Allow using different units of measures",
implied_group='product.group_uom',
help="""Allows you to select and maintain different units of measure for products."""),
- 'group_sale_delivery_address': fields.boolean("Allow a different address for delivery and invoicing ",
- implied_group='sale.group_delivery_invoice_address',
- help="Allows you to specify different delivery and invoice addresses on a sale order."),
'group_discount_per_so_line': fields.boolean("Allow setting a discount on the sale order lines",
implied_group='sale.group_discount_per_so_line',
help="Allows you to apply some discount per sale order line."),
@@ -125,7 +122,7 @@ class sale_configuration(osv.osv_memory):
class account_config_settings(osv.osv_memory):
_inherit = 'account.config.settings'
_columns = {
- 'module_sale_analytic_plans': fields.boolean('Several analytic accounts on sales',
+ 'module_sale_analytic_plans': fields.boolean('Use multiple analytic accounts on sales',
help="""This allows install module sale_analytic_plans."""),
'group_analytic_account_for_sales': fields.boolean('Analytic accounting for sales',
implied_group='sale.group_analytic_accounting',
diff --git a/addons/sale/res_config_view.xml b/addons/sale/res_config_view.xml
index 6150d4ce1a3..daf396d302b 100644
--- a/addons/sale/res_config_view.xml
+++ b/addons/sale/res_config_view.xml
@@ -12,6 +12,10 @@
<group>
<label for="id" string="Invoicing Process"/>
<div>
+ <div name="group_invoice_so_lines">
+ <field name="group_invoice_so_lines" class="oe_inline"/>
+ <label for="group_invoice_so_lines"/>
+ </div>
<div name="timesheet">
<field name="timesheet" class="oe_inline" on_change="onchange_timesheet(timesheet)"/>
<label for="timesheet"/>
@@ -30,10 +34,6 @@
</div>
<div name="Customer Features" position="inside">
<div>
- <field name="group_sale_delivery_address" class="oe_inline"/>
- <label for="group_sale_delivery_address"/>
- </div>
- <div>
<field name="group_sale_pricelist" class="oe_inline"/>
<label for="group_sale_pricelist"/>
</div>
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index c47bf1357c8..a2ee88ab860 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -50,6 +50,16 @@ class sale_order(osv.osv):
_inherit = ['mail.thread', 'ir.needaction_mixin']
_description = "Sales Order"
+ def onchange_shop_id(self, cr, uid, ids, shop_id, context=None):
+ v = {}
+ if shop_id:
+ shop = self.pool.get('sale.shop').browse(cr, uid, shop_id, context=context)
+ if shop.project_id.id:
+ v['project_id'] = shop.project_id.id
+ if shop.pricelist_id.id:
+ v['pricelist_id'] = shop.pricelist_id.id
+ return {'value': v}
+
def copy(self, cr, uid, id, default=None, context=None):
if not default:
default = {}
@@ -184,13 +194,14 @@ class sale_order(osv.osv):
'user_id': fields.many2one('res.users', 'Salesperson', states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, select=True),
'partner_id': fields.many2one('res.partner', 'Customer', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, required=True, change_default=True, select=True),
'partner_invoice_id': fields.many2one('res.partner', 'Invoice Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Invoice address for current sales order."),
- 'partner_shipping_id': fields.many2one('res.partner', 'Shipping Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Shipping address for current sales order."),
+ 'partner_shipping_id': fields.many2one('res.partner', 'Delivery Address', readonly=True, required=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Delivery address for current sales order."),
'order_policy': fields.selection([
('manual', 'On Demand'),
], 'Create Invoice', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
help="""This field controls how invoice and delivery operations are synchronized.
- With 'Before Delivery', a draft invoice is created, and it must be paid before delivery."""),
'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Pricelist for current sales order."),
+ 'currency_id': fields.related('pricelist_id', 'currency_id', type="many2one", relation="res.currency", readonly=True, required=True),
'project_id': fields.many2one('account.analytic.account', 'Contract/Analytic Account', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="The analytic account related to a sales order."),
'order_line': fields.one2many('sale.order.line', 'order_id', 'Order Lines', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}),
@@ -254,13 +265,18 @@ class sale_order(osv.osv):
return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
def onchange_pricelist_id(self, cr, uid, ids, pricelist_id, order_lines, context=None):
- if (not pricelist_id) or (not order_lines):
+ if not pricelist_id:
return {}
+ value = {
+ 'currency_id': self.pool.get('product.pricelist').browse(cr, uid, pricelist_id, context=context).currency_id.id
+ }
+ if not order_lines:
+ return {'value': value}
warning = {
'title': _('Pricelist Warning!'),
'message' : _('If you change the pricelist of this order (and eventually the currency), prices of existing order lines will not be updated.')
}
- return {'warning': warning}
+ return {'warning': warning, 'value': value}
def onchange_partner_id(self, cr, uid, ids, part):
if not part:
@@ -694,7 +710,7 @@ class sale_order_line(osv.osv):
_description = 'Sales Order Line'
_columns = {
'order_id': fields.many2one('sale.order', 'Order Reference', required=True, ondelete='cascade', select=True, readonly=True, states={'draft':[('readonly',False)]}),
- 'name': fields.text('Product Description', size=256, required=True, select=True, readonly=True, states={'draft': [('readonly', False)]}),
+ 'name': fields.text('Description', size=256, required=True, select=True, readonly=True, states={'draft': [('readonly', False)]}),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of sales order lines."),
'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], change_default=True),
'invoice_lines': fields.many2many('account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_id', 'Invoice Lines', readonly=True),
@@ -735,13 +751,13 @@ class sale_order_line(osv.osv):
if (line.order_id.invoice_quantity=='order'):
if line.product_uos:
return line.product_uos_qty or 0.0
- return line.product_uom_qty
+ return line.product_uom_qty
def _get_line_uom(self, cr, uid, line, context=None):
if (line.order_id.invoice_quantity=='order'):
if line.product_uos:
return line.product_uos.id
- return line.product_uom.id
+ return line.product_uom.id
def _prepare_order_line_invoice_line(self, cr, uid, line, account_id=False, context=None):
"""Prepare the dict of values to create the new invoice line for a
@@ -783,6 +799,7 @@ class sale_order_line(osv.osv):
_('There is no Fiscal Position defined or Income category account defined for default properties of Product categories.'))
res = {
'name': line.name,
+ 'sequence': line.sequence,
'origin': line.order_id.name,
'account_id': account_id,
'price_unit': pu,
@@ -900,7 +917,6 @@ class sale_order_line(osv.osv):
fpos = fiscal_position and self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position) or False
if update_tax: #The quantity only have changed
result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, product_obj.taxes_id)
- result.update({'type': product_obj.procure_method})
if not flag:
result['name'] = self.pool.get('product.product').name_get(cr, uid, [product_obj.id], context=context_partner)[0][1]
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index d97c9924036..2ba00a7f0ae 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -174,16 +174,17 @@
</h1>
<group>
<group>
- <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1}"/>
- <field name="partner_invoice_id" groups="sale.group_delivery_invoice_address"/>
- <field name="partner_shipping_id" groups="sale.group_delivery_invoice_address"/>
+ <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}'/>
+ <field name="partner_invoice_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'invoice'}"/>
+ <field name="partner_shipping_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'delivery'}"/>
<field name="project_id" context="{'partner_id':partner_id, 'pricelist_id':pricelist_id, 'default_name':name}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/>
</group>
<group>
<field name="date_order"/>
- <field name="shop_id" invisible="1"/>
+ <field name="shop_id" groups="base.group_no_one" on_change="onchange_shop_id(shop_id, context)" widget="selection"/>
<field name="client_order_ref"/>
<field domain="[('type','=','sale')]" name="pricelist_id" groups="product.group_sale_pricelist" on_change="onchange_pricelist_id(pricelist_id,order_line)"/>
+ <field name="currency_id" invisible="1"/>
</group>
</group>
<notebook>
@@ -200,7 +201,7 @@
<field name="product_id"
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}"
groups="base.group_user"
- on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, True, parent.date_order, False, parent.fiscal_position, False, context)"/>
+ on_change="product_id_change(parent.pricelist_id, product_id, product_uom_qty, product_uom, product_uos_qty, product_uos, name, parent.partner_id, False, True, parent.date_order, False, parent.fiscal_position, False, context)"/>
<label for="product_uom_qty"/>
<div>
<field
@@ -214,7 +215,7 @@
<label for="product_uos_qty" groups="product.group_uos"/>
<div groups="product.group_uos">
<field name="product_uos_qty" class="oe_inline"/>
- <field name="product_uos" options='{"no_open": true}' class="oe_inline"/>
+ <field name="product_uos" options='{"no_open": True}' class="oe_inline"/>
</div>
<field name="price_unit"/>
<label for="discount" groups="sale.group_discount_per_so_line"/>
@@ -251,7 +252,7 @@
on_change="product_id_change(parent.pricelist_id, product_id, product_uom_qty, product_uom, product_uos_qty, product_uos, name, parent.partner_id, False, False, parent.date_order, False, parent.fiscal_position, True, context)"/>
<field name="product_uom"
on_change="product_uom_change(parent.pricelist_id, product_id, product_uom_qty, product_uom, product_uos_qty, product_uos, name, parent.partner_id, False, False, parent.date_order, context)"
- groups="product.group_uom" options='{"no_open": true}'/>
+ groups="product.group_uom" options='{"no_open": True}'/>
<field name="product_uos_qty" groups="product.group_uos" invisible="1"/>
<field name="product_uos" string="UoS" groups="product.group_uos" invisible="1"/>
<field name="tax_id" widget="many2many_tags" domain="[('parent_id','=',False),('type_tax_use','&lt;&gt;','purchase')]"/>
@@ -261,14 +262,14 @@
</tree>
</field>
<group class="oe_subtotal_footer oe_right" colspan="2" name="sale_total">
- <field name="amount_untaxed"/>
- <field name="amount_tax"/>
+ <field name="amount_untaxed" widget='monetary' options="{'currency_field': 'currency_id'}"/>
+ <field name="amount_tax" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<div class="oe_subtotal_footer_separator oe_inline">
<label for="amount_total" />
<button name="button_dummy"
states="draft" string="(update)" type="object" class="oe_edit_only oe_link"/>
</div>
- <field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator"/>
+ <field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator" widget='monetary' options="{'currency_field': 'currency_id'}"/>
</group>
<group name="sale_margin_grp">
</group>
@@ -337,7 +338,7 @@
<field name="arch" type="xml">
<search string="Search Sales Order">
<field name="name" string="Sales Order" filter_domain="['|',('name','ilike',self),('client_order_ref','ilike',self)]"/>
- <filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter icon="terp-document-new" string="Quotations" name="draft" domain="[('state','in',('draft','sent'))]" help="Sales Order that haven't yet been confirmed"/>
<filter icon="terp-check" string="Sales" name="sales" domain="[('state','in',('manual','progress'))]"/>
diff --git a/addons/sale/test/sale_order_demo.yml b/addons/sale/test/sale_order_demo.yml
index 05109efbea2..7e5a223e8b0 100644
--- a/addons/sale/test/sale_order_demo.yml
+++ b/addons/sale/test/sale_order_demo.yml
@@ -5,10 +5,12 @@
partner_id: base.res_partner_2
note: Invoice after delivery
payment_term: account.account_payment_term
+ order_line:
+ - product_id: product.product_product_7
+ product_uom_qty: 8
-
- !record {model: sale.order.line, id: line}:
- name : 'LCD Monitor'
- order_id: sale_order_test1
- product_id: product.product_product_7
- price_unit: 190.50
- product_uom_qty: 8
+ I verify that the onchange was correctly triggered
+-
+ !assert {model: sale.order, id: sale.sale_order_test1, string: The onchange function of product was not correctly triggered}:
+ - order_line[0].name == u'[LCD17] 17\u201d LCD Monitor'
+ - order_line[0].price_unit == 1350.0
diff --git a/addons/sale_analytic_plans/sale_analytic_plans.py b/addons/sale_analytic_plans/sale_analytic_plans.py
index b8ccc44079d..872e8b0bffc 100644
--- a/addons/sale_analytic_plans/sale_analytic_plans.py
+++ b/addons/sale_analytic_plans/sale_analytic_plans.py
@@ -39,4 +39,14 @@ class sale_order_line(osv.osv):
sale_order_line()
+class sale_order(osv.osv):
+ _inherit = "sale.order"
+
+ def onchange_shop_id(self, cr, uid, ids, shop_id, context=None):
+ # Remove the project_id from the result of super() call, if any, as this field is not in the view anymore
+ res = super(sale_order, self).onchange_shop_id(cr, uid, ids, shop_id, context=context)
+ if res.get('value',{}).get('project_id'):
+ del(res['value']['project_id'])
+ return res
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml
index e54ba158b9b..665474c22c0 100644
--- a/addons/sale_crm/sale_crm_view.xml
+++ b/addons/sale_crm/sale_crm_view.xml
@@ -9,8 +9,8 @@
<field name="arch" type="xml">
<data>
<xpath expr="/form/header/button[@name='case_mark_lost']" position="after">
- <button states="done" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action" class="oe_highlight"/>
- <button states="draft,open,pending" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action"/>
+ <button states="done" string="Create Quotation" name="%(action_crm_make_sale)d" type="action"/>
+ <button states="draft,open,pending" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action" class="oe_highlight"/>
</xpath>
</data>
</field>
diff --git a/addons/sale_margin/__openerp__.py b/addons/sale_margin/__openerp__.py
index 9b393b6c5ad..bb2f78f409c 100644
--- a/addons/sale_margin/__openerp__.py
+++ b/addons/sale_margin/__openerp__.py
@@ -32,7 +32,7 @@ Price and Cost Price.
'author':'OpenERP SA',
'images':['images/sale_margin.jpeg'],
'depends':['sale_stock'],
- 'demo':[],
+ 'demo':['sale_margin_demo.xml'],
'test': ['test/sale_margin.yml'],
'data':['security/ir.model.access.csv','sale_margin_view.xml'],
'auto_install': False,
diff --git a/addons/sale_margin/sale_margin_demo.xml b/addons/sale_margin/sale_margin_demo.xml
new file mode 100644
index 00000000000..a41f05304a4
--- /dev/null
+++ b/addons/sale_margin/sale_margin_demo.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data noupdate="1">
+
+ <record id="sale.sale_order_line_1" model="sale.order.line">
+ <field name="purchase_price">2870.00</field>
+ </record>
+
+ <record id="sale.sale_order_line_2" model="sale.order.line">
+ <field name="purchase_price">126.00</field>
+ </record>
+
+ <record id="sale.sale_order_line_3" model="sale.order.line">
+ <field name="purchase_price">60.00</field>
+ </record>
+
+ <record id="sale.sale_order_line_12" model="sale.order.line">
+ <field name="purchase_price">390.00</field>
+ </record>
+
+ <record id="sale.sale_order_line_13" model="sale.order.line">
+ <field name="purchase_price">21.60</field>
+ </record>
+
+ <record id="sale.sale_order_line_14" model="sale.order.line">
+ <field name="purchase_price">4258.00</field>
+ </record>
+
+ <record id="sale.sale_order_line_16" model="sale.order.line">
+ <field name="purchase_price">2870.00</field>
+ </record>
+
+ <record id="sale.sale_order_line_17" model="sale.order.line">
+ <field name="purchase_price">155.00</field>
+ </record>
+
+ <record id="sale.sale_order_line_18" model="sale.order.line">
+ <field name="purchase_price">35.00</field>
+ </record>
+
+ <record id="sale.sale_order_line_19" model="sale.order.line">
+ <field name="purchase_price">13.00</field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/sale_margin/sale_margin_view.xml b/addons/sale_margin/sale_margin_view.xml
index 69f49bd48ea..6aa34bae26c 100644
--- a/addons/sale_margin/sale_margin_view.xml
+++ b/addons/sale_margin/sale_margin_view.xml
@@ -11,7 +11,7 @@
<group>
<label for="margin"/>
<div>
- <field name="margin"/>
+ <field name="margin" widget='monetary' options="{'currency_field': 'currency_id'}"/>
</div>
</group>
</xpath>
diff --git a/addons/sale_mrp/test/sale_mrp.yml b/addons/sale_mrp/test/sale_mrp.yml
index 0962e1fa1ff..6fd64301af2 100644
--- a/addons/sale_mrp/test/sale_mrp.yml
+++ b/addons/sale_mrp/test/sale_mrp.yml
@@ -117,26 +117,13 @@
proc_ids = self.search(cr, uid, [('origin','=',so.name) and ('state','=','running')])
assert proc_ids, _('Procurement is not in the running state!')
-
- I verify that a manufacturing order has been generated
+ I verify that a manufacturing order has been generated, and that its name and reference are correct
-
!python {model: sale.order}: |
+ mnf_obj = self.pool.get('mrp.production')
so = self.browse(cr, uid, ref("sale_order_so0"))
- mnf_obj=self.pool.get('mrp.production')
- mnf_id=mnf_obj.search(cr, uid, [('origin','=',so.name)])
+ mnf_id = mnf_obj.search(cr, uid, [('origin','=',so.name)])
assert mnf_id, _('Manufacturing order has not been generated')
--
- I verify that a 'Sale Name' field of Manufacturing order gets bind with the value
--
- !python {model: sale.order}: |
- so = self.browse(cr, uid, ref("sale_order_so0"))
- mnf_obj=self.pool.get('mrp.production')
- mnf_id=mnf_obj.search(cr, uid, [('sale_name','=',so.name)])
- assert mnf_id, _('Sale Name is not bind with the value')
--
- I verify that a 'Sale Reference' field of Manufacturing order gets bind with the value
--
- !python {model: sale.order}: |
- so = self.browse(cr, uid, ref("sale_order_so0"))
- mnf_obj=self.pool.get('mrp.production')
- mnf_id=mnf_obj.search(cr, uid, [('sale_ref','=',so.client_order_ref)])
- assert mnf_id, _('Sale Reference is not bind with the value')
+ mo = mnf_obj.browse(cr, uid, mnf_id)[0]
+ assert mo.sale_name == so.name, 'Wrong Name for the Manufacturing Order. Expected %s, Got %s' % (so.name, mo.name)
+ assert mo.sale_ref == so.client_order_ref, 'Wrong Sale Reference for the Manufacturing Order'
diff --git a/addons/sale_stock/__openerp__.py b/addons/sale_stock/__openerp__.py
index 2a670000581..10773b44a3f 100644
--- a/addons/sale_stock/__openerp__.py
+++ b/addons/sale_stock/__openerp__.py
@@ -61,6 +61,7 @@ You can choose flexible invoicing methods:
'test': ['test/cancel_order_sale_stock.yml',
'test/picking_order_policy.yml',
'test/prepaid_order_policy.yml',
+ 'test/sale_order_onchange.yml',
],
'installable': True,
'auto_install': True,
diff --git a/addons/sale_stock/res_config.py b/addons/sale_stock/res_config.py
index 22b47833190..43e1cfc6778 100644
--- a/addons/sale_stock/res_config.py
+++ b/addons/sale_stock/res_config.py
@@ -27,6 +27,9 @@ class sale_configuration(osv.osv_memory):
_inherit = 'sale.config.settings'
_columns = {
+ 'group_sale_delivery_address': fields.boolean("Allow a different address for delivery and invoicing ",
+ implied_group='sale.group_delivery_invoice_address',
+ help="Allows you to specify different delivery and invoice addresses on a sale order."),
'group_invoice_deli_orders': fields.boolean('Generate invoices after and based on delivery orders',
implied_group='sale_stock.group_invoice_deli_orders',
help="To allow your salesman to make invoices for Delivery Orders using the menu 'Deliveries to Invoice'."),
diff --git a/addons/sale_stock/res_config_view.xml b/addons/sale_stock/res_config_view.xml
index 1f5380b0f58..aa15be1d090 100644
--- a/addons/sale_stock/res_config_view.xml
+++ b/addons/sale_stock/res_config_view.xml
@@ -9,11 +9,19 @@
<field name="inherit_id" ref="sale.view_sales_config"/>
<field name="arch" type="xml">
<data>
- <xpath expr="//div[@name='timesheet']" position="before">
+ <xpath expr="//div[@name='Customer Features']" position="inside">
+ <div>
+ <field name="group_sale_delivery_address" class="oe_inline"/>
+ <label for="group_sale_delivery_address"/>
+ </div>
+ </xpath>
+ <xpath expr="//div[@name='group_invoice_so_lines']" position="replace">
<div>
<field name="group_invoice_so_lines" on_change="onchange_invoice_methods(group_invoice_so_lines, group_invoice_deli_orders)" class="oe_inline"/>
<label for="group_invoice_so_lines"/>
</div>
+ </xpath>
+ <xpath expr="//div[@name='timesheet']" position="before">
<div>
<field name="group_invoice_deli_orders" class="oe_inline" on_change="onchange_invoice_methods(group_invoice_so_lines, group_invoice_deli_orders)"/>
<label for="group_invoice_deli_orders"/>
diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py
index 490af81ed41..ce6894318c4 100644
--- a/addons/sale_stock/sale_stock.py
+++ b/addons/sale_stock/sale_stock.py
@@ -165,16 +165,6 @@ class sale_order(osv.osv):
return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
- def onchange_shop_id(self, cr, uid, ids, shop_id):
- v = {}
- if shop_id:
- shop = self.pool.get('sale.shop').browse(cr, uid, shop_id)
- v['project_id'] = shop.project_id.id
- # Que faire si le client a une pricelist a lui ?
- if shop.pricelist_id.id:
- v['pricelist_id'] = shop.pricelist_id.id
- return {'value': v}
-
def action_view_delivery(self, cr, uid, ids, context=None):
'''
This function returns an action that display existing delivery orders of given sale order ids. It can either be a in a list or in a form view, if there is only one delivery order to show.
@@ -604,14 +594,18 @@ class sale_order_line(osv.osv):
lang=lang, update_tax=update_tax, date_order=date_order, packaging=packaging, fiscal_position=fiscal_position, flag=flag, context=context)
if not product:
- return {'value': {'th_weight': 0, 'product_packaging': False,
- 'product_uos_qty': qty}, 'domain': {'product_uom': [],
- 'product_uos': []}}
+ res['value'].update({'product_packaging': False})
+ return res
+
+ #update of result obtained in super function
res_packing = self.product_packaging_change(cr, uid, ids, pricelist, product, qty, uom, partner_id, packaging, context=context)
res['value'].update(res_packing.get('value', {}))
warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or ''
product_obj = product_obj.browse(cr, uid, product, context=context)
res['value']['delay'] = (product_obj.sale_delay or 0.0)
+ res['value']['type'] = product_obj.procure_method
+
+ #check if product is available, and if not: raise an error
uom2 = False
if uom:
uom2 = product_uom_obj.browse(cr, uid, uom)
@@ -619,7 +613,6 @@ class sale_order_line(osv.osv):
uom = False
if not uom2:
uom2 = product_obj.uom_id
-
compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding)
if (product_obj.type=='product') and int(compare_qty) == -1 \
and (product_obj.procure_method=='make_to_stock'):
@@ -628,7 +621,8 @@ class sale_order_line(osv.osv):
max(0,product_obj.virtual_available), product_obj.uom_id.name,
max(0,product_obj.qty_available), product_obj.uom_id.name)
warning_msgs += _("Not enough stock ! : ") + warn_msg + "\n\n"
- # get unit price
+
+ #update of warning messages
if warning_msgs:
warning = {
'title': _('Configuration Error!'),
diff --git a/addons/sale_stock/sale_stock_view.xml b/addons/sale_stock/sale_stock_view.xml
index 7efb2849a52..73b9d33ba90 100644
--- a/addons/sale_stock/sale_stock_view.xml
+++ b/addons/sale_stock/sale_stock_view.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<openerp>
<data>
-
+
<record id="view_sale_shop_form_inherit" model="ir.ui.view">
<field name="name">sale.shop.inherit.form</field>
<field name="model">sale.shop</field>
@@ -13,7 +13,7 @@
</xpath>
</field>
</record>
-
+
<record id="view_shop_tree_inherit" model="ir.ui.view">
<field name="name">sale.shop.sale.stock</field>
<field name="model">sale.shop</field>
@@ -41,7 +41,8 @@
</xpath>
<xpath expr="//button[@name='action_view_invoice']" position="after">
<button name="action_view_delivery" string="View Delivery Order" type="object" class="oe_highlight"
- attrs="{'invisible': ['|','|','|',('picking_ids','=',False),('picking_ids','=',[]), ('state', 'not in', ('progress','manual')),('shipped','=',True)]}"/> </xpath>
+ attrs="{'invisible': ['|','|','|',('picking_ids','=',False),('picking_ids','=',[]), ('state', 'not in', ('progress','manual')),('shipped','=',True)]}"/>
+ </xpath>
<xpath expr="//button[@name='action_cancel']" position="after">
<button name="ship_cancel" states="shipping_except" string="Cancel"/>
</xpath>
@@ -55,7 +56,7 @@
<field name="product_id"
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}"
groups="base.group_user"
- on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, product_packaging, parent.fiscal_position, True, context)"/>
+ on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, product_packaging, parent.fiscal_position, False, context)"/>
</field>
<field name="product_uom_qty" position="replace">
<field context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}"
diff --git a/addons/sale_stock/stock.py b/addons/sale_stock/stock.py
index c4e505a80e8..6fc5c061dda 100644
--- a/addons/sale_stock/stock.py
+++ b/addons/sale_stock/stock.py
@@ -153,13 +153,14 @@ class stock_picking(osv.osv):
inv_name = picking.sale_id.client_order_ref + " : " + invoice_created.name
invoice_obj.write(cursor, user, [invoice_created.id], {'name': inv_name}, context=context)
for sale_line in sale_lines:
+ account_id = False
+ if not type:
+ type = context.get('inv_type', False)
+ if group:
+ name = picking.name + '-' + sale_line.name
+ else:
+ name = sale_line.name
if sale_line.product_id.type == 'service' and sale_line.invoiced == False:
- if not type:
- type = context.get('inv_type', False)
- if group:
- name = picking.name + '-' + sale_line.name
- else:
- name = sale_line.name
if type in ('out_invoice', 'out_refund'):
account_id = sale_line.product_id.product_tmpl_id.\
property_account_income.id
@@ -173,16 +174,16 @@ class stock_picking(osv.osv):
account_id = sale_line.product_id.categ_id.\
property_account_expense_categ.id
- vals = order_line_obj._prepare_order_line_invoice_line(cursor, user, sale_line, account_id, context)
- if vals: #note: in some cases we may not want to include all service lines as invoice lines
- vals['name'] = name
- vals['account_analytic_id'] = self._get_account_analytic_invoice(cursor, user, picking, sale_line)
- vals['invoice_id'] = invoices[result[picking.id]].id
- invoice_line_id = invoice_line_obj.create(cursor, user, vals, context=context)
- order_line_obj.write(cursor, user, [sale_line.id], {
- 'invoiced': True,
- 'invoice_lines': [(6, 0, [invoice_line_id])],
- })
+ vals = order_line_obj._prepare_order_line_invoice_line(cursor, user, sale_line, account_id, context)
+ if vals: #note: in some cases we may not want to include all service lines as invoice lines
+ vals['name'] = name
+ vals['account_analytic_id'] = self._get_account_analytic_invoice(cursor, user, picking, sale_line)
+ vals['invoice_id'] = invoices[result[picking.id]].id
+ invoice_line_id = invoice_line_obj.create(cursor, user, vals, context=context)
+ order_line_obj.write(cursor, user, [sale_line.id], {
+ 'invoiced': True,
+ 'invoice_lines': [(6, 0, [invoice_line_id])],
+ })
return result
# Redefinition of the new field in order to update the model stock.picking.out in the orm
diff --git a/addons/sale_stock/test/sale_order_onchange.yml b/addons/sale_stock/test/sale_order_onchange.yml
new file mode 100644
index 00000000000..1026e5627c3
--- /dev/null
+++ b/addons/sale_stock/test/sale_order_onchange.yml
@@ -0,0 +1,22 @@
+-
+ In order to test the onchange of the Sale Order, I create a product
+-
+ !record {model: product.product, id: product_onchange1}:
+ name: 'Devil Worship Book'
+ list_price: 66.6
+ procure_method: 'make_to_order'
+-
+ Now i create a sale order that uses my new product
+-
+ !record {model: sale.order, id: sale_order_onchange1}:
+ partner_id: base.res_partner_2
+ order_line:
+ - product_id: sale_stock.product_onchange1
+ product_uom_qty: 10
+-
+ I verify that the onchange of product on sale order line was correctly triggered
+-
+ !assert {model: sale.order, id: sale_order_onchange1, string: The onchange function of product was not correctly triggered}:
+ - order_line[0].name == u'Devil Worship Book'
+ - order_line[0].price_unit == 66.6
+ - order_line[0].type == 'make_to_order'
diff --git a/addons/share/i18n/ar.po b/addons/share/i18n/ar.po
index 28215c8d748..c6fba54885c 100644
--- a/addons/share/i18n/ar.po
+++ b/addons/share/i18n/ar.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-02-08 01:37+0100\n"
-"PO-Revision-Date: 2012-01-13 21:14+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"PO-Revision-Date: 2012-10-08 15:06+0000\n"
+"Last-Translator: almodhesh <Unknown>\n"
"Language-Team: Arabic <ar@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: 2012-08-28 06:34+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: share
#: field:share.wizard,embed_option_title:0
@@ -25,7 +25,7 @@ msgstr "عرض العنوان"
#. module: share
#: view:share.wizard:0
msgid "Access granted!"
-msgstr ""
+msgstr "منح الوصول!"
#. module: share
#: field:share.wizard,user_type:0
@@ -50,13 +50,15 @@ msgstr "مشاركة"
#. module: share
#: field:share.wizard,share_root_url:0
msgid "Share Access URL"
-msgstr ""
+msgstr "مشاركة الوصول URL"
#. module: share
#: code:addons/share/wizard/share_wizard.py:782
#, python-format
msgid "You may use your current login (%s) and password to view them.\n"
msgstr ""
+"يمكنك استخدام معلومات تسجيل الدخول الخاصة بك الحالية(%s) وكلمة المرور "
+"لعرضها.\n"
#. module: share
#: code:addons/share/wizard/share_wizard.py:601
@@ -83,24 +85,25 @@ msgstr ""
#. module: share
#: field:share.wizard,embed_url:0 field:share.wizard.result.line,share_url:0
msgid "Share URL"
-msgstr ""
+msgstr "مشاركة URL"
#. module: share
#: code:addons/share/wizard/share_wizard.py:776
#, python-format
msgid "These are your credentials to access this protected area:\n"
-msgstr ""
+msgstr "هذا هو اعتمادك للوصول إلى هذه المناطق المحمية\n"
#. module: share
#: code:addons/share/wizard/share_wizard.py:643
#, python-format
msgid "You must be a member of the Share/User group to use the share wizard"
msgstr ""
+"يجب أن تكون عضوا في المجموعة مشاركة / المستخدم لاستخدام مشاركة صندوق الحوار"
#. module: share
#: view:share.wizard:0
msgid "Access info"
-msgstr ""
+msgstr "معلومات الولوج"
#. module: share
#: view:share.wizard:0
@@ -111,12 +114,12 @@ msgstr "حصة"
#: code:addons/share/wizard/share_wizard.py:551
#, python-format
msgid "(Duplicated for modified sharing permissions)"
-msgstr ""
+msgstr "(تكرار للحصول على أذونات مشاركة تعديل)"
#. module: share
#: help:share.wizard,domain:0
msgid "Optional domain for further data filtering"
-msgstr ""
+msgstr "المجال اختياري لمزيد من بيانات التصفية"
#. module: share
#: sql_constraint:res.users:0
@@ -159,7 +162,7 @@ msgstr "إغلاق"
#: code:addons/share/wizard/share_wizard.py:640
#, python-format
msgid "Action and Access Mode are required to create a shared access"
-msgstr ""
+msgstr "نمط الإجراء والوصول لإنشاء مشاركة الوصول"
#. module: share
#: view:share.wizard:0
@@ -167,6 +170,7 @@ msgid ""
"Please select the action that opens the screen containing the data you want "
"to share."
msgstr ""
+"الرجاء اختيار الإجراء الذي يفتح شاشة تحتوي على البيانات التي تريد مشاركتها."
#. module: share
#: code:addons/share/wizard/share_wizard.py:781
@@ -174,7 +178,7 @@ msgstr ""
msgid ""
"The documents have been automatically added to your current OpenERP "
"documents.\n"
-msgstr ""
+msgstr "المستندات تمت إضافتها بشكل تلقائي لمستندات اوبن اي ار بي الخاصة بك\n"
#. module: share
#: view:share.wizard:0
@@ -184,7 +188,7 @@ msgstr "إلغاء"
#. module: share
#: field:res.groups,share:0
msgid "Share Group"
-msgstr ""
+msgstr "مشاركة المجموعة"
#. module: share
#: code:addons/share/wizard/share_wizard.py:763
@@ -197,12 +201,12 @@ msgstr "لا بدّ من ذكر عنوان بريد إلكتروني"
msgid ""
"Optionally, you may specify an additional domain restriction that will be "
"applied to the shared data."
-msgstr ""
+msgstr "اختيارياً، اختيار محدودية مجال لتطبيقها على المعلومات المشاركة."
#. module: share
#: help:share.wizard,name:0
msgid "Title for the share (displayed to users as menu and shortcut name)"
-msgstr ""
+msgstr "عنوان المشاركة (تعرض للمستخدمين كقائمة واسم مختصر)"
#. module: share
#: view:share.wizard:0
@@ -212,7 +216,7 @@ msgstr "خيارات"
#. module: share
#: view:res.groups:0
msgid "Regular groups only (no share groups"
-msgstr ""
+msgstr "المجموعات المنتظمة فقط( لا مجموعات مشاركة)"
#. module: share
#: code:addons/share/wizard/share_wizard.py:787
@@ -222,27 +226,32 @@ msgid ""
"Sales, HR, etc.)\n"
"It is open source and can be found on http://www.openerp.com."
msgstr ""
+"OpenERP هي قوية ومجموعة من تطبيقات الأعمال سهل الاستعمال(إدارة علاقات "
+"العملاء,المبيعات, موارد بشرية, الخ.)\n"
+"هي مفتوحة المصدر ويمكنك الوصول إليها عن طريق هذا الرابط "
+"http://www.openerp.com."
#. module: share
#: field:share.wizard,action_id:0
msgid "Action to share"
-msgstr ""
+msgstr "إجراء للمشاركة"
#. module: share
#: view:share.wizard:0
msgid "Optional: include a personal message"
-msgstr ""
+msgstr "اختياري: تضمين رسالة خاصة"
#. module: share
#: field:res.users,share:0
msgid "Share User"
-msgstr ""
+msgstr "مشاركة المستخدم"
#. module: share
#: code:addons/share/wizard/share_wizard.py:647
#, python-format
msgid "Please indicate the emails of the persons to share with, one per line"
msgstr ""
+"يرجى الإشارة إلى رسائل البريد الإلكتروني للأشخاص للمشاركة معه، واحد في كل سطر"
#. module: share
#: field:share.wizard,embed_code:0 field:share.wizard.result.line,user_id:0
@@ -252,13 +261,13 @@ msgstr "مجهول"
#. module: share
#: help:res.groups,share:0
msgid "Group created to set access rights for sharing data with some users."
-msgstr ""
+msgstr "إنشاء مجموعة لتعيين حقوق الوصول لتبادل البيانات مع بعض المستخدمين."
#. module: share
#: help:share.wizard,action_id:0
msgid ""
"The action that opens the screen containing the data you wish to share."
-msgstr ""
+msgstr "الإجراء الذي يفتح شاشة تحتوي على البيانات التي ترغب في مشاركتها."
#. module: share
#: constraint:res.users:0
@@ -270,12 +279,12 @@ msgstr ""
#: code:addons/share/wizard/share_wizard.py:526
#, python-format
msgid "(Copy for sharing)"
-msgstr ""
+msgstr "(نسخة من المشاركة)"
#. module: share
#: field:share.wizard.result.line,newly_created:0
msgid "Newly created"
-msgstr ""
+msgstr "منشأة حديثاً"
#. module: share
#: code:addons/share/wizard/share_wizard.py:616
@@ -292,7 +301,7 @@ msgstr ""
#. module: share
#: help:share.wizard,share_root_url:0
msgid "Main access page for users that are granted shared access"
-msgstr ""
+msgstr "صفحة الوصول الرئيسية للمستخدمين لضمان مشاركة الوصول"
#. module: share
#: sql_constraint:res.groups:0
@@ -343,12 +352,12 @@ msgstr "ملخّص"
#: code:addons/share/wizard/share_wizard.py:493
#, python-format
msgid "Copied access for sharing"
-msgstr ""
+msgstr "نسخ الوصول للمشاركة"
#. module: share
#: model:ir.actions.act_window,name:share.action_share_wizard_step1
msgid "Share your documents"
-msgstr ""
+msgstr "مشاركة المستندات الخاصة بك"
#. module: share
#: view:share.wizard:0
@@ -370,22 +379,22 @@ msgstr "share.wizard.result.line"
#. module: share
#: help:share.wizard,user_type:0
msgid "Select the type of user(s) you would like to share data with."
-msgstr ""
+msgstr "استخدم نوع المستخدم الذي تود مشاركة المعلومات معه"
#. module: share
#: field:share.wizard,view_type:0
msgid "Current View Type"
-msgstr ""
+msgstr "نوع عرض الحالي"
#. module: share
#: selection:share.wizard,access_mode:0
msgid "Can view"
-msgstr ""
+msgstr "امكانية المشاهدة"
#. module: share
#: selection:share.wizard,access_mode:0
msgid "Can edit"
-msgstr ""
+msgstr "امكانية التعديل"
#. module: share
#: help:share.wizard,message:0
@@ -528,3 +537,10 @@ msgstr "مشاركة مع..."
#~ msgid "Share with these people (one e-mail per line)"
#~ msgstr "المشاركة مع هؤلاء الناس (بريد إلكتروني واحد في كل سطر)"
+
+#~ msgid ""
+#~ "An optional personal message, to be included in the e-mail notification."
+#~ msgstr "رسالة اختيارية شخصية، ليتم تضمينها في اخطار البريد الإلكتروني."
+
+#~ msgid "Use this link"
+#~ msgstr "استخدم هذا الرابط"
diff --git a/addons/stock/i18n/de.po b/addons/stock/i18n/de.po
index dbd9bb99c67..2d034c970c9 100644
--- a/addons/stock/i18n/de.po
+++ b/addons/stock/i18n/de.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
-"PO-Revision-Date: 2012-05-24 22:20+0000\n"
+"PO-Revision-Date: 2012-10-12 23:21+0000\n"
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
"Language-Team: German <kde-i18n-doc@kde.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 05:56+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-14 04:39+0000\n"
+"X-Generator: Launchpad (build 16137)\n"
#. module: stock
#: field:product.product,track_outgoing:0
@@ -48,7 +48,9 @@ msgid "Chained Location If Fixed"
msgstr "Lager bei \"Fester Lagerort\""
#. module: stock
-#: view:stock.inventory:0 view:stock.move:0 view:stock.picking:0
+#: view:stock.inventory:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Put in a new pack"
msgstr "Lade in neues Paket"
@@ -86,8 +88,10 @@ msgid "Orders processed Today or planned for Today"
msgstr "heutige Aufträge"
#. module: stock
-#: view:stock.partial.move.line:0 view:stock.partial.picking:0
-#: field:stock.partial.picking,move_ids:0 view:stock.partial.picking.line:0
+#: view:stock.partial.move.line:0
+#: view:stock.partial.picking:0
+#: field:stock.partial.picking,move_ids:0
+#: view:stock.partial.picking.line:0
#: view:stock.return.picking.memory:0
msgid "Product Moves"
msgstr "Produktlieferungen"
@@ -143,19 +147,25 @@ msgid "Picking list"
msgstr "Lieferauftrag"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
#: field:report.stock.inventory,product_qty:0
#: field:report.stock.move,product_qty:0
#: field:stock.change.product.qty,new_quantity:0
#: field:stock.inventory.line,product_qty:0
#: field:stock.inventory.line.split,qty:0
#: field:stock.inventory.line.split.lines,quantity:0
-#: report:stock.inventory.move:0 field:stock.move,product_qty:0
-#: field:stock.move.consume,product_qty:0 field:stock.move.scrap,product_qty:0
-#: field:stock.move.split,qty:0 field:stock.move.split.lines,quantity:0
+#: report:stock.inventory.move:0
+#: field:stock.move,product_qty:0
+#: field:stock.move.consume,product_qty:0
+#: field:stock.move.scrap,product_qty:0
+#: field:stock.move.split,qty:0
+#: field:stock.move.split.lines,quantity:0
#: field:stock.partial.move.line,quantity:0
-#: field:stock.partial.picking.line,quantity:0 report:stock.picking.list:0
-#: field:stock.report.prodlots,qty:0 field:stock.report.tracklots,name:0
+#: field:stock.partial.picking.line,quantity:0
+#: report:stock.picking.list:0
+#: field:stock.report.prodlots,qty:0
+#: field:stock.report.tracklots,name:0
#: field:stock.return.picking.memory,quantity:0
#: field:stock.split.into,quantity:0
msgid "Quantity"
@@ -171,13 +181,17 @@ msgstr ""
"auszuführenden Lieferaufträge, die zur Bearbeitung anstehen."
#. module: stock
-#: view:report.stock.move:0 field:report.stock.move,day:0
+#: view:report.stock.move:0
+#: field:report.stock.move,day:0
msgid "Day"
msgstr "Tag"
#. module: stock
-#: view:stock.inventory:0 field:stock.inventory.line.split,product_uom:0
-#: view:stock.move:0 field:stock.move.split,product_uom:0 view:stock.picking:0
+#: view:stock.inventory:0
+#: field:stock.inventory.line.split,product_uom:0
+#: view:stock.move:0
+#: field:stock.move.split,product_uom:0
+#: view:stock.picking:0
#: view:stock.production.lot:0
msgid "UoM"
msgstr "ME"
@@ -189,13 +203,15 @@ msgid "Physical Inventories"
msgstr "Inventuraufträge"
#. module: stock
-#: field:product.category,property_stock_journal:0 view:report.stock.move:0
+#: field:product.category,property_stock_journal:0
+#: view:report.stock.move:0
#: field:stock.change.standard.price,stock_journal:0
msgid "Stock journal"
msgstr "Lagerjournal"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
msgid "Current month"
msgstr "Aktueller Monat"
@@ -206,7 +222,7 @@ msgid "Unable to assign all lots to this move!"
msgstr "Kann nicht alle Lose zu dieser Buchung zuordnen"
#. module: stock
-#: code:addons/stock/stock.py:2516
+#: code:addons/stock/stock.py:2522
#, python-format
msgid "Missing partial picking data for move #%s"
msgstr "Fehlender Teillieferauftrag für die Lieferung #%s"
@@ -262,7 +278,9 @@ msgid "Other reference or serial number"
msgstr "Fremde Referenz oder Seriennummer"
#. module: stock
-#: field:stock.move,origin:0 view:stock.picking:0 field:stock.picking,origin:0
+#: field:stock.move,origin:0
+#: view:stock.picking:0
+#: field:stock.picking,origin:0
msgid "Origin"
msgstr "Herkunft"
@@ -285,13 +303,16 @@ msgid "Downstream Traceability"
msgstr "Verfolgung Downstream"
#. module: stock
-#: view:stock.move:0 field:stock.move,picking_id:0 field:stock.picking,name:0
+#: view:stock.move:0
+#: field:stock.move,picking_id:0
+#: field:stock.picking,name:0
#: view:stock.production.lot:0
msgid "Reference"
msgstr "Referenz"
#. module: stock
-#: code:addons/stock/stock.py:670 code:addons/stock/stock.py:1516
+#: code:addons/stock/stock.py:676
+#: code:addons/stock/stock.py:1525
#, python-format
msgid "Products to Process"
msgstr "Produkte zu Lieferauftrag"
@@ -306,12 +327,13 @@ msgstr ""
"gehen, dass auch eine physische Inventur durchgeführt wird."
#. module: stock
-#: view:stock.partial.move:0 view:stock.partial.picking:0
+#: view:stock.partial.move:0
+#: view:stock.partial.picking:0
msgid "_Validate"
msgstr "_Validiere"
#. module: stock
-#: code:addons/stock/stock.py:1149
+#: code:addons/stock/stock.py:1158
#, python-format
msgid "You cannot cancel picking because stock move is in done state !"
msgstr ""
@@ -319,11 +341,12 @@ msgstr ""
"Lagerbewegungen gibt."
#. module: stock
-#: code:addons/stock/stock.py:2337 code:addons/stock/stock.py:2379
-#: code:addons/stock/stock.py:2440
+#: code:addons/stock/stock.py:2346
+#: code:addons/stock/stock.py:2388
+#: code:addons/stock/stock.py:2449
#: code:addons/stock/wizard/stock_change_product_qty.py:87
#: code:addons/stock/wizard/stock_fill_inventory.py:53
-#: code:addons/stock/wizard/stock_partial_picking.py:141
+#: code:addons/stock/wizard/stock_partial_picking.py:142
#, python-format
msgid "Warning!"
msgstr "Warnung !"
@@ -334,16 +357,20 @@ msgid "Group by partner"
msgstr "Gruppiert nach Partner"
#. module: stock
-#: model:ir.model,name:stock.model_res_partner view:report.stock.inventory:0
-#: field:report.stock.inventory,partner_id:0 view:report.stock.move:0
-#: field:report.stock.move,partner_id:0 view:stock.move:0
-#: field:stock.move,partner_id:0 view:stock.picking:0
+#: model:ir.model,name:stock.model_res_partner
+#: view:report.stock.inventory:0
+#: field:report.stock.inventory,partner_id:0
+#: view:report.stock.move:0
+#: field:report.stock.move,partner_id:0
+#: view:stock.move:0
+#: field:stock.move,partner_id:0
+#: view:stock.picking:0
#: field:stock.picking,partner_id:0
msgid "Partner"
msgstr "Partner"
#. module: stock
-#: code:addons/stock/stock.py:2119
+#: code:addons/stock/stock.py:2128
#, python-format
msgid ""
"Can not create Journal Entry, Input Account defined on this product and "
@@ -402,11 +429,17 @@ msgstr ""
"Ressourcen des Tages anzuzeigen."
#. module: stock
-#: view:report.stock.inventory:0 field:report.stock.inventory,state:0
-#: view:report.stock.move:0 field:report.stock.move,state:0
-#: view:stock.inventory:0 field:stock.inventory,state:0
-#: field:stock.inventory.line,state:0 view:stock.move:0
-#: field:stock.move,state:0 view:stock.picking:0 field:stock.picking,state:0
+#: view:report.stock.inventory:0
+#: field:report.stock.inventory,state:0
+#: view:report.stock.move:0
+#: field:report.stock.move,state:0
+#: view:stock.inventory:0
+#: field:stock.inventory,state:0
+#: field:stock.inventory.line,state:0
+#: view:stock.move:0
+#: field:stock.move,state:0
+#: view:stock.picking:0
+#: field:stock.picking,state:0
#: report:stock.picking.list:0
msgid "State"
msgstr "Status"
@@ -438,14 +471,19 @@ msgstr "ME"
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0 view:stock.move:0
-#: selection:stock.move,state:0 view:stock.picking:0
-#: view:stock.production.lot:0 field:stock.production.lot,stock_available:0
+#: selection:report.stock.move,state:0
+#: view:stock.move:0
+#: selection:stock.move,state:0
+#: view:stock.picking:0
+#: report:stock.picking.list:0
+#: view:stock.production.lot:0
+#: field:stock.production.lot,stock_available:0
msgid "Available"
msgstr "Verfügbar"
#. module: stock
-#: view:stock.picking:0 field:stock.picking,min_date:0
+#: view:stock.picking:0
+#: field:stock.picking,min_date:0
msgid "Expected Date"
msgstr "Voraussichtliche Lieferung"
@@ -497,12 +535,14 @@ msgstr ""
"Finanzkonto den aktuellen Bestandswert des Produkts."
#. module: stock
-#: field:report.stock.inventory,location_type:0 field:stock.location,usage:0
+#: field:report.stock.inventory,location_type:0
+#: field:stock.location,usage:0
msgid "Location Type"
msgstr "Lagerort Art"
#. module: stock
-#: help:report.stock.move,type:0 help:stock.picking,type:0
+#: help:report.stock.move,type:0
+#: help:stock.picking,type:0
msgid "Shipping type specify, goods coming in or going out."
msgstr "Liefertyp, Wareneingang oder -ausgang"
@@ -522,8 +562,10 @@ msgid "Product Lots Filter"
msgstr "Fertigungslos Filter"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
-#: report:stock.inventory.move:0 report:stock.picking.list:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
+#: report:stock.inventory.move:0
+#: report:stock.picking.list:0
msgid "["
msgstr "["
@@ -542,7 +584,7 @@ msgid "Move History (child moves)"
msgstr "Buchungshistorie (unterg. Buchungen)"
#. module: stock
-#: code:addons/stock/stock.py:2125
+#: code:addons/stock/stock.py:2134
#, python-format
msgid ""
"There is no stock output account defined for this product or its category: "
@@ -569,7 +611,7 @@ msgid "stock.partial.move.line"
msgstr "stock.partial.move.line"
#. module: stock
-#: code:addons/stock/stock.py:760
+#: code:addons/stock/stock.py:766
#, python-format
msgid "You can not process picking without stock moves"
msgstr "Lieferscheine ohne Buchungen können nicht verarbeitet werden."
@@ -586,7 +628,8 @@ msgid "Order(Origin)"
msgstr "Auftragsgrundlage"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
msgid "Grand Total:"
msgstr "Gesamtsumme:"
@@ -610,12 +653,14 @@ msgid "Inventory Control"
msgstr "Bestandsverwaltung"
#. module: stock
-#: view:stock.location:0 field:stock.location,comment:0
+#: view:stock.location:0
+#: field:stock.location,comment:0
msgid "Additional Information"
msgstr "Weitere Informationen"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
msgid "Location / Product"
msgstr "Lagerort / Produkt"
@@ -625,7 +670,7 @@ msgid "Destination Address "
msgstr "Zieladresse "
#. module: stock
-#: code:addons/stock/stock.py:1333
+#: code:addons/stock/stock.py:1342
#, python-format
msgid "Reception"
msgstr "Annahme"
@@ -653,7 +698,8 @@ msgstr ""
"Lagervorgängen oder zu verantwortlichen Lagermitarbeitern."
#. module: stock
-#: field:stock.location,complete_name:0 field:stock.location,name:0
+#: field:stock.location,complete_name:0
+#: field:stock.location,name:0
msgid "Location Name"
msgstr "Lagerort Bezeichnung"
@@ -700,12 +746,13 @@ msgid "Parent Wizard (for existing lines)"
msgstr "Übergeordneter Assistent (für bestehende Positionen)"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Move Information"
msgstr "Warenbewegung Information"
#. module: stock
-#: code:addons/stock/stock.py:2131
+#: code:addons/stock/stock.py:2140
#, python-format
msgid ""
"There is no inventory Valuation account defined on the product category: "
@@ -727,7 +774,8 @@ msgstr "August"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_tracking_form
#: model:ir.model,name:stock.model_stock_tracking
-#: model:ir.ui.menu,name:stock.menu_action_tracking_form view:stock.tracking:0
+#: model:ir.ui.menu,name:stock.menu_action_tracking_form
+#: view:stock.tracking:0
msgid "Packs"
msgstr "Pakete"
@@ -758,7 +806,8 @@ msgstr "Beschaffungslager"
#: model:ir.ui.menu,name:stock.menu_action_production_lot_form
#: field:stock.inventory.line.split,line_exist_ids:0
#: field:stock.inventory.line.split,line_ids:0
-#: field:stock.move.split,line_exist_ids:0 field:stock.move.split,line_ids:0
+#: field:stock.move.split,line_exist_ids:0
+#: field:stock.move.split,line_ids:0
msgid "Production Lots"
msgstr "Fertigungslose"
@@ -806,7 +855,7 @@ msgid "Reference must be unique per Company!"
msgstr "Die Referenz muss je Firma eindeutig sein"
#. module: stock
-#: code:addons/stock/product.py:417
+#: code:addons/stock/product.py:421
#, python-format
msgid "Future Receptions"
msgstr "Zukünftige Wareneingänge"
@@ -838,7 +887,8 @@ msgid "Destination Move"
msgstr "Ziel"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Process Now"
msgstr "Vorgang Fortsetzen"
@@ -911,7 +961,7 @@ msgid "Merge Inventory"
msgstr "Zusammenführung von Inventuren"
#. module: stock
-#: code:addons/stock/product.py:433
+#: code:addons/stock/product.py:437
#, python-format
msgid "Future P&L"
msgstr "Zukünftige G&V"
@@ -920,12 +970,15 @@ msgstr "Zukünftige G&V"
#: view:board.board:0
#: model:ir.actions.act_window,name:stock.action_incoming_product_board
#: model:ir.actions.act_window,name:stock.action_picking_tree4
-#: model:ir.ui.menu,name:stock.menu_action_picking_tree4 view:stock.picking:0
+#: model:ir.ui.menu,name:stock.menu_action_picking_tree4
+#: view:stock.picking:0
msgid "Incoming Shipments"
msgstr "Wareneingang"
#. module: stock
-#: view:report.stock.inventory:0 view:stock.move:0 view:stock.picking:0
+#: view:report.stock.inventory:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Scrap"
msgstr "Ausschuss melden"
@@ -945,7 +998,8 @@ msgid "Incoming"
msgstr "Eingang"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
#: field:stock.move,price_unit:0
msgid "Unit Price"
msgstr "Preis/ME"
@@ -972,12 +1026,13 @@ msgid "Currency"
msgstr "Währung"
#. module: stock
-#: view:stock.picking:0 report:stock.picking.list:0
+#: view:stock.picking:0
+#: report:stock.picking.list:0
msgid "Journal"
msgstr "Journal"
#. module: stock
-#: code:addons/stock/stock.py:1345
+#: code:addons/stock/stock.py:1354
#, python-format
msgid "is scheduled %s."
msgstr "ist geplant %s."
@@ -1024,7 +1079,8 @@ msgstr ""
"Konsignationen verwendet wird."
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
msgid "Month-1"
msgstr "Monat-1"
@@ -1062,7 +1118,8 @@ msgid "View"
msgstr "Ansicht"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
msgid "Last month"
msgstr "Letzter Monat"
@@ -1077,7 +1134,7 @@ msgid "Stock Valuation Account"
msgstr "Lagerbestandskonto"
#. module: stock
-#: code:addons/stock/stock.py:1349
+#: code:addons/stock/stock.py:1358
#, python-format
msgid "is waiting."
msgstr "ist unerledigt"
@@ -1165,7 +1222,7 @@ msgid "Author"
msgstr "Autor"
#. module: stock
-#: code:addons/stock/stock.py:1332
+#: code:addons/stock/stock.py:1341
#, python-format
msgid "Delivery Order"
msgstr "Lieferauftrag"
@@ -1176,12 +1233,13 @@ msgid "Manual Operation"
msgstr "Manuelle Durchführung"
#. module: stock
-#: view:stock.location:0 view:stock.move:0
+#: view:stock.location:0
+#: view:stock.move:0
msgid "Supplier"
msgstr "Lieferant"
#. module: stock
-#: code:addons/stock/stock.py:2727
+#: code:addons/stock/stock.py:2739
#, python-format
msgid ""
"In order to cancel this inventory, you must first unpost related journal "
@@ -1196,7 +1254,7 @@ msgid "Date Done"
msgstr "Erledigt am"
#. module: stock
-#: code:addons/stock/wizard/stock_partial_picking.py:148
+#: code:addons/stock/wizard/stock_partial_picking.py:149
#, python-format
msgid ""
"The uom rounding does not allow you to ship \"%s %s\", only roundings of "
@@ -1224,7 +1282,8 @@ msgstr "März"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_view_stock_inventory_line_split
#: model:ir.model,name:stock.model_stock_inventory_line_split
-#: view:stock.inventory:0 view:stock.inventory.line:0
+#: view:stock.inventory:0
+#: view:stock.inventory.line:0
msgid "Split inventory lines"
msgstr "Aufteilen Inventurposition"
@@ -1260,7 +1319,8 @@ msgstr "Fertigungslosnummer"
#. module: stock
#: field:stock.inventory.line,product_uom:0
-#: field:stock.move.consume,product_uom:0 field:stock.move.scrap,product_uom:0
+#: field:stock.move.consume,product_uom:0
+#: field:stock.move.scrap,product_uom:0
msgid "Product UOM"
msgstr "Produkt ME"
@@ -1270,12 +1330,14 @@ msgid "Partner Locations"
msgstr "Lagerort beim Partner"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
msgid "Current year"
msgstr "Aktuelles Jahr"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
msgid "Total quantity"
msgstr "Gesamtmenge"
@@ -1329,6 +1391,7 @@ msgstr "Lieferauftrag:"
#. module: stock
#: selection:stock.move,state:0
+#: report:stock.picking.list:0
msgid "Waiting Another Move"
msgstr "Erwarte eine andere Buchung"
@@ -1357,7 +1420,7 @@ msgstr ""
"(wenn Durschnittspreisbewertung gewählt ist)"
#. module: stock
-#: code:addons/stock/stock.py:1350
+#: code:addons/stock/stock.py:1359
#, python-format
msgid "is in draft state."
msgstr "ist im Entwurf..."
@@ -1383,16 +1446,24 @@ msgid "Shop 1"
msgstr "Shop 1"
#. module: stock
-#: view:stock.change.product.qty:0 view:stock.change.standard.price:0
-#: view:stock.fill.inventory:0 view:stock.inventory.merge:0
-#: view:stock.invoice.onshipping:0 view:stock.location.product:0
-#: view:stock.move:0 view:stock.partial.move:0 view:stock.partial.picking:0
-#: view:stock.picking:0 view:stock.return.picking:0 view:stock.split.into:0
+#: view:stock.change.product.qty:0
+#: view:stock.change.standard.price:0
+#: view:stock.fill.inventory:0
+#: view:stock.inventory.merge:0
+#: view:stock.invoice.onshipping:0
+#: view:stock.location.product:0
+#: view:stock.move:0
+#: view:stock.partial.move:0
+#: view:stock.partial.picking:0
+#: view:stock.picking:0
+#: view:stock.return.picking:0
+#: view:stock.split.into:0
msgid "_Cancel"
msgstr "Abbruch"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Ready"
msgstr "Verfügbar"
@@ -1432,7 +1503,8 @@ msgstr ""
"erstellt werden"
#. module: stock
-#: view:stock.picking:0 field:stock.picking,invoice_state:0
+#: view:stock.picking:0
+#: field:stock.picking,invoice_state:0
msgid "Invoice Control"
msgstr "Rechnungskontrolle"
@@ -1448,12 +1520,14 @@ msgstr "Interne Lieferauftragsliste"
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0 view:stock.picking:0
+#: selection:report.stock.move,state:0
+#: view:stock.picking:0
msgid "Waiting"
msgstr "Warteliste"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Split"
msgstr "Aufteilen"
@@ -1508,8 +1582,10 @@ msgid "Picking List:"
msgstr "Packauftrag:"
#. module: stock
-#: field:stock.inventory,date:0 field:stock.move,create_date:0
-#: field:stock.production.lot,date:0 field:stock.tracking,date:0
+#: field:stock.inventory,date:0
+#: field:stock.move,create_date:0
+#: field:stock.production.lot,date:0
+#: field:stock.tracking,date:0
msgid "Creation Date"
msgstr "Erzeugt am"
@@ -1524,7 +1600,8 @@ msgid "Address of customer or supplier."
msgstr "Kunden- oder Lieferantenadresse"
#. module: stock
-#: view:report.stock.move:0 field:report.stock.move,picking_id:0
+#: view:report.stock.move:0
+#: field:report.stock.move,picking_id:0
msgid "Packing"
msgstr "Lieferauftrag"
@@ -1536,7 +1613,7 @@ msgid "Customer Location"
msgstr "Kundenlagerort"
#. module: stock
-#: code:addons/stock/stock.py:2312
+#: code:addons/stock/stock.py:2321
#, python-format
msgid "You can only delete draft moves."
msgstr "Sie können lediglich Warenbewegungen im Entwurf (Status) löschen."
@@ -1563,7 +1640,8 @@ msgid "Analysis including future moves (similar to virtual stock)"
msgstr "Analyse mit zukünftigen Buchungen"
#. module: stock
-#: model:ir.actions.act_window,name:stock.action3 view:stock.tracking:0
+#: model:ir.actions.act_window,name:stock.action3
+#: view:stock.tracking:0
msgid "Downstream traceability"
msgstr "Auswertung Rückverfolgung"
@@ -1587,7 +1665,9 @@ msgstr ""
"löschen."
#. module: stock
-#: view:stock.move:0 view:stock.picking:0 field:stock.picking,date:0
+#: view:stock.move:0
+#: view:stock.picking:0
+#: field:stock.picking,date:0
msgid "Order Date"
msgstr "Auftragsdatum"
@@ -1598,7 +1678,8 @@ msgid "INV: %s"
msgstr "INV: %s"
#. module: stock
-#: view:stock.location:0 field:stock.location,location_id:0
+#: view:stock.location:0
+#: field:stock.location,location_id:0
msgid "Parent Location"
msgstr "Hauptlagerort"
@@ -1630,7 +1711,7 @@ msgid "Let this field empty if this location is shared between all companies"
msgstr "Leer lassen, wenn dieses Feld für alle Unternehmen Güligkeit hat."
#. module: stock
-#: code:addons/stock/stock.py:2337
+#: code:addons/stock/stock.py:2346
#, python-format
msgid "Please provide a positive quantity to scrap!"
msgstr "Geben Sie bitte eine positive Menge als Ausschuss ein"
@@ -1683,7 +1764,7 @@ msgid "Supplier Location"
msgstr "Lieferantenlagerort"
#. module: stock
-#: code:addons/stock/stock.py:2358
+#: code:addons/stock/stock.py:2367
#, python-format
msgid "were scrapped"
msgstr "wurde als Ausschuss gemeldet"
@@ -1737,8 +1818,11 @@ msgstr "Lagerbewertungskonto (Ausgehend)"
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_open
#: model:ir.actions.act_window,name:stock.action_move_form2
-#: model:ir.ui.menu,name:stock.menu_action_move_form2 view:stock.inventory:0
-#: view:stock.move:0 view:stock.picking:0 view:stock.production.lot:0
+#: model:ir.ui.menu,name:stock.menu_action_move_form2
+#: view:stock.inventory:0
+#: view:stock.move:0
+#: view:stock.picking:0
+#: view:stock.production.lot:0
#: view:stock.tracking:0
msgid "Stock Moves"
msgstr "Lieferaufträge"
@@ -1791,7 +1875,8 @@ msgid "Back Orders"
msgstr "Auftragsrückstand"
#. module: stock
-#: view:product.product:0 view:product.template:0
+#: view:product.product:0
+#: view:product.template:0
msgid "Counter-Part Locations Properties"
msgstr "Gegenposition Lagerorte Eigenschaften"
@@ -1801,14 +1886,15 @@ msgid "Localization"
msgstr "Standort Lager"
#. module: stock
-#: code:addons/stock/product.py:429
+#: code:addons/stock/product.py:433
#, python-format
msgid "Delivered Qty"
msgstr "Liefermenge"
#. module: stock
#: model:ir.actions.act_window,name:stock.track_line
-#: view:stock.inventory.line.split:0 view:stock.move.split:0
+#: view:stock.inventory.line.split:0
+#: view:stock.move.split:0
msgid "Split in lots"
msgstr "Teile in Lose"
@@ -1836,16 +1922,22 @@ msgid "Day Planned"
msgstr "Geplantes Datum"
#. module: stock
-#: view:report.stock.inventory:0 field:report.stock.inventory,date:0
-#: field:report.stock.move,date:0 view:stock.inventory:0
-#: report:stock.inventory.move:0 view:stock.move:0 field:stock.move,date:0
-#: field:stock.partial.move,date:0 field:stock.partial.picking,date:0
+#: view:report.stock.inventory:0
+#: field:report.stock.inventory,date:0
+#: field:report.stock.move,date:0
+#: view:stock.inventory:0
+#: report:stock.inventory.move:0
+#: view:stock.move:0
+#: field:stock.move,date:0
+#: field:stock.partial.move,date:0
+#: field:stock.partial.picking,date:0
#: view:stock.picking:0
msgid "Date"
msgstr "Datum"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
msgid "Extended Filters..."
msgstr "Erweiterter Filter..."
@@ -1868,7 +1960,7 @@ msgstr "Pinnwand Lagerwirtschaft"
#. module: stock
#: field:stock.incoterms,code:0
msgid "Code"
-msgstr "Kurzbezeichnung"
+msgstr "Kurzbez."
#. module: stock
#: view:stock.inventory.line.split:0
@@ -1882,26 +1974,31 @@ msgid "Warehouse Dashboard"
msgstr "Pinnwand Lager"
#. module: stock
-#: code:addons/stock/stock.py:513
+#: code:addons/stock/stock.py:519
#, python-format
msgid "You can not remove a lot line !"
msgstr "Sie können keine Position aus dem Los entfernen!"
#. module: stock
-#: model:ir.model,name:stock.model_stock_move_scrap view:stock.move:0
-#: view:stock.move.scrap:0 view:stock.picking:0
+#: model:ir.model,name:stock.model_stock_move_scrap
+#: view:stock.move:0
+#: view:stock.move.scrap:0
+#: view:stock.picking:0
msgid "Scrap Products"
msgstr "Ausschuss buchen"
#. module: stock
-#: code:addons/stock/stock.py:1157
+#: code:addons/stock/stock.py:1166
#, python-format
msgid "You cannot remove the picking which is in %s state !"
msgstr "Ein Lieferschein mit Status %s kann nicht entfernt werden."
#. module: stock
-#: view:stock.inventory.line.split:0 view:stock.move.consume:0
-#: view:stock.move.scrap:0 view:stock.move.split:0 view:stock.picking:0
+#: view:stock.inventory.line.split:0
+#: view:stock.move.consume:0
+#: view:stock.move.scrap:0
+#: view:stock.move.split:0
+#: view:stock.picking:0
msgid "Cancel"
msgstr "Abbrechen"
@@ -1912,22 +2009,29 @@ msgid "Return Picking"
msgstr "Rücklieferschein"
#. module: stock
-#: view:stock.inventory:0 view:stock.move:0 view:stock.picking:0
+#: view:stock.inventory:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Split in production lots"
msgstr "Aufteilen Fertigungsauftrag"
#. module: stock
#: model:ir.model,name:stock.model_stock_location
-#: field:product.product,location_id:0 view:report.stock.inventory:0
+#: field:product.product,location_id:0
+#: view:report.stock.inventory:0
#: field:report.stock.inventory,location_id:0
#: field:stock.change.product.qty,location_id:0
#: field:stock.fill.inventory,location_id:0
-#: field:stock.inventory.line,location_id:0 report:stock.inventory.move:0
-#: view:stock.location:0 view:stock.move:0
-#: field:stock.move.consume,location_id:0 field:stock.move.scrap,location_id:0
+#: field:stock.inventory.line,location_id:0
+#: report:stock.inventory.move:0
+#: view:stock.location:0
+#: view:stock.move:0
+#: field:stock.move.consume,location_id:0
+#: field:stock.move.scrap,location_id:0
#: field:stock.partial.move.line,location_id:0
#: field:stock.partial.picking.line,location_id:0
-#: field:stock.picking,location_id:0 report:stock.picking.list:0
+#: field:stock.picking,location_id:0
+#: report:stock.picking.list:0
#: field:stock.report.prodlots,location_id:0
#: field:stock.report.tracklots,location_id:0
msgid "Location"
@@ -1970,7 +2074,8 @@ msgid "Cost Price"
msgstr "Herstellungskosten"
#. module: stock
-#: view:product.product:0 field:product.product,valuation:0
+#: view:product.product:0
+#: field:product.product,valuation:0
msgid "Inventory Valuation"
msgstr "Inventur Bewertung"
@@ -1980,7 +2085,8 @@ msgid "Orders planned for today"
msgstr "Für heute geplante Aufträge"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Process Later"
msgstr "Ware ist Verfügbar"
@@ -2012,7 +2118,7 @@ msgstr ""
"die Produktivität in Ihrem Lager analysieren wollen."
#. module: stock
-#: code:addons/stock/stock.py:2116
+#: code:addons/stock/stock.py:2125
#, python-format
msgid ""
"Can not create Journal Entry, Output Account defined on this product and "
@@ -2047,7 +2153,7 @@ msgid "Stock report by tracking lots"
msgstr "Bestand nach Paketnummern"
#. module: stock
-#: code:addons/stock/stock.py:2122
+#: code:addons/stock/stock.py:2131
#, python-format
msgid ""
"There is no stock input account defined for this product or its category: "
@@ -2057,7 +2163,7 @@ msgstr ""
"\"%s\" (id: %d)"
#. module: stock
-#: code:addons/stock/product.py:419
+#: code:addons/stock/product.py:423
#, python-format
msgid "Received Qty"
msgstr "Angenommene Menge"
@@ -2082,7 +2188,8 @@ msgid "Import Inventory"
msgstr "Importiere Inventur"
#. module: stock
-#: field:stock.incoterms,name:0 field:stock.move,name:0
+#: field:stock.incoterms,name:0
+#: field:stock.move,name:0
#: field:stock.warehouse,name:0
msgid "Name"
msgstr "Bezeichnung"
@@ -2133,13 +2240,16 @@ msgid "Customer Locations"
msgstr "Kunden Lagerort"
#. module: stock
-#: view:stock.change.product.qty:0 view:stock.change.standard.price:0
+#: view:stock.change.product.qty:0
+#: view:stock.change.standard.price:0
msgid "_Apply"
msgstr "_Anwenden"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
-#: report:stock.inventory.move:0 report:stock.picking.list:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
+#: report:stock.inventory.move:0
+#: report:stock.picking.list:0
msgid "]"
msgstr "]"
@@ -2149,7 +2259,8 @@ msgid "Inventory Location"
msgstr "Lagerort Bestandsaufnahme"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
msgid "Total value"
msgstr "Gesamt Wert"
@@ -2223,8 +2334,11 @@ msgstr ""
"das aktuelle Durchführungsdatum"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
-#: view:stock.inventory:0 view:stock.move:0 view:stock.picking:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
+#: view:stock.inventory:0
+#: view:stock.move:0
+#: view:stock.picking:0
#: view:stock.production.lot:0
msgid "Group By..."
msgstr "Gruppierung..."
@@ -2240,7 +2354,7 @@ msgid "Inventory loss"
msgstr "Bestandsaufnahme"
#. module: stock
-#: code:addons/stock/stock.py:1341
+#: code:addons/stock/stock.py:1350
#, python-format
msgid "Document"
msgstr "Dokument"
@@ -2251,7 +2365,8 @@ msgid "Input Picking List"
msgstr "Eingangslieferscheine"
#. module: stock
-#: field:stock.move,product_uom:0 field:stock.partial.move.line,product_uom:0
+#: field:stock.move,product_uom:0
+#: field:stock.partial.move.line,product_uom:0
#: field:stock.partial.picking.line,product_uom:0
msgid "Unit of Measure"
msgstr "ME"
@@ -2320,23 +2435,27 @@ msgid "Warehouse board"
msgstr "Pinnwand Lagerwirtschaft"
#. module: stock
-#: code:addons/stock/product.py:439
+#: code:addons/stock/product.py:443
#, python-format
msgid "Future Qty"
msgstr "Zukünftige Menge"
#. module: stock
-#: field:stock.move,note:0 view:stock.picking:0 field:stock.picking,note:0
+#: field:stock.move,note:0
+#: view:stock.picking:0
+#: field:stock.picking,note:0
msgid "Notes"
msgstr "Bemerkungen"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
msgid "Value"
msgstr "Wert"
#. module: stock
-#: field:report.stock.move,type:0 field:stock.location,chained_picking_type:0
+#: field:report.stock.move,type:0
+#: field:stock.location,chained_picking_type:0
#: field:stock.picking,type:0
msgid "Shipping Type"
msgstr "Liefertyp"
@@ -2350,8 +2469,11 @@ msgstr "Lagerbuchungen bestätigt,verfügbar, wartend"
#: model:ir.actions.act_window,name:stock.act_product_location_open
#: model:ir.ui.menu,name:stock.menu_product_in_config_stock
#: model:ir.ui.menu,name:stock.menu_stock_product
-#: model:ir.ui.menu,name:stock.menu_stock_products_menu view:stock.inventory:0
-#: view:stock.partial.move:0 view:stock.partial.picking:0 view:stock.picking:0
+#: model:ir.ui.menu,name:stock.menu_stock_products_menu
+#: view:stock.inventory:0
+#: view:stock.partial.move:0
+#: view:stock.partial.picking:0
+#: view:stock.picking:0
msgid "Products"
msgstr "Produkte"
@@ -2372,7 +2494,8 @@ msgstr "Auslieferungsmethode"
#. module: stock
#: help:report.stock.move,location_dest_id:0
-#: help:stock.move,location_dest_id:0 help:stock.picking,location_dest_id:0
+#: help:stock.move,location_dest_id:0
+#: help:stock.picking,location_dest_id:0
msgid "Location where the system will stock the finished products."
msgstr "Lagerort, wo das System die Fertigprodukte lagert."
@@ -2415,7 +2538,7 @@ msgid "Delay(Days)"
msgstr "Verzögerung(Tage)"
#. module: stock
-#: code:addons/stock/stock.py:1697
+#: code:addons/stock/stock.py:1706
#, python-format
msgid "Operation forbidden"
msgstr "Vorgang verboten"
@@ -2426,7 +2549,7 @@ msgid "Expected date for the picking to be processed"
msgstr "Geplantes Verarbeitungsdatum für die Lieferung"
#. module: stock
-#: code:addons/stock/product.py:435
+#: code:addons/stock/product.py:439
#, python-format
msgid "P&L Qty"
msgstr "Anzahl"
@@ -2437,7 +2560,8 @@ msgid "Internal Pickings to invoice"
msgstr "zu fakturierende interne Lieferungen"
#. module: stock
-#: view:stock.production.lot:0 field:stock.production.lot,revisions:0
+#: view:stock.production.lot:0
+#: field:stock.production.lot,revisions:0
msgid "Revisions"
msgstr "Revisionen"
@@ -2476,7 +2600,8 @@ msgstr ""
"Kriterien, um Ihre Analyse exakt auf Ihren Bedarf auszurichten."
#. module: stock
-#: help:report.stock.move,location_id:0 help:stock.move,location_id:0
+#: help:report.stock.move,location_id:0
+#: help:stock.move,location_id:0
msgid ""
"Sets a location if you produce at a fixed location. This can be a partner "
"location if you subcontract the manufacturing operations."
@@ -2515,7 +2640,8 @@ msgid "Create"
msgstr "Erstellen"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Dates"
msgstr "Datumsangaben"
@@ -2532,7 +2658,8 @@ msgstr "Quelle"
#. module: stock
#: model:ir.model,name:stock.model_stock_inventory
#: selection:report.stock.inventory,location_type:0
-#: field:stock.inventory.line,inventory_id:0 report:stock.inventory.move:0
+#: field:stock.inventory.line,inventory_id:0
+#: report:stock.inventory.move:0
#: selection:stock.location,usage:0
msgid "Inventory"
msgstr "Lagerbestand"
@@ -2547,7 +2674,7 @@ msgstr "Lieferschein"
msgid ""
"The combination of serial number and internal reference must be unique !"
msgstr ""
-"Die Kombination von Serinenummer und interner Referenz muss eindeutig sein."
+"Die Kombination von Seriennummer und interner Referenz muss eindeutig sein."
#. module: stock
#: view:stock.inventory:0
@@ -2556,7 +2683,8 @@ msgstr "Bestandsaufnahme Abbrechen"
#. module: stock
#: code:addons/stock/report/report_stock.py:78
-#: code:addons/stock/report/report_stock.py:135 code:addons/stock/stock.py:760
+#: code:addons/stock/report/report_stock.py:135
+#: code:addons/stock/stock.py:766
#, python-format
msgid "Error !"
msgstr "Fehler !"
@@ -2573,7 +2701,7 @@ msgid "Fixed Location"
msgstr "Fester Lagerort"
#. module: stock
-#: code:addons/stock/stock.py:2486
+#: code:addons/stock/stock.py:2492
#, python-format
msgid "Product '%s' is consumed with '%s' quantity."
msgstr "Produkt '%s' Verbracuhsmenge '%s' ."
@@ -2625,14 +2753,19 @@ msgid "opening"
msgstr "Öffnen"
#. module: stock
+#: code:addons/stock/report/stock_graph.py:36
+#: code:addons/stock/report/stock_graph.py:104
#: model:ir.actions.report.xml,name:stock.report_product_history
+#, python-format
msgid "Stock Level Forecast"
msgstr "Bestandsvorschau"
#. module: stock
#: model:ir.model,name:stock.model_stock_journal
-#: field:report.stock.move,stock_journal:0 view:stock.journal:0
-#: field:stock.journal,name:0 field:stock.picking,stock_journal_id:0
+#: field:report.stock.move,stock_journal:0
+#: view:stock.journal:0
+#: field:stock.journal,name:0
+#: field:stock.picking,stock_journal_id:0
msgid "Stock Journal"
msgstr "Lager Journal"
@@ -2660,13 +2793,15 @@ msgid "Force Availability"
msgstr "Erzwinge Verfügbarkeit"
#. module: stock
-#: model:ir.actions.act_window,name:stock.move_scrap view:stock.move.scrap:0
+#: model:ir.actions.act_window,name:stock.move_scrap
+#: view:stock.move.scrap:0
msgid "Scrap Move"
msgstr "Buchung Ausschuss"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_reception_picking_move
-#: model:ir.ui.menu,name:stock.menu_action_pdct_in view:stock.move:0
+#: model:ir.ui.menu,name:stock.menu_action_pdct_in
+#: view:stock.move:0
msgid "Receive Products"
msgstr "Produktzugänge"
@@ -2682,7 +2817,8 @@ msgid "View Stock of Products"
msgstr "Zeige Lagerorte der Produkte"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
#: field:report.stock.move,month:0
msgid "Month"
msgstr "Monat"
@@ -2734,18 +2870,24 @@ msgid "Todo"
msgstr "Zu erledigen"
#. module: stock
-#: view:report.stock.inventory:0 field:report.stock.inventory,company_id:0
-#: view:report.stock.move:0 field:report.stock.move,company_id:0
-#: field:stock.inventory,company_id:0 field:stock.inventory.line,company_id:0
-#: field:stock.location,company_id:0 field:stock.move,company_id:0
-#: field:stock.picking,company_id:0 field:stock.production.lot,company_id:0
+#: view:report.stock.inventory:0
+#: field:report.stock.inventory,company_id:0
+#: view:report.stock.move:0
+#: field:report.stock.move,company_id:0
+#: field:stock.inventory,company_id:0
+#: field:stock.inventory.line,company_id:0
+#: field:stock.location,company_id:0
+#: field:stock.move,company_id:0
+#: field:stock.picking,company_id:0
+#: field:stock.production.lot,company_id:0
#: field:stock.production.lot.revision,company_id:0
#: field:stock.warehouse,company_id:0
msgid "Company"
msgstr "Unternehmen"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Unit Of Measure"
msgstr "ME"
@@ -2759,7 +2901,7 @@ msgstr ""
"definiert: \"%s\" (id: %d)"
#. module: stock
-#: code:addons/stock/stock.py:2445
+#: code:addons/stock/stock.py:2454
#, python-format
msgid "Can not consume a move with negative or zero quantity !"
msgstr ""
@@ -2790,8 +2932,10 @@ msgid "Delivery Counter"
msgstr "Versand Schalter"
#. module: stock
-#: view:report.stock.inventory:0 field:report.stock.inventory,prodlot_id:0
-#: view:stock.move:0 report:stock.picking.list:0
+#: view:report.stock.inventory:0
+#: field:report.stock.inventory,prodlot_id:0
+#: view:stock.move:0
+#: report:stock.picking.list:0
msgid "Lot"
msgstr "Fertigungslos"
@@ -2801,7 +2945,7 @@ msgid "Production Lot Number"
msgstr "Produktionslosnummer"
#. module: stock
-#: code:addons/stock/stock.py:2697
+#: code:addons/stock/stock.py:2709
#, python-format
msgid "Inventory '%s' is done."
msgstr "Inventur '%s' is erledigt."
@@ -2812,7 +2956,7 @@ msgid "Quantity (UOS)"
msgstr "Menge (VE)"
#. module: stock
-#: code:addons/stock/stock.py:1743
+#: code:addons/stock/stock.py:1752
#, python-format
msgid ""
"You are moving %.2f %s products but only %.2f %s available in this lot."
@@ -2836,7 +2980,8 @@ msgid "Back Order"
msgstr "Auftragsrückstand"
#. module: stock
-#: field:stock.incoterms,active:0 field:stock.location,active:0
+#: field:stock.incoterms,active:0
+#: field:stock.location,active:0
#: field:stock.tracking,active:0
msgid "Active"
msgstr "Aktiv"
@@ -2847,7 +2992,7 @@ msgid "Properties"
msgstr "Eigenschaften"
#. module: stock
-#: code:addons/stock/stock.py:1082
+#: code:addons/stock/stock.py:1088
#, python-format
msgid "Error, no partner !"
msgstr "Fehler, kein Partner!"
@@ -2873,7 +3018,8 @@ msgid "stock.partial.picking.line"
msgstr "stock.partial.picking.line"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
#: report:stock.inventory.move:0
msgid "Total:"
msgstr "Gesamt:"
@@ -2903,7 +3049,7 @@ msgid "Inventory Reference"
msgstr "Inventurauftrag"
#. module: stock
-#: code:addons/stock/stock.py:1334
+#: code:addons/stock/stock.py:1343
#, python-format
msgid "Internal picking"
msgstr "Interne Buchung"
@@ -2919,7 +3065,8 @@ msgid "To"
msgstr "An"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Process"
msgstr "Bestätigen"
@@ -2931,7 +3078,8 @@ msgstr "Revisions Name"
#. module: stock
#: model:ir.model,name:stock.model_stock_warehouse
#: model:ir.ui.menu,name:stock.menu_stock_root
-#: field:product.product,warehouse_id:0 view:stock.warehouse:0
+#: field:product.product,warehouse_id:0
+#: view:stock.warehouse:0
msgid "Warehouse"
msgstr "Lager"
@@ -2951,10 +3099,15 @@ msgid "Customers Packings"
msgstr "Kunden Lieferaufträge"
#. module: stock
-#: selection:report.stock.inventory,state:0 view:report.stock.move:0
-#: selection:report.stock.move,state:0 selection:stock.inventory,state:0
-#: view:stock.move:0 selection:stock.move,state:0 view:stock.picking:0
+#: selection:report.stock.inventory,state:0
+#: view:report.stock.move:0
+#: selection:report.stock.move,state:0
+#: selection:stock.inventory,state:0
+#: view:stock.move:0
+#: selection:stock.move,state:0
+#: view:stock.picking:0
#: selection:stock.picking,state:0
+#: report:stock.picking.list:0
msgid "Done"
msgstr "Erledigt"
@@ -2981,7 +3134,7 @@ msgid "Date done"
msgstr "Datum erledigt"
#. module: stock
-#: code:addons/stock/stock.py:1083
+#: code:addons/stock/stock.py:1089
#, python-format
msgid ""
"Please put a partner on the picking list if you want to generate invoice."
@@ -3025,17 +3178,23 @@ msgstr "Lager"
#. module: stock
#: model:ir.model,name:stock.model_product_product
-#: view:report.stock.inventory:0 field:report.stock.inventory,product_id:0
-#: field:report.stock.lines.date,product_id:0 view:report.stock.move:0
+#: view:report.stock.inventory:0
+#: field:report.stock.inventory,product_id:0
+#: field:report.stock.lines.date,product_id:0
+#: view:report.stock.move:0
#: field:report.stock.move,product_id:0
#: field:stock.change.product.qty,product_id:0
#: field:stock.inventory.line,product_id:0
-#: field:stock.inventory.line.split,product_id:0 report:stock.inventory.move:0
-#: view:stock.move:0 field:stock.move,product_id:0
-#: field:stock.move.consume,product_id:0 field:stock.move.scrap,product_id:0
+#: field:stock.inventory.line.split,product_id:0
+#: report:stock.inventory.move:0
+#: view:stock.move:0
+#: field:stock.move,product_id:0
+#: field:stock.move.consume,product_id:0
+#: field:stock.move.scrap,product_id:0
#: field:stock.move.split,product_id:0
#: field:stock.partial.move.line,product_id:0
-#: field:stock.partial.picking.line,product_id:0 view:stock.production.lot:0
+#: field:stock.partial.picking.line,product_id:0
+#: view:stock.production.lot:0
#: field:stock.production.lot,product_id:0
#: field:stock.report.prodlots,product_id:0
#: field:stock.report.tracklots,product_id:0
@@ -3059,8 +3218,9 @@ msgid "Assigned Internal Moves"
msgstr "Zugeordnete Interne Buchungen"
#. module: stock
-#: code:addons/stock/stock.py:2379 code:addons/stock/stock.py:2440
-#: code:addons/stock/wizard/stock_partial_picking.py:141
+#: code:addons/stock/stock.py:2388
+#: code:addons/stock/stock.py:2449
+#: code:addons/stock/wizard/stock_partial_picking.py:142
#, python-format
msgid "Please provide Proper Quantity !"
msgstr "Bitte eine richtige Menge angeben!"
@@ -3082,7 +3242,7 @@ msgid "Consume Products"
msgstr "Verbrauche Produkte"
#. module: stock
-#: code:addons/stock/stock.py:1742
+#: code:addons/stock/stock.py:1751
#, python-format
msgid "Insufficient Stock in Lot !"
msgstr "Fehlerhafter Bestand bei Fertigungslos !"
@@ -3098,7 +3258,8 @@ msgid "Address"
msgstr "Adresse"
#. module: stock
-#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0
+#: report:lot.stock.overview_all:0
msgid "Variants"
msgstr "Varianten"
@@ -3113,7 +3274,8 @@ msgid "Suppliers"
msgstr "Lieferanten"
#. module: stock
-#: field:report.stock.inventory,value:0 field:report.stock.move,value:0
+#: field:report.stock.inventory,value:0
+#: field:report.stock.move,value:0
msgid "Total Value"
msgstr "Gesamt Wert"
@@ -3195,9 +3357,11 @@ msgid "Pack Reference"
msgstr "Paket Referenz"
#. module: stock
-#: view:report.stock.move:0 field:report.stock.move,location_id:0
+#: view:report.stock.move:0
+#: field:report.stock.move,location_id:0
#: field:stock.inventory.line.split,location_id:0
-#: field:stock.move,location_id:0 field:stock.move.split,location_id:0
+#: field:stock.move,location_id:0
+#: field:stock.move.split,location_id:0
msgid "Source Location"
msgstr "Quelle"
@@ -3237,7 +3401,8 @@ msgid "Virtual Stock Value"
msgstr "Wert errechneter Bestand"
#. module: stock
-#: view:product.product:0 view:stock.inventory.line.split:0
+#: view:product.product:0
+#: view:stock.inventory.line.split:0
#: view:stock.move.split:0
msgid "Lots"
msgstr "Fertigungslose"
@@ -3258,7 +3423,7 @@ msgid "All at once"
msgstr "Nur Gesamtmengen liefern"
#. module: stock
-#: code:addons/stock/stock.py:1698
+#: code:addons/stock/stock.py:1707
#, python-format
msgid ""
"Quantities, UoMs, Products and Locations cannot be modified on stock moves "
@@ -3268,7 +3433,7 @@ msgstr ""
"modifiziert werden, die bereits durchgeführt wurden."
#. module: stock
-#: code:addons/stock/product.py:445
+#: code:addons/stock/product.py:449
#, python-format
msgid "Future Productions"
msgstr "Zukünftige Produktionen"
@@ -3305,7 +3470,8 @@ msgid "Moves for this production lot"
msgstr "Buchungen für diese Produktionslos"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Put in current pack"
msgstr "Lade in dieses Paket"
@@ -3353,7 +3519,8 @@ msgid "Icon"
msgstr "Icon"
#. module: stock
-#: code:addons/stock/stock.py:2311 code:addons/stock/stock.py:2726
+#: code:addons/stock/stock.py:2320
+#: code:addons/stock/stock.py:2738
#, python-format
msgid "UserError"
msgstr "BenutzerFehler"
@@ -3367,8 +3534,11 @@ msgid "Tracking"
msgstr "Seriennummer"
#. module: stock
-#: view:stock.inventory.line.split:0 view:stock.move.consume:0
-#: view:stock.move.scrap:0 view:stock.move.split:0 view:stock.split.into:0
+#: view:stock.inventory.line.split:0
+#: view:stock.move.consume:0
+#: view:stock.move.scrap:0
+#: view:stock.move.split:0
+#: view:stock.split.into:0
msgid "Ok"
msgstr "OK"
@@ -3392,13 +3562,19 @@ msgid "Non European Customers"
msgstr "Kunden ausserhalb Europas"
#. module: stock
-#: code:addons/stock/product.py:75 code:addons/stock/product.py:89
-#: code:addons/stock/product.py:92 code:addons/stock/product.py:99
-#: code:addons/stock/product.py:120 code:addons/stock/product.py:146
-#: code:addons/stock/stock.py:2116 code:addons/stock/stock.py:2119
-#: code:addons/stock/stock.py:2122 code:addons/stock/stock.py:2125
-#: code:addons/stock/stock.py:2128 code:addons/stock/stock.py:2131
-#: code:addons/stock/stock.py:2445
+#: code:addons/stock/product.py:75
+#: code:addons/stock/product.py:89
+#: code:addons/stock/product.py:92
+#: code:addons/stock/product.py:99
+#: code:addons/stock/product.py:120
+#: code:addons/stock/product.py:146
+#: code:addons/stock/stock.py:2125
+#: code:addons/stock/stock.py:2128
+#: code:addons/stock/stock.py:2131
+#: code:addons/stock/stock.py:2134
+#: code:addons/stock/stock.py:2137
+#: code:addons/stock/stock.py:2140
+#: code:addons/stock/stock.py:2454
#: code:addons/stock/wizard/stock_fill_inventory.py:47
#: code:addons/stock/wizard/stock_splitinto.py:49
#: code:addons/stock/wizard/stock_splitinto.py:53
@@ -3413,8 +3589,10 @@ msgstr "Wollen Sie diese Bestandsaufnahmen zusammenfassen?"
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0 selection:stock.inventory,state:0
-#: selection:stock.move,state:0 selection:stock.picking,state:0
+#: selection:report.stock.move,state:0
+#: selection:stock.inventory,state:0
+#: selection:stock.move,state:0
+#: selection:stock.picking,state:0
msgid "Cancelled"
msgstr "Abgebrochen"
@@ -3424,7 +3602,8 @@ msgid "Confirmed Delivery Orders"
msgstr "Bestätigte Auslieferungsaufträge"
#. module: stock
-#: view:stock.move:0 field:stock.partial.move,picking_id:0
+#: view:stock.move:0
+#: field:stock.partial.move,picking_id:0
#: field:stock.partial.picking,picking_id:0
msgid "Picking"
msgstr "Lieferschein"
@@ -3477,14 +3656,14 @@ msgstr ""
#. module: stock
#: code:addons/stock/wizard/stock_inventory_merge.py:43
#: code:addons/stock/wizard/stock_inventory_merge.py:63
-#: code:addons/stock/wizard/stock_partial_picking.py:148
-#: code:addons/stock/wizard/stock_partial_picking.py:159
+#: code:addons/stock/wizard/stock_partial_picking.py:149
+#: code:addons/stock/wizard/stock_partial_picking.py:160
#, python-format
msgid "Warning"
msgstr "Warnung"
#. module: stock
-#: code:addons/stock/stock.py:1348
+#: code:addons/stock/stock.py:1357
#, python-format
msgid "is done."
msgstr "ist erledigt"
@@ -3498,7 +3677,8 @@ msgstr "Korrekturdatum"
#: view:board.board:0
#: model:ir.actions.act_window,name:stock.action_outgoing_product_board
#: model:ir.actions.act_window,name:stock.action_picking_tree
-#: model:ir.ui.menu,name:stock.menu_action_picking_tree view:stock.picking:0
+#: model:ir.ui.menu,name:stock.menu_action_picking_tree
+#: view:stock.picking:0
msgid "Delivery Orders"
msgstr "Warenauslieferung"
@@ -3518,7 +3698,8 @@ msgstr ""
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0 selection:stock.inventory,state:0
+#: selection:report.stock.move,state:0
+#: selection:stock.inventory,state:0
#: view:stock.picking:0
msgid "Confirmed"
msgstr "Bestätigt"
@@ -3574,19 +3755,23 @@ msgid "Total outgoing quantity"
msgstr "Gesamte Warenausgangsmenge"
#. module: stock
-#: selection:stock.move,state:0 selection:stock.picking,state:0
+#: selection:stock.move,state:0
+#: selection:stock.picking,state:0
+#: report:stock.picking.list:0
msgid "New"
msgstr "Neu"
#. module: stock
-#: help:stock.partial.move.line,cost:0 help:stock.partial.picking.line,cost:0
+#: help:stock.partial.move.line,cost:0
+#: help:stock.partial.picking.line,cost:0
msgid "Unit Cost for this product line"
msgstr "Stückkosten für diese Produktlinie"
#. module: stock
#: model:ir.model,name:stock.model_product_category
#: view:report.stock.inventory:0
-#: field:report.stock.inventory,product_categ_id:0 view:report.stock.move:0
+#: field:report.stock.inventory,product_categ_id:0
+#: view:report.stock.move:0
#: field:report.stock.move,categ_id:0
msgid "Product Category"
msgstr "Produktkategorie"
@@ -3597,7 +3782,7 @@ msgid "Reporting"
msgstr "Berichtswesen"
#. module: stock
-#: code:addons/stock/stock.py:1343
+#: code:addons/stock/stock.py:1352
#, python-format
msgid " for the "
msgstr " für diese "
@@ -3667,7 +3852,7 @@ msgid "Packing list"
msgstr "Packliste"
#. module: stock
-#: code:addons/stock/stock.py:738
+#: code:addons/stock/stock.py:744
#, python-format
msgid "Not enough stock, unable to reserve the products."
msgstr ""
@@ -3680,12 +3865,14 @@ msgid "Customers"
msgstr "Kundenlagerort"
#. module: stock
-#: selection:stock.move,state:0 selection:stock.picking,state:0
+#: selection:stock.move,state:0
+#: selection:stock.picking,state:0
+#: report:stock.picking.list:0
msgid "Waiting Availability"
msgstr "Warten auf Verfügbarkeit"
#. module: stock
-#: code:addons/stock/stock.py:1347
+#: code:addons/stock/stock.py:1356
#, python-format
msgid "is cancelled."
msgstr "ist storniert"
@@ -3701,7 +3888,7 @@ msgid "Waiting "
msgstr "Wartend "
#. module: stock
-#: code:addons/stock/product.py:427
+#: code:addons/stock/product.py:431
#, python-format
msgid "Future Deliveries"
msgstr "Zukünftige Lieferungen"
@@ -3712,12 +3899,14 @@ msgid "Additional info"
msgstr "Zusatzinfo"
#. module: stock
-#: view:stock.move:0 field:stock.move,tracking_id:0
+#: view:stock.move:0
+#: field:stock.move,tracking_id:0
msgid "Pack"
msgstr "Paket"
#. module: stock
-#: view:stock.move:0 view:stock.picking:0
+#: view:stock.move:0
+#: view:stock.picking:0
msgid "Date Expected"
msgstr "Erwartetes Datum"
@@ -3815,8 +4004,10 @@ msgid "Chaining Type"
msgstr "Lieferkette Typ"
#. module: stock
-#: view:report.stock.inventory:0 view:report.stock.move:0
-#: selection:report.stock.move,type:0 view:stock.location:0
+#: view:report.stock.inventory:0
+#: view:report.stock.move:0
+#: selection:report.stock.move,type:0
+#: view:stock.location:0
#: selection:stock.location,chained_picking_type:0
#: selection:stock.picking,type:0
msgid "Internal"
@@ -3824,7 +4015,8 @@ msgstr "Intern"
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0 selection:stock.inventory,state:0
+#: selection:report.stock.move,state:0
+#: selection:stock.inventory,state:0
msgid "Draft"
msgstr "Entwurf"
@@ -3856,7 +4048,7 @@ msgid "Create Invoice"
msgstr "Erzeuge Rechnung"
#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:189
+#: code:addons/stock/wizard/stock_return_picking.py:197
#, python-format
msgid "Please specify at least one non-zero quantity!"
msgstr "Bitte definieren Sie mindestens eine Anzahl, die nicht '0' ist!"
@@ -3871,7 +4063,7 @@ msgstr ""
"Lagerorts als Quelle für Bestandsbuchungen durch die Disposition verwendet."
#. module: stock
-#: code:addons/stock/stock.py:1346
+#: code:addons/stock/stock.py:1355
#, python-format
msgid "is ready to process."
msgstr "ist bereit für Verarbeitung"
@@ -3903,7 +4095,8 @@ msgid "November"
msgstr "November"
#. module: stock
-#: code:addons/stock/product.py:100 code:addons/stock/stock.py:2128
+#: code:addons/stock/product.py:100
+#: code:addons/stock/stock.py:2137
#, python-format
msgid "There is no journal defined on the product category: \"%s\" (id: %d)"
msgstr ""
@@ -3911,7 +4104,7 @@ msgstr ""
"%d)"
#. module: stock
-#: code:addons/stock/product.py:441
+#: code:addons/stock/product.py:445
#, python-format
msgid "Unplanned Qty"
msgstr "Ungeplante Menge"
@@ -3952,14 +4145,15 @@ msgid "Move History (parent moves)"
msgstr "Buchungshistorie (übergeordnete Buchungen)"
#. module: stock
-#: code:addons/stock/product.py:423
+#: code:addons/stock/product.py:427
#, python-format
msgid "Future Stock"
msgstr "Zukünftiger Lagerbestand"
#. module: stock
-#: code:addons/stock/stock.py:513 code:addons/stock/stock.py:1149
-#: code:addons/stock/stock.py:1157
+#: code:addons/stock/stock.py:519
+#: code:addons/stock/stock.py:1158
+#: code:addons/stock/stock.py:1166
#: code:addons/stock/wizard/stock_invoice_onshipping.py:112
#, python-format
msgid "Error"
@@ -3988,18 +4182,23 @@ msgstr ""
#: field:stock.inventory.line,prod_lot_id:0
#: field:stock.inventory.line.split.lines,name:0
#: field:stock.inventory.line.split.lines,prodlot_id:0
-#: report:stock.inventory.move:0 field:stock.move,prodlot_id:0
+#: report:stock.inventory.move:0
+#: field:stock.move,prodlot_id:0
#: field:stock.move.split.lines,name:0
#: field:stock.move.split.lines,prodlot_id:0
#: field:stock.partial.move.line,prodlot_id:0
-#: field:stock.partial.picking.line,prodlot_id:0 view:stock.production.lot:0
+#: field:stock.partial.picking.line,prodlot_id:0
+#: view:stock.production.lot:0
#: field:stock.production.lot,name:0
msgid "Production Lot"
msgstr "Fertigungslos"
#. module: stock
-#: model:ir.ui.menu,name:stock.menu_traceability view:stock.move:0
-#: view:stock.picking:0 view:stock.production.lot:0 view:stock.tracking:0
+#: model:ir.ui.menu,name:stock.menu_traceability
+#: view:stock.move:0
+#: view:stock.picking:0
+#: view:stock.production.lot:0
+#: view:stock.tracking:0
msgid "Traceability"
msgstr "Lieferverfolgung"
@@ -4010,7 +4209,8 @@ msgstr "Zu Berechnen"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_location_form
-#: model:ir.ui.menu,name:stock.menu_action_location_form view:stock.picking:0
+#: model:ir.ui.menu,name:stock.menu_action_location_form
+#: view:stock.picking:0
msgid "Locations"
msgstr "Lagerorte"
@@ -4048,13 +4248,15 @@ msgstr ""
"festgelegt, wird das bei der Produktkategorie festgelegte Konto verwendet."
#. module: stock
-#: view:stock.move:0 field:stock.partial.move,move_ids:0
+#: view:stock.move:0
+#: field:stock.partial.move,move_ids:0
#: field:stock.return.picking,product_return_moves:0
msgid "Moves"
msgstr "Lieferauftragspositionen"
#. module: stock
-#: view:report.stock.move:0 field:report.stock.move,location_dest_id:0
+#: view:report.stock.move:0
+#: field:report.stock.move,location_dest_id:0
#: field:stock.partial.move.line,location_dest_id:0
#: field:stock.partial.picking.line,location_dest_id:0
#: field:stock.picking,location_dest_id:0
@@ -4128,7 +4330,8 @@ msgid "Real"
msgstr "Bestand"
#. module: stock
-#: report:stock.picking.list:0 view:stock.production.lot.revision:0
+#: report:stock.picking.list:0
+#: view:stock.production.lot.revision:0
#: field:stock.production.lot.revision,description:0
msgid "Description"
msgstr "Beschreibung"
@@ -4140,7 +4343,8 @@ msgid "May"
msgstr "Mai"
#. module: stock
-#: model:ir.actions.act_window,name:stock.action5 view:stock.tracking:0
+#: model:ir.actions.act_window,name:stock.action5
+#: view:stock.tracking:0
msgid "Upstream traceability"
msgstr "Lieferverfolgung Upstream"
@@ -4151,7 +4355,7 @@ msgid "Location Content"
msgstr "Lagerinhalt"
#. module: stock
-#: code:addons/stock/product.py:447
+#: code:addons/stock/product.py:451
#, python-format
msgid "Produced Qty"
msgstr "Prod. Anzahl"
@@ -4174,7 +4378,8 @@ msgid "Stock report by production lots"
msgstr "Bestand je Fertigungslos"
#. module: stock
-#: view:stock.location:0 selection:stock.location,chained_location_type:0
+#: view:stock.location:0
+#: selection:stock.location,chained_location_type:0
#: view:stock.move:0
msgid "Customer"
msgstr "Kunde"
@@ -4201,7 +4406,8 @@ msgid "Convenient Store"
msgstr "Gemischtwarenladen"
#. module: stock
-#: field:stock.location,scrap_location:0 view:stock.move.scrap:0
+#: field:stock.location,scrap_location:0
+#: view:stock.move.scrap:0
msgid "Scrap Location"
msgstr "Lagerort für Ausschuss"
@@ -4212,7 +4418,8 @@ msgid "April"
msgstr "April"
#. module: stock
-#: view:report.stock.inventory:0 view:stock.move:0
+#: view:report.stock.inventory:0
+#: view:stock.move:0
msgid "Future"
msgstr "Fiktiver Bestand"
@@ -4222,13 +4429,13 @@ msgid "Invoiced date"
msgstr "Rechnungsdatum"
#. module: stock
-#: code:addons/stock/stock.py:738
+#: code:addons/stock/stock.py:744
#: code:addons/stock/wizard/stock_fill_inventory.py:116
#: code:addons/stock/wizard/stock_invoice_onshipping.py:96
#: code:addons/stock/wizard/stock_invoice_onshipping.py:98
#: code:addons/stock/wizard/stock_return_picking.py:99
#: code:addons/stock/wizard/stock_return_picking.py:106
-#: code:addons/stock/wizard/stock_return_picking.py:189
+#: code:addons/stock/wizard/stock_return_picking.py:197
#, python-format
msgid "Warning !"
msgstr "Warnung"
@@ -4253,7 +4460,7 @@ msgid "Error ! You cannot create recursive associated members."
msgstr "Fehler! Sie können keine rekursive assoziierte Mitglieder anlegen."
#. module: stock
-#: code:addons/stock/wizard/stock_partial_picking.py:159
+#: code:addons/stock/wizard/stock_partial_picking.py:160
#, python-format
msgid ""
"The rounding of the initial uom does not allow you to ship \"%s %s\", as it "
@@ -4283,8 +4490,10 @@ msgid "Optional: next stock move when chaining them"
msgstr "Optional: Weiterer Lieferauftrag bei Lieferkette"
#. module: stock
-#: view:report.stock.inventory:0 field:report.stock.inventory,year:0
-#: view:report.stock.move:0 field:report.stock.move,year:0
+#: view:report.stock.inventory:0
+#: field:report.stock.inventory,year:0
+#: view:report.stock.move:0
+#: field:report.stock.move,year:0
msgid "Year"
msgstr "Jahr"
@@ -4294,12 +4503,14 @@ msgid "Physical Locations"
msgstr "Physikalische Lagerorte"
#. module: stock
-#: view:stock.picking:0 selection:stock.picking,state:0
+#: view:stock.picking:0
+#: selection:stock.picking,state:0
msgid "Ready to Process"
msgstr "Bereit zur Verarbeitung"
#. module: stock
-#: help:stock.location,posx:0 help:stock.location,posy:0
+#: help:stock.location,posx:0
+#: help:stock.location,posy:0
#: help:stock.location,posz:0
msgid "Optional localization details, for information purpose only"
msgstr "Optionale Lagerort Details, nur als Information"
diff --git a/addons/stock/product.py b/addons/stock/product.py
index 2016e25a5f6..94252f80439 100644
--- a/addons/stock/product.py
+++ b/addons/stock/product.py
@@ -513,8 +513,15 @@ class product_template(osv.osv):
string='Stock Output Account', view_load=True,
help="When doing real-time inventory valuation, counterpart journal items for all outgoing stock moves will be posted in this account, unless "
"there is a specific valuation account set on the destination location. When not set on the product, the one from the product category is used."),
+ 'sale_delay': fields.float('Customer Lead Time', help="This is the average delay in days between the confirmation of the customer order and the delivery of the finished products. It's the time you promise to your customers."),
+ 'loc_rack': fields.char('Rack', size=16),
+ 'loc_row': fields.char('Row', size=16),
+ 'loc_case': fields.char('Case', size=16),
}
+ _defaults = {
+ 'sale_delay': 7,
+ }
product_template()
class product_category(osv.osv):
diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml
index a7dff7fcc0d..3908fecd850 100644
--- a/addons/stock/product_view.xml
+++ b/addons/stock/product_view.xml
@@ -35,6 +35,16 @@
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_form_view"/>
<field name="arch" type="xml">
+ <group name="delay" position="inside">
+ <field name="sale_delay" attrs="{'readonly':[('sale_ok','=',False)]}"/>
+ </group>
+ <group name="delay" position="after">
+ <group name="store" string="Storage Localisation">
+ <field name="loc_rack"/>
+ <field name="loc_row"/>
+ <field name="loc_case"/>
+ </group>
+ </group>
<page position="after" string="Information">
<page string="Properties">
<group string="Counter-Part Locations Properties" groups="stock.group_locations">
@@ -56,7 +66,7 @@
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
- <group name="procurement_help" position="after">
+ <group name="procurement_uom" position="before">
<group name="delay" string="Delays">
<label for="produce_delay" attrs="{'invisible':[('type','=','service')]}"/>
<div attrs="{'invisible':[('type','=','service')]}">
@@ -65,13 +75,46 @@
<field name="active"/>
</group>
</group>
- <group name="inventory" position="inside">
- <group name="store" groups="stock.group_locations" string="Counter-Part Locations Properties">
- <field name="property_stock_procurement" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','procurement')]"/>
- <field name="property_stock_production" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','production')]"/>
- <field name="property_stock_inventory" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','inventory')]"/>
+ <xpath expr="//group[@string='Sale Conditions']" position="inside">
+ <label for="sale_delay"/>
+ <div>
+ <field name="sale_delay" class="oe_inline"/> days
+ </div>
+ </xpath>
+ <group name="status" position="before" version="7.0">
+ <group string="Stock and Expected Variations" attrs="{'invisible': [('type', '=', 'service')]}" groups="base.group_user">
+ <label for="qty_available"/>
+ <div>
+ <field name="qty_available" class="oe_inline"/>
+ <button name="%(action_view_change_product_quantity)d" string="update"
+ type="action"
+ class="oe_link"/>
+ </div>
+ <field name="incoming_qty" class="oe_inline"/>
+ <field name="outgoing_qty" class="oe_inline"/>
+ <field name="virtual_available" class="oe_inline"/>
+ </group>
+ <group name="lot" groups="stock.group_tracking_lot,stock.group_production_lot" string="Lots">
+ <field name="track_production" groups="stock.group_production_lot"/>
+ <field name="track_incoming" groups="stock.group_tracking_lot"/>
+ <field name="track_outgoing" groups="stock.group_tracking_lot"/>
</group>
</group>
+ <group name="status" position="after" version="7.0">
+ <group name="store" string="Storage Localisation">
+ <field name="company_id" groups="base.group_multi_company" widget="selection"/>
+ <field name="loc_rack" attrs="{'invisible':[('type','=','service')]}"/>
+ <field name="loc_row" attrs="{'invisible':[('type','=','service')]}"/>
+ <field name="loc_case" attrs="{'invisible':[('type','=','service')]}"/>
+ </group>
+ </group>
+ <group name="Weights" position="after">
+ <group name="store" groups="stock.group_locations" string="Counter-Part Locations Properties">
+ <field name="property_stock_procurement" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','procurement')]"/>
+ <field name="property_stock_production" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','production')]"/>
+ <field name="property_stock_inventory" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','inventory')]"/>
+ </group>
+ </group>
</field>
</record>
@@ -86,7 +129,7 @@
<field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}" nolabel="1"/>
<button name="%(action_view_change_standard_price)d" string="- update"
type="action" attrs="{'invisible':[('cost_method','&lt;&gt;','average')]}"
- class="oe_link"/>
+ class="oe_link" groups="product.group_costing_method"/>
</div>
</field>
</field>
@@ -116,32 +159,6 @@
</field>
</record>
- <record id="view_normal_stock_property_form" model="ir.ui.view">
- <field name="name">product.normal.stock.form.inherit</field>
- <field name="model">product.product</field>
- <field name="inherit_id" ref="product.product_normal_form_view"/>
- <field name="arch" type="xml">
- <group name="status" position="before" version="7.0">
- <group string="Stock and Expected Variations" attrs="{'invisible': [('type', '=', 'service')]}" groups="base.group_user">
- <label for="qty_available"/>
- <div>
- <field name="qty_available" class="oe_inline"/>
- <button name="%(action_view_change_product_quantity)d" string="update"
- type="action"
- class="oe_link"/>
- </div>
- <field name="incoming_qty" class="oe_inline"/>
- <field name="outgoing_qty" class="oe_inline"/>
- <field name="virtual_available" class="oe_inline"/>
- </group>
- <group name="lot" groups="stock.group_tracking_lot,stock.group_production_lot" string="Lots">
- <field name="track_production" groups="stock.group_production_lot"/>
- <field name="track_incoming" groups="stock.group_tracking_lot"/>
- <field name="track_outgoing" groups="stock.group_tracking_lot"/>
- </group>
- </group>
- </field>
- </record>
<record id="action_receive_move" model="ir.actions.act_window">
<field name="name">Receptions</field>
diff --git a/addons/stock/report/lot_overview.rml b/addons/stock/report/lot_overview.rml
index 9662eede03b..82c402a3fdf 100644
--- a/addons/stock/report/lot_overview.rml
+++ b/addons/stock/report/lot_overview.rml
@@ -184,7 +184,7 @@
<para style="terp_default_Right_9">[[ formatLang(p['price'], dp='Account') ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(p['price_value'], dp='Account') ]] [[ o.company_id.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(p['price_value'], dp='Account', currency_obj = o.company_id.currency_id)]]</para>
</td>
</tr>
</blockTable>
@@ -198,7 +198,7 @@
<para style="terp_default_Bold_9">Total:</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(price_total(), dp='Account') ]] [[ o.company_id.currency_id.symbol ]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(price_total(), dp='Account', currency_obj = o.company_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -215,7 +215,7 @@
</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(grand_total_price(), dp='Account') ]] [[ o.company_id.currency_id.symbol ]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(grand_total_price(), dp='Account', currency_obj = o.company_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/stock/report/lot_overview_all.rml b/addons/stock/report/lot_overview_all.rml
index 3b2dc5f7751..51b93c6323b 100644
--- a/addons/stock/report/lot_overview_all.rml
+++ b/addons/stock/report/lot_overview_all.rml
@@ -184,7 +184,7 @@
<para style="terp_default_Right_9">[[ formatLang(p['price'], dp='Account') ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(p['price_value'], dp='Account') ]] [[ o.company_id.currency_id.symbol]]</para>
+ <para style="terp_default_Right_9">[[ formatLang(p['price_value'], dp='Account', currency_obj = o.company_id.currency_id)]]</para>
</td>
</tr>
</blockTable>
@@ -198,7 +198,7 @@
<para style="terp_default_Bold_9">Total:</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(price_total(), dp='Account') ]] [[ o.company_id.currency_id.symbol ]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(price_total(), dp='Account', currency_obj = o.company_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
@@ -215,7 +215,7 @@
</para>
</td>
<td>
- <para style="terp_tblheader_Details_Right">[[ formatLang(grand_total_price(), dp='Account') ]] [[ o.company_id.currency_id.symbol ]]</para>
+ <para style="terp_tblheader_Details_Right">[[ formatLang(grand_total_price(), dp='Account', currency_obj = o.company_id.currency_id) ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/stock/report/report_stock_move_view.xml b/addons/stock/report/report_stock_move_view.xml
index 9b53ffd6d58..4f3e256389c 100644
--- a/addons/stock/report/report_stock_move_view.xml
+++ b/addons/stock/report/report_stock_move_view.xml
@@ -13,7 +13,7 @@
<field name="name">report.stock.move.tree</field>
<field name="model">report.stock.move</field>
<field name="arch" type="xml">
- <tree string="Moves Analysis">
+ <tree string="Moves Analysis" create="false">
<field name="date" invisible="1"/>
<field name="year" invisible="1" />
<field name="month" invisible="1"/>
@@ -105,7 +105,7 @@
<field name="name">report.stock.inventory.tree</field>
<field name="model">report.stock.inventory</field>
<field name="arch" type="xml">
- <tree string="Inventory Analysis">
+ <tree string="Inventory Analysis" create="false">
<field name="date" invisible="1"/>
<field name="year" invisible="1" />
<field name="month" invisible="1"/>
diff --git a/addons/stock/report/report_stock_view.xml b/addons/stock/report/report_stock_view.xml
index f87a212d43b..f56d738636d 100644
--- a/addons/stock/report/report_stock_view.xml
+++ b/addons/stock/report/report_stock_view.xml
@@ -20,7 +20,7 @@
<field name="name">report.stock.lines.date.tree</field>
<field name="model">report.stock.lines.date</field>
<field name="arch" type="xml">
- <tree string="Dates of Inventories">
+ <tree string="Dates of Inventories" create="false">
<field name="product_id"/>
<field name="date" />
</tree>
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 91e300eaa07..765599aa842 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -1767,7 +1767,7 @@ class stock_move(osv.osv):
location_id = property_out and property_out.id or False
else:
location_xml_id = False
- if picking_type == 'in':
+ if picking_type in ('in', 'internal'):
location_xml_id = 'stock_location_stock'
elif picking_type == 'out':
location_xml_id = 'stock_location_customers'
@@ -1798,7 +1798,7 @@ class stock_move(osv.osv):
location_xml_id = False
if picking_type == 'in':
location_xml_id = 'stock_location_suppliers'
- elif picking_type == 'out':
+ elif picking_type in ('out', 'internal'):
location_xml_id = 'stock_location_stock'
if location_xml_id:
location_model, location_id = mod_obj.get_object_reference(cr, uid, 'stock', location_xml_id)
@@ -2011,25 +2011,17 @@ class stock_move(osv.osv):
@return: Dictionary of values
"""
mod_obj = self.pool.get('ir.model.data')
- location_source_id = False
- location_dest_id = False
+ location_source_id = 'stock_location_stock'
+ location_dest_id = 'stock_location_stock'
if type == 'in':
location_source_id = 'stock_location_suppliers'
location_dest_id = 'stock_location_stock'
elif type == 'out':
location_source_id = 'stock_location_stock'
location_dest_id = 'stock_location_customers'
- if location_source_id:
- try:
- location_model, location_source_id = mod_obj.get_object_reference(cr, uid, 'stock', location_source_id)
- except ValueError, e:
- location_source_id = False
- if location_dest_id:
- try:
- location_model, location_dest_id = mod_obj.get_object_reference(cr, uid, 'stock', location_dest_id)
- except ValueError, e:
- location_dest_id = False
- return {'value':{'location_id': location_source_id, 'location_dest_id': location_dest_id}}
+ source_location = mod_obj.get_object_reference(cr, uid, 'stock', location_source_id)
+ dest_location = mod_obj.get_object_reference(cr, uid, 'stock', location_dest_id)
+ return {'value':{'location_id': source_location and source_location[1] or False, 'location_dest_id': dest_location and dest_location[1] or False}}
def onchange_date(self, cr, uid, ids, date, date_expected, context=None):
""" On change of Scheduled Date gives a Move date.
diff --git a/addons/stock/stock_demo.yml b/addons/stock/stock_demo.yml
index 93f488c8354..99565f0c08c 100644
--- a/addons/stock/stock_demo.yml
+++ b/addons/stock/stock_demo.yml
@@ -31,7 +31,6 @@
name: Ice Cream
type: product
categ_id: product.product_category_1
- supply_method: buy
list_price: 100.0
standard_price: 70.0
uom_id: product.product_uom_kgm
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index f5320a963c7..329425148c5 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -272,7 +272,7 @@
</field>
</record>
<menuitem id="menu_traceability" name="Traceability" parent="menu_stock_root"
- sequence="3" groups="stock.group_tracking_lot,stock.group_production_lot"/>
+ sequence="3"/>
<menuitem action="action_tracking_form" id="menu_action_tracking_form"
groups="product.group_stock_packaging"
sequence="6"
@@ -777,7 +777,7 @@
</group>
<notebook>
<page string="Products">
- <field name="move_lines" context="{'address_in_id': partner_id, 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}"/>
+ <field name="move_lines" context="{'address_in_id': partner_id, 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree', 'picking_type': 'internal'}"/>
<field name="note" placeholder="Add an internal note..." class="oe_inline"/>
</page>
<page string="Additional Info">
@@ -1416,7 +1416,7 @@
<field name="act_window_id" ref="action_move_form2"/>
</record>
- <menuitem action="action_move_form2" id="menu_action_move_form2" parent="menu_traceability" sequence="3"/>
+ <menuitem action="action_move_form2" id="menu_action_move_form2" parent="menu_traceability" sequence="3" groups="stock.group_locations"/>
<!--
Reception Picking (By Stock Move)
diff --git a/addons/stock/wizard/stock_return_picking.py b/addons/stock/wizard/stock_return_picking.py
index fb8e327b71f..abe1754a49e 100644
--- a/addons/stock/wizard/stock_return_picking.py
+++ b/addons/stock/wizard/stock_return_picking.py
@@ -72,7 +72,7 @@ class stock_return_picking(osv.osv_memory):
res.update({'invoice_state': 'none'})
return_history = self.get_return_history(cr, uid, record_id, context)
for line in pick.move_lines:
- qty = line.product_qty - return_history[line.id]
+ qty = line.product_qty - return_history.get(line.id, 0)
if qty > 0:
result1.append({'product_id': line.product_id.id, 'quantity': qty,'move_id':line.id})
if 'product_return_moves' in fields:
@@ -100,8 +100,8 @@ class stock_return_picking(osv.osv_memory):
valid_lines = 0
return_history = self.get_return_history(cr, uid, record_id, context)
for m in pick.move_lines:
- if m.product_qty * m.product_uom.factor > return_history[m.id]:
- valid_lines += 1
+ if m.state == 'done' and m.product_qty * m.product_uom.factor > return_history.get(m.id, 0):
+ valid_lines += 1
if not valid_lines:
raise osv.except_osv(_('Warning!'), _("No products to return (only lines in Done state and not fully returned yet can be returned)!"))
return res
diff --git a/addons/stock_location/procurement_pull.py b/addons/stock_location/procurement_pull.py
index 840e6c854c7..419118cda96 100644
--- a/addons/stock_location/procurement_pull.py
+++ b/addons/stock_location/procurement_pull.py
@@ -115,9 +115,9 @@ class procurement_order(osv.osv):
if proc.move_id:
move_obj.write(cr, uid, [proc.move_id.id],
{'location_id':proc.location_id.id})
- self.write(cr, uid, [proc.id], {'state':'running', 'message':_('Pulled from another location via procurement %d') % proc_id})
- self.running_send_note(cr, uid, [proc.id], context=context)
-
+ msg = _('Pulled from another location.')
+ self.write(cr, uid, [proc.id], {'state':'running', 'message': msg})
+ self.message_post(cr, uid, [proc.id], body=msg, context=context)
# trigger direct processing (the new procurement shares the same planned date as the original one, which is already being processed)
wf_service.trg_validate(uid, 'procurement.order', proc_id, 'button_check', cr)
return False
diff --git a/addons/stock_no_autopicking/stock_no_autopicking_view.xml b/addons/stock_no_autopicking/stock_no_autopicking_view.xml
index 9fb2b703efe..a5a96efb58d 100644
--- a/addons/stock_no_autopicking/stock_no_autopicking_view.xml
+++ b/addons/stock_no_autopicking/stock_no_autopicking_view.xml
@@ -5,7 +5,7 @@
<record model="ir.ui.view" id="view_product_form_auto_pick">
<field name="name">product.normal.auto_pick.form</field>
<field name="model">product.product</field>
- <field name="inherit_id" ref="product.product_normal_form_view" />
+ <field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
<field name="arch" type="xml">
<field name="product_manager" position="after">
<field name="auto_pick" />
diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml
index 01d6098df55..0247a205700 100644
--- a/addons/survey/survey_view.xml
+++ b/addons/survey/survey_view.xml
@@ -1125,7 +1125,8 @@
<field name="date_deadline"/>
<field name="survey_id"/>
<field name="user_id" on_change="on_change_user(user_id)"/>
- <field name="response" readonly="1"/>
+ <field name="email"/>
+ <field name="response" readonly="1"/>
</group>
</sheet>
</form>
@@ -1139,6 +1140,7 @@
<tree string="Evaluation Plan Phase" colors="red:date_deadline&lt;current_date">
<field name="date_deadline"/>
<field name="user_id"/>
+ <field name="email"/>
<field name="survey_id"/>
<field name="response" />
<field name="state" />
diff --git a/addons/warning/warning_view.xml b/addons/warning/warning_view.xml
index fd12ce53ac9..d88dc8101a5 100644
--- a/addons/warning/warning_view.xml
+++ b/addons/warning/warning_view.xml
@@ -41,7 +41,7 @@
<record id="product_warning_form_view" model="ir.ui.view">
<field name="name">product.warning.form.inherit</field>
<field name="model">product.product</field>
- <field name="inherit_id" ref="product.product_normal_form_view"/>
+ <field name="inherit_id" ref="procurement.product_template_form_view_procurement"/>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Warnings">
diff --git a/addons/web_linkedin/web_linkedin.py b/addons/web_linkedin/web_linkedin.py
index ea94329f8b1..71865c7fcc1 100644
--- a/addons/web_linkedin/web_linkedin.py
+++ b/addons/web_linkedin/web_linkedin.py
@@ -19,21 +19,16 @@
#
##############################################################################
-try:
- # embedded
- import openerp.addons.web.common.http as openerpweb
-except ImportError:
- # standalone
- import web.common.http as openerpweb
-
import base64
import urllib2
+
+import openerp
from osv import osv, fields
-class Binary(openerpweb.Controller):
+class Binary(openerp.addons.web.http.Controller):
_cp_path = "/web_linkedin/binary"
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def url2binary(self, req,url):
bfile = urllib2.urlopen(url)
return base64.b64encode(bfile.read())
diff --git a/addons/web_shortcuts/controllers/main.py b/addons/web_shortcuts/controllers/main.py
index 23f4bbd3fbe..2cdf232ac0f 100644
--- a/addons/web_shortcuts/controllers/main.py
+++ b/addons/web_shortcuts/controllers/main.py
@@ -1,16 +1,9 @@
-try:
- # embedded
- import openerp.addons.web.common.http as openerpweb
- import openerp.addons.web.controllers.main as webmain
-except ImportError:
- # standalone
- import web.common.http as openerpweb
- import web.controllers.main as webmain
+import openerp
-class Shortcuts(openerpweb.Controller):
+class Shortcuts(openerp.addons.web.http.Controller):
_cp_path = "/web/shortcuts"
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def list(self, req):
return req.session.model('ir.ui.view_sc').get_sc(
req.session._uid, "ir.ui.menu", req.session.eval_context(req.context))
diff --git a/addons/web_shortcuts/static/src/js/web_shortcuts.js b/addons/web_shortcuts/static/src/js/web_shortcuts.js
index 743f3fc73aa..c6d5a2f41fb 100644
--- a/addons/web_shortcuts/static/src/js/web_shortcuts.js
+++ b/addons/web_shortcuts/static/src/js/web_shortcuts.js
@@ -108,7 +108,7 @@ instance.web.UserMenu.include({
});
instance.web.ViewManagerAction.include({
- on_mode_switch: function (view_type, no_store) {
+ switch_mode: function (view_type, no_store) {
var self = this;
this._super.apply(this, arguments).then(function() {
self.shortcut_check(self.views[view_type]);