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.
- odoo/addons/sale_commission_product_criteria_domain/README.rst +124 -0
- odoo/addons/sale_commission_product_criteria_domain/__init__.py +1 -0
- odoo/addons/sale_commission_product_criteria_domain/__manifest__.py +26 -0
- odoo/addons/sale_commission_product_criteria_domain/demo/demo_data.xml +137 -0
- odoo/addons/sale_commission_product_criteria_domain/i18n/it.po +272 -0
- odoo/addons/sale_commission_product_criteria_domain/i18n/sale_commission_product_criteria_domain.pot +246 -0
- odoo/addons/sale_commission_product_criteria_domain/models/__init__.py +6 -0
- odoo/addons/sale_commission_product_criteria_domain/models/account_invoice_line_agent.py +30 -0
- odoo/addons/sale_commission_product_criteria_domain/models/commission.py +90 -0
- odoo/addons/sale_commission_product_criteria_domain/models/commission_group.py +72 -0
- odoo/addons/sale_commission_product_criteria_domain/models/partner.py +75 -0
- odoo/addons/sale_commission_product_criteria_domain/models/sale_commission_line_mixin.py +66 -0
- odoo/addons/sale_commission_product_criteria_domain/models/sale_order_line_agent.py +29 -0
- odoo/addons/sale_commission_product_criteria_domain/readme/CONTRIBUTORS.rst +6 -0
- odoo/addons/sale_commission_product_criteria_domain/readme/DESCRIPTION.rst +9 -0
- odoo/addons/sale_commission_product_criteria_domain/readme/USAGE.rst +22 -0
- odoo/addons/sale_commission_product_criteria_domain/security/ir.model.access.csv +5 -0
- odoo/addons/sale_commission_product_criteria_domain/static/description/icon.png +0 -0
- odoo/addons/sale_commission_product_criteria_domain/static/description/index.html +453 -0
- odoo/addons/sale_commission_product_criteria_domain/tests/__init__.py +1 -0
- odoo/addons/sale_commission_product_criteria_domain/tests/test_sale_commission_product_criteria_domain.py +334 -0
- odoo/addons/sale_commission_product_criteria_domain/views/views.xml +222 -0
- odoo_addon_sale_commission_product_criteria_domain-16.0.1.0.0.3.dist-info/METADATA +143 -0
- odoo_addon_sale_commission_product_criteria_domain-16.0.1.0.0.3.dist-info/RECORD +26 -0
- odoo_addon_sale_commission_product_criteria_domain-16.0.1.0.0.3.dist-info/WHEEL +5 -0
- odoo_addon_sale_commission_product_criteria_domain-16.0.1.0.0.3.dist-info/top_level.txt +1 -0
odoo/addons/sale_commission_product_criteria_domain/i18n/sale_commission_product_criteria_domain.pot
ADDED
@@ -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,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,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
|