Skip to content

Commit b6d98d9

Browse files
author
Michael Michot
committed
[ADD] stock reception error + fix dispute
1 parent 10d1b4d commit b6d98d9

17 files changed

+540
-28
lines changed

dispute/models/dispute.py

+22-10
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def get_related_models(self):
119119
compute="_compute_model_ref_id_selected_id"
120120
)
121121
partner_id = fields.Many2one(
122-
comodel_name="res.partner", compute="_compute_partner_id"
122+
comodel_name="res.partner", compute="_compute_partner_id", store="True"
123123
)
124124
related_document_ids = fields.One2many(
125125
comodel_name="dispute.related.document",
@@ -207,6 +207,7 @@ def message_post(self, **kwargs):
207207

208208
class DisputeLine(models.Model):
209209
_name = "dispute.line"
210+
_inherit = ["mail.activity.mixin"]
210211
_parent_field = "_undefined"
211212
_description = "Dispute line"
212213

@@ -239,6 +240,11 @@ def _compute_product_id(self):
239240
product_id = r.model_ref_id[product_field]
240241
r.product_id = product_id
241242

243+
@api.depends("model_ref_id")
244+
def _compute_price_unit(self):
245+
for r in self:
246+
r.price_unit = 0
247+
242248
@api.depends("dispute_price", "qty")
243249
def _compute_total(self):
244250
for r in self:
@@ -248,6 +254,10 @@ def _compute_total(self):
248254
def _on_change_product_id(self):
249255
self.dispute_price = self.standard_price
250256

257+
@api.depends("model_ref_id")
258+
def _compute_line_ref_id(self):
259+
self.line_ref_id = self.model_ref_id and self.model_ref_id.id or "toto"
260+
251261
dispute_id = fields.Many2one(comodel_name="dispute")
252262
dispute_price = fields.Float(required=True)
253263
company_currency = fields.Many2one(
@@ -256,6 +266,7 @@ def _on_change_product_id(self):
256266
related="dispute_id.company_id.currency_id",
257267
readonly=True,
258268
)
269+
line_ref_id = fields.Char(compute="_compute_line_ref_id")
259270
comment = fields.Text()
260271
model_ref_id = fields.Reference(
261272
selection="_selection_model", string="Reference", required=True
@@ -272,7 +283,17 @@ def _on_change_product_id(self):
272283
],
273284
required=True,
274285
)
286+
resolution = fields.Selection(
287+
[
288+
("return", "Return"),
289+
("destruction", "Destruction"),
290+
("swap", "Swap"),
291+
("accept", "Accept product"),
292+
],
293+
required=True,
294+
)
275295
standard_price = fields.Float(related="product_id.standard_price")
296+
price_unit = fields.Float(compute="_compute_price_unit")
276297
total = fields.Monetary(compute="_compute_total", currency_field="company_currency")
277298

278299
@api.depends("dispute_id.model_ref_id")
@@ -367,15 +388,6 @@ def update_dispute(self, values):
367388
r[r._parent_field].dispute_id = dispute_id.id
368389
r.dispute_line_id.dispute_id = dispute_id.id
369390

370-
# @api.model_create_multi
371-
# def create(self, vals_list):
372-
# #TODO adapt ....
373-
# for values in vals_list:
374-
# new_line = super().create(values)
375-
# new_line.update_dispute(values)
376-
377-
# return new_line
378-
379391
def write(self, values):
380392
res = super().write(values)
381393
if "dispute_id" not in values and "dispute_line_id" not in values:

dispute/models/res_partner.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,21 @@ class ResPartner(models.Model):
88
_inherit = "res.partner"
99

1010
def _compute_dispute_count(self):
11-
# retrieve all children partners and prefetch 'parent_id' on them
12-
all_partners = self.search([("id", "child_of", self.ids)])
13-
all_partners.read(["parent_id"])
11+
# # retrieve all children partners and prefetch 'parent_id' on them
12+
# all_partners = self.search([("id", "child_of", self.ids)])
13+
# all_partners.read(["parent_id"])
1414

1515
for partner in self:
1616
partner.dispute_count = len(
17-
self.env["dispute"].search([("partner_id", "in", all_partners.ids)])
17+
self.env["dispute"].search([("partner_id", "child_of", partner.id)])
1818
)
1919

2020
dispute_count = fields.Integer(
2121
compute="_compute_dispute_count", string="Dispute Count"
2222
)
23+
24+
def action_show_dispute_list(self):
25+
act_window = self.env.ref("dispute.dispute_action")
26+
act_window.domain = [("partner_id", "child_of", self.id)]
27+
28+
return act_window.read()[0]

dispute/views/dispute.xml

