| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  | import logging | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-02 09:18:46 +02:00
										 |  |  | from django.core.management.base import BaseCommand | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  | from hosting.models import MonthlyHostingBill | 
					
						
							| 
									
										
										
										
											2019-04-02 09:18:46 +02:00
										 |  |  | from membership.models import CustomUser | 
					
						
							|  |  |  | from utils.stripe_utils import StripeUtils | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  | logger = logging.getLogger(__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-02 09:18:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Command(BaseCommand): | 
					
						
							|  |  |  |     help = '''Fetches invoices from Stripe and creates bills for a given 
 | 
					
						
							|  |  |  |     customer in the MonthlyHostingBill model'''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def add_arguments(self, parser): | 
					
						
							|  |  |  |         parser.add_argument('customer_email', nargs='+', type=str) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle(self, *args, **options): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             for email in options['customer_email']: | 
					
						
							|  |  |  |                 stripe_utils = StripeUtils() | 
					
						
							|  |  |  |                 user = CustomUser.objects.get(email=email) | 
					
						
							|  |  |  |                 if hasattr(user, 'stripecustomer'): | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  |                     self.stdout.write(self.style.SUCCESS( | 
					
						
							|  |  |  |                         'Found %s. Fetching bills for him.' % email)) | 
					
						
							| 
									
										
										
										
											2019-04-03 06:22:49 +02:00
										 |  |  |                     mhb = MonthlyHostingBill.objects.filter( | 
					
						
							|  |  |  |                         customer=user.stripecustomer).last() | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  |                     created_gt = {} | 
					
						
							|  |  |  |                     if mhb is not None: | 
					
						
							|  |  |  |                         # fetch only invoices which is created after | 
					
						
							|  |  |  |                         # mhb.created, because we already have invoices till | 
					
						
							|  |  |  |                         # this date | 
					
						
							| 
									
										
										
										
											2019-04-13 15:00:19 +02:00
										 |  |  |                         created_gt = int(mhb.created.timestamp()) | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     all_invoices_response = stripe_utils.get_all_invoices( | 
					
						
							|  |  |  |                         user.stripecustomer.stripe_id, | 
					
						
							| 
									
										
										
										
											2019-04-13 12:54:57 +02:00
										 |  |  |                         created_gt=created_gt | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2019-04-03 06:59:05 +02:00
										 |  |  |                     if all_invoices_response['error'] is not None: | 
					
						
							|  |  |  |                         self.stdout.write(self.style.ERROR(all_invoices_response['error'])) | 
					
						
							|  |  |  |                         exit(1) | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  |                     all_invoices = all_invoices_response['response_object'] | 
					
						
							| 
									
										
										
										
											2019-04-03 06:59:05 +02:00
										 |  |  |                     self.stdout.write(self.style.SUCCESS("Obtained {} invoices".format(len(all_invoices) if all_invoices is not None else 0))) | 
					
						
							| 
									
										
										
										
											2019-04-20 07:31:32 +02:00
										 |  |  |                     num_invoice_created = 0 | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  |                     for invoice in all_invoices: | 
					
						
							| 
									
										
										
										
											2019-04-03 09:03:58 +02:00
										 |  |  |                         invoice['customer'] = user.stripecustomer | 
					
						
							| 
									
										
										
										
											2019-05-13 21:15:38 +02:00
										 |  |  |                         try: | 
					
						
							|  |  |  |                             existing_mhb = MonthlyHostingBill.objects.get(invoice_id=invoice['invoice_id']) | 
					
						
							|  |  |  |                             logger.debug("Invoice %s exists already. Not importing." % invoice['invoice_id']) | 
					
						
							|  |  |  |                         except MonthlyHostingBill.DoesNotExist as dne: | 
					
						
							|  |  |  |                             logger.debug("Invoice id %s does not exist" % invoice['invoice_id']) | 
					
						
							|  |  |  |                             num_invoice_created += 1 if MonthlyHostingBill.create(invoice) is not None else logger.error("Did not import invoice for %s" % str(invoice)) | 
					
						
							| 
									
										
										
										
											2019-04-20 07:31:32 +02:00
										 |  |  |                     self.stdout.write( | 
					
						
							|  |  |  |                         self.style.SUCCESS("Number of invoices imported = %s" % num_invoice_created) | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2019-04-02 09:18:46 +02:00
										 |  |  |                 else: | 
					
						
							| 
									
										
										
										
											2019-04-03 06:12:48 +02:00
										 |  |  |                     self.stdout.write(self.style.SUCCESS( | 
					
						
							|  |  |  |                         'Customer email %s does not have a stripe customer.' % email)) | 
					
						
							| 
									
										
										
										
											2019-04-02 09:18:46 +02:00
										 |  |  |         except Exception as e: | 
					
						
							|  |  |  |             print(" *** Error occurred. Details {}".format(str(e))) |