[MODULE] ~wip migration
[burette/remembership.git] / models / account_move.py
diff --git a/models/account_move.py b/models/account_move.py
new file mode 100644 (file)
index 0000000..ed53f74
--- /dev/null
@@ -0,0 +1,153 @@
+# -*- 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