Skip to content

Commit

Permalink
[IMP] sale_commission_geo_assign
Browse files Browse the repository at this point in the history
  • Loading branch information
renda-dev committed Sep 15, 2023
1 parent 4b992c3 commit 9c4cdee
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 35 deletions.
13 changes: 11 additions & 2 deletions sale_commission_geo_assign/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Sales commissions - Geo assignation
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e5b8d9c524a1a7e7c6d2340c01f7feb4eb4499037913921c2bca92e811ac530c
!! source digest: sha256:f45933bbd9dad42cec6b6d120eb1bbff2466ebef2edf1380880f08439824c2ce
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
Expand All @@ -32,6 +32,8 @@ Configure sales agents assigning them to a specific geographical area.

Then, automatically assign agents to customers, according to their geographical area.

A "Do not allow update with Geo Assign" setting can be activated in partner to prevent server action from editing set agents.

**Table of contents**

.. contents::
Expand All @@ -55,7 +57,13 @@ Sales > Customers

Select the customers you want to assign agents to and click

Action > Geo assign agents
Action > Add agents with geo assign

- Activating flag "Replace existing agents" will remove agents set in partner and replace them according to geographic criteria.

- Activating flag "Do not add new agents if agents are already assigned" will prevent assignation if agents are already set in partner.

- Deactivating both flags will simply add agents to existing ones in partner according to geographic criteria.

Bug Tracker
===========
Expand All @@ -79,6 +87,7 @@ Contributors
~~~~~~~~~~~~

* iwkse <https://ooops404.com>
* PyTech SRL <[email protected]>

Maintainers
~~~~~~~~~~~
Expand Down
2 changes: 2 additions & 0 deletions sale_commission_geo_assign/models/res_partner.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ class Partner(models.Model):
agent_zip_from = fields.Char("Zip From", help="ZIP range where this agent operates")
agent_zip_to = fields.Char("Zip To", help="ZIP range where this agent operates")

no_geo_assign_update = fields.Boolean("Do not allow update with Geo Assign")

@api.onchange("agent_country_ids")
def onchange_countries(self):
if self.agent_country_ids:
Expand Down
1 change: 1 addition & 0 deletions sale_commission_geo_assign/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
* iwkse <https://ooops404.com>
* PyTech SRL <[email protected]>
2 changes: 2 additions & 0 deletions sale_commission_geo_assign/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Configure sales agents assigning them to a specific geographical area.

Then, automatically assign agents to customers, according to their geographical area.

A "Do not allow update with Geo Assign" setting can be activated in partner to prevent server action from editing set agents.
8 changes: 7 additions & 1 deletion sale_commission_geo_assign/readme/USAGE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,10 @@ Sales > Customers

Select the customers you want to assign agents to and click

Action > Geo assign agents
Action > Add agents with geo assign

- Activating flag "Replace existing agents" will remove agents set in partner and replace them according to geographic criteria.

- Activating flag "Do not add new agents if agents are already assigned" will prevent assignation if agents are already set in partner.

- Deactivating both flags will simply add agents to existing ones in partner according to geographic criteria.
11 changes: 9 additions & 2 deletions sale_commission_geo_assign/static/description/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -367,11 +367,12 @@ <h1 class="title">Sales commissions - Geo assignation</h1>
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e5b8d9c524a1a7e7c6d2340c01f7feb4eb4499037913921c2bca92e811ac530c
!! source digest: sha256:f45933bbd9dad42cec6b6d120eb1bbff2466ebef2edf1380880f08439824c2ce
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Production/Stable" src="https://img.shields.io/badge/maturity-Production%2FStable-green.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/commission/tree/14.0/sale_commission_geo_assign"><img alt="OCA/commission" src="https://img.shields.io/badge/github-OCA%2Fcommission-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/commission-14-0/commission-14-0-sale_commission_geo_assign"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/commission&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>Configure sales agents assigning them to a specific geographical area.</p>
<p>Then, automatically assign agents to customers, according to their geographical area.</p>
<p>A “Do not allow update with Geo Assign” setting can be activated in partner to prevent server action from editing set agents.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
Expand All @@ -397,7 +398,12 @@ <h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>Go to</p>
<p>Sales &gt; Customers</p>
<p>Select the customers you want to assign agents to and click</p>
<p>Action &gt; Geo assign agents</p>
<p>Action &gt; Add agents with geo assign</p>
<ul class="simple">
<li>Activating flag “Replace existing agents” will remove agents set in partner and replace them according to geographic criteria.</li>
<li>Activating flag “Do not add new agents if agents are already assigned” will prevent assignation if agents are already set in partner.</li>
<li>Deactivating both flags will simply add agents to existing ones in partner according to geographic criteria.</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
Expand All @@ -419,6 +425,7 @@ <h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<ul class="simple">
<li>iwkse &lt;<a class="reference external" href="https://ooops404.com">https://ooops404.com</a>&gt;</li>
<li>PyTech SRL &lt;<a class="reference external" href="mailto:info&#64;pytech.it">info&#64;pytech.it</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
Expand Down
97 changes: 77 additions & 20 deletions sale_commission_geo_assign/tests/test_sale_commission_geo_assign.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,52 @@
import odoo.tests.common as common
from odoo.exceptions import UserError


