diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py index d72711424f2..e06e41cf001 100644 --- a/addons/account/__openerp__.py +++ b/addons/account/__openerp__.py @@ -99,7 +99,6 @@ for a particular financial year and for preparation of vouchers there is a modul 'project/wizard/project_account_analytic_line_view.xml', 'account_end_fy.xml', 'account_invoice_view.xml', - 'partner_view.xml', 'data/account_data.xml', 'data/data_account_type.xml', 'data/configurable_account_chart.xml', @@ -112,6 +111,7 @@ for a particular financial year and for preparation of vouchers there is a modul 'project/wizard/account_analytic_journal_report_view.xml', 'project/wizard/account_analytic_cost_ledger_for_journal_report_view.xml', 'project/wizard/account_analytic_chart_view.xml', + 'partner_view.xml', 'product_view.xml', 'account_assert_test.xml', 'process/statement_process.xml', diff --git a/addons/account/account.py b/addons/account/account.py index 3959799f1bb..e92bd3a7879 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1670,7 +1670,7 @@ class account_move_reconcile(osv.osv): elif reconcile.line_partial_ids: first_partner = reconcile.line_partial_ids[0].partner_id.id move_lines = reconcile.line_partial_ids - if any([line.partner_id.id != first_partner for line in move_lines]): + if any([(line.account_id.type in ('receivable', 'payable') and line.partner_id.id != first_partner) for line in move_lines]): return False return True diff --git a/addons/account/account_financial_report_data.xml b/addons/account/account_financial_report_data.xml index 6410a5e887c..e8ff33151c3 100644 --- a/addons/account/account_financial_report_data.xml +++ b/addons/account/account_financial_report_data.xml @@ -6,16 +6,19 @@ --> Profit and Loss + sum Income + detail_with_hierarchy account_type Expense + detail_with_hierarchy account_type diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml index 58e824a6250..b03babc63ac 100644 --- a/addons/account/account_installer.xml +++ b/addons/account/account_installer.xml @@ -20,10 +20,11 @@

+ - + - + @@ -608,5 +609,22 @@
+ + Mark As Lost + + code + + if context.get('active_model') == 'crm.lead' and context.get('active_ids'): + self.case_cancel(cr, uid, context['active_ids'], context=context) + + + + + + + Mark As Lost + + + diff --git a/addons/crm/crm_phonecall_demo.xml b/addons/crm/crm_phonecall_demo.xml index f441c29a7e6..4002e18815e 100644 --- a/addons/crm/crm_phonecall_demo.xml +++ b/addons/crm/crm_phonecall_demo.xml @@ -37,7 +37,7 @@ Ask for convenient time of meeting open +1 786 525 0724 - + @@ -50,7 +50,7 @@ done (077) 582-4035 (077) 341-3591 - + @@ -74,7 +74,7 @@ Proposal for discount offer open +34 230 953 485 - + diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml index 63385fa3e17..a84ae553b4a 100644 --- a/addons/crm/crm_view.xml +++ b/addons/crm/crm_view.xml @@ -101,7 +101,7 @@ - + diff --git a/addons/crm/html/Stephan-Keller.jpg b/addons/crm/html/Stephan-Keller.jpg new file mode 100644 index 00000000000..57464ea0b2b Binary files /dev/null and b/addons/crm/html/Stephan-Keller.jpg differ diff --git a/addons/crm/html/claudia-sebastiani.jpg b/addons/crm/html/claudia-sebastiani.jpg new file mode 100644 index 00000000000..f24ba95189a Binary files /dev/null and b/addons/crm/html/claudia-sebastiani.jpg differ diff --git a/addons/crm/html/crm_game.png b/addons/crm/html/crm_game.png new file mode 100644 index 00000000000..b5416926793 Binary files /dev/null and b/addons/crm/html/crm_game.png differ diff --git a/addons/crm/html/crm_game_01.png b/addons/crm/html/crm_game_01.png new file mode 100644 index 00000000000..a3cd109c2de Binary files /dev/null and b/addons/crm/html/crm_game_01.png differ diff --git a/addons/crm/html/crm_game_02.png b/addons/crm/html/crm_game_02.png new file mode 100644 index 00000000000..1a747e1ffe8 Binary files /dev/null and b/addons/crm/html/crm_game_02.png differ diff --git a/addons/crm/html/crm_game_03.png b/addons/crm/html/crm_game_03.png new file mode 100644 index 00000000000..2fd14886179 Binary files /dev/null and b/addons/crm/html/crm_game_03.png differ diff --git a/addons/crm/html/crm_linkedin.png b/addons/crm/html/crm_linkedin.png new file mode 100644 index 00000000000..e40563dbfc7 Binary files /dev/null and b/addons/crm/html/crm_linkedin.png differ diff --git a/addons/crm/html/crm_sc_01.jpg b/addons/crm/html/crm_sc_01.jpg new file mode 100644 index 00000000000..7a2a44d7b0d Binary files /dev/null and b/addons/crm/html/crm_sc_01.jpg differ diff --git a/addons/crm/html/crm_sc_01.png b/addons/crm/html/crm_sc_01.png new file mode 100644 index 00000000000..8f1ff1e95fe Binary files /dev/null and b/addons/crm/html/crm_sc_01.png differ diff --git a/addons/crm/html/crm_sc_02.png b/addons/crm/html/crm_sc_02.png new file mode 100644 index 00000000000..e20c44836ba Binary files /dev/null and b/addons/crm/html/crm_sc_02.png differ diff --git a/addons/crm/html/crm_sc_04a.png b/addons/crm/html/crm_sc_04a.png new file mode 100644 index 00000000000..d0308e3f68b Binary files /dev/null and b/addons/crm/html/crm_sc_04a.png differ diff --git a/addons/crm/html/crm_sc_04b.png b/addons/crm/html/crm_sc_04b.png new file mode 100644 index 00000000000..57b7965771e Binary files /dev/null and b/addons/crm/html/crm_sc_04b.png differ diff --git a/addons/crm/html/crm_sc_04c.png b/addons/crm/html/crm_sc_04c.png new file mode 100644 index 00000000000..d3c4dbae043 Binary files /dev/null and b/addons/crm/html/crm_sc_04c.png differ diff --git a/addons/crm/html/crm_sc_04d.png b/addons/crm/html/crm_sc_04d.png new file mode 100644 index 00000000000..687bdfb971f Binary files /dev/null and b/addons/crm/html/crm_sc_04d.png differ diff --git a/addons/crm/html/crm_sc_05.png b/addons/crm/html/crm_sc_05.png new file mode 100644 index 00000000000..b71ce805250 Binary files /dev/null and b/addons/crm/html/crm_sc_05.png differ diff --git a/addons/crm/html/crm_sc_06.png b/addons/crm/html/crm_sc_06.png new file mode 100644 index 00000000000..1da7d5e841f Binary files /dev/null and b/addons/crm/html/crm_sc_06.png differ diff --git a/addons/crm/html/crm_sc_08.png b/addons/crm/html/crm_sc_08.png new file mode 100644 index 00000000000..b47d9738cf9 Binary files /dev/null and b/addons/crm/html/crm_sc_08.png differ diff --git a/addons/crm/html/crm_sc_agenda.png b/addons/crm/html/crm_sc_agenda.png new file mode 100644 index 00000000000..a0f57eb4bca Binary files /dev/null and b/addons/crm/html/crm_sc_agenda.png differ diff --git a/addons/crm/html/crm_sc_marketing.png b/addons/crm/html/crm_sc_marketing.png new file mode 100644 index 00000000000..f7662587969 Binary files /dev/null and b/addons/crm/html/crm_sc_marketing.png differ diff --git a/addons/crm/html/index.html b/addons/crm/html/index.html new file mode 100644 index 00000000000..5ae542f5c91 --- /dev/null +++ b/addons/crm/html/index.html @@ -0,0 +1,252 @@ +
+
+
+

Customer Relationship Management

+

Boost sales productivity, improve win rates, grow revenue

+
+
+
+ + + + +
+
+
+

+Manage your sales funnel with no effort. Attract leads, follow-up on phone calls and meetings. Analyse the quality of your leads to make informed decisions and save time by integrating emails directly into the application. +

+ +
+
+
+ +
+
+

Your Sales Funnel, The Way You Like It

+
+

+Track your opportunities pipeline with the revolutionary kanban view. Work inside your sales funnel and get instant visual information about next actions, new messages, top opportunities and expected revenues. +

+
+
+
+ +
+
+
+
+ +
+
+

Social Network Integration

+
+
+ +
+
+
+

+Bring social intelligence to your sales process. Gain insights from social media site LinkedIn to find prospects easily and load their data automatically into your address book. +

+
+
+
+ + +
+
+

Lead Management Made Easy

+
+

+Create leads automatically from incoming emails. Analyse leads efficiency and compare performance by campaigns, channels or sales team. +

+

+Find duplicates, merge leads and assign them to the right salesperson in one operation. Spend less time on administration and more time on qualifying leads. +

+
+
+
+ +
+
+
+
+ +
+
+

Organize Your Opportunities

+

A clean user interface with everything in one screen

+
+
+ +
+
+
+

+Get your opportunities organized to stay focused on the best deals. Manage all your customer interactions from the opportunity like emails, phone calls, internal notes, meetings and quotations. +

+Follow opportunities that interrests you to get notified upon specific events: deal won or lost, stage changed, new customer demand, etc. +

+
+
+
+ +
+
+

Email Integration and Automation

+
+

+Work with the email applications you already use every day. Whether your company uses Microsoft Outlook or Gmail, no one needs to change the way they work, so everyone stays productive. +

+Route, sort and filter incoming emails automatically. OpenERP CRM handles incoming emails and route them to the right opportunities or sales team. New leads are created on the fly and interested salespersons are notified automatically. +

+
+
+
+ +
+
+
+
+ +
+
+

Collaborative Agenda

+
+
+ +
+
+
+

+Schedule your meetings and phone calls using the integrated calendar. You can see your agenda and your colleagues' in one view. As a manager, it's easy to see what your team is busy with. +

+
+
+
+ +
+
+

Lead Automation and Marketing Campaigns

+

Drive performance by automating tasks

+
+

+ Use our marketing campaigns to automate lead acquisition, follow ups and promotions. Define automated actions (e.g. ask a salesperson to call, send an email, ...) based on triggers (no activity since 20 days, answered a promotional email, etc.) +

+ Optimize campaigns from lead to close, on every channel. Make smarter decisions about where to invest and show the impact of your marketing activities on your company's bottom line. +

+
+
+
+ +
+
+
+
+ +
+
+

Customize Your Sales Cycle

+

It Fits Your Sales Approach

+

+Customize your sales cycle by configuring sales stages that perfectly fit your sales approach. Control statistics to get accurate forecasts to improve your sales performance at every stage of your customer relationship. +

+
+ + + + +
+
+
+ +
+
+

Reporting and Dashboards

+

Get access to the right information to take smart decisions

+
+
+ +
+
+
+

+Get the insights you need to make smarter decisions. Design custom dashboards to get a picture of your business at a glance. Dig deeper with real-time reports that anyone can create and share. +

+
+
+
+ +
+
+

Drive Engagement with Gamification

+

Leverage sales' natural desire for competition

+

+ Reinforce good habits and improve win rates with real-time recognition and rewards inspired by game mechanics. Align sales teams around clear business objectives with challenges, personal objectives and team leader boards. +

+
+

Leaderboards

+
+ +
+

+ Promote leaders and competition amongst sales team with performance ratios. +

+
+
+

Personnal Objectives

+
+ +
+

+ Assign clear goals to users to align them with the company objectives. +

+
+
+

Team Targets

+
+ +
+

+ Compare revenues with forecasts and budgets in real time. +

+
+
+
+ +
+
+
+

Many companies already enjoy it

+

Hear what they have to say !

+
+
+
+ + With OpenERP CRM I keep all the information about leads and customers + in a single place, and share it with my colleagues. It's great and effective. + + + +
Claudia Sebastiani
+
Sales manager at CQ Creativi Quadrati.
+
+
+
+
+
+ + I am surprised by how good OpenERP CRM is. Awesome product. + + + +
Stephan Keller
+
CEO of Sodexis, Inc.
+
+
+
+
+
diff --git a/addons/crm/i18n/ru.po b/addons/crm/i18n/ru.po index 19ae76e9f46..ec2a9f35ee5 100644 --- a/addons/crm/i18n/ru.po +++ b/addons/crm/i18n/ru.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2012-12-21 17:04+0000\n" -"PO-Revision-Date: 2013-03-01 11:27+0000\n" -"Last-Translator: Антон Лаврёнов \n" +"PO-Revision-Date: 2013-05-30 13:52+0000\n" +"Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2013-03-16 05:09+0000\n" -"X-Generator: Launchpad (build 16532)\n" +"X-Launchpad-Export-Date: 2013-05-31 05:38+0000\n" +"X-Generator: Launchpad (build 16660)\n" #. module: crm #: view:crm.lead.report:0 @@ -452,7 +452,7 @@ msgstr "# Предложений" #, python-format msgid "" "Please select more than one element (lead or opportunity) from the list view." -msgstr "" +msgstr "Пожалуйста, выберите хотя бы один элемент из списка ниже." #. module: crm #: view:crm.lead:0 @@ -1108,7 +1108,7 @@ msgstr "Удалить" #. module: crm #: model:mail.message.subtype,description:crm.mt_lead_create msgid "Opportunity created" -msgstr "" +msgstr "Предложение создано" #. module: crm #: view:crm.lead:0 @@ -1397,7 +1397,7 @@ msgstr "Сделать" #. module: crm #: model:mail.message.subtype,description:crm.mt_lead_lost msgid "Opportunity lost" -msgstr "" +msgstr "Предложение отклонено" #. module: crm #: field:crm.lead2opportunity.partner,action:0 @@ -1446,7 +1446,7 @@ msgstr "Пользователи" #. module: crm #: model:mail.message.subtype,name:crm.mt_lead_stage msgid "Stage Changed" -msgstr "" +msgstr "Стадия изменена" #. module: crm #: field:crm.case.stage,section_ids:0 @@ -1759,7 +1759,7 @@ msgstr "Способ оплаты" #. module: crm #: model:ir.model,name:crm.model_crm_lead2opportunity_partner_mass msgid "Mass Lead To Opportunity Partner" -msgstr "Массовое проведение предложений партнёру" +msgstr "Массовое преобразование кандидатов в предложения" #. module: crm #: view:sale.config.settings:0 @@ -1917,7 +1917,7 @@ msgstr "Сделать" #: model:mail.message.subtype,name:crm.mt_lead_convert_to_opportunity #: model:mail.message.subtype,name:crm.mt_salesteam_lead_opportunity msgid "Lead to Opportunity" -msgstr "" +msgstr "Кандидат в предложение" #. module: crm #: field:crm.lead,user_email:0 @@ -2126,7 +2126,7 @@ msgstr "" #. module: crm #: view:crm.lead:0 msgid "Address" -msgstr "" +msgstr "Адрес" #. module: crm #: help:crm.case.section,alias_id:0 @@ -2134,6 +2134,8 @@ msgid "" "The email address associated with this team. New emails received will " "automatically create new leads assigned to the team." msgstr "" +"Адрес эл. почты связанный с этой командой. Новая полученная эл. почта будет " +"автоматически создавать новые кандидаты связанные с командой." #. module: crm #: view:crm.lead:0 @@ -2192,7 +2194,7 @@ msgstr "Продолжение процесса" #: selection:crm.lead2opportunity.partner.mass,name:0 #: model:ir.actions.act_window,name:crm.action_crm_lead2opportunity_partner msgid "Convert to opportunity" -msgstr "Преобразовать в возможность" +msgstr "Преобразовать в предложение" #. module: crm #: field:crm.opportunity2phonecall,user_id:0 @@ -2234,6 +2236,8 @@ msgid "" "This stage is not visible, for example in status bar or kanban view, when " "there are no records in that stage to display." msgstr "" +"Эта стадия не видима, например в статус-баре или виде канбан, когда нет " +"записей этой стадии для отображения." #. module: crm #: field:crm.lead.report,nbr:0 @@ -2249,7 +2253,7 @@ msgstr "Отдел продаж, которому принадлежит воп #. module: crm #: model:crm.case.resource.type,name:crm.type_lead6 msgid "Banner Ads" -msgstr "" +msgstr "Баннер" #. module: crm #: field:crm.merge.opportunity,opportunity_ids:0 @@ -2279,7 +2283,7 @@ msgstr "Выполняется" #. module: crm #: model:mail.message.subtype,description:crm.mt_lead_convert_to_opportunity msgid "Lead converted into an opportunity" -msgstr "" +msgstr "Кандидат превращенный в предложение" #. module: crm #: view:crm.lead:0 @@ -2289,7 +2293,7 @@ msgstr "Нераспределенные кандидаты" #. module: crm #: model:mail.message.subtype,description:crm.mt_lead_won msgid "Opportunity won" -msgstr "" +msgstr "Предложение принято" #. module: crm #: field:crm.case.categ,object_id:0 @@ -2364,7 +2368,7 @@ msgstr "" #. module: crm #: field:crm.case.stage,state:0 msgid "Related Status" -msgstr "" +msgstr "Связанный статус" #. module: crm #: field:crm.phonecall,name:0 @@ -2410,7 +2414,7 @@ msgstr "Подтвердить" #. module: crm #: view:crm.lead:0 msgid "Unread messages" -msgstr "" +msgstr "Непрочитанные сообщения" #. module: crm #: field:crm.phonecall.report,section_id:0 @@ -2501,7 +2505,7 @@ msgstr "Создание предложений из кандидатов" #. module: crm #: model:crm.case.resource.type,name:crm.type_lead3 msgid "Email Campaign - Products" -msgstr "" +msgstr "Кампания эл. почты - Продукция" #. module: crm #: model:ir.actions.act_window,help:crm.crm_case_categ_phone_incoming0 @@ -2578,7 +2582,7 @@ msgstr "Август" #: model:mail.message.subtype,name:crm.mt_lead_lost #: model:mail.message.subtype,name:crm.mt_salesteam_lead_lost msgid "Opportunity Lost" -msgstr "" +msgstr "Предложение отклонено" #. module: crm #: field:crm.lead.report,deadline_month:0 @@ -2644,7 +2648,7 @@ msgstr "Сотрудники отдела" #: view:crm.opportunity2phonecall:0 #: view:crm.phonecall2phonecall:0 msgid "Schedule/Log a Call" -msgstr "" +msgstr "Запланировать/Описать звонок" #. module: crm #: field:crm.lead,planned_cost:0 @@ -2654,7 +2658,7 @@ msgstr "Планируемые затраты" #. module: crm #: help:crm.lead,date_deadline:0 msgid "Estimate of the date on which the opportunity will be won." -msgstr "" +msgstr "Оценка даты на которую это предложение будет принято." #. module: crm #: help:crm.lead,email_cc:0 @@ -2676,7 +2680,7 @@ msgstr "Описанные звонки" #: model:mail.message.subtype,name:crm.mt_lead_won #: model:mail.message.subtype,name:crm.mt_salesteam_lead_won msgid "Opportunity Won" -msgstr "" +msgstr "Предложение принято" #. module: crm #: model:ir.actions.act_window,name:crm.crm_case_section_act_tree @@ -2895,7 +2899,7 @@ msgstr "" #. module: crm #: view:crm.lead:0 msgid "Internal Notes" -msgstr "" +msgstr "Внутренние заметки" #. module: crm #: view:crm.lead:0 @@ -2960,6 +2964,7 @@ msgstr "Проиграно" #, python-format msgid "Closed/Cancelled leads cannot be converted into opportunities." msgstr "" +"Закрытые/Отмененные кандидаты не могут быть конвертированы в возможности." #. module: crm #: view:crm.lead:0 @@ -3050,7 +3055,7 @@ msgstr "Рассылка" #. module: crm #: model:mail.message.subtype,name:crm.mt_salesteam_lead_stage msgid "Opportunity Stage Changed" -msgstr "" +msgstr "Этап предложения изменен" #. module: crm #: model:ir.actions.act_window,help:crm.crm_lead_stage_act diff --git a/addons/crm/process/crm_configuration_process.xml b/addons/crm/process/crm_configuration_process.xml index c56bb8935d9..882c9680268 100644 --- a/addons/crm/process/crm_configuration_process.xml +++ b/addons/crm/process/crm_configuration_process.xml @@ -60,24 +60,24 @@ - - + + - - + + - - + + diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml index 759063b3c1d..09853c6379e 100644 --- a/addons/crm/report/crm_lead_report_view.xml +++ b/addons/crm/report/crm_lead_report_view.xml @@ -75,7 +75,7 @@ + help="Leads/Opportunities that are assigned to one of the sale teams I manage" groups="base.group_multi_salesteams"/> + help="Phone calls that are assigned to one of the sale teams I manage" groups="base.group_multi_salesteams"/> - + - diff --git a/addons/product/report/product_label.xsl b/addons/product/report/product_label.xsl index 641db73ea7d..5dbb2d64a28 100644 --- a/addons/product/report/product_label.xsl +++ b/addons/product/report/product_label.xsl @@ -67,7 +67,7 @@ - + diff --git a/addons/project/html/Mario-Riva.png b/addons/project/html/Mario-Riva.png new file mode 100644 index 00000000000..35b030a4265 Binary files /dev/null and b/addons/project/html/Mario-Riva.png differ diff --git a/addons/project/html/Yoshi-Tashiro.png b/addons/project/html/Yoshi-Tashiro.png new file mode 100644 index 00000000000..f3457a9088e Binary files /dev/null and b/addons/project/html/Yoshi-Tashiro.png differ diff --git a/addons/project/html/index.html b/addons/project/html/index.html new file mode 100644 index 00000000000..93f1be8a41d --- /dev/null +++ b/addons/project/html/index.html @@ -0,0 +1,197 @@ +
+
+

