[IMP] crm: Sales Teams menu with breadcrum
authorChristophe Matthieu <chm@openerp.com>
Fri, 25 Jan 2013 11:04:34 +0000 (12:04 +0100)
committerChristophe Matthieu <chm@openerp.com>
Fri, 25 Jan 2013 11:04:34 +0000 (12:04 +0100)
bzr revid: chm@openerp.com-20130125110434-whqnmhrvdqj0r9gh

addons/crm/__openerp__.py
addons/crm/crm.py
addons/crm/crm_lead_data.xml
addons/crm/crm_salesteams.xml [new file with mode: 0644]
addons/crm/crm_view.xml
addons/crm/security/ir.model.access.csv
addons/crm/static/src/css/crm.css [new file with mode: 0644]

index 4a792ab..46ce37f 100644 (file)
@@ -80,6 +80,8 @@ Dashboard for CRM will include:
         'crm_lead_view.xml',
         'crm_lead_menu.xml',
 
+        'crm_salesteams.xml',
+
         'crm_meeting_menu.xml',
 
         'crm_phonecall_view.xml',
@@ -113,6 +115,7 @@ Dashboard for CRM will include:
         'test/ui/duplicate_lead.yml',
         'test/ui/delete_lead.yml',
     ],
+    'css': ['static/src/css/crm.css'],
     'installable': True,
     'application': True,
     'auto_install': False,
index df6d5e1..9fa6b62 100644 (file)
@@ -109,6 +109,20 @@ 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)
+        lead_obj = self.pool.get('crm.lead')
+        for section_id in section_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)
+        lead_obj = self.pool.get('crm.lead')
+        for section_id in section_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
+
     _columns = {
         'name': fields.char('Sales Team', size=64, required=True, translate=True),
         'complete_name': fields.function(get_full_name, type='char', size=256, readonly=True, store=True),
@@ -128,6 +142,8 @@ class crm_case_section(osv.osv):
         'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="cascade", required=True,
                                     help="The email address associated with this team. New emails received will automatically "
                                          "create new leads assigned to the team."),
+        'number_lead': fields.function(get_number_leads, type='integer', readonly=True),
+        'number_opportunity': fields.function(get_number_opportunities, type='integer',  readonly=True),
     }
 
     def _get_stage_common(self, cr, uid, context):
index bb590f4..d516b20 100644 (file)
@@ -45,6 +45,7 @@
         </record>
         <record model="crm.case.stage" id="stage_lead6">
             <field name="name">Won</field>
+            <field eval="True" name="fold"/>
             <field eval="1" name="case_default"/>
             <field name="state">done</field>
             <field eval="'100'" name="probability"/>
