set after_insert
methods:
- if subscription is not in trial period, generate sales invoice
This commit is contained in:
parent
b72aac6729
commit
d3fdcd9da5
@ -42,6 +42,17 @@ class Subscriptions(Document):
|
|||||||
self.status = 'Active'
|
self.status = 'Active'
|
||||||
# todo: then generate new invoice
|
# todo: then generate new invoice
|
||||||
|
|
||||||
|
def is_trialling(self):
|
||||||
|
return not self.period_has_passed(self.trial_period_end) and self.is_new_subscription()
|
||||||
|
|
||||||
|
def period_has_passed(self, end_date):
|
||||||
|
# todo: test for illegal time
|
||||||
|
if not end_date:
|
||||||
|
return True
|
||||||
|
|
||||||
|
end_date = getdate(end_date)
|
||||||
|
return nowdate() > end_date
|
||||||
|
|
||||||
def is_past_grace_period(self):
|
def is_past_grace_period(self):
|
||||||
current_invoice = self.get_current_invoice()
|
current_invoice = self.get_current_invoice()
|
||||||
if self.current_invoice_is_past_due(current_invoice):
|
if self.current_invoice_is_past_due(current_invoice):
|
||||||
@ -58,6 +69,12 @@ class Subscriptions(Document):
|
|||||||
else:
|
else:
|
||||||
return nowdate() > current_invoice.due_date
|
return nowdate() > current_invoice.due_date
|
||||||
|
|
||||||
|
def get_current_invoice(self):
|
||||||
|
if len(self.invoices):
|
||||||
|
current = self.invoices[-1]
|
||||||
|
doc = frappe.get_doc('Sales Invoice', current)
|
||||||
|
return doc
|
||||||
|
|
||||||
def is_new_subscription(self):
|
def is_new_subscription(self):
|
||||||
return len(self.invoices) == 0
|
return len(self.invoices) == 0
|
||||||
|
|
||||||
@ -72,3 +89,67 @@ class Subscriptions(Document):
|
|||||||
elif self.trial_period_start or self.trial_period_end:
|
elif self.trial_period_start or self.trial_period_end:
|
||||||
frappe.throw(_('Both Trial Period Start Date and Trial Period End Date must be set'))
|
frappe.throw(_('Both Trial Period Start Date and Trial Period End Date must be set'))
|
||||||
|
|
||||||
|
def after_insert(self):
|
||||||
|
if not self.is_trialling():
|
||||||
|
self.generate_invoice()
|
||||||
|
|
||||||
|
def generate_invoice(self):
|
||||||
|
invoice = self.create_invoice()
|
||||||
|
invoice.save()
|
||||||
|
invoice.submit()
|
||||||
|
self.append('invoices', {'invoice': invoice.name})
|
||||||
|
self.subscription_updated(invoice)
|
||||||
|
|
||||||
|
return invoice
|
||||||
|
|
||||||
|
def create_invoice(self):
|
||||||
|
invoice = frappe.new_doc('Sales Invoice')
|
||||||
|
invoice.customer = self.get_customer(self.subscriber)
|
||||||
|
|
||||||
|
# Subscription is better suited for service items. I won't update `update_stock`
|
||||||
|
# for that reason
|
||||||
|
items_list = self.get_items_from_plans(self.plans)
|
||||||
|
for item in items_list:
|
||||||
|
item['qty'] = self.quantity
|
||||||
|
invoice.append('items', item)
|
||||||
|
|
||||||
|
# Taxes
|
||||||
|
# todo: tax template does not populate tax table
|
||||||
|
if self.tax_template:
|
||||||
|
invoice.taxes_and_charges = self.tax_template
|
||||||
|
|
||||||
|
# Due date
|
||||||
|
if cint(self.days_until_due):
|
||||||
|
invoice.append(
|
||||||
|
'payment_schedule',
|
||||||
|
{
|
||||||
|
'due_date': add_days(nowdate(), cint(self.days_until_due)),
|
||||||
|
'invoice_portion': 100
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Discounts
|
||||||
|
if self.apply_additional_discount:
|
||||||
|
invoice.apply_discount_on = self.apply_additional_discount
|
||||||
|
|
||||||
|
if self.additional_discount_percentage:
|
||||||
|
invoice.additional_discount_percentage = self.additional_discount_percentage
|
||||||
|
|
||||||
|
if self.additional_discount_amount:
|
||||||
|
invoice.additional_discount_amount = self.additional_discount_amount
|
||||||
|
|
||||||
|
return invoice
|
||||||
|
|
||||||
|
def get_customer(self, subscriber_name):
|
||||||
|
return frappe.get_value('Subscriber', subscriber_name)
|
||||||
|
|
||||||
|
def get_items_from_plans(self, plans):
|
||||||
|
plan_items = [plan.plan for plan in plans]
|
||||||
|
|
||||||
|
if plan_items:
|
||||||
|
item_names = frappe.db.sql(
|
||||||
|
'select item as item_code, cost as rate from `tabSubscription Plan` where name=%s',
|
||||||
|
plan_items, as_dict=1
|
||||||
|
)
|
||||||
|
return item_names
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user