prorate invoice when cancelling subscription
This commit is contained in:
parent
4499e5351c
commit
688fd6b205
@ -225,18 +225,18 @@ class Subscriptions(Document):
|
|||||||
# todo: deal with users who collect prepayments. Maybe a new Subscription Invoice doctype?
|
# todo: deal with users who collect prepayments. Maybe a new Subscription Invoice doctype?
|
||||||
self.set_subscription_status()
|
self.set_subscription_status()
|
||||||
|
|
||||||
def generate_invoice(self):
|
def generate_invoice(self, prorate=0):
|
||||||
"""
|
"""
|
||||||
Creates a `Sales Invoice` for the `Subscription`, updates `self.invoices` and
|
Creates a `Sales Invoice` for the `Subscription`, updates `self.invoices` and
|
||||||
saves the `Subscription`.
|
saves the `Subscription`.
|
||||||
"""
|
"""
|
||||||
invoice = self.create_invoice()
|
invoice = self.create_invoice(prorate)
|
||||||
self.append('invoices', {'invoice': invoice.name})
|
self.append('invoices', {'invoice': invoice.name})
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
return invoice
|
return invoice
|
||||||
|
|
||||||
def create_invoice(self):
|
def create_invoice(self, prorate):
|
||||||
"""
|
"""
|
||||||
Creates a `Sales Invoice`, submits it and returns it
|
Creates a `Sales Invoice`, submits it and returns it
|
||||||
"""
|
"""
|
||||||
@ -247,7 +247,7 @@ class Subscriptions(Document):
|
|||||||
|
|
||||||
# Subscription is better suited for service items. I won't update `update_stock`
|
# Subscription is better suited for service items. I won't update `update_stock`
|
||||||
# for that reason
|
# for that reason
|
||||||
items_list = self.get_items_from_plans(self.plans)
|
items_list = self.get_items_from_plans(self.plans, prorate)
|
||||||
for item in items_list:
|
for item in items_list:
|
||||||
item['qty'] = self.quantity
|
item['qty'] = self.quantity
|
||||||
invoice.append('items', item)
|
invoice.append('items', item)
|
||||||
@ -288,18 +288,35 @@ class Subscriptions(Document):
|
|||||||
"""
|
"""
|
||||||
return frappe.get_value('Subscriber', subscriber_name)
|
return frappe.get_value('Subscriber', subscriber_name)
|
||||||
|
|
||||||
def get_items_from_plans(self, plans):
|
def get_items_from_plans(self, plans, prorate=0):
|
||||||
"""
|
"""
|
||||||
Returns the `Item`s linked to `Subscription Plan`
|
Returns the `Item`s linked to `Subscription Plan`
|
||||||
"""
|
"""
|
||||||
plan_items = [plan.plan for plan in plans]
|
plan_items = [plan.plan for plan in plans]
|
||||||
|
item_names = None
|
||||||
|
|
||||||
if plan_items:
|
if plan_items and not prorate:
|
||||||
item_names = frappe.db.sql(
|
item_names = frappe.db.sql(
|
||||||
'select item as item_code, cost as rate from `tabSubscription Plan` where name in %s',
|
'select item as item_code, cost as rate from `tabSubscription Plan` where name in %s',
|
||||||
(plan_items,), as_dict=1
|
(plan_items,), as_dict=1
|
||||||
)
|
)
|
||||||
return item_names
|
|
||||||
|
elif plan_items:
|
||||||
|
prorate_factor = self.get_proration_factor(self.current_invoice_end, self.current_invoice_start)
|
||||||
|
|
||||||
|
item_names = frappe.db.sql(
|
||||||
|
'select item as item_code, cost * %s as rate from `tabSubscription Plan` where name in %s',
|
||||||
|
(prorate_factor, plan_items,), as_dict=1
|
||||||
|
)
|
||||||
|
|
||||||
|
return item_names
|
||||||
|
|
||||||
|
def get_proration_factor(self, period_end, period_start):
|
||||||
|
diff = date_diff(nowdate(), period_start) + 1
|
||||||
|
plan_days = date_diff(period_end, period_start) + 1
|
||||||
|
prorate_factor = diff/plan_days
|
||||||
|
|
||||||
|
return prorate_factor
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
"""
|
"""
|
||||||
@ -384,8 +401,12 @@ class Subscriptions(Document):
|
|||||||
This sets the subscription as cancelled. It will stop invoices from being generated
|
This sets the subscription as cancelled. It will stop invoices from being generated
|
||||||
but it will not affect already created invoices.
|
but it will not affect already created invoices.
|
||||||
"""
|
"""
|
||||||
|
to_generate_invoice = True if self.status == 'Active' else False
|
||||||
|
to_prorate = frappe.db.get_single_value('Subscription Settings', 'prorate')
|
||||||
self.status = 'Canceled'
|
self.status = 'Canceled'
|
||||||
self.cancelation_date = nowdate()
|
self.cancelation_date = nowdate()
|
||||||
|
if to_generate_invoice:
|
||||||
|
self.generate_invoice(prorate=to_prorate)
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
def restart_subscription(self):
|
def restart_subscription(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user