class TestSaleCommissionGeoAssign(common.TransactionCase):
def setUp(self):
super(TestSaleCommissionGeoAssign, self).setUp()
self.partner_model = self.env["res.partner"]
self.wizard_model = self.env["wizard.geo.assign.partner"]
self.genova = self.env.ref("base.state_it_ge")
self.country_genova = self.env.ref("base.state_it_ge")

def test_geo_assign(self):
c1 = self.partner_model.create(
self.customer_1 = self.partner_model.create(
{
"name": "c1",
"name": "Customer 1",
"zip": "16137",
}
)
c2 = self.partner_model.create(
self.customer_2 = self.partner_model.create(
{
"name": "c2",
"state_id": self.genova.id,
"name": "Customer 2",
"state_id": self.country_genova.id,
}
)
agent1 = self.partner_model.create(
{"name": "agent1", "agent": True, "agent_state_ids": [(4, self.genova.id)]}

self.agent = self.partner_model.create(
{
"name": "Agent",
"agent": True,
"agent_state_ids": [(4, self.country_genova.id)],
}
)
wizard = self.wizard_model.with_context(active_ids=[c1.id, c2.id]).create({})

def test_geo_assign(self):
wizard = self.wizard_model.with_context(
active_ids=[self.customer_1.id, self.customer_2.id]
).create({})
wizard.geo_assign_partner()
self.assertTrue(len(c2.agent_ids) == 1)
self.assertTrue(agent1.id == c2.agent_ids[0].id)
self.assertFalse(c1.agent)
self.assertTrue(len(self.customer_2.agent_ids) == 1)
self.assertTrue(self.agent.id == self.customer_2.agent_ids[0].id)
self.assertFalse(self.customer_1.agent)

wizard = self.wizard_model.with_context(active_ids=[c1.id, c2.id]).create({})
wizard = self.wizard_model.with_context(
active_ids=[self.customer_1.id, self.customer_2.id]
).create({})
wizard.check_existing_agents = False
wizard.geo_assign_partner()
self.assertTrue(len(c2.agent_ids) == 1)
self.assertTrue(agent1.id == c2.agent_ids[0].id)
self.assertFalse(c1.agent)
self.assertTrue(len(self.customer_2.agent_ids) == 1)
self.assertTrue(self.agent.id == self.customer_2.agent_ids[0].id)
self.assertFalse(self.customer_1.agent)

agent2 = self.partner_model.create(
{
Expand All @@ -46,6 +57,52 @@ def test_geo_assign(self):
}
)
wizard.geo_assign_partner()
self.assertTrue(len(c2.agent_ids) == 1)
self.assertTrue(len(c1.agent_ids) == 1)
self.assertTrue(agent2.id == c1.agent_ids[0].id)
self.assertTrue(len(self.customer_2.agent_ids) == 1)
self.assertTrue(len(self.customer_1.agent_ids) == 1)
self.assertTrue(agent2.id == self.customer_1.agent_ids[0].id)

def test_geo_assign_overwrite(self):
new_agent = self.partner_model.create(
{
"name": "New Agent",
"agent": True,
}
)

self.customer_2.agent_ids = [(4, new_agent.id)]

wizard = self.wizard_model.with_context(active_ids=[self.customer_2.id]).create(
{}
)
wizard.replace_existing_agents = True
wizard._onchange_replace_existing_agents()
wizard.geo_assign_partner()
self.assertEqual(self.customer_2.agent_ids, self.agent)

def test_no_geo_assign_update(self):
self.customer_1.no_geo_assign_update = True
wizard = self.wizard_model.with_context(
active_ids=[self.customer_1.id, self.customer_2.id]
).create({})
with self.assertRaises(UserError):
wizard.geo_assign_partner()

def test_check_existing_agents(self):
new_agent = self.partner_model.create(
{
"name": "New Agent",
"agent": True,
}
)
self.customer_2.agent_ids = [(4, new_agent.id)]

wizard = self.wizard_model.with_context(
active_ids=[self.customer_1.id, self.customer_2.id]
).create({})
with self.assertRaises(UserError):
wizard.geo_assign_partner()
wizard.replace_existing_agents = True
wizard._onchange_replace_existing_agents()
wizard.geo_assign_partner()
self.assertNotIn(new_agent, self.customer_2.agent_ids)
self.assertEqual(self.customer_2.agent_ids, self.agent)
5 changes: 5 additions & 0 deletions sale_commission_geo_assign/views/res_partner_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
<field name="agent_zip_to" />
</group>
</xpath>
<page name="sales_purchases" position="inside">
<group>
<field name="no_geo_assign_update" />
</group>
</page>
</field>
</record>

Expand Down
37 changes: 31 additions & 6 deletions sale_commission_geo_assign/wizard/wizard_geo_assign_partner.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).

from odoo import _, fields, models
from odoo import _, api, fields, models
from odoo.exceptions import UserError


class WizardGeoAssign(models.TransientModel):
_name = "wizard.geo.assign.partner"
_description = "Wizard Geo Assign Partner"

check_existing_agents = fields.Boolean(
"Check existing agents",
string="Check Existing Agents",
help="If checked, partners with already assigned agents will be "
"blocked. Otherwise, found agents will be added",
default=True,
)
replace_existing_agents = fields.Boolean(string="Replace Existing Agents")

@api.onchange("replace_existing_agents")
def _onchange_replace_existing_agents(self):
self.check_existing_agents = not self.replace_existing_agents

def geo_assign_partner(self):
self.ensure_one()
Expand All @@ -22,14 +28,33 @@ def geo_assign_partner(self):
raise UserError(_("No agents found in the system"))
partners = partner_model.browse(self.env.context.get("active_ids"))
for partner in partners:
if partner.no_geo_assign_update:
raise UserError(
_("Partner %s is not allowed to be updated through geo assignation")
% partner.display_name
)
if len(partner.agent_ids) > 0 and self.check_existing_agents:
raise UserError(
_(
"Partner %s already has agents. You should remove them"
" or deselect 'Check existing agents'"
" or deselect 'Do not add new agents if agents are already assigned'"
)
% partner.display_name
)
for agent in agents:
if agent.is_assignable(partner):
partner.agent_ids = [(4, agent.id)]

assignable_agents = [
agent for agent in agents if agent.is_assignable(partner)
]
if self.replace_existing_agents and assignable_agents:
partner.write(
{
"agent_ids": [(5, 0, 0)],
}
)
for agent in assignable_agents:
self.update_partner_data(partner, agent)

@api.model
def update_partner_data(self, partner, agent):
if agent.is_assignable(partner):
partner.agent_ids = [(4, agent.id)]
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<odoo>
<!-- wizard action on res.partner -->
<record id="action_geo_assign_partner" model="ir.actions.act_window">
<field name="name">Geo assign agents</field>
<field name="name">Add Agents with Geo Assign</field>
<field name="res_model">wizard.geo.assign.partner</field>
<field name="view_mode">form</field>
<field name="target">new</field>
Expand All @@ -11,12 +11,18 @@

<!-- wizard view -->
<record id="wizard_geo_assign_partner_view" model="ir.ui.view">
<field name="name">Geo assign agents</field>
<field name="name">Add Agents with Geo Assign</field>
<field name="model">wizard.geo.assign.partner</field>
<field name="arch" type="xml">
<form string="Geo assign agents">
<form>
<group>
<field name="check_existing_agents" />
<field name="replace_existing_agents" />
<separator />
<field
name="check_existing_agents"
string="Do not add new agents if agents are already assigned"
attrs="{'invisible':[('replace_existing_agents', '=', True)]}"
/>
</group>
<footer>
<button
Expand Down

0 comments on commit 9c4cdee

Please sign in to comment.