Project Management

+

Infinitely flexible. Incredibly easy to use.

+
+
+ + + + +
+
+
+

+OpenERP's collaborative and realtime project management helps your team get +work done. Keep track of everything, from the big picture to the minute +details, from the customer contract to the billing. +

+ +
+
+
+ +
+
+

Designed to fit your own process

+
+

+Organize projects around your own processes. Work on tasks and issues using the kanban view, schedule tasks using the gantt chart +and control deadlines in the calendar view. Every project may have it's own stages +allowing teams to optimize their job. +

+
+
+

Kanban

+
+ +
+
+
+

Gantt Charts

+ +

+
+
+

Calendar

+ +
+
+
+ +
+
+

Easy to use

+
+ +
+
+

+Get organized as fast as you can think. The easy-to-use interface takes no time +to learn, and every action is instantaneous, so there’s nothing standing +between you and your sweet productive flow. +

+
+
+
+ +
+

Work Together

+

Real time chats, document sharing, email integration

+
+
+

+Use open chatter to communicate with your team or customers and share comments +and documents on tasks and issues. Integrate discussion fast with the email +integration. +

+Talk to others users or customers with the live chat feature. +

+
+
+ +
+
+
+ +
+
+

Collaborative Writing

+

The power of etherpad, inside your tasks

+
+ +
+
+

+Collaboratively edit the same specifications or meeting minutes right inside the +application. The incorporated etherpad feature allows several people to work +on the same tasks, at the same time. +

+

+This is very efficient for scrum meetings, meeting minutes or complex +specifications. Every user has their own color and you can replay the whole +creation of the content. +

+
+
+
+ +
+
+

Get Work Done

+
+

+Get alerts on followed events to stay up to date with what interests you. Use +instant green/red visual indicators to scan through what has been done and what +requires your attention. +

+
+
+ +
+
+
+ +
+
+

Timesheets, Contracts & Invoicing

+
+ +
+
+

+Projects are automatically integrated with customer contracts allowing you to +invoice based on time & materials and record timesheets easily. +

+
+
+
+ + +
+
+

Track Issues

+

Support services, helpdesk, bug tracker, etc.

+
+

+Single out the issues that arise in a project in order to have a better focus +on resolving them. Integrate customer interaction on every issue and get +accurate reports on your team's performance. +

+
+
+
+ +
+
+
+
+ +
+
+
+

Many companies already enjoy it

+

Hear what they have to say !

