diff --git a/addons/crm/crm.py b/addons/crm/crm.py index 9fa6b6281f7..c00b5ff2597 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -109,17 +109,17 @@ class crm_case_section(osv.osv): def get_full_name(self, cr, uid, ids, field_name, arg, context=None): return dict(self.name_get(cr, uid, ids, context=context)) - def get_number_leads(self, cr, uid, section_ids, field_name, arg, context=None): - res = dict.fromkeys(section_ids, 0) + def get_number_leads(self, cr, uid, ids, field_name, arg, context=None): + res = dict.fromkeys(ids, 0) lead_obj = self.pool.get('crm.lead') - for section_id in section_ids: + for section_id in ids: res[section_id] = lead_obj.search(cr, uid, [("section_id", "=", section_id), '|', '|', ("type", "=", "lead"), ("type", "=", "both"), ("type", "=", False), ('state', 'not in', ['done', 'cancel'])], count=True, context=context) return res - def get_number_opportunities(self, cr, uid, section_ids, field_name, arg, context=None): - res = dict.fromkeys(section_ids, 0) + def get_number_opportunities(self, cr, uid, ids, field_name, arg, context=None): + res = dict.fromkeys(ids, 0) lead_obj = self.pool.get('crm.lead') - for section_id in section_ids: + for section_id in ids: res[section_id] = lead_obj.search(cr, uid, [("section_id", "=", section_id), '|', ("type", "=", "opportunity"), ("type", "=", "both"), ('state', 'not in', ['done', 'cancel'])], context=context, count=True) return res diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index d675753bcb2..20d9339ede5 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -85,28 +85,11 @@ class crm_lead(base_stage, format_address, osv.osv): } def dynamic_help(self, cr, uid, help, context=None): - alias_txt = "" - if context.get('default_section_id'): - project_id = self.pool.get('crm.case.section').browse(cr, uid, context.get('default_section_id'), context=context) - alias = project_id.alias_id and project_id.alias_id.name_get() or False - if alias and alias[0] and alias[0][1]: - alias_txt = alias[0][1] - else: - model_id = self.pool.get('ir.model').search(cr, uid, [("model", "=", self._name)], context=context)[0] - alias_obj = self.pool.get('mail.alias') - alias_nb = 0 - alias_ids = alias_obj.search(cr, uid, [("alias_model_id", "=", model_id)], context=context, limit=5) - if alias_ids: - for alias in alias_obj.browse(cr, uid, alias_ids, context=context): - email = "%s@%s" % (alias.alias_name, alias.alias_domain) - alias_txt = "%s%s%s" % (alias_txt, (alias_nb and ", " or " "), email) - alias_nb += 1 - if alias_txt: - if context.get('default_type', False) == "opportunity": - help = "%s %s" % (help, _("
You can also create opportunities by sending an email to: %s
" % alias_txt)) - else: - help = "%s %s" % (help, _("
You can also create lead by sending an email to: %s
" % alias_txt)) - return help + if context.get('default_type', None) == 'lead': + context['dynamic_help_model'] = 'crm.case.section' + context['dynamic_help_id'] = context.get('default_section_id', None) + context['dynamic_help_documents'] = _("leads") + return super(crm_lead, self).dynamic_help(cr, uid, help, context=context) def create(self, cr, uid, vals, context=None): if context is None: diff --git a/addons/crm/crm_salesteams.xml b/addons/crm/crm_salesteams.xml index 9a76c98a985..3c55f0198f7 100644 --- a/addons/crm/crm_salesteams.xml +++ b/addons/crm/crm_salesteams.xml @@ -51,7 +51,7 @@ kanban,tree,graph,form,calendar [('type','=','opportunity')] - + { 'search_default_section_id': [active_id], 'default_section_id': active_id, 'stage_type': 'opportunity', 'default_type': 'opportunity', 'default_user_id': uid } @@ -120,12 +120,12 @@ %%
diff --git a/addons/crm/static/src/css/crm.css b/addons/crm/static/src/css/crm.css index e9f7abfa7ae..a263393e8fa 100644 --- a/addons/crm/static/src/css/crm.css +++ b/addons/crm/static/src/css/crm.css @@ -36,4 +36,8 @@ .oe_kanban_crm_salesteams_alias small { display: block; margin-left: 20px; +} + +.oe_kanban_crm_salesteams_list a { + white-space: nowrap; } \ No newline at end of file diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index d75a9199369..27ca09136d6 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -35,6 +35,7 @@ from openerp import SUPERUSER_ID from openerp.addons.mail.mail_message import decode from openerp.osv import fields, osv from openerp.tools.safe_eval import safe_eval as eval +from openerp.tools.translate import _ _logger = logging.getLogger(__name__) @@ -88,6 +89,31 @@ class mail_thread(osv.AbstractModel): # :param function lambda: returns whether the tracking should record using this subtype _track = {} + def dynamic_help(self, cr, uid, help, context=None): + if not context.get('dynamic_help_model', None): + return help + + alias_txt = "" + if context.get('dynamic_help_id', None): + object_id = self.pool.get(context.get('dynamic_help_model')).browse(cr, uid, context.get('dynamic_help_id'), context=context) + alias = object_id.alias_id and object_id.alias_id.name_get() or False + if alias and alias[0] and alias[0][1]: + alias_txt = alias[0][1] + else: + model_id = self.pool.get('ir.model').search(cr, uid, [("model", "=", self._name)], context=context)[0] + alias_obj = self.pool.get('mail.alias') + alias_nb = 0 + alias_ids = alias_obj.search(cr, uid, [("alias_model_id", "=", model_id)], context=context, limit=5) + if alias_ids: + for alias in alias_obj.browse(cr, uid, alias_ids, context=context): + email = "%s@%s" % (alias.alias_name, alias.alias_domain) + alias_txt = "%s%s%s" % (alias_txt, (alias_nb and ", " or " "), email) + alias_nb += 1 + if alias_txt: + help = "%s %s" % (help, _("
You can also create %s by sending an email to: %s
" % (context.get('dynamic_help_documents', _("documents")), alias_txt))) + + return help + def _get_message_data(self, cr, uid, ids, name, args, context=None): """ Computes: - message_unread: has uid unread message for the document diff --git a/addons/project/project.py b/addons/project/project.py index 91dfc858113..a35ecfe4ece 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -891,26 +891,12 @@ class task(base_stage, osv.osv): def dynamic_help(self, cr, uid, help, context=None): - alias_txt = "" - if context.get('default_project_id'): - project_id = self.pool.get('project.project').browse(cr, uid, context.get('default_project_id'), context=context) - alias = project_id.alias_id and project_id.alias_id.name_get() or False - if alias and alias[0] and alias[0][1]: - alias_txt = alias[0][1] - else: - model_id = self.pool.get('ir.model').search(cr, uid, [("model", "=", self._name)], context=context)[0] - alias_obj = self.pool.get('mail.alias') - alias_nb = 0 - alias_ids = alias_obj.search(cr, uid, [("alias_model_id", "=", model_id)], context=context, limit=5) - if alias_ids: - for alias in alias_obj.browse(cr, uid, alias_ids, context=context): - email = "%s@%s" % (alias.alias_name, alias.alias_domain) - alias_txt = "%s%s%s" % (alias_txt, (alias_nb and ", " or " "), email) - alias_nb += 1 - if alias_txt: - help = "%s %s" % (help, _("
You can also create tasks by sending an email to: %s
" % alias_txt)) - return help - + context['dynamic_help_model'] = 'project.project' + context['dynamic_help_id'] = context.get('default_project_id', None) + context['dynamic_help_documents'] = _("tasks") + print context + return super(task, self).dynamic_help(cr, uid, help, context=context) + # ---------------------------------------- # Case management # ---------------------------------------- diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index 18fdb739923..bf5ccf8ab7b 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -340,6 +340,7 @@

+ diff --git a/addons/sale_crm/sale_crm.py b/addons/sale_crm/sale_crm.py index 1f3f85d5ed1..00a6503f70a 100644 --- a/addons/sale_crm/sale_crm.py +++ b/addons/sale_crm/sale_crm.py @@ -29,6 +29,27 @@ class sale_order(osv.osv): domain="['|',('section_id','=',section_id),('section_id','=',False), ('object_id.model', '=', 'crm.lead')]") } +class crm_case_section(osv.osv): + _inherit = 'crm.case.section' + + def get_number_saleorder(self, cr, uid, ids, field_name, arg, context=None): + res = dict.fromkeys(ids, 0) + obj = self.pool.get('sale.order') + for section_id in ids: + res[section_id] = obj.search(cr, uid, [("section_id", "=", section_id), ('state','not in',('draft','sent','cancel'))], context=context, count=True) + return res + + def get_number_quotation(self, cr, uid, ids, field_name, arg, context=None): + res = dict.fromkeys(ids, 0) + obj = self.pool.get('sale.order') + for section_id in ids: + res[section_id] = obj.search(cr, uid, [("section_id", "=", section_id), ('state','in',('draft','sent','cancel'))], context=context, count=True) + return res + + _columns = { + 'number_saleorder': fields.function(get_number_saleorder, type='integer', readonly=True), + 'number_quotation': fields.function(get_number_quotation, type='integer', readonly=True), + } class res_users(osv.Model): _inherit = 'res.users' diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml index 0b5fce2f5cd..4c96e8b2cc5 100644 --- a/addons/sale_crm/sale_crm_view.xml +++ b/addons/sale_crm/sale_crm_view.xml @@ -113,5 +113,78 @@ + + + + Sales Orders + ir.actions.act_window + sale.order + form + tree,form,calendar,graph + + [('state','not in',('draft','sent','cancel'))] + { + 'search_default_section_id': [active_id], 'default_section_id': active_id + } + +

+ Click to create a quotation that can be converted into a sales + order. +

+ OpenERP will help you efficiently handle the complete sales flow: + quotation, sales order, delivery, invoicing and payment. +

+
+
+ + + Quotations + ir.actions.act_window + sale.order + form + + tree,form,calendar,graph + { + 'search_default_section_id': [active_id], 'default_section_id': active_id, 'show_address': 1 + } + [('state','in',('draft','sent','cancel'))] + + +

+ Click to create a quotation, the first step of a new sale. +

+ OpenERP will help you handle efficiently the complete sale flow: + from the quotation to the sales order, the + delivery, the invoicing and the payment collection. +

+ The social feature helps you organize discussions on each sales + order, and allow your customers to keep track of the evolution + of the sales order. +

+
+
+ + + crm.case.section.kanban + crm.case.section + + + + + + + + + + + QuotationQuotations + + + Sales OrderSales Orders + + + + +