+8-2
Original file line numberDiff line numberDiff line change
@@ -257,16 +257,20 @@
257257
<field name="company_currency" invisible="1" />
258258
<field name="model_ref_id" />
259259
<field name="product_id" />
260-
<field name="standard_price" />
260+
<field name="standard_price" optional="show" />
261261
<field name="reason" />
262+
<field name="resolution" />
262263
<field name="comment" />
263-
<field name="dispute_price" />
264+
<field name="dispute_price" optional="show" />
264265
<field name="qty" />
265266
<field
266267
name="total"
267268
widget="monetary"
268269
options="{'currency_field': 'company_currency'}"
270+
optional="show"
269271
/>
272+
<field name="activity_ids" widget="list_activity" optional="show" />
273+
270274
</tree>
271275
</field>
272276
</record>
@@ -280,9 +284,11 @@
280284
<field name="model_ref_id" />
281285
<field name="product_id" />
282286
<field name="standard_price" />
287+
<field name="price_unit" />
283288
<field name="dispute_price" />
284289
<field name="qty" />
285290
<field name="reason" />
291+
<field name="resolution" />
286292
</group>
287293
<group string="Comment">
288294
<field name="comment" nolabel="1" />

dispute/views/res_partner_views.xml

+2-12
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
<?xml version="1.0" encoding="utf-8" ?>
22
<odoo>
3-
<record id="act_res_partner_2_dispute" model="ir.actions.act_window">
4-
<field name="name">Disputes</field>
5-
<field name="res_model">dispute</field>
6-
<field name="view_mode">tree,form,graph</field>
7-
<field
8-
name="context"
9-
>{'search_default_partner_id': active_id, 'default_partner_id': active_id}</field>
10-
</record>
11-
123
<record id="res_partner_view_purchase_buttons" model="ir.ui.view">
134
<field name="name">res.partner.view.purchase.buttons</field>
145
<field name="model">res.partner</field>
@@ -18,9 +9,8 @@
189
<field name="arch" type="xml">
1910
<div name="button_box" position="inside">
2011
<button
21-
class="oe_stat_button"
22-
name="%(dispute.act_res_partner_2_dispute)d"
23-
type="action"
12+
name="action_show_dispute_list"
13+
type="object"
2414
icon="fa-exclamation-circle"
2515
>
2616
<field string="Dispute" name="dispute_count" widget="statinfo" />

dispute_purchase/models/purchase_dispute.py

+23
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,26 @@ def get_related_models(self):
3232
models += ["purchase.order"]
3333

3434
return models
35+
36+
37+
class DisputeLine(models.Model):
38+
_inherit = ["dispute.line"]
39+
40+
def _compute_price_unit(self):
41+
if self.model_ref_id and self.model_ref_id._name == "purchase.order.line":
42+
for r in self:
43+
r.price_unit = r.model_ref_id.price_unit
44+
else:
45+
super()._compute_price_unit()
46+
47+
def _on_change_model_ref_id(self):
48+
domains = {
49+
"purchase.order.line": [
50+
("order_id.id", "=", self.dispute_id.model_ref_id.id)
51+
],
52+
"product.product": [],
53+
}
54+
if self.model_ref_id and self.model_ref_id._name in domains:
55+
return {"domain": {"model_ref_id": domains[self.model_ref_id._name]}}
56+
else:
57+
return super()._on_change_model_ref_id()

dispute_stock/__manifest__.py

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"depends": [
1212
"dispute",
1313
"stock",
14+
"stock_reception_error",
1415
],
1516
"data": [],
1617
"installable": True,

dispute_stock/models/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import stock_picking_dispute
2+
from . import stock_reception_error_dispute
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from odoo import _, fields, models
2+
3+
4+
class Dispute(models.Model):
5+
_inherit = ["dispute"]
6+
7+
def _selection_model(self):
8+
selection_model = super()._selection_model()
9+
model_name = "stock.reception.error"
10+
selection_model.append((model_name, _(self.env[model_name]._description)))
11+
12+
return selection_model
13+
14+
def get_line_model_info(self, model_name):
15+
line_model_info = {
16+
"model_name": "stock.reception.error.line",
17+
"domain": "[('stock_reception_error_id', '=', dispute_model_ref_id.id)]",
18+
"product_id_field_name": "product_id",
19+
}
20+
if model_name == "stock.reception.error":
21+
# Force selection to only compatible sub_model of model_name
22+
return [line_model_info]
23+
else:
24+
super_info = super().get_line_model_info(model_name)
25+
if not model_name:
26+
super_info.append(line_model_info)
27+
return super_info
28+
29+
def get_related_models(self):
30+
models = super().get_related_models()
31+
32+
models += ["stock.reception.error"]
33+
34+
return models
35+
36+
37+
class StockReceptionError(models.Model):
38+
_name = "stock.reception.error"
39+
_inherit = ["stock.reception.error"]
40+
41+
dispute_id = fields.Many2one(comodel_name="dispute")
42+
43+
44+
class StockReceptionErrorLine(models.Model):
45+
_name = "stock.reception.error.line"
46+
# _parent_field = "picking_id"
47+
_inherit = ["stock.reception.error.line", "dispute.line.mixin"]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../stock_reception_error

