diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 933112c..a1d345b 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index cd848e1..a855790 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 0c44493..6fb6114 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/migrations/0016_expensecategory_expense.py b/core/migrations/0016_expensecategory_expense.py new file mode 100644 index 0000000..98ccf52 --- /dev/null +++ b/core/migrations/0016_expensecategory_expense.py @@ -0,0 +1,43 @@ +# Generated by Django 5.2.7 on 2026-02-02 17:15 + +import django.db.models.deletion +import django.utils.timezone +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0015_userprofile'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='ExpenseCategory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name_en', models.CharField(max_length=100, verbose_name='Name (English)')), + ('name_ar', models.CharField(max_length=100, verbose_name='Name (Arabic)')), + ('description', models.TextField(blank=True, verbose_name='Description')), + ], + options={ + 'verbose_name_plural': 'Expense Categories', + }, + ), + migrations.CreateModel( + name='Expense', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.DecimalField(decimal_places=3, max_digits=15, verbose_name='Amount')), + ('date', models.DateField(default=django.utils.timezone.now, verbose_name='Date')), + ('description', models.TextField(blank=True, verbose_name='Description')), + ('attachment', models.FileField(blank=True, null=True, upload_to='expense_attachments/', verbose_name='Attachment')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expenses', to=settings.AUTH_USER_MODEL)), + ('payment_method', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expenses', to='core.paymentmethod')), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='expenses', to='core.expensecategory')), + ], + ), + ] diff --git a/core/migrations/__pycache__/0016_expensecategory_expense.cpython-311.pyc b/core/migrations/__pycache__/0016_expensecategory_expense.cpython-311.pyc new file mode 100644 index 0000000..4a3e0c7 Binary files /dev/null and b/core/migrations/__pycache__/0016_expensecategory_expense.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index 6d25482..4c5b59e 100644 --- a/core/models.py +++ b/core/models.py @@ -104,6 +104,30 @@ class PaymentMethod(models.Model): def __str__(self): return f"{self.name_en} / {self.name_ar}" +class ExpenseCategory(models.Model): + name_en = models.CharField(_("Name (English)"), max_length=100) + name_ar = models.CharField(_("Name (Arabic)"), max_length=100) + description = models.TextField(_("Description"), blank=True) + + class Meta: + verbose_name_plural = _("Expense Categories") + + def __str__(self): + return f"{self.name_en} / {self.name_ar}" + +class Expense(models.Model): + category = models.ForeignKey(ExpenseCategory, on_delete=models.CASCADE, related_name="expenses") + amount = models.DecimalField(_("Amount"), max_digits=15, decimal_places=3) + date = models.DateField(_("Date"), default=timezone.now) + description = models.TextField(_("Description"), blank=True) + payment_method = models.ForeignKey(PaymentMethod, on_delete=models.SET_NULL, null=True, blank=True, related_name="expenses") + created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name="expenses") + attachment = models.FileField(_("Attachment"), upload_to="expense_attachments/", blank=True, null=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"Expense {self.id} - {self.amount} ({self.category.name_en})" + class Sale(models.Model): PAYMENT_TYPE_CHOICES = [ ('cash', _('Cash')), @@ -357,4 +381,4 @@ def create_user_profile(sender, instance, created, **kwargs): def save_user_profile(sender, instance, **kwargs): if not hasattr(instance, 'profile'): UserProfile.objects.create(user=instance) - instance.profile.save() + instance.profile.save() \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 96b77d5..dd1e563 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -121,6 +121,26 @@ + +