--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright 2012-2020 L'Heureux Cyclage
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import api, fields, models, _
+import time
+from datetime import datetime, date
+from dateutil.relativedelta import relativedelta
+
+
+class AccountMoveLine(models.Model):
+ _inherit = 'account.invoice.line'
+
+ def write(self, vals):
+ # OVERRIDE
+ res = super(AccountMoveLine, self).write(vals)
+
+ member_line_obj = self.env['membership.membership_line']
+ for line in self.browse(vals):
+ if line.invoice_id.type == 'out_invoice':
+ ml_ids = member_line_obj.search([
+ ('account_invoice_line', '=', line.id)
+ ])
+ if line.product_id and line.product_id.membership:
+ member_line_id = member_line_obj.search(
+ [
+ ('partner', '=', line.invoice_id.partner_id.id),
+ ('account_invoice_line', '=', line.id)
+ ],
+ limit=1,
+ )
+ for member_line in member_line_obj.browse(member_line_id):
+ # NOTE: get member_line created in membership.account_invoice_line.create
+ date_from = member_line.date_from
+ date_to = member_line.date_to
+ if line.product_id.membership_date2date:
+ date_from = (
+ 'date_from' in context
+ and context.get('date_from')
+ and datetime.strptime(
+ context('date_from'), "%Y-%m-%d"
+ )
+ or date.today()
+ )
+ # TODO: parameterize this delta?
+ date_to = date_from + relativedelta(months=+12, days=-1)
+ date_from = date_from.strftime("%Y-%m-%d")
+ date_to = date_to.strftime("%Y-%m-%d")
+ member_line_obj.write(
+ member_line.id,
+ {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ }
+ )
+
+ if line.product_id.membership_grouped:
+ if line.invoice_id.partner_id.associate_members:
+ associate_member_line_ids = member_line_obj.search([
+ ('account_invoice_line', '=', line.id),
+ ('partner', '!=', line.invoice_id.partner_id.id),
+ ])
+ for associate_member_line in member_line_obj.browse(associate_member_line_ids):
+ member_line_obj.write(
+ associate_member_line.id,
+ {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ }
+ )
+ else:
+ print("# DEV: mettre une contrainte pour l'objet\
+ membership.membership_line interdisant les\
+ adhésions groupées reliées à des partenaires\
+ sans membres associés")
+ else:
+ associate_member_line_ids = member_line_obj.search([
+ ('account_invoice_line', '=', line.id),
+ ('partner', '!=', line.invoice_id.partner_id.id)
+ ])
+ member_line_obj.unlink(associate_member_line_ids)
+ # Define member ident if it's necessary
+ partners = [line.invoice_id.partner_id]
+ if line.invoice_id.partner_id.associate_members:
+ partners.extend(line.invoice_id.partner_id.associate_members)
+ for i in partners:
+ if not i.member_ident:
+ mbr_id = self.env['ir.sequence'].env['member_ident']
+ self.env['res.partner'].write(i.id, {'member_ident': mbr_id})
+ if line.product_id and not line.product_id.membership and ml_ids:
+ # Product line has changed to a non membership product
+ member_line_obj.unlink(ml_ids)
+ return res
+
+ def create(self, vals_list):
+ # OVERRIDE
+ res = super(AccountMoveLine, self).create(vals_list)
+
+ member_line_obj = self.env['membership.membership_line']
+ line = self.browse(res)
+
+ if line.invoice_id.type == 'out_invoice' and line.product_id and line.product_id.membership:
+ member_line_id = member_line_obj.search([
+ ('partner', '=', line.invoice_id.partner_id.id),
+ ('account_invoice_line', '=', line.id),
+ ], limit=1)
+ for member_line in member_line_obj.browse(member_line_id):
+ # NOTE: get member_line created in membership.account_invoice_line.create
+ date_from = member_line.date_from
+ date_to = member_line.date_to
+ if line.product_id.membership_date2date:
+ date_from = (
+ 'date_from' in context
+ and context.get('date_from')
+ and datetime.strptime(
+ context.get('date_from'), "%Y-%m-%d"
+ )
+ or date.today())
+ # TODO: parameterize this delta?
+ date_to = date_from + relativedelta(months=+12, days=-1)
+ date_from = date_from.strftime("%Y-%m-%d")
+ date_to = date_to .strftime("%Y-%m-%d")
+ member_line_obj.write(
+ member_line.id,
+ {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ })
+ partners = [line.invoice_id.partner_id]
+ if line.product_id.membership_grouped and line.invoice_id.partner_id.associate_members:
+ partners.extend(line.invoice_id.partner_id.associate_members)
+ # Adding membership lines just for associate partners
+ for associate_member in line.invoice_id.partner_id.associate_members:
+ member_line_obj.create({
+ 'partner': associate_member.id,
+ 'membership_id': line.product_id.id,
+ 'member_price': line.price_unit,
+ 'date': time.strftime('%Y-%m-%d'),
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'account_invoice_line': line.id,
+ })
+ elif line.product_id.membership_grouped and not line.invoice_id.partner_id.associate_members:
+ raise osv.except_osv(
+ _('Error!!!'),
+ _('You try to invoice grouped membership product to a partner who hasn\'t associated partners.')
+ )
+ # Define member ident if it's necessary
+ for i in partners:
+ if not i.member_ident:
+ mbr_id = self.env['ir.sequence'].env['member_ident']
+ self.env['res.partner'].write(i.id, {'member_ident': mbr_id})
+ return res