[IMP] salesteams: add sales order and quotation
authorChristophe Matthieu <chm@openerp.com>
Wed, 6 Feb 2013 09:44:14 +0000 (10:44 +0100)
committerChristophe Matthieu <chm@openerp.com>
Wed, 6 Feb 2013 09:44:14 +0000 (10:44 +0100)
bzr revid: chm@openerp.com-20130206094414-8f7kp19dam6su991

addons/crm/crm.py
addons/crm/crm_lead.py
addons/crm/crm_salesteams.xml
addons/crm/static/src/css/crm.css
addons/mail/mail_thread.py
addons/project/project.py
addons/sale/sale_view.xml
addons/sale_crm/sale_crm.py
addons/sale_crm/sale_crm_view.xml

index 9fa6b62..c00b5ff 100644 (file)
@@ -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
 
index d675753..20d9339 100644 (file)
@@ -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, _("<div class='oe_view_nocontent_create_alias'>You can also create opportunities by sending an email to: <b>%s</b></div>" % alias_txt))
-            else:
-                help = "%s %s" % (help, _("<div class='oe_view_nocontent_create_alias'>You can also create lead by sending an email to: <b>%s</b></div>" % 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:
index 9a76c98..3c55f01 100644 (file)
@@ -51,7 +51,7 @@
             <field name="view_mode">kanban,tree,graph,form,calendar</field>
             <field name="domain">[('type','=','opportunity')]</field>
             <field name="view_id" ref="crm.crm_case_kanban_view_leads"/>
-        <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
+            <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
             <field name="context">{
                 'search_default_section_id': [active_id], 'default_section_id': active_id, 'stage_type': 'opportunity', 'default_type': 'opportunity', 'default_user_id': uid
             }</field>
                                         <span class="oe_e">%%</span><small><field name="alias_id"/></small>
                                     </div>
                                     <div class="oe_kanban_crm_salesteams_list">
-                                        <a name="%(crm_case_form_view_salesteams_opportunity)d" type="action" style="margin-right: 10px">
-                                            <field name="number_opportunity"/>
-                                            <t t-if="record.number_opportunity.raw_value &gt; 1">Opportunities</t><t t-if="record.number_opportunity.raw_value &lt;= 1">Opportunity</t></a>
                                         <a name="%(crm_case_form_view_salesteams_lead)d" type="action" style="margin-right: 10px">
-                                            <field name="number_lead"/>
-                                            <t t-if="record.number_lead.raw_value &gt; 1">Leads</t><t t-if="record.number_lead.raw_value &lt;= 1">Lead</t></a>
+                                            <t t-raw="record.number_lead.raw_value"/>
+                                            <t t-if="record.number_lead.raw_value &gt;= 1">Leads</t><t t-if="record.number_lead.raw_value &lt; 1">Lead</t></a>
+                                        <a name="%(crm_case_form_view_salesteams_opportunity)d" type="action" style="margin-right: 10px">
+                                            <t t-raw="record.number_opportunity.raw_value"/>
+                                            <t t-if="record.number_opportunity.raw_value &gt;= 1">Opportunities</t><t t-if="record.number_opportunity.raw_value &lt; 1">Opportunity</t></a>
                                     </div>
                                     <div class="oe_kanban_crm_salesteams_avatars">
                                         <t t-foreach="record.member_ids.raw_value.slice(0,11)" t-as="member">
index e9f7abf..a263393 100644 (file)
@@ -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
index d75a919..27ca091 100644 (file)
@@ -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, _("<div class='oe_view_nocontent_create_alias'>You can also create %s by sending an email to: <b>%s</b></div>" % (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
index 91dfc85..a35ecfe 100644 (file)
@@ -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, _("<div class='oe_view_nocontent_create_alias'>You can also create tasks by sending an email to: <b>%s</b></div>" % 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
     # ----------------------------------------
index 18fdb73..bf5ccf8 100644 (file)
               </p>
             </field>
         </record>
+
         <menuitem action="action_orders" id="menu_sale_order" parent="base.menu_sales" sequence="5" groups="base.group_sale_salesman,base.group_sale_manager"/>
 
         <record id="action_orders_exception" model="ir.actions.act_window">
index 1f3f85d..00a6503 100644 (file)
@@ -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'
index 0b5fce2..4c96e8b 100644 (file)
             </field>
         </record>
 
+        <!-- search by Salesteams -->
+
+        <record id="action_orders_salesteams" model="ir.actions.act_window">
+            <field name="name">Sales Orders</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">sale.order</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form,calendar,graph</field>
+            <field name="search_view_id" ref="sale.view_sales_order_filter"/>
+            <field name="domain">[('state','not in',('draft','sent','cancel'))]</field>
+            <field name="context">{
+                'search_default_section_id': [active_id], 'default_section_id': active_id
+            }</field>
+            <field name="help" type="html">
+              <p class="oe_view_nocontent_create">
+                Click to create a quotation that can be converted into a sales
+                order.
+              </p><p>
+                OpenERP will help you efficiently handle the complete sales flow:
+                quotation, sales order, delivery, invoicing and payment.
+              </p>
+            </field>
+        </record>
+
+        <record id="action_quotations_salesteams" model="ir.actions.act_window">
+            <field name="name">Quotations</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">sale.order</field>
+            <field name="view_type">form</field>
+            <field name="view_id" ref="sale.view_quotation_tree"/>
+            <field name="view_mode">tree,form,calendar,graph</field>
+            <field name="context">{
+                'search_default_section_id': [active_id], 'default_section_id': active_id, 'show_address': 1
+            }</field>
+            <field name="domain">[('state','in',('draft','sent','cancel'))]</field>
+            <field name="search_view_id" ref="sale.view_sales_order_filter"/>
+            <field name="help" type="html">
+              <p class="oe_view_nocontent_create">
+                Click to create a quotation, the first step of a new sale.
+              </p><p>
+                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.
+              </p><p>
+                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.
+              </p>
+            </field>
+        </record>
+
+        <record id="crm_case_section_salesteams_view_kanban" model="ir.ui.view">
+            <field name="name">crm.case.section.kanban</field>
+            <field name="model">crm.case.section</field>
+            <field name="inherit_id" ref="crm.crm_case_section_salesteams_view_kanban"/>
+            <field name="arch" type="xml">
+            <data>
+                <xpath expr="//field[@name='number_opportunity']" position="after">
+                    <field name="number_quotation"/>
+                    <field name="number_saleorder"/>
+                </xpath>
+                <xpath expr="//div[@class='oe_kanban_crm_salesteams_list']" position="inside">
+                    <a name="%(action_quotations_salesteams)d" type="action" style="margin-right: 10px">
+                        <t t-raw="record.number_quotation.raw_value"/>
+                        <t t-if="record.number_quotation.raw_value &gt;= 1">Quotation</t><t t-if="record.number_quotation.raw_value &lt; 1">Quotations</t></a>
+                    <a name="%(action_orders_salesteams)d" type="action" style="margin-right: 10px">
+                        <t t-raw="record.number_saleorder.raw_value"/>
+                        <t t-if="record.number_saleorder.raw_value &gt;= 1">Sales Order</t><t t-if="record.number_saleorder.raw_value &lt; 1">Sales Orders</t></a>
+                </xpath>
+            </data>
+            </field>
+        </record>
+
     </data>
 </openerp>