1 # -*- coding: utf-8 -*-
2 # Copyright 2012-2020 L'Heureux Cyclage
3 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
5 from odoo
import api
, fields
, models
, _
7 from datetime
import datetime
, date
8 from dateutil
.relativedelta
import relativedelta
11 class AccountMoveLine(models
.Model
):
12 _inherit
= 'account.invoice.line'
14 def write(self
, vals
):
16 res
= super(AccountMoveLine
, self
).write(vals
)
18 member_line_obj
= self
.env
['membership.membership_line']
19 for line
in self
.browse(vals
):
20 if line
.invoice_id
.type == 'out_invoice':
21 ml_ids
= member_line_obj
.search([
22 ('account_invoice_line', '=', line
.id)
24 if line
.product_id
and line
.product_id
.membership
:
25 member_line_id
= member_line_obj
.search(
27 ('partner', '=', line
.invoice_id
.partner_id
.id),
28 ('account_invoice_line', '=', line
.id)
32 for member_line
in member_line_obj
.browse(member_line_id
):
33 # NOTE: get member_line created in membership.account_invoice_line.create
34 date_from
= member_line
.date_from
35 date_to
= member_line
.date_to
36 if line
.product_id
.membership_date2date
:
38 'date_from' in context
39 and context
.get('date_from')
40 and datetime
.strptime(
41 context('date_from'), "%Y-%m-%d"
45 # TODO: parameterize this delta?
46 date_to
= date_from
+ relativedelta(months
=+12, days
=-1)
47 date_from
= date_from
.strftime("%Y-%m-%d")
48 date_to
= date_to
.strftime("%Y-%m-%d")
49 member_line_obj
.write(
52 'date_from': date_from
,
57 if line
.product_id
.membership_grouped
:
58 if line
.invoice_id
.partner_id
.associate_members
:
59 associate_member_line_ids
= member_line_obj
.search([
60 ('account_invoice_line', '=', line
.id),
61 ('partner', '!=', line
.invoice_id
.partner_id
.id),
63 for associate_member_line
in member_line_obj
.browse(associate_member_line_ids
):
64 member_line_obj
.write(
65 associate_member_line
.id,
67 'date_from': date_from
,
72 print("# DEV: mettre une contrainte pour l'objet\
73 membership.membership_line interdisant les\
74 adhésions groupées reliées à des partenaires\
75 sans membres associés")
77 associate_member_line_ids
= member_line_obj
.search([
78 ('account_invoice_line', '=', line
.id),
79 ('partner', '!=', line
.invoice_id
.partner_id
.id)
81 member_line_obj
.unlink(associate_member_line_ids
)
82 # Define member ident if it's necessary
83 partners
= [line
.invoice_id
.partner_id
]
84 if line
.invoice_id
.partner_id
.associate_members
:
85 partners
.extend(line
.invoice_id
.partner_id
.associate_members
)
87 if not i
.member_ident
:
88 mbr_id
= self
.env
['ir.sequence'].env
['member_ident']
89 self
.env
['res.partner'].write(i
.id, {'member_ident': mbr_id
})
90 if line
.product_id
and not line
.product_id
.membership
and ml_ids
:
91 # Product line has changed to a non membership product
92 member_line_obj
.unlink(ml_ids
)
95 def create(self
, vals_list
):
97 res
= super(AccountMoveLine
, self
).create(vals_list
)
99 member_line_obj
= self
.env
['membership.membership_line']
100 line
= self
.browse(res
)
102 if line
.invoice_id
.type == 'out_invoice' and line
.product_id
and line
.product_id
.membership
:
103 member_line_id
= member_line_obj
.search([
104 ('partner', '=', line
.invoice_id
.partner_id
.id),
105 ('account_invoice_line', '=', line
.id),
107 for member_line
in member_line_obj
.browse(member_line_id
):
108 # NOTE: get member_line created in membership.account_invoice_line.create
109 date_from
= member_line
.date_from
110 date_to
= member_line
.date_to
111 if line
.product_id
.membership_date2date
:
113 'date_from' in context
114 and context
.get('date_from')
115 and datetime
.strptime(
116 context
.get('date_from'), "%Y-%m-%d"
119 # TODO: parameterize this delta?
120 date_to
= date_from
+ relativedelta(months
=+12, days
=-1)
121 date_from
= date_from
.strftime("%Y-%m-%d")
122 date_to
= date_to
.strftime("%Y-%m-%d")
123 member_line_obj
.write(
126 'date_from': date_from
,
129 partners
= [line
.invoice_id
.partner_id
]
130 if line
.product_id
.membership_grouped
and line
.invoice_id
.partner_id
.associate_members
:
131 partners
.extend(line
.invoice_id
.partner_id
.associate_members
)
132 # Adding membership lines just for associate partners
133 for associate_member
in line
.invoice_id
.partner_id
.associate_members
:
134 member_line_obj
.create({
135 'partner': associate_member
.id,
136 'membership_id': line
.product_id
.id,
137 'member_price': line
.price_unit
,
138 'date': time
.strftime('%Y-%m-%d'),
139 'date_from': date_from
,
141 'account_invoice_line': line
.id,
143 elif line
.product_id
.membership_grouped
and not line
.invoice_id
.partner_id
.associate_members
:
144 raise osv
.except_osv(
146 _('You try to invoice grouped membership product to a partner who hasn\'t associated partners.')
148 # Define member ident if it's necessary
150 if not i
.member_ident
:
151 mbr_id
= self
.env
['ir.sequence'].env
['member_ident']
152 self
.env
['res.partner'].write(i
.id, {'member_ident': mbr_id
})