+
+
+
+ + OpenERP provides essential platform for our project management. + Things are better organized and much more visible with it. + + + +
Yoshi Tashiro
+
Managing Director, RoomsFor (Hong Kong)
+
+
+
+
+
+ + The possibility to link the Project Management to Sales and Manufacturing widely + extends the range of possible applications beyond the needs of service companies. + + + +
Mario Riva
+ +
+
+
+
+
+
+
diff --git a/addons/project/html/project_01.png b/addons/project/html/project_01.png new file mode 100644 index 00000000000..0c86a2965d5 Binary files /dev/null and b/addons/project/html/project_01.png differ diff --git a/addons/project/html/project_calendar.png b/addons/project/html/project_calendar.png new file mode 100644 index 00000000000..f8c8fca7662 Binary files /dev/null and b/addons/project/html/project_calendar.png differ diff --git a/addons/project/html/project_chat.png b/addons/project/html/project_chat.png new file mode 100644 index 00000000000..8cb771e876f Binary files /dev/null and b/addons/project/html/project_chat.png differ diff --git a/addons/project/html/project_easy.png b/addons/project/html/project_easy.png new file mode 100644 index 00000000000..4ffde14b42b Binary files /dev/null and b/addons/project/html/project_easy.png differ diff --git a/addons/project/html/project_etherpad.png b/addons/project/html/project_etherpad.png new file mode 100644 index 00000000000..038b210ee18 Binary files /dev/null and b/addons/project/html/project_etherpad.png differ diff --git a/addons/project/html/project_gantt.png b/addons/project/html/project_gantt.png new file mode 100644 index 00000000000..34486b98558 Binary files /dev/null and b/addons/project/html/project_gantt.png differ diff --git a/addons/project/html/project_illu_01.png b/addons/project/html/project_illu_01.png new file mode 100644 index 00000000000..4fff4837faa Binary files /dev/null and b/addons/project/html/project_illu_01.png differ diff --git a/addons/project/html/project_kanban.png b/addons/project/html/project_kanban.png new file mode 100644 index 00000000000..c541d3b5d08 Binary files /dev/null and b/addons/project/html/project_kanban.png differ diff --git a/addons/project/html/project_kpi.png b/addons/project/html/project_kpi.png new file mode 100644 index 00000000000..c58f8176098 Binary files /dev/null and b/addons/project/html/project_kpi.png differ diff --git a/addons/project/html/project_timesheet.png b/addons/project/html/project_timesheet.png new file mode 100644 index 00000000000..d06c3a924ec Binary files /dev/null and b/addons/project/html/project_timesheet.png differ diff --git a/addons/project/i18n/ru.po b/addons/project/i18n/ru.po index 1743d66e55d..b64662f916b 100644 --- a/addons/project/i18n/ru.po +++ b/addons/project/i18n/ru.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2012-12-21 17:04+0000\n" -"PO-Revision-Date: 2013-03-14 06:44+0000\n" +"PO-Revision-Date: 2013-05-28 06:22+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2013-03-16 04:56+0000\n" -"X-Generator: Launchpad (build 16532)\n" +"X-Launchpad-Export-Date: 2013-05-29 05:37+0000\n" +"X-Generator: Launchpad (build 16640)\n" #. module: project #: view:project.project:0 @@ -27,6 +27,8 @@ msgid "" "If checked, this contract will be available in the project menu and you will " "be able to manage tasks or track issues" msgstr "" +"Если выбрано, этот контракт станет активным в меню проекта, и вы сможете " +"редактировать задачи или отслеживать проблемы" #. module: project #: field:project.project,progress_rate:0 @@ -217,7 +219,7 @@ msgstr "Предложение контакта" #. module: project #: help:project.config.settings,group_time_work_estimation_tasks:0 msgid "Allows you to compute Time Estimation on tasks." -msgstr "" +msgstr "Позволяет вычислить расход времени на задачи." #. module: project #: field:report.project.task.user,user_id:0 @@ -913,6 +915,8 @@ msgid "" "Provides management of issues/bugs in projects.\n" " This installs the module project_issue." msgstr "" +"Обеспечивает управление проблем / ошибок в проектах.\n" +" Устанавливает модуль project_issue." #. module: project #: help:project.task,kanban_state:0 @@ -927,7 +931,7 @@ msgstr "" #. module: project #: view:project.task:0 msgid "10" -msgstr "" +msgstr "10" #. module: project #: help:project.project,analytic_account_id:0 @@ -953,7 +957,7 @@ msgstr "Отменить" #. module: project #: view:project.project:0 msgid "Other Info" -msgstr "" +msgstr "Прочая информация" #. module: project #: view:project.task.delegate:0 @@ -981,6 +985,8 @@ msgid "" "Follow this project to automatically track the events associated to tasks " "and issues of this project." msgstr "" +"Позволяет проекту автоматически отслеживать события, связанные с задачами и " +"проблемами этого проекта." #. module: project #: view:project.task:0 @@ -990,7 +996,7 @@ msgstr "Исполнитель" #. module: project #: model:mail.message.subtype,name:project.mt_task_stage msgid "Stage Changed" -msgstr "" +msgstr "Стадия изменена" #. module: project #: view:project.project:0 @@ -1006,7 +1012,7 @@ msgstr "Важное" #. module: project #: field:project.category,name:0 msgid "Name" -msgstr "" +msgstr "Название" #. module: project #: selection:report.project.task.user,month:0 @@ -1033,7 +1039,7 @@ msgstr "Общие" #: help:project.project,message_ids:0 #: help:project.task,message_ids:0 msgid "Messages and communication history" -msgstr "" +msgstr "Сообщения и история общения" #. module: project #: view:project.project:0 @@ -1041,6 +1047,8 @@ msgid "" "To invoice or setup invoicing and renewal options, go to the related " "contract:" msgstr "" +"Для выставления счета или изменения счета и обновления вариантов, перейти к " +"соответствующему контракту:" #. module: project #: field:project.task.delegate,state:0 @@ -1097,7 +1105,7 @@ msgstr "Порученные задания" #: view:project.task:0 #: field:project.task,message_unread:0 msgid "Unread Messages" -msgstr "" +msgstr "Непрочитанные" #. module: project #: view:project.task:0 @@ -1139,7 +1147,7 @@ msgstr "Показывать только срочные задания" #. module: project #: model:project.category,name:project.project_category_04 msgid "Usability" -msgstr "" +msgstr "Удобство использования" #. module: project #: view:report.project.task.user:0 @@ -1156,7 +1164,7 @@ msgstr "Выполнил(а)" #: code:addons/project/project.py:181 #, python-format msgid "Invalid Action!" -msgstr "" +msgstr "Неверное действие!" #. module: project #: help:project.task.type,state:0 @@ -1165,6 +1173,9 @@ msgid "" "stage. For example, if a stage is related to the status 'Close', when your " "document reaches this stage, it is automatically closed." msgstr "" +"Статус документа автоматически изменяется по выбранному этапу. Например, " +"если стадия связана со статусом «Закрыть» , когда ваш документ достигает " +"этой стадии, оно автоматически закрывается." #. module: project #: view:project.task:0 @@ -1174,7 +1185,7 @@ msgstr "Доп. информация" #. module: project #: view:project.task:0 msgid "Edit..." -msgstr "" +msgstr "Изменить..." #. module: project #: view:report.project.task.user:0 @@ -1185,7 +1196,7 @@ msgstr "№ задачи" #. module: project #: field:project.project,doc_count:0 msgid "Number of documents attached" -msgstr "" +msgstr "Количество прикрепленных документов" #. module: project #: field:project.task,priority:0 @@ -1205,6 +1216,9 @@ msgid "" "automatically synchronizedwith Tasks (or optionally Issues if the Issue " "Tracker module is installed)." msgstr "" +"Внутренние e-mail, связанный с этим проектом. Входящие письма автоматически " +"синхронизируются с заданиями (или проблемами, если модуль Issue Tracker " +"установлен)." #. module: project #: model:ir.actions.act_window,help:project.open_task_type_form @@ -1237,7 +1251,7 @@ msgstr "%s (копия)" #. module: project #: model:mail.message.subtype,name:project.mt_project_task_stage msgid "Task Stage Changed" -msgstr "" +msgstr "Этап задачи изменен" #. module: project #: view:project.task:0 @@ -1269,12 +1283,12 @@ msgstr "Время отсрочки" #. module: project #: view:project.project:0 msgid "Team" -msgstr "" +msgstr "Группа" #. module: project #: help:project.config.settings,time_unit:0 msgid "This will set the unit of measure used in projects and tasks." -msgstr "" +msgstr "Установить единицу измерения, используемую в проектах и задачах." #. module: project #: selection:project.task,priority:0 @@ -1328,7 +1342,7 @@ msgstr "Заголовок вашего проверочного задания" #. module: project #: field:project.config.settings,time_unit:0 msgid "Working time unit" -msgstr "" +msgstr "Единица рабочего времени" #. module: project #: view:project.project:0 @@ -1344,7 +1358,7 @@ msgstr "Низкий" #. module: project #: selection:project.project,state:0 msgid "Closed" -msgstr "" +msgstr "Закрыто" #. module: project #: view:project.project:0 @@ -1366,7 +1380,7 @@ msgstr "В ожидании" #: view:project.category:0 #: field:project.task,categ_ids:0 msgid "Tags" -msgstr "" +msgstr "Теги" #. module: project #: model:ir.model,name:project.model_project_task_history @@ -1386,7 +1400,7 @@ msgstr "" #. module: project #: help:project.config.settings,group_manage_delegation_task:0 msgid "Allows you to delegate tasks to other users." -msgstr "" +msgstr "Позволяет делегировать задачи другим пользователям." #. module: project #: field:project.project,active:0 @@ -1415,7 +1429,7 @@ msgstr "" #. module: project #: view:project.config.settings:0 msgid "Helpdesk & Support" -msgstr "" +msgstr "Поддержка" #. module: project #: help:report.project.task.user,opening_days:0 @@ -1441,7 +1455,7 @@ msgstr "" #: code:addons/project/project.py:220 #, python-format msgid "Attachments" -msgstr "" +msgstr "Вложения" #. module: project #: view:project.task:0 @@ -1464,6 +1478,8 @@ msgid "" "You cannot delete a project containing tasks. You can either delete all the " "project's tasks and then delete the project or simply deactivate the project." msgstr "" +"Вы не можете удалить проект, содержащий задачи. Вы можете либо удалить все " +"задачи проекта, а затем удалить проект или просто сделать проект неактивным." #. module: project #: model:process.transition.action,name:project.process_transition_action_draftopentask0 @@ -1474,7 +1490,7 @@ msgstr "Открытые" #. module: project #: field:project.project,privacy_visibility:0 msgid "Privacy / Visibility" -msgstr "" +msgstr "Безопасность/Видимость" #. module: project #: view:project.task:0 @@ -1488,7 +1504,7 @@ msgstr "Оставшееся время" #. module: project #: model:mail.message.subtype,description:project.mt_task_stage msgid "Stage changed" -msgstr "" +msgstr "Этап изменен" #. module: project #: constraint:project.task:0 @@ -1521,7 +1537,7 @@ msgstr "Общее время" #. module: project #: model:ir.model,name:project.model_project_config_settings msgid "project.config.settings" -msgstr "" +msgstr "project.config.settings" #. module: project #: model:project.task.type,name:project.project_tt_development @@ -1586,12 +1602,12 @@ msgstr "Назначить на" #. module: project #: model:res.groups,name:project.group_time_work_estimation_tasks msgid "Time Estimation on Tasks" -msgstr "" +msgstr "Оценка времени на задачи" #. module: project #: field:project.task,total_hours:0 msgid "Total" -msgstr "" +msgstr "Всего" #. module: project #: model:process.node,note:project.process_node_taskbydelegate0 @@ -1601,7 +1617,7 @@ msgstr "Поручить ваше задание другому пользова #. module: project #: model:mail.message.subtype,description:project.mt_task_started msgid "Task started" -msgstr "" +msgstr "Задание начато" #. module: project #: help:project.task.reevaluate,remaining_hours:0 @@ -1614,6 +1630,8 @@ msgid "" "This stage is not visible, for example in status bar or kanban view, when " "there are no records in that stage to display." msgstr "" +"Эта стадия не видима, например в статус-баре или виде канбан, когда нет " +"записей на этой стадии для отображения." #. module: project #: view:project.task:0 @@ -1643,7 +1661,7 @@ msgstr "Проекты в ожидании" #. module: project #: view:project.task:0 msgid "Remaining" -msgstr "" +msgstr "Осталось" #. module: project #: field:project.task,progress:0 @@ -1672,17 +1690,17 @@ msgstr "" #. module: project #: field:project.config.settings,module_project_issue:0 msgid "Track issues and bugs" -msgstr "" +msgstr "Отслеживание проблем и ошибок" #. module: project #: field:project.config.settings,module_project_mrp:0 msgid "Generate tasks from sale orders" -msgstr "" +msgstr "Создание задач из заказов" #. module: project #: model:ir.ui.menu,name:project.menu_task_types_view msgid "Task Stages" -msgstr "" +msgstr "Этапы задач" #. module: project #: model:process.node,note:project.process_node_drafttask0 @@ -1693,7 +1711,7 @@ msgstr "Определить требования и установить зап #: field:project.project,message_ids:0 #: field:project.task,message_ids:0 msgid "Messages" -msgstr "" +msgstr "Сообщения" #. module: project #: field:project.project,color:0 @@ -1752,17 +1770,17 @@ msgstr "Дата окончания" #. module: project #: field:project.task.type,state:0 msgid "Related Status" -msgstr "" +msgstr "Связанный статус" #. module: project #: view:project.project:0 msgid "Documents" -msgstr "" +msgstr "Документы" #. module: project #: model:mail.message.subtype,description:project.mt_task_new msgid "Task created" -msgstr "" +msgstr "Задача создана" #. module: project #: view:report.project.task.user:0 @@ -1774,7 +1792,7 @@ msgstr "# дней" #: field:project.project,message_follower_ids:0 #: field:project.task,message_follower_ids:0 msgid "Followers" -msgstr "" +msgstr "Подписчики" #. module: project #: selection:project.project,state:0 @@ -1812,7 +1830,7 @@ msgstr "Проверка задания" #. module: project #: field:project.config.settings,module_project_long_term:0 msgid "Manage resources planning on gantt view" -msgstr "" +msgstr "Управление планированием ресурсов на диаграмме Ганта" #. module: project #: view:project.task:0 @@ -1871,7 +1889,7 @@ msgstr "Проекты" #. module: project #: model:res.groups,name:project.group_tasks_work_on_tasks msgid "Task's Work on Tasks" -msgstr "" +msgstr "Задачи, работающие на задачи" #. module: project #: help:project.task.delegate,name:0 @@ -1914,7 +1932,7 @@ msgstr "Декабрь" #: view:project.task.delegate:0 #: view:project.task.reevaluate:0 msgid "or" -msgstr "" +msgstr "или" #. module: project #: help:project.config.settings,module_project_mrp:0 @@ -1938,7 +1956,7 @@ msgstr "" #. module: project #: model:project.category,name:project.project_category_03 msgid "Experiment" -msgstr "" +msgstr "Эксперимент" #. module: project #: model:process.transition.action,name:project.process_transition_action_opendrafttask0 @@ -1998,7 +2016,7 @@ msgstr "" #: model:ir.actions.act_window,name:project.action_config_settings #: view:project.config.settings:0 msgid "Configure Project" -msgstr "" +msgstr "Настроить проект" #. module: project #: view:project.task.history.cumulative:0 @@ -2030,7 +2048,7 @@ msgstr "Пожалуйста, сначала удалите проект, ссы #: model:mail.message.subtype,name:project.mt_project_task_new #: model:mail.message.subtype,name:project.mt_task_new msgid "Task Created" -msgstr "" +msgstr "Задание создано" #. module: project #: view:report.project.task.user:0 @@ -2048,12 +2066,12 @@ msgstr "Проекты, в которых я менеджер" #: selection:project.task.history,kanban_state:0 #: selection:project.task.history.cumulative,kanban_state:0 msgid "Ready for next stage" -msgstr "" +msgstr "Готово к следующей стадии" #. module: project #: field:project.task.type,case_default:0 msgid "Default for New Projects" -msgstr "" +msgstr "По умолчанию для нового проекта" #. module: project #: view:project.task:0 @@ -2098,7 +2116,7 @@ msgstr "" #. module: project #: model:mail.message.subtype,description:project.mt_task_closed msgid "Task closed" -msgstr "" +msgstr "Задание закрыто" #. module: project #: selection:report.project.task.user,month:0 @@ -2130,13 +2148,13 @@ msgstr "" #. module: project #: selection:project.project,privacy_visibility:0 msgid "Followers Only" -msgstr "" +msgstr "Только для подписчиков" #. module: project #: view:board.board:0 #: field:project.project,task_count:0 msgid "Open Tasks" -msgstr "" +msgstr "Открытые задачи" #. module: project #: field:project.project,priority:0 diff --git a/addons/project/i18n/th.po b/addons/project/i18n/th.po new file mode 100644 index 00000000000..7dfd58eee63 --- /dev/null +++ b/addons/project/i18n/th.po @@ -0,0 +1,2109 @@ +# Thai translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:04+0000\n" +"PO-Revision-Date: 2013-05-15 07:02+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Thai \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-05-16 05:12+0000\n" +"X-Generator: Launchpad (build 16626)\n" + +#. module: project +#: view:project.project:0 +msgid "Email Interface" +msgstr "" + +#. module: project +#: help:account.analytic.account,use_tasks:0 +msgid "" +"If checked, this contract will be available in the project menu and you will " +"be able to manage tasks or track issues" +msgstr "" + +#. module: project +#: field:project.project,progress_rate:0 +#: view:report.project.task.user:0 +#: field:report.project.task.user,progress:0 +msgid "Progress" +msgstr "" + +#. module: project +#: model:process.node,name:project.process_node_taskbydelegate0 +msgid "Task by delegate" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Parent" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.dblc_proj +msgid "Project's tasks" +msgstr "" + +#. module: project +#: field:project.task.type,name:0 +msgid "Stage Name" +msgstr "" + +#. module: project +#: model:process.transition.action,name:project.process_transition_action_openpendingtask0 +msgid "Set pending" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "New Project Based on Template" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,day:0 +msgid "Day" +msgstr "" + +#. module: project +#: model:project.task.type,name:project.project_tt_merge +msgid "Merge" +msgstr "" + +#. module: project +#: view:res.partner:0 +msgid "Start Task" +msgstr "" + +#. module: project +#: code:addons/project/project.py:932 +#, python-format +msgid "Warning !" +msgstr "" + +#. module: project +#: help:project.project,message_unread:0 +#: help:project.task,message_unread:0 +msgid "If checked new messages require your attention." +msgstr "" + +#. module: project +#: model:process.node,name:project.process_node_donetask0 +msgid "Done task" +msgstr "" + +#. module: project +#: model:process.node,note:project.process_node_donetask0 +msgid "Task is Completed" +msgstr "" + +#. module: project +#: view:res.partner:0 +msgid "False" +msgstr "" + +#. module: project +#: model:project.task.type,name:project.project_tt_testing +msgid "Testing" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_account_analytic_account +msgid "Analytic Account" +msgstr "" + +#. module: project +#: field:project.config.settings,group_time_work_estimation_tasks:0 +msgid "Manage time estimation on tasks" +msgstr "" + +#. module: project +#: help:project.project,message_summary:0 +#: help:project.task,message_summary:0 +msgid "" +"Holds the Chatter summary (number of messages, ...). This summary is " +"directly in html format in order to be inserted in kanban views." +msgstr "" + +#. module: project +#: code:addons/project/project.py:432 +#: code:addons/project/project.py:1318 +#, python-format +msgid "Warning!" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_res_partner +msgid "Partner" +msgstr "" + +#. module: project +#: field:project.config.settings,group_manage_delegation_task:0 +msgid "Allow task delegation" +msgstr "" + +#. module: project +#: field:project.task.delegate,planned_hours:0 +#: view:report.project.task.user:0 +#: field:report.project.task.user,hours_planned:0 +msgid "Planned Hours" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Reset as Project" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "In progress tasks" +msgstr "" + +#. module: project +#: help:project.project,progress_rate:0 +msgid "Percent of tasks closed according to the total of tasks todo." +msgstr "" + +#. module: project +#: model:ir.actions.client,name:project.action_client_project_menu +msgid "Open Project Menu" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,help:project.action_project_task_user_tree +msgid "" +"This report allows you to analyse the performance of your projects and " +"users. You can analyse the quantities of tasks, the hours spent compared to " +"the planned hours, the average number of days to open or close a task, etc." +msgstr "" + +#. module: project +#: view:project.task.delegate:0 +msgid "Validation Task Title" +msgstr "" + +#. module: project +#: model:res.groups,name:project.group_delegate_task +msgid "Task Delegation" +msgstr "" + +#. module: project +#: field:project.project,planned_hours:0 +#: field:project.task.history,planned_hours:0 +#: field:project.task.history.cumulative,planned_hours:0 +msgid "Planned Time" +msgstr "" + +#. module: project +#: selection:project.project,privacy_visibility:0 +msgid "Public" +msgstr "" + +#. module: project +#: model:project.category,name:project.project_category_01 +msgid "Contact's suggestion" +msgstr "" + +#. module: project +#: help:project.config.settings,group_time_work_estimation_tasks:0 +msgid "Allows you to compute Time Estimation on tasks." +msgstr "" + +#. module: project +#: field:report.project.task.user,user_id:0 +msgid "Assigned To" +msgstr "" + +#. module: project +#: model:mail.message.subtype,name:project.mt_project_task_closed +#: model:mail.message.subtype,name:project.mt_task_closed +msgid "Task Done" +msgstr "" + +#. module: project +#: view:project.project:0 +#: view:report.project.task.user:0 +#: field:report.project.task.user,partner_id:0 +msgid "Contact" +msgstr "" + +#. module: project +#: model:process.transition,name:project.process_transition_delegate0 +#: view:project.task:0 +msgid "Delegate" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.open_view_template_project +#: view:project.project:0 +msgid "Templates of Projects" +msgstr "" + +#. module: project +#: field:project.project,analytic_account_id:0 +msgid "Contract/Analytic" +msgstr "" + +#. module: project +#: view:project.config.settings:0 +msgid "Project Management" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.action_project_task_delegate +#: view:project.task.delegate:0 +msgid "Project Task Delegate" +msgstr "" + +#. module: project +#: model:mail.message.subtype,name:project.mt_project_task_started +#: model:mail.message.subtype,name:project.mt_task_started +msgid "Task Started" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Very Important" +msgstr "" + +#. module: project +#: view:project.config.settings:0 +msgid "Support" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Member" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Cancel Task" +msgstr "" + +#. module: project +#: help:project.project,members:0 +msgid "" +"Project's members are users who can have an access to the tasks related to " +"this project." +msgstr "" + +#. module: project +#: view:project.project:0 +#: field:project.task,manager_id:0 +msgid "Project Manager" +msgstr "" + +#. module: project +#: field:project.project,state:0 +#: field:project.task,state:0 +#: field:project.task.history,state:0 +#: field:project.task.history.cumulative,state:0 +#: field:report.project.task.user,state:0 +msgid "Status" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "August" +msgstr "" + +#. module: project +#: view:project.project:0 +#: field:project.project,complete_name:0 +msgid "Project Name" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "June" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "October" +msgstr "" + +#. module: project +#: help:project.project,total_hours:0 +msgid "" +"Sum of total hours of all tasks related to this project and its child " +"projects." +msgstr "" + +#. module: project +#: help:project.project,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the project " +"without removing it." +msgstr "" + +#. module: project +#: model:process.transition,note:project.process_transition_opendonetask0 +msgid "When task is completed, it will come into the done state." +msgstr "" + +#. module: project +#: field:project.project,message_summary:0 +#: field:project.task,message_summary:0 +msgid "Summary" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Append this project to another one using analytic accounts hierarchy" +msgstr "" + +#. module: project +#: view:project.task:0 +#: view:project.task.history.cumulative:0 +msgid "In Progress Tasks" +msgstr "" + +#. module: project +#: help:res.company,project_time_mode_id:0 +msgid "" +"This will set the unit of measure used in projects and tasks.\n" +"If you use the timesheet linked to projects (project_timesheet module), " +"don't forget to setup the right unit of measure in your employees." +msgstr "" + +#. module: project +#: field:project.task,user_id:0 +#: view:report.project.task.user:0 +msgid "Assigned to" +msgstr "" + +#. module: project +#: code:addons/project/project.py:1021 +#, python-format +msgid "Delegated User should be specified" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Project(s) Manager" +msgstr "" + +#. module: project +#: selection:project.project,state:0 +#: view:project.task:0 +#: selection:project.task,state:0 +#: selection:project.task.history,state:0 +#: selection:project.task.history.cumulative,state:0 +#: selection:project.task.type,state:0 +#: selection:report.project.task.user,state:0 +msgid "In Progress" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Reactivate" +msgstr "" + +#. module: project +#: field:project.project,resource_calendar_id:0 +msgid "Working Time" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.action_project_task_reevaluate +msgid "Re-evaluate Task" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Validate planned time" +msgstr "" + +#. module: project +#: field:project.config.settings,module_pad:0 +msgid "Use integrated collaborative note pads on task" +msgstr "" + +#. module: project +#: model:mail.message.subtype,name:project.mt_project_task_blocked +#: model:mail.message.subtype,name:project.mt_task_blocked +msgid "Task Blocked" +msgstr "" + +#. module: project +#: model:process.node,note:project.process_node_opentask0 +msgid "Encode your working hours." +msgstr "" + +#. module: project +#: field:project.project,alias_id:0 +msgid "Alias" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "oe_kanban_text_red" +msgstr "" + +#. module: project +#: model:mail.message.subtype,description:project.mt_task_blocked +msgid "Task blocked" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Delegation" +msgstr "" + +#. module: project +#: field:project.task,create_date:0 +msgid "Create Date" +msgstr "" + +#. module: project +#: view:res.partner:0 +msgid "For changing to open state" +msgstr "" + +#. module: project +#: view:project.config.settings:0 +msgid "Apply" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_project_task_delegate +msgid "Task Delegate" +msgstr "" + +#. module: project +#: help:project.task.delegate,new_task_description:0 +msgid "Reinclude the description of the task in the task of the user" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Project Settings" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "My tasks" +msgstr "" + +#. module: project +#: model:process.transition,name:project.process_transition_opendonetask0 +msgid "Open Done Task" +msgstr "" + +#. module: project +#: field:project.task.delegate,planned_hours_me:0 +msgid "Hours to Validate" +msgstr "" + +#. module: project +#: help:project.task,remaining_hours:0 +msgid "" +"Total remaining time, can be re-estimated periodically by the assignee of " +"the task." +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "March" +msgstr "" + +#. module: project +#: view:board.board:0 +#: model:ir.actions.act_window,name:project.my_open_tasks_action +#: view:project.task:0 +#: view:project.task.history.cumulative:0 +msgid "My Tasks" +msgstr "" + +#. module: project +#: constraint:project.task:0 +msgid "Error ! You cannot create recursive tasks." +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "Pending tasks" +msgstr "" + +#. module: project +#: view:project.task.reevaluate:0 +msgid "_Evaluate" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,opening_days:0 +msgid "Days to Open" +msgstr "" + +#. module: project +#: selection:report.project.task.user,priority:0 +msgid "Very urgent" +msgstr "" + +#. module: project +#: help:project.task.delegate,project_id:0 +#: help:project.task.delegate,user_id:0 +msgid "User you want to delegate this task to" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Set as Template" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_project_task +#: view:project.config.settings:0 +#: view:project.project:0 +#: view:project.task:0 +#: field:project.task.history,task_id:0 +#: field:project.task.history.cumulative,task_id:0 +#: field:project.task.work,task_id:0 +#: view:report.project.task.user:0 +msgid "Task" +msgstr "" + +#. module: project +#: help:project.config.settings,group_tasks_work_on_tasks:0 +msgid "Allows you to compute work on tasks." +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Administration" +msgstr "" + +#. module: project +#: field:project.config.settings,group_tasks_work_on_tasks:0 +msgid "Log work activities on tasks" +msgstr "" + +#. module: project +#: model:project.task.type,name:project.project_tt_analysis +msgid "Analysis" +msgstr "" + +#. module: project +#: field:project.task,name:0 +#: field:report.project.task.user,name:0 +msgid "Task Summary" +msgstr "" + +#. module: project +#: field:project.task,active:0 +msgid "Not a Template Task" +msgstr "" + +#. module: project +#: field:project.task,planned_hours:0 +msgid "Initially Planned Hours" +msgstr "" + +#. module: project +#: model:process.transition,note:project.process_transition_delegate0 +msgid "Delegates tasks to the other user" +msgstr "" + +#. module: project +#: help:project.task,effective_hours:0 +msgid "Computed using the sum of the task work done." +msgstr "" + +#. module: project +#: model:ir.actions.act_window,help:project.open_view_project_all +msgid "" +"

\n" +" Click to start a new project.\n" +"

\n" +" Projects are used to organize your activities; plan\n" +" tasks, track issues, invoice timesheets. You can define\n" +" internal projects (R&D, Improve Sales Process),\n" +" private projects (My Todos) or customer ones.\n" +"

\n" +" You will be able collaborate with internal users on\n" +" projects or invite customers to share your activities.\n" +"

