prorate invoice when cancelling subscription

This commit is contained in:
tundebabzy 2018-03-02 08:54:05 +01:00
parent 4499e5351c
commit 688fd6b205

View File

@ -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):