from django.db import models from osinacore.models import * import requests # Create your models here. class Item(models.Model): TYPE = ( ('Product', 'Product'), ('Service', 'Service'), ) type = models.CharField(max_length=200, choices=TYPE, null=True) title = models.CharField(max_length=200) description = models.TextField(blank=True) customer = models.ForeignKey(CustomerProfile, null=True, blank=True, on_delete=models.CASCADE) item_type = models.ForeignKey(ProjectType, on_delete=models.CASCADE, null=True, blank=True) amount = models.FloatField(null=True) recurring = models.BooleanField(default=False) def __str__(self): return self.title class RecurringCycle(models.Model): item = models.ForeignKey(Item, on_delete=models.CASCADE, null=True) months = models.IntegerField() cycle_price = models.FloatField(null=True) def __str__(self): return f"{self.months} months" class Order(models.Model): STATUS = ( ('Completed', 'Completed'), ('Failed', 'Failed'), ('Cancelled', 'Cancelled'), ('None', 'None'), ('Pending', 'Pending'), ) customer = models.ForeignKey(CustomerProfile, on_delete=models.CASCADE) business = models.ForeignKey(Business, on_delete=models.SET_NULL, null=True, blank=True) status = models.CharField(max_length=200, choices=STATUS, default='None') order_id = models.CharField(max_length=100, null=True, blank=True) due_date = models.DateField(null=True, blank=True) @property def get_cart_total(self): orderitems = self.orderitem_set.all() total = sum([item.get_total for item in orderitems]) return total def save(self, *args, **kwargs): if not self.order_id: order_count = Order.objects.filter(customer=self.customer).count() order_count_str = str(order_count).zfill(4) self.order_id = f"{self.customer.customer_id}-{order_count_str}" super(Order, self).save(*args, **kwargs) class OrderItem(models.Model): order = models.ForeignKey(Order, on_delete=models.CASCADE) item = models.ForeignKey(Item, on_delete=models.CASCADE) active = models.BooleanField(default=False, null=True) purchased_at = models.DateField(null=True, blank=True) end_at = models.DateField(blank=True, null=True) terminated_at = models.DateField(blank=True, null=True) recurring_cycle = models.ForeignKey(RecurringCycle, on_delete=models.SET_NULL, null=True, blank=True) @property def get_total(self): if self.recurring_cycle: total = self.recurring_cycle.cycle_price else: total = self.item.amount total = round(total, 2) return total def save(self, *args, **kwargs): if self.purchased_at: try: customer_email = self.order.customer.user.email plan_name = self.item.title payload = { 'email': customer_email, 'plan': plan_name } response = requests.post('https://osimenu.com/api/create-subscription/', data=payload) if response.status_code == 201: print('Subscription created successfully') else: print('Failed to create subscription') except Exception as e: print(f'Error creating subscription: {e}') super(OrderItem, self).save(*args, **kwargs) class Invoice(models.Model): invoice_number = models.CharField(max_length=100, null=True, blank=True) order = models.OneToOneField(Order, on_delete=models.SET_NULL, null=True) date_created = models.DateField() pdf = models.FileField(upload_to='uploaded_images', null=True, blank=True) def __str__(self): return self.invoice_number def save(self, *args, **kwargs): if not self.invoice_number: current_year = str(timezone.now().year)[-2:] last_invoice = Invoice.objects.filter(invoice_number__startswith=current_year).order_by('-invoice_number').first() if last_invoice: last_invoice_number = int(last_invoice.invoice_number.split('-')[1].split('+')[0]) new_invoice_number = f"${current_year}-{last_invoice_number + 1}" else: new_invoice_number = f"${current_year}-1425" self.invoice_number = new_invoice_number super().save(*args, **kwargs) class PaymentType(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class OrderPayment(models.Model): order = models.ManyToManyField(Order, null=True) amount = models.DecimalField(decimal_places=3, max_digits = 5) date_paid = models.DateField() type = models.ForeignKey(PaymentType, null=True, on_delete=models.SET_NULL) comment = models.TextField(null=True, blank=True) def __str__(self): return f"Payment for {self.order}" class Receipt(models.Model): receipt_number = models.CharField(max_length=100) payment = models.ManyToManyField(OrderPayment) date_generated = models.DateField() def __str__(self): return self.receipt_number