\n" +" " +msgstr "" + +#. module: project +#: view:project.config.settings:0 +msgid "Planning" +msgstr "" + +#. module: project +#: view:project.task:0 +#: field:project.task,date_deadline:0 +#: field:report.project.task.user,date_deadline:0 +msgid "Deadline" +msgstr "" + +#. module: project +#: view:project.task.history.cumulative:0 +msgid "Ready" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "New Tasks" +msgstr "" + +#. module: project +#: field:project.config.settings,module_project_issue_sheet:0 +msgid "Invoice working time on issues" +msgstr "" + +#. module: project +#: view:project.project:0 +#: view:project.task:0 +#: field:project.task.history,end_date:0 +#: field:project.task.history.cumulative,end_date:0 +msgid "End Date" +msgstr "" + +#. module: project +#: model:project.task.type,name:project.project_tt_specification +msgid "Specification" +msgstr "" + +#. module: project +#: model:process.transition,note:project.process_transition_draftopentask0 +msgid "From draft state, it will come into the open state." +msgstr "" + +#. module: project +#: view:project.task.history.cumulative:0 +msgid "Task's Analysis" +msgstr "" + +#. module: project +#: view:project.task.delegate:0 +#: field:project.task.delegate,new_task_description:0 +msgid "New Task Description" +msgstr "" + +#. module: project +#: field:report.project.task.user,delay_endings_days:0 +msgid "Overpassed Deadline" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "New tasks" +msgstr "" + +#. module: project +#: selection:project.task,priority:0 +#: selection:report.project.task.user,priority:0 +msgid "Medium" +msgstr "" + +#. module: project +#: field:project.project,total_hours:0 +msgid "Total Time" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "Creation Date" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Miscellaneous" +msgstr "" + +#. module: project +#: view:project.task:0 +#: field:project.task,stage_id:0 +#: field:project.task.history,type_id:0 +#: field:project.task.history.cumulative,type_id:0 +msgid "Stage" +msgstr "" + +#. module: project +#: model:process.transition,name:project.process_transition_draftopentask0 +msgid "Draft Open task" +msgstr "" + +#. module: project +#: field:project.project,alias_model:0 +msgid "Alias Model" +msgstr "" + +#. module: project +#: help:report.project.task.user,closing_days:0 +msgid "Number of Days to close the task" +msgstr "" + +#. module: project +#: view:board.board:0 +msgid "My Board" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.open_task_type_form +msgid "Stages" +msgstr "" + +#. module: project +#: view:project.project:0 +#: view:project.task:0 +msgid "Delete" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "In progress" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "September" +msgstr "" + +#. module: project +#: selection:report.project.task.user,priority:0 +msgid "Urgent" +msgstr "" + +#. module: project +#: model:project.category,name:project.project_category_02 +msgid "Feature request" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Delegated tasks" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_project_task_work +msgid "Project Task Work" +msgstr "" + +#. module: project +#: code:addons/project/wizard/project_task_delegate.py:81 +#, python-format +msgid "CHECK: %s" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Close Project" +msgstr "" + +#. module: project +#: field:project.project,tasks:0 +msgid "Task Activities" +msgstr "" + +#. module: project +#: field:project.project,effective_hours:0 +#: field:project.task.work,hours:0 +msgid "Time Spent" +msgstr "" + +#. module: project +#: view:project.project:0 +#: view:project.task:0 +msgid "í" +msgstr "" + +#. module: project +#: field:account.analytic.account,company_uom_id:0 +msgid "unknown" +msgstr "" + +#. module: project +#: field:project.project,message_is_follower:0 +#: field:project.task,message_is_follower:0 +msgid "Is a Follower" +msgstr "" + +#. module: project +#: field:project.task,work_ids:0 +msgid "Work done" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "Extended Filters..." +msgstr "" + +#. module: project +#: model:ir.ui.menu,name:project.menu_tasks_config +msgid "GTD" +msgstr "" + +#. module: project +#: help:project.task,state:0 +msgid "" +"The status is set to 'Draft', when a case is created. " +"If the case is in progress the status is set to 'Open'. " +"When the case is over, the status is set to 'Done'. If " +"the case needs to be reviewed then the status is set " +"to 'Pending'." +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_res_company +msgid "Companies" +msgstr "" + +#. module: project +#: field:project.task.type,fold:0 +msgid "Folded by Default" +msgstr "" + +#. module: project +#: field:project.task.history,date:0 +#: field:project.task.history.cumulative,date:0 +#: field:project.task.work,date:0 +msgid "Date" +msgstr "" + +#. module: project +#: help:project.config.settings,module_project_issue:0 +msgid "" +"Provides management of issues/bugs in projects.\n" +" This installs the module project_issue." +msgstr "" + +#. module: project +#: help:project.task,kanban_state:0 +msgid "" +"A task's kanban state indicates special situations affecting it:\n" +" * Normal is the default situation\n" +" * Blocked indicates something is preventing the progress of this task\n" +" * Ready for next stage indicates the task is ready to be pulled to the next " +"stage" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "10" +msgstr "" + +#. module: project +#: help:project.project,analytic_account_id:0 +msgid "" +"Link this project to an analytic account if you need financial management on " +"projects. It enables you to connect projects with budgets, planning, cost " +"and revenue analysis, timesheets on projects, etc." +msgstr "" + +#. module: project +#: model:process.transition.action,name:project.process_transition_action_draftcanceltask0 +#: model:process.transition.action,name:project.process_transition_action_opencanceltask0 +#: view:project.config.settings:0 +#: view:project.task.delegate:0 +#: view:project.task.reevaluate:0 +msgid "Cancel" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Other Info" +msgstr "" + +#. module: project +#: view:project.task.delegate:0 +msgid "_Delegate" +msgstr "" + +#. module: project +#: selection:project.task,priority:0 +#: selection:report.project.task.user,priority:0 +msgid "Very Low" +msgstr "" + +#. module: project +#: help:project.project,effective_hours:0 +msgid "" +"Sum of spent hours of all tasks related to this project and its child " +"projects." +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "" +"Follow this project to automatically track the events associated to tasks " +"and issues of this project." +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Users" +msgstr "" + +#. module: project +#: model:mail.message.subtype,name:project.mt_task_stage +msgid "Stage Changed" +msgstr "" + +#. module: project +#: view:project.project:0 +#: model:res.groups,name:project.group_project_manager +msgid "Manager" +msgstr "" + +#. module: project +#: selection:project.task,priority:0 +msgid "Important" +msgstr "" + +#. module: project +#: field:project.category,name:0 +msgid "Name" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "November" +msgstr "" + +#. module: project +#: view:project.task.reevaluate:0 +msgid "Reevaluate Task" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_project_task_type +#: view:project.task.type:0 +msgid "Task Stage" +msgstr "" + +#. module: project +#: view:project.task.type:0 +msgid "Common" +msgstr "" + +#. module: project +#: help:project.project,message_ids:0 +#: help:project.task,message_ids:0 +msgid "Messages and communication history" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "" +"To invoice or setup invoicing and renewal options, go to the related " +"contract:" +msgstr "" + +#. module: project +#: field:project.task.delegate,state:0 +msgid "Validation State" +msgstr "" + +#. module: project +#: field:project.task.work,name:0 +msgid "Work summary" +msgstr "" + +#. module: project +#: view:project.project:0 +#: view:project.task:0 +#: view:report.project.task.user:0 +msgid "Group By..." +msgstr "" + +#. module: project +#: view:project.project:0 +#: selection:project.project,state:0 +msgid "Template" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Re-open project" +msgstr "" + +#. module: project +#: help:project.project,priority:0 +msgid "Gives the sequence order when displaying the list of projects" +msgstr "" + +#. module: project +#: constraint:project.project:0 +msgid "Error! project start-date must be lower then project end-date." +msgstr "" + +#. module: project +#: field:project.project,members:0 +msgid "Project Members" +msgstr "" + +#. module: project +#: field:project.task,child_ids:0 +msgid "Delegated Tasks" +msgstr "" + +#. module: project +#: view:project.project:0 +#: field:project.project,message_unread:0 +#: view:project.task:0 +#: field:project.task,message_unread:0 +msgid "Unread Messages" +msgstr "" + +#. module: project +#: view:project.task:0 +#: field:project.task,parent_ids:0 +msgid "Parent Tasks" +msgstr "" + +#. module: project +#: model:process.node,name:project.process_node_opentask0 +msgid "Open task" +msgstr "" + +#. module: project +#: view:project.task.type:0 +msgid "Stages common to all projects" +msgstr "" + +#. module: project +#: model:process.node,name:project.process_node_drafttask0 +msgid "Draft task" +msgstr "" + +#. module: project +#: field:project.task,notes:0 +msgid "Notes" +msgstr "" + +#. module: project +#: view:project.task:0 +#: view:project.task.history.cumulative:0 +msgid "Pending Tasks" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Show only tasks having a deadline" +msgstr "" + +#. module: project +#: model:project.category,name:project.project_category_04 +msgid "Usability" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,hours_delay:0 +msgid "Avg. Plan.-Eff." +msgstr "" + +#. module: project +#: field:project.task.work,user_id:0 +msgid "Done by" +msgstr "" + +#. module: project +#: code:addons/project/project.py:181 +#, python-format +msgid "Invalid Action!" +msgstr "" + +#. module: project +#: help:project.task.type,state:0 +msgid "" +"The status of your document is automatically changed regarding the selected " +"stage. For example, if a stage is related to the status 'Close', when your " +"document reaches this stage, it is automatically closed." +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Extra Info" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Edit..." +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,nbr:0 +msgid "# of tasks" +msgstr "" + +#. module: project +#: field:project.project,doc_count:0 +msgid "Number of documents attached" +msgstr "" + +#. module: project +#: field:project.task,priority:0 +#: field:report.project.task.user,priority:0 +msgid "Priority" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Open Projects" +msgstr "" + +#. module: project +#: help:project.project,alias_id:0 +msgid "" +"Internal email associated with this project. Incoming emails are " +"automatically synchronizedwith Tasks (or optionally Issues if the Issue " +"Tracker module is installed)." +msgstr "" + +#. module: project +#: model:ir.actions.act_window,help:project.open_task_type_form +msgid "" +"

\n" +" Click to add a stage in the task pipeline.\n" +"

\n" +" Define the steps that will be used in the project from the\n" +" creation of the task, up to the closing of the task or " +"issue.\n" +" You will use these stages in order to track the progress in\n" +" solving a task or an issue.\n" +"

\n" +" " +msgstr "" + +#. module: project +#: help:project.task,total_hours:0 +msgid "Computed as: Time Spent + Remaining Time." +msgstr "" + +#. module: project +#: code:addons/project/project.py:356 +#: code:addons/project/project.py:377 +#: code:addons/project/project.py:709 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: project +#: model:mail.message.subtype,name:project.mt_project_task_stage +msgid "Task Stage Changed" +msgstr "" + +#. module: project +#: view:project.task:0 +#: field:project.task.history,remaining_hours:0 +#: field:project.task.history.cumulative,remaining_hours:0 +msgid "Remaining Time" +msgstr "" + +#. module: project +#: field:project.task.delegate,name:0 +msgid "Delegated Title" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "July" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_project_task_reevaluate +msgid "project.task.reevaluate" +msgstr "" + +#. module: project +#: field:project.task,delay_hours:0 +msgid "Delay Hours" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Team" +msgstr "" + +#. module: project +#: help:project.config.settings,time_unit:0 +msgid "This will set the unit of measure used in projects and tasks." +msgstr "" + +#. module: project +#: selection:project.task,priority:0 +msgid "Very important" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,month:0 +msgid "Month" +msgstr "" + +#. module: project +#: model:project.task.type,name:project.project_tt_design +msgid "Design" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Start Date" +msgstr "" + +#. module: project +#: view:project.task:0 +#: selection:project.task,kanban_state:0 +#: selection:project.task.history,kanban_state:0 +#: view:project.task.history.cumulative:0 +#: selection:project.task.history.cumulative,kanban_state:0 +msgid "Blocked" +msgstr "" + +#. module: project +#: help:project.task,progress:0 +msgid "" +"If the task has a progress of 99.99% you should close the task if it's " +"finished or reevaluate the time" +msgstr "" + +#. module: project +#: field:project.task,user_email:0 +msgid "User Email" +msgstr "" + +#. module: project +#: help:project.task.delegate,prefix:0 +msgid "Title for your validation task" +msgstr "" + +#. module: project +#: field:project.config.settings,time_unit:0 +msgid "Working time unit" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Projects in which I am a member." +msgstr "" + +#. module: project +#: selection:project.task,priority:0 +#: selection:report.project.task.user,priority:0 +msgid "Low" +msgstr "" + +#. module: project +#: selection:project.project,state:0 +msgid "Closed" +msgstr "" + +#. module: project +#: view:project.project:0 +#: selection:project.project,state:0 +#: view:project.task:0 +#: selection:project.task,state:0 +#: selection:project.task.delegate,state:0 +#: selection:project.task.history,state:0 +#: selection:project.task.history.cumulative,state:0 +#: selection:project.task.type,state:0 +#: view:report.project.task.user:0 +#: selection:report.project.task.user,state:0 +msgid "Pending" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.project_category_action +#: model:ir.ui.menu,name:project.menu_project_category_act +#: view:project.category:0 +#: field:project.task,categ_ids:0 +msgid "Tags" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_project_task_history +#: model:ir.model,name:project.model_project_task_history_cumulative +msgid "History of Tasks" +msgstr "" + +#. module: project +#: help:project.task.delegate,state:0 +msgid "" +"New state of your own task. Pending will be reopened automatically when the " +"delegated task is closed" +msgstr "" + +#. module: project +#: help:project.config.settings,group_manage_delegation_task:0 +msgid "Allows you to delegate tasks to other users." +msgstr "" + +#. module: project +#: field:project.project,active:0 +msgid "Active" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_project_category +msgid "Category of project's task, issue, ..." +msgstr "" + +#. module: project +#: help:project.project,resource_calendar_id:0 +msgid "Timetable working hours to adjust the gantt diagram report" +msgstr "" + +#. module: project +#: help:project.task,delay_hours:0 +msgid "" +"Computed as difference between planned hours by the project manager and the " +"total hours of the task." +msgstr "" + +#. module: project +#: view:project.config.settings:0 +msgid "Helpdesk & Support" +msgstr "" + +#. module: project +#: help:report.project.task.user,opening_days:0 +msgid "Number of Days to Open the task" +msgstr "" + +#. module: project +#: field:project.task,delegated_user_id:0 +msgid "Delegated To" +msgstr "" + +#. module: project +#: help:project.task,planned_hours:0 +msgid "" +"Estimated time to do the task, usually set by the project manager when the " +"task is in draft state." +msgstr "" + +#. module: project +#: code:addons/project/project.py:220 +#, python-format +msgid "Attachments" +msgstr "" + +#. module: project +#: view:project.task:0 +#: selection:project.task,state:0 +#: selection:project.task.delegate,state:0 +#: selection:project.task.history,state:0 +#: selection:project.task.history.cumulative,state:0 +#: model:project.task.type,name:project.project_tt_deployment +#: selection:project.task.type,state:0 +#: view:report.project.task.user:0 +#: selection:report.project.task.user,state:0 +#: view:res.partner:0 +msgid "Done" +msgstr "" + +#. module: project +#: code:addons/project/project.py:182 +#, python-format +msgid "" +"You cannot delete a project containing tasks. You can either delete all the " +"project's tasks and then delete the project or simply deactivate the project." +msgstr "" + +#. module: project +#: model:process.transition.action,name:project.process_transition_action_draftopentask0 +#: view:project.project:0 +msgid "Open" +msgstr "" + +#. module: project +#: field:project.project,privacy_visibility:0 +msgid "Privacy / Visibility" +msgstr "" + +#. module: project +#: view:project.task:0 +#: field:project.task,remaining_hours:0 +#: field:project.task.reevaluate,remaining_hours:0 +#: view:report.project.task.user:0 +#: field:report.project.task.user,remaining_hours:0 +msgid "Remaining Hours" +msgstr "" + +#. module: project +#: model:mail.message.subtype,description:project.mt_task_stage +msgid "Stage changed" +msgstr "" + +#. module: project +#: constraint:project.task:0 +msgid "Error ! Task end-date must be greater then task start-date" +msgstr "" + +#. module: project +#: field:project.task.history,user_id:0 +#: field:project.task.history.cumulative,user_id:0 +msgid "Responsible" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Search Project" +msgstr "" + +#. module: project +#: view:project.task.delegate:0 +msgid "Delegated Task" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,total_hours:0 +msgid "Total Hours" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_project_config_settings +msgid "project.config.settings" +msgstr "" + +#. module: project +#: model:project.task.type,name:project.project_tt_development +msgid "Development" +msgstr "" + +#. module: project +#: help:project.task,active:0 +msgid "" +"This field is computed automatically and have the same behavior than the " +"boolean 'active' field: if the task is linked to a template or unactivated " +"project, it will be hidden unless specifically asked." +msgstr "" + +#. module: project +#: model:res.request.link,name:project.req_link_task +msgid "Project task" +msgstr "" + +#. module: project +#: field:project.task,effective_hours:0 +msgid "Hours Spent" +msgstr "" + +#. module: project +#: help:project.config.settings,module_pad:0 +msgid "" +"Lets the company customize which Pad installation should be used to link to " +"new pads\n" +" (by default, http://ietherpad.com/).\n" +" This installs the module pad." +msgstr "" + +#. module: project +#: field:project.task,id:0 +msgid "ID" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.action_view_task_overpassed_draft +msgid "Overpassed Tasks" +msgstr "" + +#. module: project +#: code:addons/project/project.py:932 +#, python-format +msgid "" +"Child task still open.\n" +"Please cancel or complete child task first." +msgstr "" + +#. module: project +#: field:project.task.delegate,user_id:0 +msgid "Assign To" +msgstr "" + +#. module: project +#: model:res.groups,name:project.group_time_work_estimation_tasks +msgid "Time Estimation on Tasks" +msgstr "" + +#. module: project +#: field:project.task,total_hours:0 +msgid "Total" +msgstr "" + +#. module: project +#: model:process.node,note:project.process_node_taskbydelegate0 +msgid "Delegate your task to the other user" +msgstr "" + +#. module: project +#: model:mail.message.subtype,description:project.mt_task_started +msgid "Task started" +msgstr "" + +#. module: project +#: help:project.task.reevaluate,remaining_hours:0 +msgid "Put here the remaining hours required to close the task." +msgstr "" + +#. module: project +#: help:project.task.type,fold:0 +msgid "" +"This stage is not visible, for example in status bar or kanban view, when " +"there are no records in that stage to display." +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Deadlines" +msgstr "" + +#. module: project +#: code:addons/project/wizard/project_task_delegate.py:69 +#: code:addons/project/wizard/project_task_delegate.py:70 +#: code:addons/project/wizard/project_task_delegate.py:77 +#: code:addons/project/wizard/project_task_delegate.py:78 +#, python-format +msgid "CHECK: " +msgstr "" + +#. module: project +#: code:addons/project/project.py:432 +#, python-format +msgid "You must assign members on the project '%s' !" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Pending Projects" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Remaining" +msgstr "" + +#. module: project +#: field:project.task,progress:0 +msgid "Progress (%)" +msgstr "" + +#. module: project +#: field:project.task,company_id:0 +#: field:project.task.work,company_id:0 +#: view:report.project.task.user:0 +#: field:report.project.task.user,company_id:0 +msgid "Company" +msgstr "" + +#. module: project +#: help:project.config.settings,module_project_timesheet:0 +msgid "" +"This allows you to transfer the entries under tasks defined for Project " +"Management to\n" +" the timesheet line entries for particular date and user, " +"with the effect of creating,\n" +" editing and deleting either ways.\n" +" This installs the module project_timesheet." +msgstr "" + +#. module: project +#: field:project.config.settings,module_project_issue:0 +msgid "Track issues and bugs" +msgstr "" + +#. module: project +#: field:project.config.settings,module_project_mrp:0 +msgid "Generate tasks from sale orders" +msgstr "" + +#. module: project +#: model:ir.ui.menu,name:project.menu_task_types_view +msgid "Task Stages" +msgstr "" + +#. module: project +#: model:process.node,note:project.process_node_drafttask0 +msgid "Define the Requirements and Set Planned Hours." +msgstr "" + +#. module: project +#: field:project.project,message_ids:0 +#: field:project.task,message_ids:0 +msgid "Messages" +msgstr "" + +#. module: project +#: field:project.project,color:0 +#: field:project.task,color:0 +msgid "Color Index" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.open_board_project +#: model:ir.model,name:project.model_project_project +#: model:ir.ui.menu,name:project.menu_project_dashboard +#: model:ir.ui.menu,name:project.menu_project_management +#: view:project.project:0 +#: view:project.task:0 +#: field:project.task,project_id:0 +#: field:project.task.delegate,project_id:0 +#: field:project.task.history.cumulative,project_id:0 +#: view:report.project.task.user:0 +#: field:report.project.task.user,project_id:0 +#: model:res.request.link,name:project.req_link_project +msgid "Project" +msgstr "" + +#. module: project +#: selection:project.project,state:0 +#: selection:project.task,state:0 +#: selection:project.task.history,state:0 +#: selection:project.task.history.cumulative,state:0 +#: model:project.task.type,name:project.project_tt_cancel +#: selection:project.task.type,state:0 +#: selection:report.project.task.user,state:0 +msgid "Cancelled" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,help:project.act_project_project_2_project_task_all +#: model:ir.actions.act_window,help:project.action_view_task +msgid "" +"

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

