diff --git a/.DS_Store b/.DS_Store index 24c3ea4..50fcb47 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/bookings/models.py b/bookings/models.py index 71a8362..a2beaba 100644 --- a/bookings/models.py +++ b/bookings/models.py @@ -1,3 +1,73 @@ from django.db import models +import uuid +from events.models import Event +from accounts.models import User # Create your models here. +class Ticket(models.Model): + event = models.ForeignKey(Event, on_delete=models.CASCADE) + ticket_name = models.CharField(max_length=250) + price_per_ticket = models.DecimalField(max_digits=10, decimal_places=2) + maximum_quantity = models.IntegerField() + available_quantity = models.IntegerField(default=0) + is_active = models.BooleanField(default=True) + created_date = models.DateField(auto_now_add=True) + updated_date = models.DateField(auto_now=True) + + def __str__(self): + return self.ticket_name + + +class TicketType(models.Model): + ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE) + ticket_type = models.CharField(max_length=250) + ticket_type_description = models.TextField() + quantity = models.IntegerField() + price = models.DecimalField(max_digits=10, decimal_places=2) + is_active = models.BooleanField(default=True) + created_date = models.DateField(auto_now_add=True) + updated_date = models.DateField(auto_now=True) + + is_offer = models.BooleanField(default=False) + offer_percentage = models.IntegerField(default=0) + offer_price = models.DecimalField(max_digits=10, decimal_places=2, default=0) + offer_start_date = models.DateField(blank=True, null=True) + offer_end_date = models.DateField(blank=True, null=True) + + + def __str__(self): + return self.ticket_type + + +class Cart(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE) + ticket_type = models.ForeignKey(TicketType, on_delete=models.CASCADE) + quantity = models.IntegerField() + price = models.DecimalField(max_digits=10, decimal_places=2) + created_date = models.DateField(auto_now_add=True) + updated_date = models.DateField(auto_now=True) + + def __str__(self): + return self.user.username + " - " + self.ticket.event.name + + +class Booking(models.Model): + booking_id = models.CharField(max_length=250) + user = models.ForeignKey(User, on_delete=models.CASCADE) + ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE) + ticket_type = models.ForeignKey(TicketType, on_delete=models.CASCADE) + quantity = models.IntegerField() + price = models.DecimalField(max_digits=10, decimal_places=2) + created_date = models.DateField(auto_now_add=True) + updated_date = models.DateField(auto_now=True) + + transaction_id = models.CharField(max_length=250, blank=True, null=True) + + def __save__(self): + if not self.booking_id: + self.booking_id = str(self.ticket.event.name[:3].upper()) + str(uuid.uuid4().hex[:10]).upper() + super().save(*args, **kwargs) + + def __str__(self): + return self.booking_id \ No newline at end of file diff --git a/bookings/tickets_view/__init__.py b/bookings/tickets_view/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ledger/__init__.py b/ledger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ledger/admin.py b/ledger/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/ledger/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/ledger/apps.py b/ledger/apps.py new file mode 100644 index 0000000..61287d0 --- /dev/null +++ b/ledger/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LedgerConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'ledger' diff --git a/ledger/migrations/__init__.py b/ledger/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ledger/models.py b/ledger/models.py new file mode 100644 index 0000000..454d58b --- /dev/null +++ b/ledger/models.py @@ -0,0 +1,70 @@ +from django.db import models +from django.conf import settings + +User = settings.AUTH_USER_MODEL + +class RazorpayTransaction(models.Model): + # Optional: who this transaction relates to + user = models.ForeignKey(User, + on_delete=models.SET_NULL, + null=True, blank=True, + related_name="razorpay_transactions", + ) + + # Razorpay identifiers + razorpay_order_id = models.CharField(max_length=191, unique=True) + razorpay_payment_id = models.CharField(max_length=191, blank=True, null=True) + razorpay_signature = models.CharField(max_length=255, blank=True, null=True) + + # Generic linkage to any domain object (order, booking, wallet topup, etc.) + reference_type = models.CharField( + max_length=100, + blank=True, null=True, + help_text="What this payment is for, e.g. 'booking', 'wallet_topup', 'ticket'", + ) + transaction_id = models.CharField( + max_length=100, + blank=True, null=True, + help_text="ID of the related for the transaction", + ) + + # Amount info (Razorpay uses smallest unit, e.g. paise) + amount = models.BigIntegerField(help_text="Amount in paise") + currency = models.CharField(max_length=10, default="INR") + + # Status & method + status = models.CharField( + max_length=50, + help_text="created/authorized/captured/failed/refunded", + ) + method = models.CharField( + max_length=50, + blank=True, null=True, + help_text="card/netbanking/wallet/upi/etc", + ) + email = models.EmailField(blank=True, null=True) + contact = models.CharField(max_length=20, blank=True, null=True) + + # Errors + error_code = models.CharField(max_length=100, blank=True, null=True) + error_description = models.TextField(blank=True, null=True) + + # Extra data + notes = models.JSONField(blank=True, null=True) + raw_gateway_response = models.JSONField( + blank=True, null=True, + help_text="Full payload from Razorpay", + ) + + # Timestamps + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + captured_at = models.DateTimeField(blank=True, null=True) + + def __str__(self): + return f"{self.razorpay_payment_id or self.razorpay_order_id} - {self.status}" + + def __save__(self): + if not self.transaction_id: + self.transaction_id = str(uuid.uuid4().hex[:10]).upper() + super().save(*args, **kwargs) diff --git a/ledger/tests.py b/ledger/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/ledger/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/ledger/views.py b/ledger/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/ledger/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.