[MODULE] ~wip migration
[burette/remembership.git] / models / account_move.py
1 # -*- coding: utf-8 -*-
2 # Copyright 2012-2020 L'Heureux Cyclage
3 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4
5 from odoo import api, fields, models, _
6 import time
7 from datetime import datetime, date
8 from dateutil.relativedelta import relativedelta
9
10
11 class AccountMoveLine(models.Model):
12 _inherit = 'account.invoice.line'
13
14 def write(self, vals):
15 # OVERRIDE
16 res = super(AccountMoveLine, self).write(vals)
17
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)
23 ])
24 if line.product_id and line.product_id.membership:
25 member_line_id = member_line_obj.search(
26 [
27 ('partner', '=', line.invoice_id.partner_id.id),
28 ('account_invoice_line', '=', line.id)
29 ],
30 limit=1,
31 )
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:
37 date_from = (
38 'date_from' in context
39 and context.get('date_from')
40 and datetime.strptime(
41 context('date_from'), "%Y-%m-%d"
42 )
43 or date.today()
44 )
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(
50 member_line.id,
51 {
52 'date_from': date_from,
53 'date_to': date_to,
54 }
55 )
56
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),
62 ])
63 for associate_member_line in member_line_obj.browse(associate_member_line_ids):
64 member_line_obj.write(
65 associate_member_line.id,
66 {
67 'date_from': date_from,
68 'date_to': date_to,
69 }
70 )
71 else:
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")
76 else:
77 associate_member_line_ids = member_line_obj.search([
78 ('account_invoice_line', '=', line.id),
79 ('partner', '!=', line.invoice_id.partner_id.id)
80 ])
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)
86 for i in partners:
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)
93 return res
94
95 def create(self, vals_list):
96 # OVERRIDE
97 res = super(AccountMoveLine, self).create(vals_list)
98
99 member_line_obj = self.env['membership.membership_line']
100 line = self.browse(res)
101
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),
106 ], limit=1)
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:
112 date_from = (
113 'date_from' in context
114 and context.get('date_from')
115 and datetime.strptime(
116 context.get('date_from'), "%Y-%m-%d"
117 )
118 or date.today())
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(
124 member_line.id,
125 {
126 'date_from': date_from,
127 'date_to': date_to,
128 })
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,
140 'date_to': date_to,
141 'account_invoice_line': line.id,
142 })
143 elif line.product_id.membership_grouped and not line.invoice_id.partner_id.associate_members:
144 raise osv.except_osv(
145 _('Error!!!'),
146 _('You try to invoice grouped membership product to a partner who hasn\'t associated partners.')
147 )
148 # Define member ident if it's necessary
149 for i in partners:
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})
153 return res