odoo-addon-sale-commission-product-criteria-domain 16.0.1.0.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. odoo/addons/sale_commission_product_criteria_domain/README.rst +124 -0
  2. odoo/addons/sale_commission_product_criteria_domain/__init__.py +1 -0
  3. odoo/addons/sale_commission_product_criteria_domain/__manifest__.py +26 -0
  4. odoo/addons/sale_commission_product_criteria_domain/demo/demo_data.xml +137 -0
  5. odoo/addons/sale_commission_product_criteria_domain/i18n/it.po +272 -0
  6. odoo/addons/sale_commission_product_criteria_domain/i18n/sale_commission_product_criteria_domain.pot +246 -0
  7. odoo/addons/sale_commission_product_criteria_domain/models/__init__.py +6 -0
  8. odoo/addons/sale_commission_product_criteria_domain/models/account_invoice_line_agent.py +30 -0
  9. odoo/addons/sale_commission_product_criteria_domain/models/commission.py +90 -0
  10. odoo/addons/sale_commission_product_criteria_domain/models/commission_group.py +72 -0
  11. odoo/addons/sale_commission_product_criteria_domain/models/partner.py +75 -0
  12. odoo/addons/sale_commission_product_criteria_domain/models/sale_commission_line_mixin.py +66 -0
  13. odoo/addons/sale_commission_product_criteria_domain/models/sale_order_line_agent.py +29 -0
  14. odoo/addons/sale_commission_product_criteria_domain/readme/CONTRIBUTORS.rst +6 -0
  15. odoo/addons/sale_commission_product_criteria_domain/readme/DESCRIPTION.rst +9 -0
  16. odoo/addons/sale_commission_product_criteria_domain/readme/USAGE.rst +22 -0
  17. odoo/addons/sale_commission_product_criteria_domain/security/ir.model.access.csv +5 -0
  18. odoo/addons/sale_commission_product_criteria_domain/static/description/icon.png +0 -0
  19. odoo/addons/sale_commission_product_criteria_domain/static/description/index.html +453 -0
  20. odoo/addons/sale_commission_product_criteria_domain/tests/__init__.py +1 -0
  21. odoo/addons/sale_commission_product_criteria_domain/tests/test_sale_commission_product_criteria_domain.py +334 -0
  22. odoo/addons/sale_commission_product_criteria_domain/views/views.xml +222 -0
  23. odoo_addon_sale_commission_product_criteria_domain-16.0.1.0.0.3.dist-info/METADATA +143 -0
  24. odoo_addon_sale_commission_product_criteria_domain-16.0.1.0.0.3.dist-info/RECORD +26 -0
  25. odoo_addon_sale_commission_product_criteria_domain-16.0.1.0.0.3.dist-info/WHEEL +5 -0
  26. odoo_addon_sale_commission_product_criteria_domain-16.0.1.0.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,246 @@
