Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion membership_subscription/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

{
"name": "Membership Subscription",
"version": "16.0.1.0.0",
"version": "16.0.1.1.0",
"license": "AGPL-3",
"category": "Association",
"website": "https://www.onestein.nl",
Expand Down
4 changes: 4 additions & 0 deletions membership_subscription/models/product_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ class ProductTemplate(models.Model):
_inherit = "product.template"

first_of_period_billing_policy = fields.Boolean("Billing Policy: First of Period")
membership_skip_invoice = fields.Boolean(
string="Skip Invoice",
help="Skip invoice for this product when sold as a subscription",
)

@api.onchange("membership_type")
def _onchange_membership_type(self):
Expand Down
64 changes: 61 additions & 3 deletions membership_subscription/models/sale_subscription.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@

from dateutil.relativedelta import relativedelta

from odoo import models
from odoo import fields, models


class SaleSubscription(models.Model):
_inherit = "sale.subscription"

def calculate_recurring_next_date(self, start_date):
if self.account_invoice_ids_count == 0:
lines = self.sale_subscription_line_ids
if self.account_invoice_ids_count == 0 and not lines.product_id.filtered(
lambda x: x.membership_skip_invoice
):
self.recurring_next_date = date.today()
else:
if self.sale_subscription_line_ids.mapped("product_id").filtered(
if lines.product_id.filtered(
lambda x: x.first_of_period_billing_policy
and x.membership_type == "variable"
):
Expand All @@ -36,3 +39,58 @@ def calculate_recurring_next_date(self, start_date):
return super(SaleSubscription, self).calculate_recurring_next_date(
start_date
)

def _generate_subscription_date_range(self):
self.ensure_one()
if self._membership_skip_invoice():
start_date = self.recurring_next_date or self.date_start
end_date = self._calculate_recurring_next_date(start_date)
return start_date, end_date
return super()._generate_subscription_date_range()

def generate_invoice(self):
if self._membership_skip_invoice():
self._membership_generate_membership_lines()
return
return super(SaleSubscription, self).generate_invoice()

def create_invoice(self):
if self._membership_skip_invoice():
self._membership_generate_membership_lines()
return
return super(SaleSubscription, self).create_invoice()

def manual_invoice(self):
if self._membership_skip_invoice():
self._membership_generate_membership_lines()
return

def _membership_skip_invoice(self):
return bool(
self.sale_subscription_line_ids.filtered(
lambda x: x.product_id.membership
and x.product_id.membership_skip_invoice
)
)

def _membership_generate_membership_lines(self):
memberships_vals = []
for line in self.sale_subscription_line_ids.filtered(
lambda x: x.product_id.membership and x.product_id.membership_skip_invoice
):
subscription = line.sale_subscription_id
date_from, date_to = subscription._generate_subscription_date_range()
memberships_vals.append(
{
"partner": subscription.partner_id.id,
"membership_id": line.product_id.id,
"member_price": line.price_unit,
"date": fields.Date.today(),
"date_from": date_from,
"date_to": date_to,
"state": "free",
}
)
subscription.calculate_recurring_next_date(subscription.recurring_next_date)

self.env["membership.membership_line"].create(memberships_vals)
1 change: 1 addition & 0 deletions membership_subscription/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import test_membership_skip_invoice
Loading
Loading