diff --git a/addons/crm/crm_salesteams.xml b/addons/crm/crm_salesteams.xml
new file mode 100644 (file)
index 0000000..5bed560
--- /dev/null
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+  <data>
+
+        <!-- CRM lead search by Salesteams -->
+
+        <record model="ir.actions.act_window" id="crm_case_form_view_salesteams_lead">
+            <field name="name">Leads</field>
+            <field name="res_model">crm.lead</field>
+            <field name="view_mode">tree,form</field>
+            <field name="domain">['|', ('type','=','lead'), ('type','=',False)]</field>
+            <field name="context">{
+                'search_default_section_id': [active_id], 
+                'default_section_id': active_id, 
+                'search_default_new': True, 
+                'search_default_open': True
+            }</field>
+            <field name="help" type="html">
+              <p class="oe_view_nocontent_create">
+                Click to create a new lead.
+              </p><p>
+                Use leads if you need a qualification step before creating an
+                opportunity or a customer. It can be a business card you received,
+                a contact form filled in your website, or a file of unqualified
+                prospects you import, etc.
+              </p><p>
+                Once qualified, the lead can be converted into a business
+                opportunity and/or a new customer in your address book.
+              </p>
+            </field>
+        </record>
+
+        <!-- CRM opportunity search by Salesteams -->
+
+        <record model="ir.actions.act_window" id="crm_case_form_view_salesteams_opportunity">
+            <field name="name">Leads</field>
+            <field name="res_model">crm.lead</field>
+            <field name="view_mode">kanban,tree,form</field>
+            <field name="domain">[('type','=','opportunity')]</field>
+            <field name="view_id" ref="crm.crm_case_kanban_view_leads"/>
+            <field name="context">{
+                'search_default_section_id': [active_id],
+                'default_section_id': active_id, 
+                'search_default_new': True, 
+                'search_default_open': True
+            }</field>
+            <field name="help" type="html">
+              <p class="oe_view_nocontent_create">
+                Click to create a new lead.
+              </p><p>
+                Use leads if you need a qualification step before creating an
+                opportunity or a customer. It can be a business card you received,
+                a contact form filled in your website, or a file of unqualified
+                prospects you import, etc.
+              </p><p>
+                Once qualified, the lead can be converted into a business
+                opportunity and/or a new customer in your address book.
+              </p>
+            </field>
+        </record>
+
+        <!-- Case Sections Salesteams kanban view -->
+
+        <record model="ir.ui.view" id="crm_case_section_salesteams_view_kanban">
+            <field name="name">crm.case.section.kanban</field>
+            <field name="model">crm.case.section</field>
+            <field name="arch" type="xml">
+                <kanban version="7.0">
+                    <field name="name"/>
+                    <field name="user_id"/>
+                    <field name="member_ids"/>
+                    <field name="note"/>
+                    <field name="alias_id"/>
+                    <field name="number_lead"/>
+                    <field name="number_opportunity"/>
+                    <templates>
+                        <t t-name="kanban-box">
+                            <div t-attf-class="oe_kanban_card oe_kanban_project oe_kanban_global_click oe_kanban_crm_salesteams" style="width:200px;">
+                                <div class="oe_dropdown_toggle oe_dropdown_kanban" groups="base.group_user">
+                                    <span class="oe_e">í</span>
+                                    <ul class="oe_dropdown_menu">
+                                        <t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Project Settings</a></li></t>
+                                        <t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t>
+                                    </ul>
+                                </div>
+                                <div class="oe_kanban_content">
+                                    <h4>
+                                      <field name="name"/>
+                                      <div class="oe_kanban_crm_salesteams_leader">
+                                        <small>
+                                          <t t-if="record.user_id.raw_value">(<field name="user_id"/>)</t>
+                                          <t t-if="!record.user_id.raw_value"><br/></t>
+                                        </small>
+                                      </div>
+                                    </h4>
+                                    <div class="oe_kanban_crm_salesteams_list">
+                                        <a name="%(crm_case_form_view_salesteams_lead)d" type="action"> 
+                                            <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><br/>
+                                        <a name="%(crm_case_form_view_salesteams_opportunity)d" type="action"> 
+                                            <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>
+                                    </div>
+                                    <div class="oe_kanban_crm_salesteams_avatars">
+                                        <t t-foreach="record.member_ids.raw_value.slice(0,11)" t-as="member">
+                                            <img t-att-src="kanban_image('res.users', 'image_small', member)" t-att-data-member_id="member"/>
+                                        </t>
+                                    </div>
+                                    <br/>
+                                    <small style="position: absolute; bottom: 5px;">
+                                        <field name="alias_id"/>
+                                    </small>
+                                </div>
+                            </div>
+                        </t>
+                    </templates>
+                </kanban>
+            </field>
+        </record>
+
+        <!-- Case Sections Action -->
+
+        <record id="crm_case_section_salesteams_act" model="ir.actions.act_window">
+            <field name="name">Sales Teams</field>
+            <field name="res_model">crm.case.section</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">kanban,tree,form</field>
+            <field name="view_id" ref="crm_case_section_salesteams_view_kanban"/>
+            <field name="help" type="html">
+              <p class="oe_view_nocontent_create">
+                Click to define a new sales team.
+              </p><p>
+                Use sales team to organize your different salespersons or
+                departments into separate teams. Each team will work in
+                its own list of opportunities.
+              </p>
+            </field>
+        </record>
+
+        <menuitem
+            action="crm_case_section_salesteams_act"
+            id="crm.menu_crm_case_section_act"
+            sequence="1"
+            parent="base.menu_sales"
+            groups="base.group_sale_manager,base.group_sale_salesman"/>
+  </data>
+</openerp>
\ No newline at end of file
index 2c156ca..23d71ef 100644 (file)
             <field name="model">crm.case.section</field>
             <field name="arch" type="xml">
                 <form string="Sales Team" version="7.0">
-                    <group>
+                    <sheet>
                         <group>
-                            <field name="name" colspan="2"/>
-                            <field name="parent_id"/>
-                            <field name="code"/>
-                        </group>
+                            <group>
+                                <field name="name" colspan="2"/>
+                                <field name="parent_id"/>
+                                <field name="code"/>
+                            </group>
 
