refactor:
- current_invoice _start and end should be determined by trial period or billing period - adds new functions to get billing period data
This commit is contained in:
		
							parent
							
								
									c634ca8737
								
							
						
					
					
						commit
						45b6a1719f
					
				| @ -5,7 +5,7 @@ | |||||||
| from __future__ import unicode_literals | from __future__ import unicode_literals | ||||||
| import frappe | import frappe | ||||||
| from frappe.model.document import Document | from frappe.model.document import Document | ||||||
| from frappe.utils.data import now, nowdate, getdate, cint, add_days, date_diff, get_last_day, get_first_day | from frappe.utils.data import now, nowdate, getdate, cint, add_days, date_diff, get_last_day, get_first_day, add_to_date | ||||||
| from frappe import _ | from frappe import _ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -25,17 +25,58 @@ class Subscriptions(Document): | |||||||
| 		if self.trial_period_start and self.is_trialling(): | 		if self.trial_period_start and self.is_trialling(): | ||||||
| 			self.current_invoice_start = self.trial_period_start | 			self.current_invoice_start = self.trial_period_start | ||||||
| 		elif not date: | 		elif not date: | ||||||
| 			current_invoice = self.get_current_invoice() | 			self.current_invoice_start = nowdate() | ||||||
| 			if not current_invoice: |  | ||||||
| 				self.current_invoice_start = nowdate() |  | ||||||
| 			else: |  | ||||||
| 				self.current_invoice_start = current_invoice.posting_date |  | ||||||
| 
 | 
 | ||||||
| 	def set_current_invoice_end(self): | 	def set_current_invoice_end(self): | ||||||
| 		if self.is_trialling(): | 		if self.is_trialling(): | ||||||
| 			self.current_invoice_end = self.trial_period_end | 			self.current_invoice_end = self.trial_period_end | ||||||
| 		else: | 		else: | ||||||
| 			self.current_invoice_end = get_last_day(self.current_invoice_start) | 			billing_cycle_info = self.get_billing_cycle() | ||||||
|  | 			if billing_cycle_info: | ||||||
|  | 				self.current_invoice_end = add_to_date(self.current_invoice_start, **billing_cycle_info) | ||||||
|  | 			else: | ||||||
|  | 				self.current_invoice_end = get_last_day(self.current_invoice_start) | ||||||
|  | 
 | ||||||
|  | 	def get_billing_cycle(self): | ||||||
|  | 		return self.get_billing_cycle_data() | ||||||
|  | 
 | ||||||
|  | 	def validate_plans_billing_cycle(self, billing_cycle_data): | ||||||
|  | 		if billing_cycle_data and len(billing_cycle_data) != 1: | ||||||
|  | 			frappe.throw(_('You can only have Plans with the same billing cycle in a Subscription')) | ||||||
|  | 
 | ||||||
|  | 	def get_billing_cycle_and_interval(self): | ||||||
|  | 		plan_names = [plan.plan for plan in self.plans] | ||||||
|  | 		billing_info = frappe.db.sql( | ||||||
|  | 			'select distinct `billing_interval`, `billing_interval_count` ' | ||||||
|  | 			'from `tabSubscription Plan` ' | ||||||
|  | 			'where name in %s', | ||||||
|  | 			(plan_names,), as_dict=1 | ||||||
|  | 		) | ||||||
|  | 
 | ||||||
|  | 		return billing_info | ||||||
|  | 
 | ||||||
|  | 	def get_billing_cycle_data(self): | ||||||
|  | 		billing_info = self.get_billing_cycle_and_interval() | ||||||
|  | 
 | ||||||
|  | 		self.validate_plans_billing_cycle(billing_info) | ||||||
|  | 
 | ||||||
|  | 		if billing_info: | ||||||
|  | 			data = dict() | ||||||
|  | 			interval = billing_info[0]['billing_interval'] | ||||||
|  | 			interval_count = billing_info[0]['billing_interval_count'] | ||||||
|  | 			if interval not in ['Day', 'Week']: | ||||||
|  | 				data['days'] = -1 | ||||||
|  | 			if interval == 'Day': | ||||||
|  | 				data['days'] = interval_count - 1 | ||||||
|  | 			elif interval == 'Month': | ||||||
|  | 				data['months'] = interval_count | ||||||
|  | 			elif interval == 'Year': | ||||||
|  | 				data['years'] == interval_count | ||||||
|  | 			# todo: test week | ||||||
|  | 			elif interval == 'Week': | ||||||
|  | 				data['days'] = interval_count * 7 - 1 | ||||||
|  | 
 | ||||||
|  | 			return data | ||||||
| 
 | 
 | ||||||
| 	def before_save(self): | 	def before_save(self): | ||||||
| 		self.set_status() | 		self.set_status() | ||||||
| @ -89,6 +130,7 @@ class Subscriptions(Document): | |||||||
| 
 | 
 | ||||||
| 	def validate(self): | 	def validate(self): | ||||||
| 		self.validate_trial_period() | 		self.validate_trial_period() | ||||||
|  | 		self.validate_plans_billing_cycle(self.get_billing_cycle_and_interval()) | ||||||
| 
 | 
 | ||||||
| 	def validate_trial_period(self): | 	def validate_trial_period(self): | ||||||
| 		if self.trial_period_start and self.trial_period_end: | 		if self.trial_period_start and self.trial_period_end: | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user