setup/stock_reception_error/setup.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import setuptools
2+
3+
setuptools.setup(
4+
setup_requires=['setuptools-odoo'],
5+
odoo_addon=True,
6+
)

stock_reception_error/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import models

stock_reception_error/__manifest__.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Copyright 2020 Pharmasimple (https://www.pharmasimple.be)
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3+
{
4+
"name": "Stock Reception Error",
5+
"category": "Stock",
6+
"summary": "Stock Reception Error",
7+
"version": "14.0.1.0.0",
8+
"author": "Pharmasimple",
9+
"license": "AGPL-3",
10+
"website": "https://github.com/akretion/phs-addons",
11+
"depends": ["mail", "stock", "purchase"],
12+
"data": [
13+
"data/stock_reception_error.xml",
14+
"security/ir.model.access.csv",
15+
"views/stock_reception_error.xml",
16+
],
17+
"installable": True,
18+
"application": False,
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo noupdate="1">
3+
<record id="stock_reception_error_seq" model="ir.sequence">
4+
<field name="name">stock reception error sequence</field>
5+
<field name="code">stock_reception_error</field>
6+
<field name="prefix">SRE/</field>
7+
<field eval="1" name="number_next" />
8+
<field eval="1" name="number_increment" />
9+
<field eval="5" name="padding" />
10+
<field eval="False" name="company_id" />
11+
</record>
12+
</odoo>
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import stock_reception_error
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
from odoo import fields, models
2+
3+
4+
class StockReceptionError(models.Model):
5+
_name = "stock.reception.error"
6+
_inherit = ["mail.thread", "mail.activity.mixin"]
7+
_description = "Stock Reception Error"
8+
9+
name = fields.Char(
10+
copy=False,
11+
readonly=True,
12+
default=lambda self: self.env["ir.sequence"].next_by_code(
13+
"stock_reception_error"
14+
),
15+
)
16+
state = fields.Selection(
17+
default="draft",
18+
selection=[
19+
("draft", "Draft"),
20+
("in_progress", "In Progress"),
21+
("done", "Done"),
22+
],
23+
tracking=True,
24+
)
25+
26+
color = fields.Integer("Color Index", default=0)
27+
reception_date = fields.Date(required=True)
28+
description = fields.Html()
29+
line_ids = fields.One2many(
30+
comodel_name="stock.reception.error.line",
31+
inverse_name="stock_reception_error_id",
32+
)
33+
partner_id = fields.Many2one(comodel_name="res.partner", required=True)
34+
purchase_order_id = fields.Many2one(
35+
comodel_name="purchase.order",
36+
required=True,
37+
domain="[('partner_id', '=',partner_id)]",
38+
)
39+
responsible_id = fields.Many2one(comodel_name="res.users")
40+
summary = fields.Text()
41+
42+
43+
class StockReceptionErrorLine(models.Model):
44+
_name = "stock.reception.error.line"
45+
_inherit = ["mail.thread", "mail.activity.mixin"]
46+
_description = "Stock Reception Error line"
47+
48+
def _compute_name(self):
49+
for r in self:
50+
r.name = r.product_id and r.product_id.name or r.product_description
51+
52+
name = fields.Char(compute=_compute_name)
53+
stock_reception_error_id = fields.Many2one(comodel_name="stock.reception.error")
54+
comment = fields.Text()
55+
partner_id = fields.Many2one(
56+
related="stock_reception_error_id.partner_id", store=True
57+
)
58+
reception_date = fields.Date(
59+
related="stock_reception_error_id.reception_date", store=True
60+
)
61+
62+
product_id = fields.Many2one(comodel_name="product.product")
63+
product_description = fields.Char()
64+
qty = fields.Float(required=True)
65+
reason = fields.Selection(
66+
[
67+
("qty", "Quantity"),
68+
("quality", "Quality"),
69+
("other", "Others"),
70+
],
71+
required=True,
72+
)
73+
resolution = fields.Selection(
74+
selection=[
75+
("return", "Supplier return"),
76+
("destruction", "Destruction"),
77+
("ok_reception", "To receive"),
78+
],
79+
tracking=True,
80+
)
81+
state = fields.Selection(
82+
default="draft",
83+
selection=[
84+
("draft", "Draft"),
85+
("in_progress", "In Progress"),
86+
("done", "Done"),
87+
],
88+
tracking=True,
89+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2+
access_sre_user,stock reception error user,model_stock_reception_error,stock.group_stock_user,1,1,1,1
3+
access_sre_line_user,stock reception error line user,model_stock_reception_error_line,stock.group_stock_user,1,1,1,1

0 commit comments

Comments
 (0)