-                        <group>
-                            <field name="user_id"/>
-                            <field name="resource_calendar_id"/>
-                            <field name="active"/>
-                        </group>
-                    </group>
-                    <notebook colspan="4">
-                        <page string="Sales Team">
-                           <group>
-                                <field name="alias_id" invisible="1" required="0"/>
-                                <label for="alias_name" attrs="{'invisible': [('alias_domain', '=', False)]}"/>
-                                <div attrs="{'invisible': [('alias_domain', '=', False)]}">
-                                    <field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
-                                 </div>
-                                <field name="change_responsible"/>
+                            <group>
+                                <field name="user_id"/>
+                                <field name="resource_calendar_id"/>
+                                <field name="active"/>
                             </group>
-                            <separator string="Team Members"/>
-                            <field name="member_ids" widget="many2many_kanban">
-                                <kanban quick_create="false" create="true">
-                                    <field name="name"/>
-                                    <templates>
-                                        <t t-name="kanban-box">
-                                            <div style="position: relative">
-                                                <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
-                                                <div class="oe_module_vignette">
-                                                    <div class="oe_module_desc">
-                                                        <field name="name"/>
+                        </group>
+                        <notebook colspan="4">
+                            <page string="Sales Team">
+                               <group>
+                                    <field name="alias_id" invisible="1" required="0"/>
+                                    <label for="alias_name" attrs="{'invisible': [('alias_domain', '=', False)]}"/>
+                                    <div attrs="{'invisible': [('alias_domain', '=', False)]}">
+                                        <field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
+                                     </div>
+                                    <field name="change_responsible"/>
+                                </group>
+                                <separator string="Team Members"/>
+                                <field name="member_ids" widget="many2many_kanban">
+                                    <kanban quick_create="false" create="true">
+                                        <field name="name"/>
+                                        <templates>
+                                            <t t-name="kanban-box">
+                                                <div style="position: relative">
+                                                    <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
+                                                    <div class="oe_module_vignette">
+                                                        <div class="oe_module_desc">
+                                                            <field name="name"/>
+                                                        </div>
                                                     </div>
                                                 </div>
-                                            </div>
-                                        </t>
-                                    </templates>
-                                </kanban>
-                            </field>
-                        </page>
-                        <page string="Stages">
-                            <separator string="Select Stages for this Sales Team"/>
-                            <field name="stage_ids"/>
-                        </page>
-                        <page string="Notes">
-                            <field name="note"/>
-                        </page>
-                    </notebook>
+                                            </t>
+                                        </templates>
+                                    </kanban>
+                                </field>
+                            </page>
+                            <page string="Stages">
+                                <separator string="Select Stages for this Sales Team"/>
+                                <field name="stage_ids"/>
+                            </page>
+                            <page string="Notes">
+                                <field name="note"/>
+                            </page>
+                        </notebook>
+                    </sheet>
                     <div class="oe_chatter">
                         <field name="message_follower_ids" widget="mail_followers" help="Follow this salesteam to automatically track the events associated to users of this team."/>
                         <field name="message_ids" widget="mail_thread"/>
index 74394d3..eaa1143 100644 (file)
@@ -36,4 +36,4 @@ access_res_partner_bank_type_crm_user,res.partner.bank.type.crm.user,base.model_
 access_crm_lead_partner_manager,crm.lead.partner.manager,model_crm_lead,base.group_partner_manager,1,0,0,0\r
 access_crm_phonecall_partner_manager,crm.phonecall.partner.manager,model_crm_phonecall,base.group_partner_manager,1,1,1,1\r
 access_crm_payment_mode_user,crm.payment.mode,model_crm_payment_mode,base.group_sale_salesman,1,0,0,0\r
-access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1\r
+access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1
\ No newline at end of file
diff --git a/addons/crm/static/src/css/crm.css b/addons/crm/static/src/css/crm.css
new file mode 100644 (file)
index 0000000..06c6125
--- /dev/null
@@ -0,0 +1,22 @@
+.oe_kanban_crm_salesteams {
+    width: 220px;
+    min-height: 160px;
+}
+.oe_kanban_crm_salesteams_avatars {
+    margin-top: 8px;
+}
+
+.oe_kanban_crm_salesteams_avatars img {
+    width: 30px;
+    height: 30px;
+    padding-left: 0px;
+    margin-top: 3px;
+    -moz-border-radius: 2px;
+    -webkit-border-radius: 2px;
+    border-radius: 2px;
+    -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+    -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+    -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+}
+
+