diff --git a/car_inventory/__pycache__/settings.cpython-311.pyc b/car_inventory/__pycache__/settings.cpython-311.pyc index 95d4c00b..862c29ac 100644 Binary files a/car_inventory/__pycache__/settings.cpython-311.pyc and b/car_inventory/__pycache__/settings.cpython-311.pyc differ diff --git a/car_inventory/settings.py b/car_inventory/settings.py index f955b516..cbe804fd 100644 --- a/car_inventory/settings.py +++ b/car_inventory/settings.py @@ -110,20 +110,10 @@ DATABASES = { "NAME": "haikal", "USER": "haikal", "PASSWORD": "haikal", - "HOST": "localhost", + "HOST": "10.10.1.120", "PORT": 5432, } } -# DATABASES = { -# "default": { -# "ENGINE": "django_prometheus.db.backends.postgresql", -# "NAME": "murad_haikal", -# "USER": "f95166", -# "PASSWORD": "Kfsh&rc9788", -# "HOST": "localhost", -# "PORT": 5432, -# } -# } # Password validation # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators diff --git a/inventory/__pycache__/models.cpython-311.pyc b/inventory/__pycache__/models.cpython-311.pyc index c95fcdda..28a3466a 100644 Binary files a/inventory/__pycache__/models.cpython-311.pyc and b/inventory/__pycache__/models.cpython-311.pyc differ diff --git a/inventory/__pycache__/urls.cpython-311.pyc b/inventory/__pycache__/urls.cpython-311.pyc index eef291b6..e99fb01d 100644 Binary files a/inventory/__pycache__/urls.cpython-311.pyc and b/inventory/__pycache__/urls.cpython-311.pyc differ diff --git a/inventory/__pycache__/views.cpython-311.pyc b/inventory/__pycache__/views.cpython-311.pyc index 2b8c0b67..c1a83824 100644 Binary files a/inventory/__pycache__/views.cpython-311.pyc and b/inventory/__pycache__/views.cpython-311.pyc differ diff --git a/inventory/migrations/0014_payment_refund.py b/inventory/migrations/0014_payment_refund.py new file mode 100644 index 00000000..4e5748f9 --- /dev/null +++ b/inventory/migrations/0014_payment_refund.py @@ -0,0 +1,43 @@ +# Generated by Django 5.1.4 on 2024-12-24 14:43 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0013_salequotation_is_paid'), + ] + + operations = [ + migrations.CreateModel( + name='Payment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')), + ('payment_method', models.CharField(choices=[('cash', 'cash'), ('credit', 'credit'), ('transfer', 'transfer'), ('debit', 'debit'), ('SADAD', 'SADAD')], max_length=50, verbose_name='method')), + ('reference_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='reference number')), + ('payment_date', models.DateField(auto_now_add=True, verbose_name='date')), + ('quotation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to='inventory.salequotation')), + ], + options={ + 'verbose_name': 'payment', + 'verbose_name_plural': 'payments', + }, + ), + migrations.CreateModel( + name='Refund', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')), + ('reason', models.TextField(blank=True, verbose_name='reason')), + ('refund_date', models.DateField(auto_now_add=True, verbose_name='refund date')), + ('payment', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='refund', to='inventory.payment')), + ], + options={ + 'verbose_name': 'refund', + 'verbose_name_plural': 'refunds', + }, + ), + ] diff --git a/inventory/signals.py b/inventory/signals.py index 77e62bca..ea65b4c4 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -1,18 +1,9 @@ from random import randint -from django.db.models.signals import post_save, post_delete,pre_delete +from django.db.models.signals import post_save, post_delete, pre_delete, pre_save from django.dispatch import receiver -from django_ledger.views import JournalEntryCreateView -from django_ledger.models import ( - EntityModel, - VendorModel, - CustomerModel, - UnitOfMeasureModel, - AccountModel, - ItemModelAbstract, - ItemModel -) -from django.contrib.auth import get_user_model +from django.utils import timezone +from django_ledger.models import EntityModel from django.utils.translation import gettext_lazy as _ @@ -73,25 +64,22 @@ def update_car_status_on_reservation_delete(sender, instance, **kwargs): @receiver(post_save, sender=models.Dealer) def create_ledger_entity(sender, instance, created, **kwargs): if created: - # Group.objects.get(name=instance.dealer_type.lower()).user_set.add(instance.user) - try: - entity, created = EntityModel.objects.get_or_create( - name=instance.get_root_dealer.name, - admin=instance.get_root_dealer.user, - # address_1=instance.address, - accrual_method=False, - fy_start_month=1, - depth=0, - ) - if created: - default_coa = entity.create_chart_of_accounts( - assign_as_default=True, commit=True, coa_name=_("Chart of Accounts") - ) - if default_coa: - entity.populate_default_coa( - activate_accounts=True, coa_model=default_coa - ) - print(f"Ledger entity created for Dealer: {instance.name}") + entity, created = EntityModel.objects.get_or_create( + name=instance.get_root_dealer.name, + admin=instance.get_root_dealer.user, + # address_1=instance.address, + accrual_method=False, + fy_start_month=1, + depth=0, + ) + print(entity) + if created: + default_coa = entity.create_chart_of_accounts(assign_as_default=True, + commit=True, + coa_name=_("Chart of Accounts")) + if default_coa: + entity.populate_default_coa(activate_accounts=True, coa_model=default_coa) + print(f"Ledger entity created for Dealer: {instance.name}") # entity.create_account( # coa_model=coa, @@ -156,7 +144,7 @@ def create_ledger_vendor(sender, instance, created, **kwargs): entity = EntityModel.objects.filter(name=instance.dealer.name).first() entity.create_vendor( - vendor_name=instance.name, + name=instance.name, vendor_number=instance.crn, address_1=instance.address, phone=instance.phone_number, @@ -264,3 +252,26 @@ def create_customer(sender, instance, created, **kwargs): # default_amount=instance.cost_price, # ) # print(f"Inventory item updated with CarFinance data for Car: {instance.car}") + + +@receiver(pre_save, sender=models.SaleQuotation) +def update_quotation_status(sender, instance, **kwargs): + if instance.valid_until and timezone.now() > instance.valid_until: + instance.status = 'expired' + # instance.total_price = instance.calculate_total_price() + + +@receiver(post_save, sender=models.Payment) +def update_status_on_payment(sender, instance, created, **kwargs): + if created: + quotation = instance.sale_quotation + total_payments = sum(payment.amount for payment in quotation.payments.all()) + if total_payments >= quotation.amount: + quotation.status = 'completed' + # SalesInvoice.objects.create(sales_order=order) + elif total_payments > 0: + quotation.status = 'partially_paid' + else: + quotation.status = 'pending' + quotation.save() +