1
+ # Translation of Odoo Server.
2
+ # This file contains the translation of the following modules:
3
+ # * sale_commission_product_criteria_domain
4
+ #
5
+ msgid ""
6
+ msgstr ""
7
+ "Project-Id-Version: Odoo Server 16.0\n"
8
+ "Report-Msgid-Bugs-To: \n"
9
+ "Last-Translator: \n"
10
+ "Language-Team: \n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: \n"
14
+ "Plural-Forms: \n"
15
+
16
+ #. module: sale_commission_product_criteria_domain
17
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__agent_id
18
+ msgid "Agent"
19
+ msgstr ""
20
+
21
+ #. module: sale_commission_product_criteria_domain
22
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__agent_group_ids
23
+ msgid "Agent Group"
24
+ msgstr ""
25
+
26
+ #. module: sale_commission_product_criteria_domain
27
+ #: model:ir.model,name:sale_commission_product_criteria_domain.model_account_invoice_line_agent
28
+ msgid "Agent detail of commission line in invoice lines"
29
+ msgstr ""
30
+
31
+ #. module: sale_commission_product_criteria_domain
32
+ #: model:ir.model,name:sale_commission_product_criteria_domain.model_sale_order_line_agent
33
+ msgid "Agent detail of commission line in order lines"
34
+ msgstr ""
35
+
36
+ #. module: sale_commission_product_criteria_domain
37
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__partner_agent_ids
38
+ #: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria_domain.commission_items_group_form
39
+ msgid "Agents"
40
+ msgstr ""
41
+
42
+ #. module: sale_commission_product_criteria_domain
43
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__agents_count
44
+ msgid "Agents Count"
45
+ msgstr ""
46
+
47
+ #. module: sale_commission_product_criteria_domain
48
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_partner__allowed_commission_group_ids
49
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_users__allowed_commission_group_ids
50
+ msgid "Allowed Commission Group"
51
+ msgstr ""
52
+
53
+ #. module: sale_commission_product_criteria_domain
54
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_partner__allowed_commission_group_ids_domain
55
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_users__allowed_commission_group_ids_domain
56
+ msgid "Allowed Commission Group Ids Domain"
57
+ msgstr ""
58
+
59
+ #. module: sale_commission_product_criteria_domain
60
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_partner__apply_commission_restrictions
61
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_users__apply_commission_restrictions
62
+ msgid "Apply Restrictions"
63
+ msgstr ""
64
+
65
+ #. module: sale_commission_product_criteria_domain
66
+ #. odoo-python
67
+ #: code:addons/sale_commission_product_criteria_domain/models/commission.py:0
68
+ #, python-format
69
+ msgid "At least one group for each restriction must be selected."
70
+ msgstr ""
71
+
72
+ #. module: sale_commission_product_criteria_domain
73
+ #: model:ir.model,name:sale_commission_product_criteria_domain.model_commission
74
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item__commission_id
75
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__commission_ids
76
+ msgid "Commission"
77
+ msgstr ""
78
+
79
+ #. module: sale_commission_product_criteria_domain
80
+ #. odoo-python
81
+ #: code:addons/sale_commission_product_criteria_domain/models/commission_group.py:0
82
+ #, python-format
83
+ msgid "Commission Group Agents"
84
+ msgstr ""
85
+
86
+ #. module: sale_commission_product_criteria_domain
87
+ #: model:ir.model,name:sale_commission_product_criteria_domain.model_commission_item
88
+ msgid "Commission Item"
89
+ msgstr ""
90
+
91
+ #. module: sale_commission_product_criteria_domain
92
+ #: model:ir.model,name:sale_commission_product_criteria_domain.model_commission_item_agent
93
+ msgid "Commission Item Agent"
94
+ msgstr ""
95
+
96
+ #. module: sale_commission_product_criteria_domain
97
+ #: model:ir.model,name:sale_commission_product_criteria_domain.model_commission_items_group
98
+ msgid "Commission Items Group"
99
+ msgstr ""
100
+
101
+ #. module: sale_commission_product_criteria_domain
102
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_partner__commission_item_agent_ids
103
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_users__commission_item_agent_ids
104
+ msgid "Commission Items Groups"
105
+ msgstr ""
106
+
107
+ #. module: sale_commission_product_criteria_domain
108
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__group_ids
109
+ msgid "Commission Items Groups Restrictions"
110
+ msgstr ""
111
+
112
+ #. module: sale_commission_product_criteria_domain
113
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_partner__commission_type
114
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_res_users__commission_type
115
+ msgid "Commission Type"
116
+ msgstr ""
117
+
118
+ #. module: sale_commission_product_criteria_domain
119
+ #: model:ir.actions.act_window,name:sale_commission_product_criteria_domain.commission_items_group_tree_action
120
+ #: model:ir.ui.menu,name:sale_commission_product_criteria_domain.menu_commission_items_group
121
+ msgid "Commission Type Items Groups"
122
+ msgstr ""
123
+
124
+ #. module: sale_commission_product_criteria_domain
125
+ #: model:ir.model.constraint,message:sale_commission_product_criteria_domain.constraint_commission_items_group_unique_cig_name
126
+ msgid ""
127
+ "Commission items group with such name already exists. Name must be unique."
128
+ msgstr ""
129
+
130
+ #. module: sale_commission_product_criteria_domain
131
+ #: model:ir.model,name:sale_commission_product_criteria_domain.model_res_partner
132
+ msgid "Contact"
133
+ msgstr ""
134
+
135
+ #. module: sale_commission_product_criteria_domain
136
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__create_uid
137
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__create_uid
138
+ msgid "Created by"
139
+ msgstr ""
140
+
141
+ #. module: sale_commission_product_criteria_domain
142
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__create_date
143
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__create_date
144
+ msgid "Created on"
145
+ msgstr ""
146
+
147
+ #. module: sale_commission_product_criteria_domain
148
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__display_name
149
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__display_name
150
+ msgid "Display Name"
151
+ msgstr ""
152
+
153
+ #. module: sale_commission_product_criteria_domain
154
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item__group_id
155
+ msgid "Group"
156
+ msgstr ""
157
+
158
+ #. module: sale_commission_product_criteria_domain
159
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__id
160
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__id
161
+ msgid "ID"
162
+ msgstr ""
163
+
164
+ #. module: sale_commission_product_criteria_domain
165
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__item_ids
166
+ msgid "Items"
167
+ msgstr ""
168
+
169
+ #. module: sale_commission_product_criteria_domain
170
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent____last_update
171
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group____last_update
172
+ msgid "Last Modified on"
173
+ msgstr ""
174
+
175
+ #. module: sale_commission_product_criteria_domain
176
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__write_uid
177
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__write_uid
178
+ msgid "Last Updated by"
179
+ msgstr ""
180
+
181
+ #. module: sale_commission_product_criteria_domain
182
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__write_date
183
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__write_date
184
+ msgid "Last Updated on"
185
+ msgstr ""
186
+
187
+ #. module: sale_commission_product_criteria_domain
188
+ #: model:ir.model,name:sale_commission_product_criteria_domain.model_commission_line_mixin
189
+ msgid ""
190
+ "Mixin model for having commission agent lines in any object inheriting from "
191
+ "this one"
192
+ msgstr ""
193
+
194
+ #. module: sale_commission_product_criteria_domain
195
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_items_group__name
196
+ msgid "Name"
197
+ msgstr ""
198
+
199
+ #. module: sale_commission_product_criteria_domain
200
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item_agent__partner_id
201
+ msgid "Partner"
202
+ msgstr ""
203
+
204
+ #. module: sale_commission_product_criteria_domain
205
+ #: model:ir.model.fields.selection,name:sale_commission_product_criteria_domain.selection__commission__commission_type__product_restricted
206
+ msgid "Product criteria (with restrictions)"
207
+ msgstr ""
208
+
209
+ #. module: sale_commission_product_criteria_domain
210
+ #: model:ir.model.fields,help:sale_commission_product_criteria_domain.field_res_partner__allowed_commission_group_ids
211
+ #: model:ir.model.fields,help:sale_commission_product_criteria_domain.field_res_users__allowed_commission_group_ids
212
+ msgid "Related only to agents"
213
+ msgstr ""
214
+
215
+ #. module: sale_commission_product_criteria_domain
216
+ #: model:ir.model.fields,help:sale_commission_product_criteria_domain.field_commission__commission_type
217
+ #: model:ir.model.fields,help:sale_commission_product_criteria_domain.field_commission_item__sale_commission_type
218
+ #: model:ir.model.fields,help:sale_commission_product_criteria_domain.field_res_partner__commission_type
219
+ #: model:ir.model.fields,help:sale_commission_product_criteria_domain.field_res_users__commission_type
220
+ msgid ""
221
+ "Select the percentage type of the commission:\n"
222
+ "* 'Fixed percentage': all commissions are computed with a fixed percentage. You can fill the percentage in the field \"Fixed percentage\".\n"
223
+ "* 'By sections': percentage varies depending amount intervals. You can fill intervals and percentages in the section \"Rate definition\"."
224
+ msgstr ""
225
+
226
+ #. module: sale_commission_product_criteria_domain
227
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission__commission_type
228
+ #: model:ir.model.fields,field_description:sale_commission_product_criteria_domain.field_commission_item__sale_commission_type
229
+ msgid "Type"
230
+ msgstr ""
231
+
232
+ #. module: sale_commission_product_criteria_domain
233
+ #. odoo-python
234
+ #: code:addons/sale_commission_product_criteria_domain/models/commission_group.py:0
235
+ #, python-format
236
+ msgid ""
237
+ "You can not delete this commission group since there is related to it "
238
+ "commission items."
239
+ msgstr ""
240
+
241
+ #. module: sale_commission_product_criteria_domain
242
+ #: model:ir.model.constraint,message:sale_commission_product_criteria_domain.constraint_commission_item_agent_commission_item_unique_agent
243
+ msgid ""
244
+ "You can only add one time each agent into Commission Items Groups "
245
+ "Restrictions table."
246
+ msgstr ""
@@ -0,0 +1,6 @@
1
+ from . import commission
2
+ from . import commission_group
3
+ from . import partner
4
+ from . import account_invoice_line_agent
5
+ from . import sale_order_line_agent
6
+ from . import sale_commission_line_mixin
@@ -0,0 +1,30 @@
1
+ # © 2023 ooops404
2
+ # License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
3
+ from odoo import api, models
4
+
5
+
6
+ class AccountInvoiceLineAgent(models.Model):
7
+ _inherit = "account.invoice.line.agent"
8
+
9
+ @api.depends(
10
+ "object_id.price_subtotal",
11
+ "object_id.product_id.commission_free",
12
+ "commission_id",
13
+ )
14
+ def _compute_amount(self):
15
+ res = None
16
+ for line in self:
17
+ if (
18
+ line.commission_id
19
+ and line.commission_id.commission_type == "product_restricted"
20
+ ):
21
+ inv_line = line.object_id
22
+ line.amount = line._get_single_commission_amount(
23
+ line.commission_id,
24
+ inv_line.price_subtotal,
25
+ inv_line.product_id,
26
+ inv_line.quantity,
27
+ )
28
+ else:
29
+ res = super(AccountInvoiceLineAgent, line)._compute_amount()
30
+ return res
@@ -0,0 +1,90 @@
1
+ # © 2023 ooops404
2
+ # Copyright 2023 Simone Rubino - Aion Tech
3
+ # License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
4
+ from odoo import _, api, exceptions, fields, models
5
+
6
+
7
+ class SaleCommission(models.Model):
8
+ _inherit = "commission"
9
+
10
+ commission_type = fields.Selection(
11
+ selection_add=[("product_restricted", "Product criteria (with restrictions)")],
12
+ ondelete={"product_restricted": "set default"},
13
+ )
14
+
15
+
16
+ class CommissionItem(models.Model):
17
+ _inherit = "commission.item"
18
+
19
+ commission_id = fields.Many2one(
20
+ "commission",
21
+ string="Commission",
22
+ domain=[("commission_type", "in", ["product", "product_restricted"])],
23
+ required=True,
24
+ )
25
+ sale_commission_type = fields.Selection(
26
+ related="commission_id.commission_type", readonly=True
27
+ )
28
+ group_id = fields.Many2one(
29
+ "commission.items.group",
30
+ ondelete="restrict",
31
+ )
32
+
33
+ def write(self, values):
34
+ res = super().write(values)
35
+ if self.group_id and not self.group_id.commission_ids.ids:
36
+ self.group_id.commission_ids = [(6, 0, self.commission_id.ids)]
37
+ if self.commission_id.commission_type != "product_restricted" and self.group_id:
38
+ self.group_id = False
39
+ return res
40
+
41
+
42
+ class CommissionItemAgent(models.Model):
43
+ _name = "commission.item.agent"
44
+ _description = "Commission Item Agent"
45
+
46
+ _sql_constraints = [
47
+ (
48
+ "commission_item_unique_agent",
49
+ "UNIQUE(partner_id, agent_id)",
50
+ "You can only add one time each agent into Commission "
51
+ "Items Groups Restrictions table.",
52
+ )
53
+ ]
54
+
55
+ partner_agent_ids = fields.Many2many(related="partner_id.agent_ids")
56
+ agent_group_ids = fields.Many2many(
57
+ "commission.items.group", compute="_compute_agent_group_ids"
58
+ )
59
+ agent_id = fields.Many2one(
60
+ "res.partner", domain='[("id", "in", partner_agent_ids)]', required=True
61
+ )
62
+ partner_id = fields.Many2one(
63
+ "res.partner", domain=[("agent", "=", False)], required=True
64
+ )
65
+ group_ids = fields.Many2many(
66
+ "commission.items.group",
67
+ domain="[('id', 'in', agent_group_ids)]",
68
+ string="Commission Items Groups Restrictions",
69
+ required=True,
70
+ )
71
+
72
+ @api.depends("agent_id")
73
+ def _compute_agent_group_ids(self):
74
+ for rec in self:
75
+ if rec.agent_id.allowed_commission_group_ids:
76
+ dom = ("group_id", "in", rec.agent_id.allowed_commission_group_ids.ids)
77
+ else:
78
+ dom = ("group_id", "!=", False)
79
+ items = self.env["commission.item"].search(
80
+ [("commission_id", "=", rec.agent_id.commission_id.id), dom]
81
+ )
82
+ rec.agent_group_ids = [(6, 0, items.mapped("group_id").ids)]
83
+
84
+ @api.constrains("group_ids", "agent_id", "partner_id")
85
+ def _constraint_commission_item_agent_ids(self):
86
+ for cia in self:
87
+ if not cia.group_ids:
88
+ raise exceptions.ValidationError(
89
+ _("At least one group for each restriction must be selected.")
90
+ )
@@ -0,0 +1,72 @@
1
+ # © 2023 ooops404
2
+ # Copyright 2023 Simone Rubino - Aion Tech
3
+ # License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
4
+ from odoo import _, api, exceptions, fields, models
5
+
6
+
7
+ class CommissionItemsGroup(models.Model):
8
+ _name = "commission.items.group"
9
+ _description = "Commission Items Group"
10
+ _sql_constraints = [
11
+ (
12
+ "unique_cig_name",
13
+ "UNIQUE(name)",
14
+ "Commission items group with such name already exists. "
15
+ "Name must be unique.",
16
+ )
17
+ ]
18
+
19
+ name = fields.Char(required=True)
20
+ commission_ids = fields.Many2many(
21
+ "commission",
22
+ compute="_compute_commission_ids",
23
+ domain=[("commission_type", "=", "product_restricted")],
24
+ readonly=True,
25
+ store=True,
26
+ )
27
+ item_ids = fields.One2many(
28
+ "commission.item", "group_id", string="Items", readonly=True
29
+ )
30
+ agents_count = fields.Integer(compute="_compute_agents_count")
31
+
32
+ @api.depends("item_ids")
33
+ def _compute_commission_ids(self):
34
+ for rec in self:
35
+ rec.commission_ids = [(6, 0, rec.item_ids.mapped("commission_id").ids)]
36
+
37
+ @api.ondelete(at_uninstall=False)
38
+ def _unlink_except_item_ids(self):
39
+ for group in self:
40
+ if group.item_ids:
41
+ raise exceptions.ValidationError(
42
+ _(
43
+ "You can not delete this commission group since "
44
+ "there is related to it commission items."
45
+ )
46
+ )
47
+
48
+ def _compute_agents_count(self):
49
+ res_partner_obj = self.env["res.partner"]
50
+ for rec in self:
51
+ rec.agents_count = res_partner_obj.search_count(
52
+ [
53
+ ("agent", "=", True),
54
+ ("allowed_commission_group_ids", "in", rec.ids),
55
+ ]
56
+ )
57
+
58
+ def action_open_related_agents(self):
59
+ agent_ids = self.env["res.partner"].search(
60
+ [
61
+ ("agent", "=", True),
62
+ ("allowed_commission_group_ids", "in", self.ids),
63
+ ]
64
+ )
65
+ return {
66
+ "name": _("Commission Group Agents"),
67
+ "type": "ir.actions.act_window",
68
+ "view_mode": "tree",
69
+ "res_model": "res.partner",
70
+ "context": self.env.context,
71
+ "domain": [("id", "in", agent_ids.ids)],
72
+ }
@@ -0,0 +1,75 @@
1
+ # © 2023 ooops404
2
+ # Copyright 2023 Simone Rubino - Aion Tech
3
+ # License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
4
+
5
+ from odoo import api, fields, models
6
+
7
+
8
+ class ResPartner(models.Model):
9
+ _inherit = "res.partner"
10
+
11
+ apply_commission_restrictions = fields.Boolean("Apply Restrictions")
12
+ commission_item_agent_ids = fields.One2many(
13
+ "commission.item.agent", "partner_id", string="Commission Items Groups"
14
+ )
15
+ allowed_commission_group_ids = fields.Many2many(
16
+ "commission.items.group", help="Related only to agents"
17
+ )
18
+ allowed_commission_group_ids_domain = fields.Binary(
19
+ compute="_compute_allowed_commission_group_ids_domain",
20
+ readonly=True,
21
+ store=False,
22
+ )
23
+ commission_type = fields.Selection(
24
+ string="Commission Type",
25
+ related="commission_id.commission_type",
26
+ )
27
+
28
+ @api.depends("commission_id")
29
+ def _compute_allowed_commission_group_ids_domain(self):
30
+ for rec in self:
31
+ if rec.agent:
32
+ allowed_group_ids = rec.commission_id.filtered(
33
+ lambda x: x.commission_type == "product_restricted"
34
+ ).item_ids.mapped("group_id")
35
+ rec.allowed_commission_group_ids_domain = [
36
+ ("id", "in", allowed_group_ids.ids),
37
+ ]
38
+ else:
39
+ rec.allowed_commission_group_ids_domain = False
40
+
41
+ @api.onchange("agent_ids")
42
+ def _onchange_agent_ids(self):
43
+ for rec in self:
44
+ exiting_agents = rec.commission_item_agent_ids.mapped("agent_id")
45
+ to_create = [
46
+ {
47
+ "agent_id": x.id,
48
+ "group_ids": [(6, 0, x.allowed_commission_group_ids.ids)],
49
+ }
50
+ for x in rec.agent_ids.filtered(
51
+ lambda x: x.commission_id.commission_type == "product_restricted"
52
+ )
53
+ if x not in exiting_agents
54
+ ]
55
+ to_delete = rec.commission_item_agent_ids.filtered(
56
+ lambda x: x.agent_id in (exiting_agents - rec.agent_ids)
57
+ )
58
+ if to_delete:
59
+ rec.update(
60
+ {"commission_item_agent_ids": [(2, dl.id, 0) for dl in to_delete]}
61
+ )
62
+ if to_create:
63
+ rec.update(
64
+ {"commission_item_agent_ids": [(0, 0, line) for line in to_create]}
65
+ )
66
+
67
+ def write(self, vals):
68
+ res = super().write(vals)
69
+ for partner in self:
70
+ if (
71
+ partner.commission_id.commission_type != "product_restricted"
72
+ and partner.allowed_commission_group_ids
73
+ ):
74
+ partner.allowed_commission_group_ids = False
75
+ return res
@@ -0,0 +1,66 @@
1
+ # © 2023 ooops404
2
+ # Copyright 2023 Simone Rubino - Aion Tech
3
+ # License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
4
+ from odoo import models
5
+
6
+
7
+ class SaleCommissionLineMixin(models.AbstractModel):
8
+ _inherit = "commission.line.mixin"
9
+
10
+ def _get_commission_items(self, commission, product):
11
+ # Method replaced
12
+ categ_ids = {}
13
+ categ = product.categ_id
14
+ while categ:
15
+ categ_ids[categ.id] = True
16
+ categ = categ.parent_id
17
+ categ_ids = list(categ_ids)
18
+
19
+ # Module specific mod:
20
+ if self.object_id._name == "sale.order.line":
21
+ partner = self.object_id.order_id.partner_id
22
+ elif self.object_id._name == "account.move.line":
23
+ partner = self.object_id.partner_id
24
+ else:
25
+ partner = False
26
+ if partner:
27
+ group_ids = (
28
+ partner.commission_item_agent_ids.filtered(
29
+ lambda x: x.agent_id == self.agent_id
30
+ )
31
+ .mapped("group_ids")
32
+ .ids
33
+ )
34
+ else:
35
+ group_ids = []
36
+
37
+ # Select all suitable items. Order by best match
38
+ # (priority is: all/cat/subcat/product/variant).
39
+ self.env.cr.execute(
40
+ """
41
+ SELECT
42
+ item.id
43
+ FROM
44
+ commission_item AS item
45
+ LEFT JOIN product_category AS categ ON item.categ_id = categ.id
46
+ LEFT JOIN commission_item_agent AS cia ON item.group_id = cia.id
47
+ WHERE
48
+ (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%s))
49
+ AND (item.product_id IS NULL OR item.product_id = any(%s))
50
+ AND (item.categ_id IS NULL OR item.categ_id = any(%s))
51
+ AND (item.commission_id = %s)
52
+ AND (item.active = TRUE)
53
+ AND (cia.id IS NULL OR cia.id = any(%s))
54
+ ORDER BY
55
+ item.applied_on, item.based_on, categ.complete_name desc
56
+ """,
57
+ (
58
+ product.product_tmpl_id.ids,
59
+ product.ids,
60
+ categ_ids,
61
+ commission._origin.id,
62
+ group_ids,
63
+ ),
64
+ )
65
+ item_ids = [x[0] for x in self.env.cr.fetchall()]
66
+ return item_ids
@@ -0,0 +1,29 @@
1
+ # © 2023 ooops404
2
+ # Copyright 2023 Simone Rubino - Aion Tech
3
+ # License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
4
+ from odoo import api, models
5
+
6
+
7
+ class SaleOrderLineAgent(models.Model):
8
+ _inherit = "sale.order.line.agent"
9
+
10
+ @api.depends(
11
+ "object_id.price_subtotal", "object_id.product_id", "object_id.product_uom_qty"
12
+ )
13
+ def _compute_amount(self):
14
+ res = None
15
+ for line in self:
16
+ if (
17
+ line.commission_id
18
+ and line.commission_id.commission_type == "product_restricted"
19
+ ):
20
+ order_line = line.object_id
21
+ line.amount = line._get_single_commission_amount(
22
+ line.commission_id,
23
+ order_line.price_subtotal,
24
+ order_line.product_id,
25
+ order_line.product_uom_qty,
26
+ )
27
+ else:
28
+ res = super(SaleOrderLineAgent, line)._compute_amount()
29
+ return res
@@ -0,0 +1,6 @@
1
+ * `Ooops404 <https://www.ooops404.com>`__:
2
+
3
+ * Ilyas <irazor147@gmail.com>
4
+ * `Aion Tech <https://aiontech.company/>`_:
5
+
6
+ * Simone Rubino <simone.rubino@aion-tech.it>
@@ -0,0 +1,9 @@
1
+ This module allows to limit applied commission items for specific groups.
2
+
3
+ This module allows to manage the following commission structure use case:
4
+
5
+ Agent A receives commission 50 when selling product 1 to customer X
6
+
7
+ Agent A receives commission 20 when selling product 1 to customer Y
8
+
9
+ This implementation is based on pricelist-like Commission Type structure provided by sale_commission_product_criteria.
@@ -0,0 +1,22 @@
1
+ Go to Commissions > Configuration > Commission Type Items Groups
2
+
3
+ Create one or more new Groups, eg. “Italy” and “Spain”
4
+
5
+ Create new Commission type, select type “Product Criteria (with restrictions)”, eg: “Southern Europe”
6
+
7
+ Add lines to Commission type; for each line one Group must be set, eg.
8
+
9
+ Product: Conference Chair, value: $20, group: Italy
10
+
11
+ Product: Conference Chair, value: $10, group: Spain
12
+
13
+
14
+ Go to Agent A, assign Commission type: “Southern Europe” > add “Allowed Commission Groups”: “Italy”, “Spain”
15
+
16
+ In this way, we are allowing Commission type lines for both “Spain” and “Italy” to be applied to this agent.
17
+
18
+ Go to customer X, set agent: “Agent A” > in table “Commission items group” set group “Spain”
19
+
20
+ Go to customer Y, set agent: “Agent A” > in table “Commission items group” set group “Italy”
21
+
22
+ On sales for customer X, only Commission type lines with group “Spain” will be applied to agent; on sales for customer Y, only Commission type lines with group “Italy” will be applied to agent.
@@ -0,0 +1,5 @@
1
+ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2
+ cia1,cia1,model_commission_item_agent,sales_team.group_sale_manager,1,1,1,1
3
+ cia2,cia2,model_commission_item_agent,sales_team.group_sale_salesman,1,1,0,0
4
+ cig1,cig1,model_commission_items_group,sales_team.group_sale_manager,1,1,1,1
5
+ cig2,cig2,model_commission_items_group,sales_team.group_sale_salesman,1,1,0,0