Skip to content

Commit

Permalink
[IMP] sale_commission_geo_assign: improve geo assignment wizard
Browse files Browse the repository at this point in the history
  • Loading branch information
renda-dev authored and aleuffre committed Sep 18, 2023
1 parent 4b992c3 commit c989ff2
Show file tree
Hide file tree
Showing 10 changed files with 200 additions and 72 deletions.
19 changes: 16 additions & 3 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:3ac49498e2384e8c24d7c886e656c261d2f82485a67806cc42e0f1e7648a0681
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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 @@ -49,13 +51,23 @@ For every agent, you can set Countries, States or ZIP range
Usage
=====

Go to
Go to Sales > Agents > open a record: in tab "Agent information", set geographic criteria.

When using server action, this agent will be assigned to customers whose address match the set criteria.

To assign agents, go to:

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 +91,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.
14 changes: 12 additions & 2 deletions sale_commission_geo_assign/readme/USAGE.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
Go to
Go to Sales > Agents > open a record: in tab "Agent information", set geographic criteria.

When using server action, this agent will be assigned to customers whose address match the set criteria.

To assign agents, go to:

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.
55 changes: 32 additions & 23 deletions sale_commission_geo_assign/static/description/index.html
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
<title>Sales commissions - Geo assignation</title>
<style type="text/css">

/*
:Author: David Goodger ([email protected])
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.

See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

Expand Down Expand Up @@ -367,69 +367,78 @@ <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:3ac49498e2384e8c24d7c886e656c261d2f82485a67806cc42e0f1e7648a0681
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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><a class="reference external" 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" 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" 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" 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" 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">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>Go to</p>
<p>Sales &gt; Commissions Management &gt; Agents</p>
<p>For every agent, you can set Countries, States or ZIP range</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>Go to</p>
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>Go to Sales &gt; Agents &gt; open a record: in tab “Agent information”, set geographic criteria.</p>
<p>When using server action, this agent will be assigned to customers whose address match the set criteria.</p>
<p>To assign agents, 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>
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/commission/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/commission/issues/new?body=module:%20sale_commission_geo_assign%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>Agile Business Group</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<h2><a class="toc-backref" href="#id6">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">
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/eLBati"><img alt="eLBati" src="https://github.com/eLBati.png?size=40px" /></a></p>
<p><a class="reference external" href="https://github.com/eLBati"><img alt="eLBati" src="https://github.com/eLBati.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/commission/tree/14.0/sale_commission_geo_assign">OCA/commission</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
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)
31 changes: 17 additions & 14 deletions sale_commission_geo_assign/views/res_partner_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,26 @@
<field name="model">res.partner</field>
<field name="inherit_id" ref="sale_commission.view_partner_form_agent" />
<field name="arch" type="xml">
<xpath
expr="//page[@name='agent_information']/group[1]/group[2]"
position="after"
>
<newline />
<group>
<field name="agent_country_ids" widget="many2many_tags" />
<field name="agent_state_ids" widget="many2many_tags" />
</group>
<newline />
<group>
<field name="agent_zip_from" />
<xpath expr="//page[@name='agent_information']" position="inside">
<group name="agent_geo_assign" string="Geo-assign to customers">
<group>
<field name="agent_country_ids" widget="many2many_tags" />
<field name="agent_state_ids" widget="many2many_tags" />
</group>
<newline />
<group>
<field name="agent_zip_from" />
</group>
<group>
<field name="agent_zip_to" />
</group>
</group>
</xpath>
<page name="sales_purchases" position="inside">
<group>
<field name="agent_zip_to" />
<field name="no_geo_assign_update" />
</group>
</xpath>
</page>
</field>
</record>

Expand Down
Loading

0 comments on commit c989ff2

Please sign in to comment.