16 changed files with 496 additions and 0 deletions
@ -0,0 +1,24 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Cybrosys Technologies(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
import models |
@ -0,0 +1,41 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Cybrosys Technologies(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
{ |
|||
'name': 'Parent Team & Targets', |
|||
'version': '10.0.1.0.0', |
|||
'category': 'Sales', |
|||
'summary': 'Sales Team Targets and Parent Teams', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'website': 'http://www.cybrosys.com', |
|||
'depends': ['crm', 'sale'], |
|||
'images': ['static/description/banner.jpg'], |
|||
'data': [ |
|||
'views/parent_team.xml', |
|||
'views/sales_man_target.xml', |
|||
'views/sales_team_target.xml', |
|||
'security/ir.model.access.csv', |
|||
], |
|||
'installable': True, |
|||
'auto_install': False, |
|||
} |
@ -0,0 +1,25 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Cybrosys Technologies(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
import crm_target |
|||
import crm_target_team |
@ -0,0 +1,133 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Cybrosys Technologies(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
from datetime import datetime |
|||
from dateutil import relativedelta |
|||
from odoo import models, fields, api |
|||
from odoo.tools.translate import _ |
|||
|
|||
|
|||
class CrmTeam(models.Model): |
|||
_name = "crm.target" |
|||
|
|||
def get_currency(self): |
|||
return self.env.user.company_id.currency_id.id |
|||
|
|||
name = fields.Char(string='Name', required=True) |
|||
user_id = fields.Many2one('res.users', 'Sales Person', required=True) |
|||
sales_team = fields.Many2one('crm.team', string='Sales Team') |
|||
target_amount = fields.Float('Target') |
|||
date_from = fields.Date("Starting date", required=True) |
|||
date_to = fields.Date("Ending date", required=True) |
|||
duration = fields.Integer(default=1) |
|||
currency_id = fields.Many2one('res.currency', store=True, string='Currency', readonly=True, default=lambda self: self.get_currency()) |
|||
|
|||
@api.onchange('user_id') |
|||
def onchange_salesman(self): |
|||
team_ids = self.env['crm.team'].search([]) |
|||
dates = fields.Date |
|||
|
|||
for team_id in team_ids: |
|||
for member_id in team_id.member_ids: |
|||
if self.user_id == member_id: |
|||
self.sales_team = team_id.id |
|||
|
|||
@api.onchange('date_from', 'date_to') |
|||
def get_duration(self): |
|||
if self.date_from and self.date_to: |
|||
r = relativedelta.relativedelta(datetime.strptime(self.date_to, "%Y-%m-%d"), datetime.strptime(self.date_from, "%Y-%m-%d")) |
|||
|
|||
t_day = datetime.strptime(self.date_to, "%Y-%m-%d").day |
|||
t_month = datetime.strptime(self.date_to, "%Y-%m-%d").month |
|||
t_year = datetime.strptime(self.date_to, "%Y-%m-%d").year |
|||
|
|||
f_day = datetime.strptime(self.date_from, "%Y-%m-%d").day |
|||
f_month = datetime.strptime(self.date_from, "%Y-%m-%d").month |
|||
f_year = datetime.strptime(self.date_from, "%Y-%m-%d").year |
|||
if t_year < f_year: |
|||
self.date_from = None |
|||
self.date_to = None |
|||
return { |
|||
'warning': { |
|||
'title': _('Warning!'), |
|||
'message': _('Please check the date'), |
|||
} |
|||
} |
|||
elif t_year == f_year and t_month < f_month: |
|||
self.date_to = None |
|||
self.date_from = None |
|||
return { |
|||
'warning': { |
|||
'title': _('Warning!'), |
|||
'message': _('Please check the date'), |
|||
} |
|||
} |
|||
elif t_year == f_year and t_month == f_month and t_day < f_day: |
|||
self.date_to = None |
|||
self.date_from = None |
|||
return { |
|||
'warning': { |
|||
'title': _('Warning!'), |
|||
'message': _('Please check the date'), |
|||
} |
|||
} |
|||
self.duration = r.months if r.months > 0 else 1 |
|||
|
|||
def action_your_target(self): |
|||
tree_res = self.env['ir.model.data'].get_object_reference('sales_team_parent', 'sales_target_tree_view') |
|||
x = self.env['ir.model.data'].get_object_reference('sales_team_parent', 'action_crm_sales_target_act') |
|||
|
|||
tree_id = tree_res and tree_res[1] or False |
|||
form_res = self.env['ir.model.data'].get_object_reference('sales_team_parent', 'sales_target_form_view') |
|||
form_id = form_res and form_res[1] or False |
|||
|
|||
user_obj = self.env['res.users'] |
|||
|
|||
u_id = user_obj.browse([self._uid]) |
|||
obj_target = self.env['crm.target'].search([]) |
|||
|
|||
if u_id.has_group('sales_team.group_sale_salesman_all_leads') and u_id.has_group( |
|||
'sales_team.group_sale_salesman') and u_id.has_group('sales_team.group_sale_manager'): |
|||
obj_target_list = obj_target.ids |
|||
|
|||
else: |
|||
obj_target_list = [] |
|||
if obj_target: |
|||
for obj in obj_target.ids: |
|||
print obj |
|||
if self.env['crm.target'].browse([obj]).user_id.id == self._uid: |
|||
obj_target_list.append(obj) |
|||
|
|||
return { |
|||
'model': 'ir.actions.act_window', |
|||
'name': 'Target', |
|||
'type': 'ir.actions.act_window', |
|||
'view_type': 'form', |
|||
'view_mode': 'form,tree', |
|||
'res_model': 'crm.target', |
|||
'views': [(tree_id, 'tree'), (form_id, 'form')], |
|||
'domain': [('id', 'in', obj_target_list)], |
|||
'id': x[1], |
|||
} |
|||
|
|||
|
@ -0,0 +1,59 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Cybrosys Technologies(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
from odoo import models, fields, api |
|||
|
|||
|
|||
class CrmTeam(models.Model): |
|||
_inherit = 'crm.team' |
|||
|
|||
def get_currency(self): |
|||
return self.env.user.company_id.currency_id.id |
|||
|
|||
team_target = fields.Float(string='Team Target', compute="compute_team_target") |
|||
parent_team = fields.Many2one('crm.team', string='Parent Team', copy=False) |
|||
currency_id = fields.Many2one('res.currency', store=True, string='Currency', readonly=True, default=lambda self: self.get_currency()) |
|||
|
|||
@api.one |
|||
def compute_team_target(self): |
|||
total = 0 |
|||
childs = self.get_childs(self.id) |
|||
childs += self |
|||
for team in childs: |
|||
for member_id in team.member_ids: |
|||
target = team.env['crm.target'].search([('user_id', '=', member_id.id)]) |
|||
if target: |
|||
for t in target: |
|||
total += t.target_amount |
|||
|
|||
team.team_target = total |
|||
return |
|||
|
|||
def get_childs(self, team_id): |
|||
child_teams = self.search([('parent_team.id', '=', team_id)]) |
|||
if child_teams: |
|||
for team in child_teams: |
|||
child_teams += self.get_childs(team.id) |
|||
return child_teams |
|||
|
|||
|
|
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 26 KiB |
@ -0,0 +1,103 @@ |
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan">Parent Team</h2> |
|||
<h3 class="oe_slogan">..Parent Team and Targets..</h3> |
|||
<h4 class="oe_slogan">Cybrosys Technologies , www.cybrosys.com</h4> |
|||
<div> |
|||
<p class='oe_mt32' style="text-align: center;"> |
|||
This module by Cybrosys Technologies introduces the parent team - child team concept. We can also assign |
|||
targets to each salesperson. |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 style="color:#875A7B;">Features</h2> |
|||
<div class="oe_span6 text-justify oe_mt32"> |
|||
<p class="oe_mb32" style="margin-left:48px;"> |
|||
☛ Create parent team or child team for an existing sales team. |
|||
</p> |
|||
<p class="oe_mb32" style="margin-left:48px;"> |
|||
☛ Admin can assign targets to salesperson. |
|||
</p> |
|||
<p class="oe_mb32" style="margin-left:48px;"> |
|||
☛ View team target. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<h3 class="oe_slogan">Create parent team.</h3> |
|||
<div class="oe_demo oe_screenshot"> |
|||
<img src="parent-team.png"> |
|||
</div> |
|||
<p class="oe_mt32" style="margin-left:48px;"> |
|||
Go to Sales -> Configuration -> Sales Team. Select a team and assign a parent for that team. The parent-child relation |
|||
between sales teams will be useful in many situations. For example, the leader of parent team has power over it's child teams. |
|||
The parent team leader will be able to access his child team's targets. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<h3 class="oe_slogan">Assign target to salesperson.</h3> |
|||
<div class="oe_demo oe_screenshot"> |
|||
<img src="salesman-target.png"> |
|||
</div> |
|||
<p class="oe_mt32" style="margin-left:48px;"> |
|||
Go to Sales -> Configuration -> Salesman Target and assign targets to salesperson. Only administrator can |
|||
assign targets. Salesperson can view his targets only. |
|||
Head of sale can view all the targets of his team members and admin can see all the targets. </p> |
|||
<p class="oe_mt32" style="margin-left:48px;"> |
|||
We can assign time duration for each target. When we enter the starting date and ending date of a target, |
|||
if it is not valid, the system will take care of it and informs us. The targets will always be in company currency. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<h3 class="oe_slogan">Team target.</h3> |
|||
<div class="oe_demo oe_screenshot"> |
|||
<img src="team-target.png"> |
|||
</div> |
|||
<p class="oe_mt32" style="margin-left:48px;"> |
|||
The total team target will be the sum of targets of it's members and it's child teams. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark" style="padding-top: 153px;"> |
|||
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
|||
<div class="oe_slogan" style="margin-top:10px !important;"> |
|||
<div> |
|||
<a class="btn btn-primary btn-lg mt8" |
|||
style="color: #FFFFFF !important;border-radius: 0;" href="http://www.cybrosys.com"><i |
|||
class="fa fa-envelope"></i> Email </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="http://www.cybrosys.com/contact/"><i |
|||
class="fa fa-phone"></i> Contact Us </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="http://www.cybrosys.com/odoo-customization-and-installation/"><i |
|||
class="fa fa-check-square"></i> Request Customization </a> |
|||
</div> |
|||
<br> |
|||
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
|||
<div> |
|||
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;"></i></a></td> |
|||
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;"></i></a></td> |
|||
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px;padding-left: 8px;"></i></a></td> |
|||
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;"></i></a></td> |
|||
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;"></i></a></td> |
|||
</div> |
|||
</div> |
|||
</section> |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 83 KiB |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record model="ir.ui.view" id="sales_team_form_view_extended"> |
|||
<field name="name">crm.team.form</field> |
|||
<field name="model">crm.team</field> |
|||
<field name="inherit_id" ref="sales_team.crm_team_view_form"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//group[1]/group[2]" position="inside"> |
|||
<field name="parent_team"/> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
|
|||
</data> |
|||
</odoo> |
@ -0,0 +1,76 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record model="ir.ui.view" id="sales_target_form_view"> |
|||
<field name="name">crm.target.form</field> |
|||
<field name="model">crm.target</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Targets"> |
|||
<sheet> |
|||
<div class="oe_title"> |
|||
<label for="name" string="Name" /> |
|||
<h1> |
|||
<field name="name"/> |
|||
</h1> |
|||
</div> |
|||
<group> |
|||
<group> |
|||
<field name="user_id"/> |
|||
<field name="sales_team"/> |
|||
</group> |
|||
<group> |
|||
<field name="date_from"/> |
|||
<field name="date_to"/> |
|||
<field name="duration" invisible="1"/> |
|||
<field name="currency_id" invisible="1"/> |
|||
</group> |
|||
</group> |
|||
<group> |
|||
<group> |
|||
<field name="target_amount" class="oe_inline" widget='monetary' options="{'currency_field': 'currency_id'}"/> |
|||
</group> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record model="ir.ui.view" id="sales_target_tree_view"> |
|||
<field name="name">crm.target.tree</field> |
|||
<field name="model">crm.target</field> |
|||
<field name="arch" type="xml"> |
|||
<tree> |
|||
<field name="name"/> |
|||
<field name="user_id"/> |
|||
<field name="sales_team"/> |
|||
<field name="target_amount" widget='monetary' options="{'currency_field': 'currency_id'}"/> |
|||
<field name="date_from"/> |
|||
<field name="date_to"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
|
|||
<record id="action_crm_sales_target_act" model="ir.actions.act_window"> |
|||
<field name="name">Target</field> |
|||
<field name="res_model">crm.target</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">tree,form</field> |
|||
|
|||
</record> |
|||
|
|||
<record id="action_crm_sales_target" model="ir.actions.server"> |
|||
<field name="name">Targets</field> |
|||
<field name="type">ir.actions.server</field> |
|||
<field name="res_model">crm.target</field> |
|||
<field name="model_id" ref="model_crm_target"/> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="state">code</field> |
|||
<field name="code">action = model.action_your_target()</field> |
|||
</record> |
|||
|
|||
<menuitem name="Target" id="main_menu_target" parent="sales_team.menu_base_partner" sequence="101" /> |
|||
<menuitem name="Salesman Target" id="menu_crm_target" parent="main_menu_target" action="action_crm_sales_target"/> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record model="ir.ui.view" id="sales_team_target_form_view"> |
|||
<field name="name">crm.team.target.form</field> |
|||
<field name="model">crm.team</field> |
|||
<field name="inherit_id" ref="sales_team.crm_team_view_form"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//group[1]/group[2]" position="inside"> |
|||
<field name="currency_id" invisible="1"/> |
|||
<field name="team_target" widget='monetary' options="{'currency_field': 'currency_id'}"/> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
Loading…
Reference in new issue