forked from OCA/sale-workflow
-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathsale_order.py
More file actions
111 lines (92 loc) · 4.13 KB
/
sale_order.py
File metadata and controls
111 lines (92 loc) · 4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# Copyright 2021 Akretion France (http://www.akretion.com/)
# Copyright 2024 Akretion France (http://www.akretion.com/)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models
class SaleOrder(models.Model):
_inherit = "sale.order"
def _action_confirm(self):
super()._action_confirm()
sale_primeship = self.env["sale.primeship"]
for record in self:
partner = record.partner_id.commercial_partner_id
for line in record.order_line:
product_template = line.product_template_id
if product_template.primeship_activation:
# We do not take in account product_qty for now:
duration = product_template.primeship_duration
start = fields.Date.context_today(record)
end = start + relativedelta(months=duration)
# If we have already some primeships, we need to check for overlaps
if partner.primeship_ids:
# We assume no overlaps between partner primeships
for primeship in partner.primeship_ids.sorted("start_date"):
if primeship.overlaps(start, end):
start = primeship.end_date
end = start + relativedelta(months=duration)
vals = {
"start_date": start,
"end_date": end,
"partner_id": partner.id,
"order_line_id": line.id,
# this is to reactivate a maybe deactivated existing primeship
"active": True,
}
if line.primeship_id:
# Hm... something seems to have gone wrong here,
# but we handle it nonetheless.
line.primeship_id.write(vals)
else:
# We may have a deactivated primeship because of an order
# cancellation.
primeship = sale_primeship.with_context(
active_test=False,
).search([("order_line_id", "=", line.id)])
if primeship:
primeship.write(vals)
else:
sale_primeship.create(vals)
return True
def _action_cancel(self):
rv = super()._action_cancel()
for record in self:
record.order_line.mapped("primeship_id").active = False
return rv
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
primeship_id = fields.Many2one(
string="Primeships",
comodel_name="sale.primeship",
compute="_compute_primeship_id",
inverse="_inverse_primeship_id",
)
# One2one impl
primeship_ids = fields.One2many(
comodel_name="sale.primeship", inverse_name="order_line_id"
)
@api.depends("primeship_ids")
def _compute_primeship_id(self):
for record in self:
record.primeship_id = record.primeship_ids[:1]
def _inverse_primeship_id(self):
for record in self:
if record.primeship_ids:
primeship = record.env["sale.primeship"].browse(
record.primeship_ids[0].id
)
primeship.order_line_id = record
record.primeship_id.order_line_id = record
def _prepare_invoice_line(self, **optional_values):
"""Update invoice start/end dates.
Set invoice start/end dates to primeship start/end dates
In case of multi quantity, this assumes continuous date ranges."""
self.ensure_one()
res = super()._prepare_invoice_line(**optional_values)
if self.primeship_id:
res.update(
{
"start_date": self.primeship_id.start_date,
"end_date": self.primeship_id.end_date,
}
)
return res