\n" +" OpenERP's project management allows you to manage the " +"pipeline\n" +" of tasks in order to get things done efficiently. You can\n" +" track progress, discuss on tasks, attach documents, etc.\n" +"

\n" +" " +msgstr "" + +#. module: project +#: field:project.task,date_end:0 +#: field:report.project.task.user,date_end:0 +msgid "Ending Date" +msgstr "" + +#. module: project +#: field:project.task.type,state:0 +msgid "Related Status" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Documents" +msgstr "" + +#. module: project +#: model:mail.message.subtype,description:project.mt_task_new +msgid "Task created" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,no_of_days:0 +msgid "# of Days" +msgstr "" + +#. module: project +#: field:project.project,message_follower_ids:0 +#: field:project.task,message_follower_ids:0 +msgid "Followers" +msgstr "" + +#. module: project +#: selection:project.project,state:0 +#: view:project.task:0 +#: selection:project.task,state:0 +#: selection:project.task.history,state:0 +#: selection:project.task.history.cumulative,state:0 +#: selection:project.task.type,state:0 +#: view:report.project.task.user:0 +msgid "New" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.action_view_task_history_cumulative +#: model:ir.ui.menu,name:project.menu_action_view_task_history_cumulative +msgid "Cumulative Flow" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,hours_effective:0 +msgid "Effective Hours" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "OverPass delay" +msgstr "" + +#. module: project +#: view:project.task.delegate:0 +msgid "Validation Task" +msgstr "" + +#. module: project +#: field:project.config.settings,module_project_long_term:0 +msgid "Manage resources planning on gantt view" +msgstr "" + +#. module: project +#: view:project.task:0 +#: view:project.task.history.cumulative:0 +msgid "Unassigned Tasks" +msgstr "" + +#. module: project +#: help:project.project,planned_hours:0 +msgid "" +"Sum of planned hours of all tasks related to this project and its child " +"projects." +msgstr "" + +#. module: project +#: view:res.partner:0 +msgid "For changing to done state" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "My Task" +msgstr "" + +#. module: project +#: view:project.task:0 +#: view:project.task.history.cumulative:0 +#: view:report.project.task.user:0 +msgid "My Projects" +msgstr "" + +#. module: project +#: help:project.task,sequence:0 +msgid "Gives the sequence order when displaying a list of tasks." +msgstr "" + +#. module: project +#: field:project.task,date_start:0 +#: field:report.project.task.user,date_start:0 +msgid "Starting Date" +msgstr "" + +#. module: project +#: code:addons/project/project.py:398 +#: model:ir.actions.act_window,name:project.open_view_project_all +#: model:ir.ui.menu,name:project.menu_projects +#: view:project.project:0 +#: field:project.task.type,project_ids:0 +#: view:res.company:0 +#, python-format +msgid "Projects" +msgstr "" + +#. module: project +#: model:res.groups,name:project.group_tasks_work_on_tasks +msgid "Task's Work on Tasks" +msgstr "" + +#. module: project +#: help:project.task.delegate,name:0 +msgid "New title of the task delegated to the user" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.action_project_task_user_tree +#: model:ir.ui.menu,name:project.menu_project_task_user_tree +#: view:report.project.task.user:0 +msgid "Tasks Analysis" +msgstr "" + +#. module: project +#: view:project.task:0 +#: view:project.task.history.cumulative:0 +msgid "Project Tasks" +msgstr "" + +#. module: project +#: field:account.analytic.account,use_tasks:0 +#: model:ir.actions.act_window,name:project.act_project_project_2_project_task_all +#: model:ir.actions.act_window,name:project.action_view_task +#: model:ir.ui.menu,name:project.menu_action_view_task +#: model:process.process,name:project.process_process_tasksprocess0 +#: view:project.project:0 +#: view:project.task:0 +#: view:res.partner:0 +#: field:res.partner,task_ids:0 +msgid "Tasks" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "December" +msgstr "" + +#. module: project +#: view:project.config.settings:0 +#: view:project.task.delegate:0 +#: view:project.task.reevaluate:0 +msgid "or" +msgstr "" + +#. module: project +#: help:project.config.settings,module_project_mrp:0 +msgid "" +"This feature automatically creates project tasks from service products in " +"sale orders.\n" +" More precisely, tasks are created for procurement lines with " +"product of type 'Service',\n" +" procurement method 'Make to Order', and supply method " +"'Manufacture'.\n" +" This installs the module project_mrp." +msgstr "" + +#. module: project +#: help:project.task.delegate,planned_hours:0 +msgid "Estimated time to close this task by the delegated user" +msgstr "" + +#. module: project +#: model:project.category,name:project.project_category_03 +msgid "Experiment" +msgstr "" + +#. module: project +#: model:process.transition.action,name:project.process_transition_action_opendrafttask0 +#: selection:report.project.task.user,state:0 +msgid "Draft" +msgstr "" + +#. module: project +#: field:project.task,kanban_state:0 +#: field:project.task.history,kanban_state:0 +#: field:project.task.history.cumulative,kanban_state:0 +msgid "Kanban State" +msgstr "" + +#. module: project +#: field:project.config.settings,module_project_timesheet:0 +msgid "Record timesheet lines per tasks" +msgstr "" + +#. module: project +#: model:ir.model,name:project.model_report_project_task_user +msgid "Tasks by user and project" +msgstr "" + +#. module: project +#: field:res.company,project_time_mode_id:0 +msgid "Project Time Unit" +msgstr "" + +#. module: project +#: view:project.task:0 +#: selection:project.task,kanban_state:0 +#: selection:project.task.history,kanban_state:0 +#: selection:project.task.history.cumulative,kanban_state:0 +msgid "Normal" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,closing_days:0 +msgid "Days to Close" +msgstr "" + +#. module: project +#: model:res.groups,name:project.group_project_user +msgid "User" +msgstr "" + +#. module: project +#: help:project.project,alias_model:0 +msgid "" +"The kind of document created when an email is received on this project's " +"email alias" +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.action_config_settings +#: view:project.config.settings:0 +msgid "Configure Project" +msgstr "" + +#. module: project +#: view:project.task.history.cumulative:0 +msgid "Tasks's Cumulative Flow" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "January" +msgstr "" + +#. module: project +#: field:project.task.delegate,prefix:0 +msgid "Your Task Title" +msgstr "" + +#. module: project +#: view:project.task.reevaluate:0 +msgid "Reevaluation Task" +msgstr "" + +#. module: project +#: code:addons/project/project.py:1318 +#, python-format +msgid "Please delete the project linked with this account first." +msgstr "" + +#. module: project +#: model:mail.message.subtype,name:project.mt_project_task_new +#: model:mail.message.subtype,name:project.mt_task_new +msgid "Task Created" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +msgid "Non Assigned Tasks to users" +msgstr "" + +#. module: project +#: view:project.project:0 +msgid "Projects in which I am a manager" +msgstr "" + +#. module: project +#: view:project.task:0 +#: selection:project.task,kanban_state:0 +#: selection:project.task.history,kanban_state:0 +#: selection:project.task.history.cumulative,kanban_state:0 +msgid "Ready for next stage" +msgstr "" + +#. module: project +#: field:project.task.type,case_default:0 +msgid "Default for New Projects" +msgstr "" + +#. module: project +#: view:project.task:0 +#: field:project.task,description:0 +#: field:project.task.type,description:0 +msgid "Description" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "May" +msgstr "" + +#. module: project +#: help:project.task.type,case_default:0 +msgid "" +"If you check this field, this stage will be proposed by default on each new " +"project. It will not assign this stage to existing projects." +msgstr "" + +#. module: project +#: field:project.task,partner_id:0 +msgid "Customer" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "February" +msgstr "" + +#. module: project +#: help:project.config.settings,module_project_long_term:0 +msgid "" +"A long term project management module that tracks planning, scheduling, and " +"resource allocation.\n" +" This installs the module project_long_term." +msgstr "" + +#. module: project +#: model:mail.message.subtype,description:project.mt_task_closed +msgid "Task closed" +msgstr "" + +#. module: project +#: selection:report.project.task.user,month:0 +msgid "April" +msgstr "" + +#. module: project +#: view:project.task:0 +msgid "Spent Hours" +msgstr "" + +#. module: project +#: help:project.project,sequence:0 +msgid "Gives the sequence order when displaying a list of Projects." +msgstr "" + +#. module: project +#: model:ir.actions.act_window,name:project.act_res_users_2_project_task_opened +msgid "Assigned Tasks" +msgstr "" + +#. module: project +#: help:project.config.settings,module_project_issue_sheet:0 +msgid "" +"Provides timesheet support for the issues/bugs management in project.\n" +" This installs the module project_issue_sheet." +msgstr "" + +#. module: project +#: selection:project.project,privacy_visibility:0 +msgid "Followers Only" +msgstr "" + +#. module: project +#: view:board.board:0 +#: field:project.project,task_count:0 +msgid "Open Tasks" +msgstr "" + +#. module: project +#: field:project.project,priority:0 +#: field:project.project,sequence:0 +#: field:project.task,sequence:0 +#: field:project.task.type,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: project +#: view:project.task:0 +#: view:project.task.work:0 +msgid "Task Work" +msgstr "" + +#. module: project +#: help:project.task.delegate,planned_hours_me:0 +msgid "" +"Estimated time for you to validate the work done by the user to whom you " +"delegate this task" +msgstr "" + +#. module: project +#: view:report.project.task.user:0 +#: field:report.project.task.user,year:0 +msgid "Year" +msgstr "" + +#. module: project +#: field:project.project,type_ids:0 +#: view:project.task.type:0 +msgid "Tasks Stages" +msgstr "" diff --git a/addons/project/process/task_process.xml b/addons/project/process/task_process.xml index 4a73bfd00d1..9955fe1ffe1 100644 --- a/addons/project/process/task_process.xml +++ b/addons/project/process/task_process.xml @@ -68,24 +68,24 @@ - - + + - - + + - - + + diff --git a/addons/project/project.py b/addons/project/project.py index 0b99356a9de..5d5abce3066 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -198,8 +198,12 @@ class project(osv.osv): return res def _task_count(self, cr, uid, ids, field_name, arg, context=None): + if context is None: + context = {} res = dict.fromkeys(ids, 0) - task_ids = self.pool.get('project.task').search(cr, uid, [('project_id', 'in', ids)]) + ctx = context.copy() + ctx['active_test'] = False + task_ids = self.pool.get('project.task').search(cr, uid, [('project_id', 'in', ids)], context=ctx) for task in self.pool.get('project.task').browse(cr, uid, task_ids, context): res[task.project_id.id] += 1 return res @@ -210,7 +214,7 @@ class project(osv.osv): def _get_visibility_selection(self, cr, uid, context=None): """ Overriden in portal_project to offer more options """ - return [('public', 'All Users'), + return [('public', 'Public'), ('employees', 'Employees Only'), ('followers', 'Followers Only')] @@ -275,7 +279,17 @@ class project(osv.osv): "with Tasks (or optionally Issues if the Issue Tracker module is installed)."), 'alias_model': fields.selection(_alias_models, "Alias Model", select=True, required=True, help="The kind of document created when an email is received on this project's email alias"), - 'privacy_visibility': fields.selection(_visibility_selection, 'Privacy / Visibility', required=True), + 'privacy_visibility': fields.selection(_visibility_selection, 'Privacy / Visibility', required=True, + help="Holds visibility of the tasks or issues that belong to the current project:\n" + "- Public: everybody sees everything; if portal is activated, portal users\n" + " see all tasks or issues; if anonymous portal is activated, visitors\n" + " see all tasks or issues\n" + "- Portal (only available if Portal is installed): employees see everything;\n" + " if portal is activated, portal users see the tasks or issues followed by\n" + " them or by someone of their company\n" + "- Employees Only: employees see all tasks or issues\n" + "- Followers Only: employees see only the followed tasks or issues; if portal\n" + " is activated, portal users see the followed tasks or issues."), 'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','Pending'),('close','Closed')], 'Status', required=True,), 'doc_count':fields.function(_get_attached_docs, string="Number of documents attached", type='int') } @@ -293,7 +307,7 @@ class project(osv.osv): 'sequence': 10, 'type_ids': _get_type_common, 'alias_model': 'project.task', - 'privacy_visibility': 'public', + 'privacy_visibility': 'employees', } # TODO: Why not using a SQL contraints ? @@ -612,7 +626,8 @@ class task(base_stage, osv.osv): search_domain = [] project_id = self._resolve_project_id_from_context(cr, uid, context=context) if project_id: - search_domain += [('project_ids', '=', project_id)] + search_domain += ['|', ('project_ids', '=', project_id)] + search_domain += [('id', 'in', ids)] stage_ids = stage_obj._search(cr, uid, search_domain, order=order, access_rights_uid=access_rights_uid, context=context) result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context) # restore order of the search @@ -738,7 +753,7 @@ class task(base_stage, osv.osv): 'priority': fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Important'), ('0','Very important')], 'Priority', select=True), 'sequence': fields.integer('Sequence', select=True, help="Gives the sequence order when displaying a list of tasks."), 'stage_id': fields.many2one('project.task.type', 'Stage', track_visibility='onchange', - domain="['&', ('fold', '=', False), ('project_ids', '=', project_id)]"), + domain="[('project_ids', '=', project_id)]"), 'state': fields.related('stage_id', 'state', type="selection", store=True, selection=_TASK_STATE, string="Status", readonly=True, help='The status is set to \'Draft\', when a case is created.\ diff --git a/addons/project/project_demo.xml b/addons/project/project_demo.xml index f5fbf878fd0..b7dcc2bdb83 100644 --- a/addons/project/project_demo.xml +++ b/addons/project/project_demo.xml @@ -62,7 +62,7 @@ E-Learning Integration project.task - public + employees @@ -76,6 +76,7 @@ Website Design Templates project.task + employees @@ -89,6 +90,7 @@ Data Import/Export Plugin project.task + followers diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 298355d4c82..eb042e5f0c7 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -52,7 +52,8 @@ kanban,tree,form,calendar,gantt,graph { 'search_default_project_id': [active_id], - 'default_project_id': active_id, + 'default_project_id': active_id, + 'active_test': False, } @@ -509,6 +510,7 @@
  • !
  • +
    diff --git a/addons/project/security/project_security.xml b/addons/project/security/project_security.xml index bac7e3365e6..71db402641f 100644 --- a/addons/project/security/project_security.xml +++ b/addons/project/security/project_security.xml @@ -76,15 +76,13 @@ - Project/Task: employees: public or employee or following or assigned + Project/Task: employees: public or employee or (followers and following) ['|', - ('user_id', '=', user.id), - '|', - ('project_id.privacy_visibility', 'in', ['public', 'employees']), - '&', - ('project_id.privacy_visibility', '=', 'followers'), - ('message_follower_ids', 'in', [user.partner_id.id]), + ('project_id.privacy_visibility', 'in', ['public', 'employees']), + '&', + ('project_id.privacy_visibility', '=', 'followers'), + ('message_follower_ids', 'in', [user.partner_id.id]), ] diff --git a/addons/project_gtd/project_gtd_view.xml b/addons/project_gtd/project_gtd_view.xml index 1467ce55fab..4bfd5b783c7 100644 --- a/addons/project_gtd/project_gtd_view.xml +++ b/addons/project_gtd/project_gtd_view.xml @@ -106,6 +106,8 @@ + + diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 69792322ab3..a008c670138 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -270,7 +270,7 @@ class project_issue(base_stage, osv.osv): 'version_id': fields.many2one('project.issue.version', 'Version'), 'stage_id': fields.many2one ('project.task.type', 'Stage', track_visibility='onchange', - domain="['&', ('fold', '=', False), ('project_ids', '=', project_id)]"), + domain="[('project_ids', '=', project_id)]"), 'project_id':fields.many2one('project.project', 'Project', track_visibility='onchange'), 'duration': fields.float('Duration'), 'task_id': fields.many2one('project.task', 'Task', domain="[('project_id','=',project_id)]"), @@ -495,10 +495,10 @@ class project_issue(base_stage, osv.osv): def message_get_suggested_recipients(self, cr, uid, ids, context=None): recipients = super(project_issue, self).message_get_suggested_recipients(cr, uid, ids, context=context) for issue in self.browse(cr, uid, ids, context=context): - if issue.partner_id: - self._message_add_suggested_recipient(cr, uid, recipients, issue, partner=issue.partner_id, reason=_('Customer')) - elif issue.email_from: + if issue.email_from: self._message_add_suggested_recipient(cr, uid, recipients, issue, email=issue.email_from, reason=_('Customer Email')) + elif issue.partner_id: + self._message_add_suggested_recipient(cr, uid, recipients, issue, partner=issue.partner_id, reason=_('Customer')) return recipients def message_new(self, cr, uid, msg, custom_values=None, context=None): diff --git a/addons/project_issue/security/project_issue_security.xml b/addons/project_issue/security/project_issue_security.xml index 5215a94a8b7..c8ed12086e4 100644 --- a/addons/project_issue/security/project_issue_security.xml +++ b/addons/project_issue/security/project_issue_security.xml @@ -10,15 +10,13 @@ - Project/Issue: employees: public or employee or following or assigned + Project/Issue: employees: public or employee or (followers and following) ['|', - '|', - ('project_id.privacy_visibility', 'in', ['public', 'employees']), - '&', - ('project_id.privacy_visibility', '=', 'followers'), - ('message_follower_ids', 'in', [user.id]), - ('user_id', '=', user.id), + ('project_id.privacy_visibility', 'in', ['public', 'employees']), + '&', + ('project_id.privacy_visibility', '=', 'followers'), + ('message_follower_ids', 'in', [user.id]), ] diff --git a/addons/project_mrp/process/project_mrp_process.xml b/addons/project_mrp/process/project_mrp_process.xml index e2195c6f61b..c25cd264538 100644 --- a/addons/project_mrp/process/project_mrp_process.xml +++ b/addons/project_mrp/process/project_mrp_process.xml @@ -50,24 +50,24 @@ - - + + - - + + - - + + diff --git a/addons/project_timesheet/__openerp__.py b/addons/project_timesheet/__openerp__.py index 0651d7b9ce4..4dff3695c5c 100644 --- a/addons/project_timesheet/__openerp__.py +++ b/addons/project_timesheet/__openerp__.py @@ -34,7 +34,7 @@ with the effect of creating, editing and deleting either ways. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'images': ['images/invoice_task_work.jpeg', 'images/my_timesheet.jpeg', 'images/working_hour.jpeg'], - 'depends': ['project', 'hr_timesheet_sheet', 'hr_timesheet_invoice', 'account_analytic_analysis'], + 'depends': ['resource', 'project', 'hr_timesheet_sheet', 'hr_timesheet_invoice', 'account_analytic_analysis'], 'data': [ 'security/ir.model.access.csv', 'security/project_timesheet_security.xml', diff --git a/addons/project_timesheet/process/project_timesheet_process.xml b/addons/project_timesheet/process/project_timesheet_process.xml index 1bff69b603e..17dd35dcad2 100644 --- a/addons/project_timesheet/process/project_timesheet_process.xml +++ b/addons/project_timesheet/process/project_timesheet_process.xml @@ -46,24 +46,24 @@ - - + + - - + + - - + + diff --git a/addons/purchase/html/index.html b/addons/purchase/html/index.html new file mode 100644 index 00000000000..67b122ac557 --- /dev/null +++ b/addons/purchase/html/index.html @@ -0,0 +1,141 @@ +
    +
    +
    +

    Purchase Management

    +

    Automate requisition-to-pay, control invoicing

    +
    +
    +
    + + + + +
    +
    +
    +

    +Automate procurement propositions, launch request for quotations, track purchase orders, manage suppliers' information, control products reception and check suppliers' invoices. +

    + +
    +
    +
    + +
    +
    +

    Automated Procurement Propositions

    +

    Reduce inventory level with procurement rules

    +
    +

    +Get the right purchase proposition at the right time to reduce your inventory level. Improve your purchase and inventory performance with procurement rules depending on stock levels, logistic rules, sales orders, forecasted manufacturing orders, etc. +

    +Send requests for quotations or purchase orders to your supplier in one click. Get access to product receptions and invoices from your purchase order. +

    +
    +
    + +
    +
    +
    + +
    +
    +

    Purchase Tenders

    +

    Get the best price by negotiating with several suppliers

    +
    + +
    +
    +

    +Launch purchase tenders, integrate supplier's answers in the process and compare propositions. Choose the best offer and send purchase orders easily. Use reporting to analyse the quality of your suppliers afterwards. +

    +
    +
    +
    + +
    +
    + +
    + Download our free E-book +
    + +
    +
    +

    Email integrations

    +
    +

    +Integrate all supplier's communications on the purchase orders (or RfQs) to get a strong traceability on the negotiation or after sales service issues. Use the claim management module to track issues related to suppliers. +

    +
    +
    + +
    +
    +
    + + +
    +
    +

    Standard Price, Average Price, FIFO

    +
    + +
    +
    +

    +Use the costing method that reflects your business: standard price, average price, fifo or lifo. Get your accounting entries and the right inventory valuation in real-time; OpenERP manages everything for you, transparently. +

    +
    +
    +
    + + +
    +
    +

    Import Supplier Pricelists

    +

    Take smart purchase decisions using the best prices

    +
    +

    +Easily import supplier's pricelists to make smarter purchase decisions based on promotions, prices depending on quantities and special contract conditions. You can even base your sales price depending on your supplier's prices. +

    +
    +
    + +
    +
    +
    + +
    +
    +

    Control Products and Invoices

    +
    +
    + +
    +
    +
    +

    +No product or order is left behind, the inventory control allows you to manage back orders, refunds, product reception and quality control. Choose the right control method according to your need. +

    +

    +Control supplier invoices with no effort. Choose the right method according to your need: pre-generate draft invoices based on purchase orders, on products receptions, create invoices manually and import lines from purchase orders, etc. +

    +
    +
    +
    + +
    +
    +

    Get Statistics On Your Purchases

    +
    +

    +Get accurate statistics on the performance of your suppliers through flexible reporting: delivery delays, negotiated discount on prices, quantities purchased, etc. Integrate purchases with the analytic accounting to analyse your contracts profitability. +

    +
    +
    + +
    +
    +
    diff --git a/addons/purchase/html/purchase_compose.png b/addons/purchase/html/purchase_compose.png new file mode 100644 index 00000000000..22cbe1cb21c Binary files /dev/null and b/addons/purchase/html/purchase_compose.png differ diff --git a/addons/purchase/html/purchase_dashboard.png b/addons/purchase/html/purchase_dashboard.png new file mode 100644 index 00000000000..0939edea591 Binary files /dev/null and b/addons/purchase/html/purchase_dashboard.png differ diff --git a/addons/purchase/html/purchase_import.png b/addons/purchase/html/purchase_import.png new file mode 100644 index 00000000000..bd2a4d0c15e Binary files /dev/null and b/addons/purchase/html/purchase_import.png differ diff --git a/addons/purchase/html/purchase_incoming.png b/addons/purchase/html/purchase_incoming.png new file mode 100644 index 00000000000..02b82cead02 Binary files /dev/null and b/addons/purchase/html/purchase_incoming.png differ diff --git a/addons/purchase/html/purchase_po.png b/addons/purchase/html/purchase_po.png new file mode 100644 index 00000000000..d9cec9f5140 Binary files /dev/null and b/addons/purchase/html/purchase_po.png differ diff --git a/addons/purchase/html/purchase_procurement.png b/addons/purchase/html/purchase_procurement.png new file mode 100644 index 00000000000..cb315e08224 Binary files /dev/null and b/addons/purchase/html/purchase_procurement.png differ diff --git a/addons/purchase/html/purchase_product.png b/addons/purchase/html/purchase_product.png new file mode 100644 index 00000000000..cbfd054d72e Binary files /dev/null and b/addons/purchase/html/purchase_product.png differ diff --git a/addons/purchase/html/purchase_product_form.png b/addons/purchase/html/purchase_product_form.png new file mode 100644 index 00000000000..a25c85b6496 Binary files /dev/null and b/addons/purchase/html/purchase_product_form.png differ diff --git a/addons/purchase/html/purchase_tender.png b/addons/purchase/html/purchase_tender.png new file mode 100644 index 00000000000..33ef600b869 Binary files /dev/null and b/addons/purchase/html/purchase_tender.png differ diff --git a/addons/purchase/process/purchase_process.xml b/addons/purchase/process/purchase_process.xml index c6b6805351a..7feb47690e0 100644 --- a/addons/purchase/process/purchase_process.xml +++ b/addons/purchase/process/purchase_process.xml @@ -154,16 +154,16 @@ - - + + - - + + @@ -171,24 +171,24 @@ - - + + - - + + - - + + @@ -196,32 +196,32 @@ - - + + - - + + - - + + - - + + + False sale.group_delivery_invoice_address - - False - sale.group_delivery_invoice_address - - - False - sale.group_delivery_invoice_address - - - False - sale.group_delivery_invoice_address - - - False - sale.group_delivery_invoice_address - - + False sale.group_delivery_invoice_address diff --git a/addons/sale/sale_demo.xml b/addons/sale/sale_demo.xml index 428b586ffa8..eb937199aba 100644 --- a/addons/sale/sale_demo.xml +++ b/addons/sale/sale_demo.xml @@ -288,6 +288,8 @@ + + diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index e24a6e45fe0..d8d038eb002 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -307,7 +307,7 @@ - + diff --git a/addons/sale/wizard/sale_line_invoice.py b/addons/sale/wizard/sale_line_invoice.py index 83b953cc4d5..3b04319f5c7 100644 --- a/addons/sale/wizard/sale_line_invoice.py +++ b/addons/sale/wizard/sale_line_invoice.py @@ -21,6 +21,7 @@ from openerp.osv import osv, fields from openerp.tools.translate import _ +from openerp import netsvc class sale_order_line_make_invoice(osv.osv_memory): _name = "sale.order.line.make.invoice" @@ -80,6 +81,7 @@ class sale_order_line_make_invoice(osv.osv_memory): sales_order_line_obj = self.pool.get('sale.order.line') sales_order_obj = self.pool.get('sale.order') + wf_service = netsvc.LocalService('workflow') for line in sales_order_line_obj.browse(cr, uid, context.get('active_ids', []), context=context): if (not line.invoiced) and (line.state not in ('draft', 'cancel')): if not line.order_id in invoices: diff --git a/addons/sale_analytic_plans/i18n/ru.po b/addons/sale_analytic_plans/i18n/ru.po index 90d9eb5c3b9..8995b7b45c0 100644 --- a/addons/sale_analytic_plans/i18n/ru.po +++ b/addons/sale_analytic_plans/i18n/ru.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2012-12-21 17:06+0000\n" -"PO-Revision-Date: 2010-12-25 22:14+0000\n" +"PO-Revision-Date: 2013-06-03 08:05+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2013-03-16 05:32+0000\n" -"X-Generator: Launchpad (build 16532)\n" +"X-Launchpad-Export-Date: 2013-06-04 05:20+0000\n" +"X-Generator: Launchpad (build 16660)\n" #. module: sale_analytic_plans #: field:sale.order.line,analytics_id:0 @@ -24,7 +24,7 @@ msgstr "Разнесение аналитики" #. module: sale_analytic_plans #: model:ir.model,name:sale_analytic_plans.model_sale_order msgid "Sales Order" -msgstr "" +msgstr "Заказ продаж" #. module: sale_analytic_plans #: model:ir.model,name:sale_analytic_plans.model_sale_order_line diff --git a/addons/sale_analytic_plans/sale_analytic_plans_view.xml b/addons/sale_analytic_plans/sale_analytic_plans_view.xml index 3600d71b7d4..121efbdf12e 100644 --- a/addons/sale_analytic_plans/sale_analytic_plans_view.xml +++ b/addons/sale_analytic_plans/sale_analytic_plans_view.xml @@ -52,5 +52,17 @@ + + account.invoice.form.analytic.inherit + account.invoice + + + + + + + + + diff --git a/addons/sale_crm/__openerp__.py b/addons/sale_crm/__openerp__.py index 6591589342e..7db1aa1eff0 100644 --- a/addons/sale_crm/__openerp__.py +++ b/addons/sale_crm/__openerp__.py @@ -47,7 +47,11 @@ modules. 'security/ir.model.access.csv', 'report/sale_crm_account_invoice_report_view.xml', ], - 'demo': [], + 'js': [ + 'static/lib/justgage.js', + 'static/src/js/sale_crm.js', + ], + 'demo': ['sale_crm_demo.xml'], 'test': ['test/sale_crm.yml'], 'installable': True, 'auto_install': True, diff --git a/addons/sale_crm/i18n/ru.po b/addons/sale_crm/i18n/ru.po index 8ae90e42303..f6266edf8ca 100644 --- a/addons/sale_crm/i18n/ru.po +++ b/addons/sale_crm/i18n/ru.po @@ -7,20 +7,20 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2012-12-21 17:06+0000\n" -"PO-Revision-Date: 2011-03-23 13:50+0000\n" +"PO-Revision-Date: 2013-06-03 08:05+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2013-03-16 05:10+0000\n" -"X-Generator: Launchpad (build 16532)\n" +"X-Launchpad-Export-Date: 2013-06-04 05:20+0000\n" +"X-Generator: Launchpad (build 16660)\n" #. module: sale_crm #: code:addons/sale_crm/wizard/crm_make_sale.py:90 #, python-format msgid "Insufficient Data!" -msgstr "" +msgstr "Недостаточно данных!" #. module: sale_crm #: view:crm.lead:0 @@ -31,12 +31,12 @@ msgstr "Преобразовать в предложение" #. module: sale_crm #: model:ir.model,name:sale_crm.model_account_invoice_report msgid "Invoices Statistics" -msgstr "" +msgstr "Статистика по счетам" #. module: sale_crm #: field:crm.make.sale,close:0 msgid "Mark Won" -msgstr "" +msgstr "Отметить \"Выиграна\"" #. module: sale_crm #: field:res.users,default_section_id:0 @@ -51,23 +51,23 @@ msgstr "Мои отделы продаж" #. module: sale_crm #: model:ir.model,name:sale_crm.model_res_users msgid "Users" -msgstr "" +msgstr "Пользователи" #. module: sale_crm #: help:crm.make.sale,close:0 msgid "" "Check this to close the opportunity after having created the sales order." -msgstr "" +msgstr "Отметьте, для закрытия предложения после создания заказа продажи." #. module: sale_crm #: model:mail.message.subtype,name:sale_crm.mt_salesteam_order_sent msgid "Quotation Send" -msgstr "" +msgstr "Отправить предложение" #. module: sale_crm #: field:sale.order,categ_ids:0 msgid "Categories" -msgstr "" +msgstr "Категории" #. module: sale_crm #: code:addons/sale_crm/wizard/crm_make_sale.py:124 @@ -94,7 +94,7 @@ msgstr "Продать" #. module: sale_crm #: model:ir.model,name:sale_crm.model_account_invoice msgid "Invoice" -msgstr "" +msgstr "Счет" #. module: sale_crm #: code:addons/sale_crm/wizard/crm_make_sale.py:93 @@ -106,7 +106,7 @@ msgstr "Предложение: %s" #: code:addons/sale_crm/wizard/crm_make_sale.py:110 #, python-format msgid "Opportunity has been converted to the quotation %s." -msgstr "" +msgstr "Предложение преобразовано в заявку %s." #. module: sale_crm #: field:crm.make.sale,shop_id:0 @@ -117,12 +117,12 @@ msgstr "Магазин" #: code:addons/sale_crm/wizard/crm_make_sale.py:90 #, python-format msgid "No addresse(s) defined for this customer." -msgstr "" +msgstr "Не задан адрес для этого заказчика" #. module: sale_crm #: model:mail.message.subtype,name:sale_crm.mt_salesteam_order_confirmed msgid "Sales Order Confirmed" -msgstr "" +msgstr "Заказ продаж подтвержден" #. module: sale_crm #: view:account.invoice:0 @@ -136,7 +136,7 @@ msgstr "Отдел продаж" #. module: sale_crm #: view:crm.lead:0 msgid "Create Quotation" -msgstr "" +msgstr "Создать заявку" #. module: sale_crm #: model:ir.actions.act_window,name:sale_crm.action_crm_make_sale @@ -156,7 +156,7 @@ msgstr "Заказ продаж" #. module: sale_crm #: view:crm.make.sale:0 msgid "or" -msgstr "" +msgstr "или" #~ msgid "Create" #~ msgstr "Создать" diff --git a/addons/sale_crm/process/sale_crm_process.xml b/addons/sale_crm/process/sale_crm_process.xml index 721508a2ba5..21297e12dbd 100644 --- a/addons/sale_crm/process/sale_crm_process.xml +++ b/addons/sale_crm/process/sale_crm_process.xml @@ -42,8 +42,8 @@ - - + + @@ -51,24 +51,24 @@ - - + + - - + + - - + + --> diff --git a/addons/sale_crm/sale_crm.py b/addons/sale_crm/sale_crm.py index d0899729050..97c5f4579e0 100644 --- a/addons/sale_crm/sale_crm.py +++ b/addons/sale_crm/sale_crm.py @@ -19,7 +19,10 @@ # ############################################################################## -from datetime import datetime +from datetime import date +from dateutil import relativedelta + +from openerp import tools from openerp.osv import osv, fields @@ -31,35 +34,61 @@ class sale_order(osv.osv): domain="['|',('section_id','=',section_id),('section_id','=',False), ('object_id.model', '=', 'crm.lead')]") } + def _prepare_invoice(self, cr, uid, order, lines, context=None): + invoice_vals = super(sale_order, self)._prepare_invoice(cr, uid, order, lines, context=context) + if order.section_id and order.section_id.id: + invoice_vals['section_id'] = order.section_id.id + return invoice_vals + class crm_case_section(osv.osv): _inherit = 'crm.case.section' - def _get_sum_month_invoice(self, cr, uid, ids, field_name, arg, context=None): - res = dict.fromkeys(ids, 0) + def _get_sale_orders_data(self, cr, uid, ids, field_name, arg, context=None): + obj = self.pool.get('sale.order') + res = dict.fromkeys(ids, False) + month_begin = date.today().replace(day=1) + groupby_begin = (month_begin + relativedelta.relativedelta(months=-4)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) + for id in ids: + res[id] = dict() + created_domain = [('section_id', '=', id), ('state', 'in', ['draft', 'sent']), ('date_order', '>=', groupby_begin)] + res[id]['monthly_quoted'] = self.__get_bar_values(cr, uid, obj, created_domain, ['amount_total', 'date_order'], 'amount_total', 'date_order', context=context) + validated_domain = [('section_id', '=', id), ('state', 'not in', ['draft', 'sent']), ('date_confirm', '>=', groupby_begin)] + res[id]['monthly_confirmed'] = self.__get_bar_values(cr, uid, obj, validated_domain, ['amount_total', 'date_confirm'], 'amount_total', 'date_confirm', context=context) + return res + + def _get_invoices_data(self, cr, uid, ids, field_name, arg, context=None): obj = self.pool.get('account.invoice.report') - when = datetime.today() - for section_id in ids: - invoice_ids = obj.search(cr, uid, [("section_id", "=", section_id), ('state', 'not in', ['draft', 'cancel']), ('year', '=', when.year), ('month', '=', when.month > 9 and when.month or "0%s" % when.month)], context=context) - for invoice in obj.browse(cr, uid, invoice_ids, context=context): - res[section_id] += invoice.price_total + res = dict.fromkeys(ids, False) + month_begin = date.today().replace(day=1) + groupby_begin = (month_begin + relativedelta.relativedelta(months=-4)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) + for id in ids: + created_domain = [('section_id', '=', id), ('state', 'not in', ['draft', 'cancel']), ('date', '>=', groupby_begin)] + res[id] = self.__get_bar_values(cr, uid, obj, created_domain, ['price_total', 'date'], 'price_total', 'date', context=context) return res _columns = { - 'quotation_ids': fields.one2many('sale.order', 'section_id', - string='Quotations', readonly=True, - domain=[('state', 'in', ['draft', 'sent', 'cancel'])]), - 'sale_order_ids': fields.one2many('sale.order', 'section_id', - string='Sale Orders', readonly=True, - domain=[('state', 'not in', ['draft', 'sent', 'cancel'])]), - 'invoice_ids': fields.one2many('account.invoice', 'section_id', - string='Invoices', readonly=True, - domain=[('state', 'not in', ['draft', 'cancel'])]), - 'sum_month_invoice': fields.function(_get_sum_month_invoice, - string='Total invoiced this month', - type='integer', readonly=True), + 'invoiced_forecast': fields.integer(string='Invoice Forecast', + help="Forecast of the invoice revenue for the current month. This is the amount the sales \n" + "team should invoice this month. It is used to compute the progression ratio \n" + " of the current and forecast revenue on the kanban view."), + 'invoiced_target': fields.integer(string='Invoice Target', + help="Target of invoice revenue for the current month. This is the amount the sales \n" + "team estimates to be able to invoice this month."), + 'monthly_quoted': fields.function(_get_sale_orders_data, + type='string', readonly=True, multi='_get_sale_orders_data', + string='Rate of created quotation per duration'), + 'monthly_confirmed': fields.function(_get_sale_orders_data, + type='string', readonly=True, multi='_get_sale_orders_data', + string='Rate of validate sales orders per duration'), + 'monthly_invoiced': fields.function(_get_invoices_data, + type='string', readonly=True, + string='Rate of sent invoices per duration'), } + def action_forecast(self, cr, uid, id, value, context=None): + return self.write(cr, uid, [id], {'invoiced_forecast': value}, context=context) + class res_users(osv.Model): _inherit = 'res.users' diff --git a/addons/sale_crm/sale_crm_demo.xml b/addons/sale_crm/sale_crm_demo.xml new file mode 100644 index 00000000000..0c2822719dd --- /dev/null +++ b/addons/sale_crm/sale_crm_demo.xml @@ -0,0 +1,130 @@ + + + + + + 52700 + 60000 + + + + Indirect Sales + IM + 36000 + 40000 + + + + + + + + + + + draft + out_invoice + + Test invoice 1 + + + Basic computer with Dvorak keyboard and left-handed mouse + + 250 + 1 + + + + Little server with raid 1 and 512ECC ram + + 800 + 2 + + + + Server with raid 10 and 2048ECC ram + + 4800 + 4 + + + + + + + + + + + + + + + + + + + + + + + + + draft + out_invoice + + Test invoice 1 + + + Basic formation with Dvorak + + 500 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml index f8b4228334e..ae21934ce61 100644 --- a/addons/sale_crm/sale_crm_view.xml +++ b/addons/sale_crm/sale_crm_view.xml @@ -16,6 +16,11 @@ + + + {'stage_type': 'opportunity', 'default_type': 'opportunity', 'default_user_id': uid, 'needaction_menu_ref': 'sale.menu_sale_quotations'} + + sale.order.inherit sale.order @@ -38,7 +43,7 @@ + help="My Sales Team(s)" groups="base.group_multi_salesteams"/> @@ -70,7 +75,7 @@ - + @@ -96,7 +101,7 @@ - + @@ -110,7 +115,7 @@ - + @@ -130,7 +135,6 @@ { 'search_default_section_id': [active_id], 'default_section_id': active_id, - 'search_default_my_sale_orders_filter': 1, } @@ -153,8 +157,8 @@ tree,form,calendar,graph { 'search_default_section_id': [active_id], - 'default_section_id': active_id, 'show_address': 1, - 'search_default_my_sale_orders_filter': 1 + 'default_section_id': active_id, + 'show_address': 1, } [('state','in',('draft','sent','cancel'))] @@ -185,7 +189,7 @@ ('type', '=', 'out_invoice')] { 'search_default_section_id': [active_id], - 'default_section_id': active_id}, + 'default_section_id': active_id, 'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale', @@ -207,38 +211,68 @@ + + crm.case.section.form + crm.case.section + + + + + + + + + + + crm.case.section.kanban crm.case.section - - - - + + + + + + - - - - Quotations - Quotation - - - - Sales Orders - Sales Order - - - - Invoices - Invoice - + + + + + + -
    -
    -
    Invoiced this month
    +
    + Invoiced + Forecast +
    +
    +
    Define an invoicing target in the sales team settings to see the period's achievement and forecast at a glance.
    diff --git a/addons/sale_crm/static/lib/justgage.js b/addons/sale_crm/static/lib/justgage.js new file mode 100644 index 00000000000..52b5c6ea0c3 --- /dev/null +++ b/addons/sale_crm/static/lib/justgage.js @@ -0,0 +1,883 @@ +/** + * JustGage - this is work-in-progress, unreleased, unofficial code, so it might not work top-notch :) + * Check http://www.justgage.com for official releases + * Licensed under MIT. + * @author Bojan Djuricic (@Toorshia) + * + * LATEST UPDATES + + * ----------------------------- + * April 01, 2013. + * ----------------------------- + * fix - https://github.com/toorshia/justgage/issues/46 + + * ----------------------------- + * March 26, 2013. + * ----------------------------- + * customSectors - define specific color for value range (0-10 : red, 10-30 : blue etc.) + + * ----------------------------- + * March 23, 2013. + * ----------------------------- + * counter - option to animate value in counting fashion + * fix - https://github.com/toorshia/justgage/issues/45 + + * ----------------------------- + * March 13, 2013. + * ----------------------------- + * refresh method - added optional 'max' parameter to use when you need to update max value + + * ----------------------------- + * February 26, 2013. + * ----------------------------- + * decimals - option to define/limit number of decimals when not using humanFriendly or customRenderer to display value + * fixed a missing parameters bug when calling generateShadow() for IE < 9 + + * ----------------------------- + * December 31, 2012. + * ----------------------------- + * fixed text y-position for hidden divs - workaround for Raphael 'dy' bug - https://github.com/DmitryBaranovskiy/raphael/issues/491 + * 'show' parameters, like showMinMax are now 'hide' because I am lame developer - please update these in your setups + * Min and Max labels are now auto-off when in donut mode + * Start angle in donut mode is now 90 + * donutStartAngle - option to define start angle for donut + + * ----------------------------- + * November 25, 2012. + * ----------------------------- + * Option to define custom rendering function for displayed value + + * ----------------------------- + * November 19, 2012. + * ----------------------------- + * Config.value is now updated after gauge refresh + + * ----------------------------- + * November 13, 2012. + * ----------------------------- + * Donut display mode added + * Option to hide value label + * Option to enable responsive gauge size + * Removed default title attribute + * Option to accept min and max defined as string values + * Option to configure value symbol + * Fixed bad aspect ratio calculations + * Option to configure minimum font size for all texts + * Option to show shorthand big numbers (human friendly) + */ + + JustGage = function(config) { + + if (!config.id) {alert("Missing id parameter for gauge!"); return false;} + if (!config.node) { + if (!document.getElementById(config.id)) {alert("No element with id: \""+config.id+"\" found!"); return false;} + config.node = document.getElementById(config.id); + } + + var obj = this; + + // configurable parameters + obj.config = + { + // id : string + // this is container element id + id : config.id, + + // node : string + // the node to use instead of DOM + node : config.node, + + // title : string + // gauge title + title : (config.title) ? config.title : "", + + // titleFontColor : string + // color of gauge title + titleFontColor : (config.titleFontColor) ? config.titleFontColor : "#999999", + + // value : int + // value gauge is showing + value : (config.value) ? config.value : 0, + + + // valueFontColor : string + // color of label showing current value + valueFontColor : (config.valueFontColor) ? config.valueFontColor : "#010101", + + // symbol : string + // special symbol to show next to value + symbol : (config.symbol) ? config.symbol : "", + + // min : int + // min value + min : (config.min) ? parseFloat(config.min) : 0, + + // max : int + // max value + max : (config.max) ? parseFloat(config.max) : 100, + + // humanFriendlyDecimal : int + // number of decimal places for our human friendly number to contain + humanFriendlyDecimal : (config.humanFriendlyDecimal) ? config.humanFriendlyDecimal : 0, + + // textRenderer: func + // function applied before rendering text + textRenderer : (config.textRenderer) ? config.textRenderer : null, + + // gaugeWidthScale : float + // width of the gauge element + gaugeWidthScale : (config.gaugeWidthScale) ? config.gaugeWidthScale : 1.0, + + // gaugeColor : string + // background color of gauge element + gaugeColor : (config.gaugeColor) ? config.gaugeColor : "#edebeb", + + // label : string + // text to show below value + label : (config.label) ? config.label : "", + + // labelFontColor : string + // color of label showing label under value + labelFontColor : (config.labelFontColor) ? config.labelFontColor : "#b3b3b3", + + // shadowOpacity : int + // 0 ~ 1 + shadowOpacity : (config.shadowOpacity) ? config.shadowOpacity : 0.2, + + // shadowSize: int + // inner shadow size + shadowSize : (config.shadowSize) ? config.shadowSize : 5, + + // shadowVerticalOffset : int + // how much shadow is offset from top + shadowVerticalOffset : (config.shadowVerticalOffset) ? config.shadowVerticalOffset : 3, + + // levelColors : string[] + // colors of indicator, from lower to upper, in RGB format + levelColors : (config.levelColors) ? config.levelColors : [ + "#a9d70b", + "#f9c802", + "#ff0000" + ], + + // startAnimationTime : int + // length of initial animation + startAnimationTime : (config.startAnimationTime) ? config.startAnimationTime : 700, + + // startAnimationType : string + // type of initial animation (linear, >, <, <>, bounce) + startAnimationType : (config.startAnimationType) ? config.startAnimationType : ">", + + // refreshAnimationTime : int + // length of refresh animation + refreshAnimationTime : (config.refreshAnimationTime) ? config.refreshAnimationTime : 700, + + // refreshAnimationType : string + // type of refresh animation (linear, >, <, <>, bounce) + refreshAnimationType : (config.refreshAnimationType) ? config.refreshAnimationType : ">", + + // donutStartAngle : int + // angle to start from when in donut mode + donutStartAngle : (config.donutStartAngle) ? config.donutStartAngle : 90, + + // valueMinFontSize : int + // absolute minimum font size for the value + valueMinFontSize : config.valueMinFontSize || 16, + + // titleMinFontSize + // absolute minimum font size for the title + titleMinFontSize : config.titleMinFontSize || 10, + + // labelMinFontSize + // absolute minimum font size for the label + labelMinFontSize : config.labelMinFontSize || 10, + + // minLabelMinFontSize + // absolute minimum font size for the minimum label + minLabelMinFontSize : config.minLabelMinFontSize || 10, + + // maxLabelMinFontSize + // absolute minimum font size for the maximum label + maxLabelMinFontSize : config.maxLabelMinFontSize || 10, + + // hideValue : bool + // hide value text + hideValue : (config.hideValue) ? config.hideValue : false, + + // hideMinMax : bool + // hide min and max values + hideMinMax : (config.hideMinMax) ? config.hideMinMax : false, + + // hideInnerShadow : bool + // hide inner shadow + hideInnerShadow : (config.hideInnerShadow) ? config.hideInnerShadow : false, + + // humanFriendly : bool + // convert large numbers for min, max, value to human friendly (e.g. 1234567 -> 1.23M) + humanFriendly : (config.humanFriendly) ? config.humanFriendly : false, + + // noGradient : bool + // whether to use gradual color change for value, or sector-based + noGradient : (config.noGradient) ? config.noGradient : false, + + // donut : bool + // show full donut gauge + donut : (config.donut) ? config.donut : false, + + // relativeGaugeSize : bool + // whether gauge size should follow changes in container element size + relativeGaugeSize : (config.relativeGaugeSize) ? config.relativeGaugeSize : false, + + // counter : bool + // animate level number change + counter : (config.counter) ? config.counter : false, + + // decimals : int + // number of digits after floating point + decimals : (config.decimals) ? config.decimals : 0, + + // customSectors : [] of objects + // number of digits after floating point + customSectors : (config.customSectors) ? config.customSectors : [] + }; + + // variables + var + canvasW, + canvasH, + widgetW, + widgetH, + aspect, + dx, + dy, + titleFontSize, + titleX, + titleY, + valueFontSize, + valueX, + valueY, + labelFontSize, + labelX, + labelY, + minFontSize, + minX, + minY, + maxFontSize, + maxX, + maxY; + + // overflow values + if (this.config.value > this.config.max) this.config.value = this.config.max; + if (this.config.value < this.config.min) this.config.value = this.config.min; + this.originalValue = config.value; + + // canvas + this.canvas = Raphael(this.config.node, "100%", "100%"); + if (this.config.relativeGaugeSize === true) { + this.canvas.setViewBox(0, 0, 200, 150, true); + } + + // canvas dimensions + if (this.config.relativeGaugeSize === true) { + canvasW = 200; + canvasH = 150; + } else { + canvasW = getStyle(this.config.node, "width").slice(0, -2) * 1; + canvasH = getStyle(this.config.node, "height").slice(0, -2) * 1; + } + + // widget dimensions + if (this.config.donut === true) { + + // DONUT ******************************* + + // width more than height + if(canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH; + // width less than height + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW; + // if height don't fit, rescale both + if(widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + // equal + } else { + widgetW = canvasW; + widgetH = widgetW; + } + + // delta + dx = (canvasW - widgetW)/2; + dy = (canvasH - widgetH)/2; + + // title + titleFontSize = ((widgetH / 8) > 10) ? (widgetH / 10) : 10; + titleX = dx + widgetW / 2; + titleY = dy + widgetH / 11; + + // value + valueFontSize = ((widgetH / 6.4) > 16) ? (widgetH / 5.4) : 18; + valueX = dx + widgetW / 2; + if(this.config.label !== '') { + valueY = dy + widgetH / 1.85; + } else { + valueY = dy + widgetH / 1.7; + } + + // label + labelFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + labelX = dx + widgetW / 2; + labelY = valueY + labelFontSize; + + // min + minFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * this.config.gaugeWidthScale) / 2 ; + minY = labelY; + + // max + maxFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * this.config.gaugeWidthScale) / 2 ; + maxY = labelY; + + } else { + // HALF ******************************* + + // width more than height + if(canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH * 1.25; + //if width doesn't fit, rescale both + if(widgetW > canvasW) { + aspect = widgetW / canvasW; + widgetW = widgetW / aspect; + widgetH = widgetH / aspect; + } + // width less than height + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW / 1.25; + // if height don't fit, rescale both + if(widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + // equal + } else { + widgetW = canvasW; + widgetH = widgetW * 0.75; + } + + // delta + dx = (canvasW - widgetW)/2; + dy = (canvasH - widgetH)/2; + + // title + titleFontSize = ((widgetH / 8) > this.config.titleMinFontSize) ? (widgetH / 10) : this.config.titleMinFontSize; + titleX = dx + widgetW / 2; + titleY = dy + widgetH / 6.4; + + // value + valueFontSize = ((widgetH / 6.5) > this.config.valueMinFontSize) ? (widgetH / 6.5) : this.config.valueMinFontSize; + valueX = dx + widgetW / 2; + valueY = dy + widgetH / 1.275; + + // label + labelFontSize = ((widgetH / 16) > this.config.labelMinFontSize) ? (widgetH / 16) : this.config.labelMinFontSize; + labelX = dx + widgetW / 2; + labelY = valueY + valueFontSize / 2 + 5; + + // min + minFontSize = ((widgetH / 16) > this.config.minLabelMinFontSize) ? (widgetH / 16) : this.config.minLabelMinFontSize; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * this.config.gaugeWidthScale) / 2 ; + minY = labelY; + + // max + maxFontSize = ((widgetH / 16) > this.config.maxLabelMinFontSize) ? (widgetH / 16) : this.config.maxLabelMinFontSize; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * this.config.gaugeWidthScale) / 2 ; + maxY = labelY; + } + + // parameters + this.params = { + canvasW : canvasW, + canvasH : canvasH, + widgetW : widgetW, + widgetH : widgetH, + dx : dx, + dy : dy, + titleFontSize : titleFontSize, + titleX : titleX, + titleY : titleY, + valueFontSize : valueFontSize, + valueX : valueX, + valueY : valueY, + labelFontSize : labelFontSize, + labelX : labelX, + labelY : labelY, + minFontSize : minFontSize, + minX : minX, + minY : minY, + maxFontSize : maxFontSize, + maxX : maxX, + maxY : maxY + }; + + // var clear + canvasW, canvasH, widgetW, widgetH, aspect, dx, dy, titleFontSize, titleX, titleY, valueFontSize, valueX, valueY, labelFontSize, labelX, labelY, minFontSize, minX, minY, maxFontSize, maxX, maxY = null + + // pki - custom attribute for generating gauge paths + this.canvas.customAttributes.pki = function (value, min, max, w, h, dx, dy, gws, donut) { + + var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path; + + if (donut) { + alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 7; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.95 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) + 0 - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) + 0 - Ri * Math.sin(alpha); + + path += "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ro + "," + Ro + " 0 0 1 " + (Cx + Ro) + "," + Cy + " "; + } + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx + Ri) + "," + Cy + " "; + } + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + + return { path: path }; + + } else { + alpha = (1 - (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 10; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.25 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) + 0 - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) + 0 - Ri * Math.sin(alpha); + + path += "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + + return { path: path }; + } + + // var clear + alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path = null; + }; + + // gauge + this.gauge = this.canvas.path().attr({ + "stroke": "none", + "fill": this.config.gaugeColor, + pki: [this.config.max, this.config.min, this.config.max, this.params.widgetW, this.params.widgetH, this.params.dx, this.params.dy, this.config.gaugeWidthScale, this.config.donut] + }); + this.gauge.id = this.config.id+"-gauge"; + + // level + this.level = this.canvas.path().attr({ + "stroke": "none", + "fill": getColor(this.config.value, (this.config.value - this.config.min) / (this.config.max - this.config.min), this.config.levelColors, this.config.noGradient, this.config.customSectors), + pki: [this.config.min, this.config.min, this.config.max, this.params.widgetW, this.params.widgetH, this.params.dx, this.params.dy, this.config.gaugeWidthScale, this.config.donut] + }); + if(this.config.donut) { + this.level.transform("r" + this.config.donutStartAngle + ", " + (this.params.widgetW/2 + this.params.dx) + ", " + (this.params.widgetH/1.95 + this.params.dy)); + } + this.level.id = this.config.id+"-level"; + + // title + this.txtTitle = this.canvas.text(this.params.titleX, this.params.titleY, this.config.title); + this.txtTitle.attr({ + "font-size":this.params.titleFontSize, + "font-weight":"bold", + "font-family":"Arial", + "fill":this.config.titleFontColor, + "fill-opacity":"1" + }); + setDy(this.txtTitle, this.params.titleFontSize, this.params.titleY); + this.txtTitle.id = this.config.id+"-txttitle"; + + // value + this.txtValue = this.canvas.text(this.params.valueX, this.params.valueY, 0); + this.txtValue.attr({ + "font-size":this.params.valueFontSize, + "font-weight":"bold", + "font-family":"Arial", + "fill":this.config.valueFontColor, + "fill-opacity":"0" + }); + setDy(this.txtValue, this.params.valueFontSize, this.params.valueY); + this.txtValue.id = this.config.id+"-txtvalue"; + + // label + this.txtLabel = this.canvas.text(this.params.labelX, this.params.labelY, this.config.label); + this.txtLabel.attr({ + "font-size":this.params.labelFontSize, + "font-weight":"normal", + "font-family":"Arial", + "fill":this.config.labelFontColor, + "fill-opacity":"0" + }); + setDy(this.txtLabel, this.params.labelFontSize, this.params.labelY); + this.txtLabel.id = this.config.id+"-txtlabel"; + + // min + this.txtMinimum = this.config.min; + if( this.config.humanFriendly ) this.txtMinimum = humanFriendlyNumber( this.config.min, this.config.humanFriendlyDecimal ); + this.txtMin = this.canvas.text(this.params.minX, this.params.minY, this.txtMinimum); + this.txtMin.attr({ + "font-size":this.params.minFontSize, + "font-weight":"normal", + "font-family":"Arial", + "fill":this.config.labelFontColor, + "fill-opacity": (this.config.hideMinMax || this.config.donut)? "0" : "1" + }); + setDy(this.txtMin, this.params.minFontSize, this.params.minY); + this.txtMin.id = this.config.id+"-txtmin"; + + // max + this.txtMaximum = this.config.max; + if( this.config.humanFriendly ) this.txtMaximum = humanFriendlyNumber( this.config.max, this.config.humanFriendlyDecimal ); + this.txtMax = this.canvas.text(this.params.maxX, this.params.maxY, this.txtMaximum); + this.txtMax.attr({ + "font-size":this.params.maxFontSize, + "font-weight":"normal", + "font-family":"Arial", + "fill":this.config.labelFontColor, + "fill-opacity": (this.config.hideMinMax || this.config.donut)? "0" : "1" + }); + setDy(this.txtMax, this.params.maxFontSize, this.params.maxY); + this.txtMax.id = this.config.id+"-txtmax"; + + var defs = this.canvas.canvas.childNodes[1]; + var svg = "http://www.w3.org/2000/svg"; + + if (ie < 9) { + onCreateElementNsReady(function() { + this.generateShadow(svg, defs); + }); + } else { + this.generateShadow(svg, defs); + } + + // var clear + defs, svg = null; + + // execute on each animation frame + function onAnimate() { + if (obj.config.counter) { + var currentValue = obj.level.attr("pki"); + + if(obj.config.textRenderer) { + // this.originalValue = this.config.textRenderer(this.originalValue); + obj.txtValue.attr("text", obj.config.textRenderer(Math.floor(currentValue[0]))); + } else if(obj.config.humanFriendly) { + // this.originalValue = humanFriendlyNumber( this.originalValue, this.config.humanFriendlyDecimal ) + this.config.symbol; + obj.txtValue.attr("text", humanFriendlyNumber( Math.floor(currentValue[0]), obj.config.humanFriendlyDecimal ) + obj.config.symbol); + } else { + // this.originalValue += this.config.symbol; + obj.txtValue.attr("text", (currentValue[0] * 1).toFixed(obj.config.decimals) + obj.config.symbol); + } + + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + currentValue = null; + } + } + + if(!obj.config.counter) { + if(obj.config.textRenderer) { + obj.originalValue = obj.config.textRenderer(obj.originalValue); + } else if(obj.config.humanFriendly) { + obj.originalValue = humanFriendlyNumber( obj.originalValue, obj.config.humanFriendlyDecimal ) + obj.config.symbol; + } else { + obj.originalValue = (obj.originalValue * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + + obj.txtValue.attr("text", obj.originalValue); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + } + + //event fired on each animation frame + eve.on("raphael.anim.frame.*", onAnimate); + + // animate gauge level + this.level.animate({pki: [this.config.value, this.config.min, this.config.max, this.params.widgetW, this.params.widgetH, this.params.dx, this.params.dy, this.config.gaugeWidthScale, this.config.donut]}, this.config.startAnimationTime, this.config.startAnimationType); + + // animate value + this.txtValue.animate({"fill-opacity":"1"}, this.config.startAnimationTime, this.config.startAnimationType); + + // animate label + this.txtLabel.animate({"fill-opacity":"1"}, this.config.startAnimationTime, this.config.startAnimationType); +}; + +/** Refresh gauge level */ +JustGage.prototype.refresh = function(val, max) { + + var originalVal, displayVal, color, max = max || null; + + // set new max + if(max !== null) { + this.config.max = max; + + this.txtMaximum = this.config.max; + if( this.config.humanFriendly ) this.txtMaximum = humanFriendlyNumber( this.config.max, this.config.humanFriendlyDecimal ); + this.txtMax.attr({"text" : this.config.max}); + setDy(this.txtMax, this.params.maxFontSize, this.params.maxY); + } + + // overflow values + originalVal = val; + displayVal = val; + if ((val * 1) > (this.config.max * 1)) {val = (this.config.max * 1);} + if ((val * 1) < (this.config.min * 1)) {val = (this.config.min * 1);} + + color = getColor(val, (val - this.config.min) / (this.config.max - this.config.min), this.config.levelColors, this.config.noGradient, this.config.customSectors); + + if(this.config.textRenderer) { + displayVal = this.config.textRenderer(displayVal); + } else if( this.config.humanFriendly ) { + displayVal = humanFriendlyNumber( displayVal, this.config.humanFriendlyDecimal ) + this.config.symbol; + } else { + displayVal = (displayVal * 1).toFixed(this.config.decimals) + this.config.symbol; + } + + if(!this.config.counter) { + this.canvas.getById(this.config.id+"-txtvalue").attr({"text":displayVal}); + setDy(this.canvas.getById(this.config.id+"-txtvalue"), this.params.valueFontSize, this.params.valueY); + } + + this.canvas.getById(this.config.id+"-level").animate({pki: [val, this.config.min, this.config.max, this.params.widgetW, this.params.widgetH, this.params.dx, this.params.dy, this.config.gaugeWidthScale, this.config.donut], "fill":color}, this.config.refreshAnimationTime, this.config.refreshAnimationType); + this.config.value = val * 1; + + // var clear + originalVal, displayVal, color, max = null; +}; + +/** Generate shadow */ +JustGage.prototype.generateShadow = function(svg, defs) { + + var gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3; + + // FILTER + gaussFilter=document.createElementNS(svg,"filter"); + gaussFilter.setAttribute("id", this.config.id + "-inner-shadow"); + defs.appendChild(gaussFilter); + + // offset + feOffset = document.createElementNS(svg,"feOffset"); + feOffset.setAttribute("dx", 0); + feOffset.setAttribute("dy", this.config.shadowVerticalOffset); + gaussFilter.appendChild(feOffset); + + // blur + feGaussianBlur = document.createElementNS(svg,"feGaussianBlur"); + feGaussianBlur.setAttribute("result","offset-blur"); + feGaussianBlur.setAttribute("stdDeviation", this.config.shadowSize); + gaussFilter.appendChild(feGaussianBlur); + + // composite 1 + feComposite1 = document.createElementNS(svg,"feComposite"); + feComposite1.setAttribute("operator","out"); + feComposite1.setAttribute("in", "SourceGraphic"); + feComposite1.setAttribute("in2","offset-blur"); + feComposite1.setAttribute("result","inverse"); + gaussFilter.appendChild(feComposite1); + + // flood + feFlood = document.createElementNS(svg,"feFlood"); + feFlood.setAttribute("flood-color","black"); + feFlood.setAttribute("flood-opacity", this.config.shadowOpacity); + feFlood.setAttribute("result","color"); + gaussFilter.appendChild(feFlood); + + // composite 2 + feComposite2 = document.createElementNS(svg,"feComposite"); + feComposite2.setAttribute("operator","in"); + feComposite2.setAttribute("in", "color"); + feComposite2.setAttribute("in2","inverse"); + feComposite2.setAttribute("result","shadow"); + gaussFilter.appendChild(feComposite2); + + // composite 3 + feComposite3 = document.createElementNS(svg,"feComposite"); + feComposite3.setAttribute("operator","over"); + feComposite3.setAttribute("in", "shadow"); + feComposite3.setAttribute("in2","SourceGraphic"); + gaussFilter.appendChild(feComposite3); + + // set shadow + if (!this.config.hideInnerShadow) { + this.canvas.canvas.childNodes[2].setAttribute("filter", "url(#" + this.config.id + "-inner-shadow)"); + this.canvas.canvas.childNodes[3].setAttribute("filter", "url(#" + this.config.id + "-inner-shadow)"); + } + + // var clear + gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3 = null; + +}; + +/** Get color for value */ +function getColor(val, pct, col, noGradient, custSec) { + + var no, inc, colors, percentage, rval, gval, bval, lower, upper, range, rangePct, pctLower, pctUpper, color; + var noGradient = noGradient || custSec.length > 0; + + if(custSec.length > 0) { + for(var i = 0; i < custSec.length; i++) { + if(val > custSec[i].lo && val <= custSec[i].hi) { + return custSec[i].color; + } + } + } + + no = col.length; + if (no === 1) return col[0]; + inc = (noGradient) ? (1 / no) : (1 / (no - 1)); + colors = []; + for (var i = 0; i < col.length; i++) { + percentage = (noGradient) ? (inc * (i + 1)) : (inc * i); + rval = parseInt((cutHex(col[i])).substring(0,2),16); + gval = parseInt((cutHex(col[i])).substring(2,4),16); + bval = parseInt((cutHex(col[i])).substring(4,6),16); + colors[i] = { pct: percentage, color: { r: rval, g: gval, b: bval } }; + } + + if(pct === 0) { + return 'rgb(' + [colors[0].color.r, colors[0].color.g, colors[0].color.b].join(',') + ')'; + } + + for (var j = 0; j < colors.length; j++) { + if (pct <= colors[j].pct) { + if (noGradient) { + return 'rgb(' + [colors[j].color.r, colors[j].color.g, colors[j].color.b].join(',') + ')'; + } else { + lower = colors[j - 1]; + upper = colors[j]; + range = upper.pct - lower.pct; + rangePct = (pct - lower.pct) / range; + pctLower = 1 - rangePct; + pctUpper = rangePct; + color = { + r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper), + g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper), + b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper) + }; + return 'rgb(' + [color.r, color.g, color.b].join(',') + ')'; + } + } + } + +} + +/** Fix Raphael display:none tspan dy attribute bug */ +function setDy(elem, fontSize, txtYpos) { + if ((!ie || ie > 9) && (elem.node.firstChild.attributes.dy)) { + elem.node.firstChild.attributes.dy.value = 0; + } +} + +/** Random integer */ +function getRandomInt (min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +/** Cut hex */ +function cutHex(str) { + return (str.charAt(0)=="#") ? str.substring(1,7):str; +} + +/** Human friendly number suffix - From: http://stackoverflow.com/questions/2692323/code-golf-friendly-number-abbreviator */ +function humanFriendlyNumber( n, d ) { + var p, d2, i, s; + + p = Math.pow; + d2 = p(10, d); + i = 7; + while( i ) { + s = p(10,i--*3); + if( s <= n ) { + n = Math.round(n*d2/s)/d2+"KMGTPE"[i]; + } + } + return n; +} + +/** Get style */ +function getStyle(oElm, strCssRule){ + var strValue = ""; + if(document.defaultView && document.defaultView.getComputedStyle){ + strValue = document.defaultView.getComputedStyle(oElm).getPropertyValue(strCssRule); + } + else if(oElm.currentStyle){ + strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; +} + +/** Create Element NS Ready */ +function onCreateElementNsReady(func) { + if (document.createElementNS !== undefined) { + func(); + } else { + setTimeout(function() { onCreateElementNsReady(func); }, 100); + } +} + +/** Get IE version */ +// ---------------------------------------------------------- +// A short snippet for detecting versions of IE in JavaScript +// without resorting to user-agent sniffing +// ---------------------------------------------------------- +// If you're not in IE (or IE version is less than 5) then: +// ie === undefined +// If you're in IE (>=5) then you can determine which version: +// ie === 7; // IE7 +// Thus, to detect IE: +// if (ie) {} +// And to detect the version: +// ie === 6 // IE6 +// ie > 7 // IE8, IE9 ... +// ie < 9 // Anything less than IE9 +// ---------------------------------------------------------- +// UPDATE: Now using Live NodeList idea from @jdalton +var ie = (function(){ + + var undef, + v = 3, + div = document.createElement('div'), + all = div.getElementsByTagName('i'); + + while ( + div.innerHTML = '', + all[0] + ); + return v > 4 ? v : undef; +}()); \ No newline at end of file diff --git a/addons/sale_crm/static/src/js/sale_crm.js b/addons/sale_crm/static/src/js/sale_crm.js new file mode 100644 index 00000000000..207ac959af3 --- /dev/null +++ b/addons/sale_crm/static/src/js/sale_crm.js @@ -0,0 +1,108 @@ +openerp.sale_crm = function(openerp) { +var _t = openerp.web._t; + +openerp.sale_crm.GaugeWidget = openerp.web_kanban.AbstractField.extend({ + className: "oe_gage", + start: function() { + var self = this; + + var parent = this.getParent(); + var max = this.options.max_field ? parent.record[this.options.max_field].raw_value : 100; + var label = this.options.label_field ? parent.record[this.options.label_field].raw_value : ""; + var title = this.$node.html(); + var val = this.field.value; + var value = _.isArray(val) && val.length ? val[val.length-1]['value'] : val; + var unique_id = _.uniqueId("JustGage"); + + this.$el.empty() + .attr('style', this.$node.attr('style') + ';position:relative; display:inline-block;') + .attr('id', unique_id); + this.gage = new JustGage({ + id: unique_id, + node: this.$el[0], + title: title, + value: value, + min: 0, + max: max, + relativeGaugeSize: true, + humanFriendly: true, + titleFontColor: '#333333', + valueFontColor: '#333333', + labelFontColor: '#000', + label: label, + levelColors: [ + "#ff0000", + "#f9c802", + "#a9d70b" + ], + }); + + var flag_open = false; + if (self.options.action_change) { + var $svg = self.$el.find('svg'); + var css = { + 'text-align': 'center', + 'position': 'absolute', + 'width': self.$el.outerWidth() + 'px', + 'top': (self.$el.outerHeight()/2-5) + 'px' + }; + + self.$el.click(function (event) { + event.stopPropagation(); + flag_open = false; + if (!parent.view.is_action_enabled('edit')) { + return; + } + if (!self.$el.find(".oe_justgage_edit").size()) { + $div = $('
    '); + $div.css(css); + $input = $('').val(value); + $input.css({ + 'text-align': 'center', + 'margin': 'auto', + 'width': ($svg.outerWidth()-40) + 'px' + }); + $div.append($input); + self.$el.prepend($div) + $input.focus() + .keydown(function (event) { + event.stopPropagation(); + if (event.keyCode == 13 || event.keyCode == 9) { + if ($input.val() != value) { + parent.view.dataset.call(self.options.action_change, [parent.id, $input.val()]).then(function () { + parent.do_reload(); + }); + } else { + $div.remove(); + } + } + }) + .click(function (event) { + event.stopPropagation(); + flag_open = false; + }) + .blur(function (event) { + if(!flag_open) { + self.$el.find(".oe_justgage_edit").remove(); + } else { + flag_open = false; + setTimeout(function () {$input.focus();}, 0); + } + }); + } + }).mousedown(function () { + flag_open = true; + }); + + if (!+value) { + $svg.fadeTo(0, 0.3); + $div = $('
    ').text(_t("Click to change value")); + $div.css(css); + self.$el.append($div); + } + } + }, +}); +openerp.web_kanban.fields_registry.add("gage", "openerp.sale_crm.GaugeWidget"); + +}; diff --git a/addons/sale_margin/i18n/ru.po b/addons/sale_margin/i18n/ru.po index 7c764c89223..cac4fe13548 100644 --- a/addons/sale_margin/i18n/ru.po +++ b/addons/sale_margin/i18n/ru.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-12-21 17:06+0000\n" -"PO-Revision-Date: 2011-01-20 08:51+0000\n" +"PO-Revision-Date: 2013-06-04 13:50+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2013-03-16 05:40+0000\n" -"X-Generator: Launchpad (build 16532)\n" +"X-Launchpad-Export-Date: 2013-06-05 05:32+0000\n" +"X-Generator: Launchpad (build 16660)\n" #. module: sale_margin #: field:sale.order.line,purchase_price:0 @@ -44,6 +44,7 @@ msgid "" "It gives profitability by calculating the difference between the Unit Price " "and the cost price." msgstr "" +"Дает прибыльность как разницу между стоимостью единицы и себестоимостью." #~ msgid "Customer Invoice" #~ msgstr "Счета клиентам" diff --git a/addons/sale_stock/process/sale_stock_process.xml b/addons/sale_stock/process/sale_stock_process.xml index c10b34c8866..1ebebec7809 100644 --- a/addons/sale_stock/process/sale_stock_process.xml +++ b/addons/sale_stock/process/sale_stock_process.xml @@ -72,40 +72,40 @@ - - + + - - + + - - + + - - + + - - + +