From c03fe9d85ac796ec2ec288bf4ac0bf7c30817c21 Mon Sep 17 00:00:00 2001 From: ismail Date: Tue, 22 Jul 2025 14:59:19 +0300 Subject: [PATCH] fix the delay in caused by the notification and switch to channels --- car_inventory/asgi.py | 33 +- car_inventory/urls.py | 5 +- haikalbot/migrations/0001_initial.py | 2 +- haikalbot/migrations/0002_initial.py | 2 +- inventory/forms.py | 51 +- inventory/management/commands/led.py | 79 +++ inventory/management/commands/seed.py | 117 ++++ inventory/management/commands/seed1.py | 242 +++++++ inventory/middleware.py | 50 +- inventory/migrations/0001_initial.py | 12 +- inventory/models.py | 63 +- inventory/notifications/__init__.py | 0 inventory/notifications/sse.py | 205 ++++++ inventory/override.py | 314 ++++++++- inventory/signals.py | 72 +- inventory/tasks.py | 25 +- inventory/templatetags/custom_filters.py | 11 + inventory/urls.py | 39 +- inventory/utils.py | 621 ++++++++++++------ inventory/views.py | 308 +++++---- .../56d21851a30bf81ad30874af4c9f0290.webp | Bin 0 -> 450 bytes .../138397308bd57adbff0504b57626b17b.webp | Bin 0 -> 1240 bytes static/images/logos/staff/customer2.jpg | Bin 0 -> 30523 bytes static/images/logos/users/customer1.jpg | Bin 0 -> 51643 bytes static/images/user-logo.png | Bin 0 -> 814 bytes static/user-logo.png | Bin 0 -> 814 bytes .../56d21851a30bf81ad30874af4c9f0290.webp | Bin 0 -> 450 bytes .../138397308bd57adbff0504b57626b17b.webp | Bin 0 -> 1240 bytes staticfiles/images/logos/staff/customer2.jpg | Bin 0 -> 30523 bytes staticfiles/images/logos/users/customer1.jpg | Bin 0 -> 51643 bytes staticfiles/images/user-logo.png | Bin 0 -> 814 bytes staticfiles/js/formSubmitHandler.js | 51 ++ staticfiles/user-logo.png | Bin 0 -> 814 bytes templates/base.html | 10 +- templates/bill/bill_update.html | 3 +- templates/bill/tags/bill_item_formset.html | 10 +- templates/components/email_modal.html | 16 + templates/crm/leads/lead_detail.html | 69 +- templates/crm/leads/lead_form.html | 2 +- templates/crm/leads/lead_send.html | 5 +- .../crm/opportunities/opportunity_detail.html | 58 +- .../crm/opportunities/opportunity_form.html | 8 +- templates/inventory/car_detail.html | 4 + templates/ledger/ledger/ledger_list.html | 2 +- templates/notifications.html | 25 +- .../sales/estimates/estimate_detail.html | 4 +- .../sales/estimates/sale_order_form.html | 261 +------- templates/sales/invoices/invoice_detail.html | 3 + templates/sales/invoices/invoice_list.html | 2 +- templates/sales/invoices/invoice_update.html | 29 + templates/sales/journals/journal_list.html | 2 +- templates/sales/orders/order_details.html | 2 +- templates/sales/orders/order_list.html | 2 +- templates/sales/payments/payment_form1.html | 43 ++ templates/sales/payments/payment_list.html | 2 +- templates/sales/saleorder_detail.html | 71 +- templates/sales/sales_list.html | 2 +- .../sales/tags/invoice_item_formset.html | 73 ++ templates/users/user_form.html | 4 +- templates/users/user_list.html | 4 +- 60 files changed, 2169 insertions(+), 849 deletions(-) create mode 100644 inventory/management/commands/led.py create mode 100644 inventory/management/commands/seed.py create mode 100644 inventory/management/commands/seed1.py create mode 100644 inventory/notifications/__init__.py create mode 100644 inventory/notifications/sse.py create mode 100644 static/images/CACHE/images/logos/staff/customer2/56d21851a30bf81ad30874af4c9f0290.webp create mode 100644 static/images/CACHE/images/user-logo/138397308bd57adbff0504b57626b17b.webp create mode 100644 static/images/logos/staff/customer2.jpg create mode 100644 static/images/logos/users/customer1.jpg create mode 100644 static/images/user-logo.png create mode 100644 static/user-logo.png create mode 100644 staticfiles/images/CACHE/images/logos/staff/customer2/56d21851a30bf81ad30874af4c9f0290.webp create mode 100644 staticfiles/images/CACHE/images/user-logo/138397308bd57adbff0504b57626b17b.webp create mode 100644 staticfiles/images/logos/staff/customer2.jpg create mode 100644 staticfiles/images/logos/users/customer1.jpg create mode 100644 staticfiles/images/user-logo.png create mode 100644 staticfiles/js/formSubmitHandler.js create mode 100644 staticfiles/user-logo.png create mode 100644 templates/components/email_modal.html create mode 100644 templates/sales/invoices/invoice_update.html create mode 100644 templates/sales/payments/payment_form1.html create mode 100644 templates/sales/tags/invoice_item_formset.html diff --git a/car_inventory/asgi.py b/car_inventory/asgi.py index 206c8884..6eba063c 100644 --- a/car_inventory/asgi.py +++ b/car_inventory/asgi.py @@ -10,16 +10,31 @@ https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ # asgi.py import os -from django.core.asgi import get_asgi_application +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "car_inventory.settings") + +import django +django.setup() + + +from django.urls import path from channels.routing import ProtocolTypeRouter, URLRouter from channels.auth import AuthMiddlewareStack from api import routing +from inventory.notifications.sse import NotificationSSEApp +from django.urls import re_path +from django.core.asgi import get_asgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "car_inventory.settings") - -application = ProtocolTypeRouter( - { - "http": get_asgi_application(), - "websocket": AuthMiddlewareStack(URLRouter(routing.websocket_urlpatterns)), - } -) +# application = ProtocolTypeRouter( +# { +# "http": get_asgi_application(), +# # "websocket": AuthMiddlewareStack(URLRouter(routing.websocket_urlpatterns)), +# } +# ) +application = ProtocolTypeRouter({ + "http": AuthMiddlewareStack( + URLRouter([ + path("sse/notifications/", NotificationSSEApp()), + re_path(r"", get_asgi_application()), # All other routes go to Django + ]) + ), +}) \ No newline at end of file diff --git a/car_inventory/urls.py b/car_inventory/urls.py index 906c1c91..1917a67b 100644 --- a/car_inventory/urls.py +++ b/car_inventory/urls.py @@ -4,9 +4,9 @@ from django.conf.urls.static import static from django.conf import settings from django.conf.urls.i18n import i18n_patterns from inventory import views -# from debug_toolbar.toolbar import debug_toolbar_urls - + # from debug_toolbar.toolbar import debug_toolbar_urls +from inventory.notifications.sse import NotificationSSEApp # import debug_toolbar from schema_graph.views import Schema # from two_factor.urls import urlpatterns as tf_urls @@ -30,6 +30,7 @@ urlpatterns += i18n_patterns( path("plans/", include("plans.urls")), path("schema/", Schema.as_view()), path("tours/", include("tours.urls")), + # path('', include(tf_urls)), ) diff --git a/haikalbot/migrations/0001_initial.py b/haikalbot/migrations/0001_initial.py index ea907f56..9f36e19a 100644 --- a/haikalbot/migrations/0001_initial.py +++ b/haikalbot/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.4 on 2025-07-15 11:38 +# Generated by Django 5.2.4 on 2025-07-22 08:37 import django.db.models.deletion import django.utils.timezone diff --git a/haikalbot/migrations/0002_initial.py b/haikalbot/migrations/0002_initial.py index af1f353e..cee8307b 100644 --- a/haikalbot/migrations/0002_initial.py +++ b/haikalbot/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.4 on 2025-07-15 11:38 +# Generated by Django 5.2.4 on 2025-07-22 08:37 import django.db.models.deletion from django.db import migrations, models diff --git a/inventory/forms.py b/inventory/forms.py index e77ea00e..2292b217 100644 --- a/inventory/forms.py +++ b/inventory/forms.py @@ -430,25 +430,22 @@ class CarFinanceForm(forms.ModelForm): additional services associated with a car finance application. """ - additional_finances = forms.ModelMultipleChoiceField( - queryset=AdditionalServices.objects.all(), - widget=forms.CheckboxSelectMultiple(attrs={"class": "form-check-input"}), - required=False, - ) + # additional_finances = forms.ModelMultipleChoiceField( + # queryset=AdditionalServices.objects.all(), + # widget=forms.CheckboxSelectMultiple(attrs={"class": "form-check-input"}), + # required=False, + # ) class Meta: model = CarFinance - exclude = [ - "car", - "profit_margin", - "vat_amount", - "total", - "additional_services", - ] + fields = ["cost_price","marked_price"] def save(self, commit=True): instance = super().save() - instance.additional_services.set(self.cleaned_data["additional_finances"]) + try: + instance.additional_services.set(self.cleaned_data["additional_finances"]) + except KeyError: + pass instance.save() return instance @@ -1362,27 +1359,27 @@ class SaleOrderForm(forms.ModelForm): class Meta: model = SaleOrder fields = [ - "customer", + # "customer", "expected_delivery_date", - "estimate", - "opportunity", + # "estimate", + # "opportunity", "comments", - "order_date", - "status", + # "order_date", + # "status", ] widgets = { "expected_delivery_date": forms.DateInput( attrs={"type": "date", "label": _("Expected Delivery Date")} ), - "order_date": forms.DateInput( - attrs={"type": "date", "label": _("Order Date")} - ), - "customer": forms.Select( - attrs={ - "class": "form-control", - "label": _("Customer"), - } - ), + # "order_date": forms.DateInput( + # attrs={"type": "date", "label": _("Order Date")} + # ), + # "customer": forms.Select( + # attrs={ + # "class": "form-control", + # "label": _("Customer"), + # } + # ), } diff --git a/inventory/management/commands/led.py b/inventory/management/commands/led.py new file mode 100644 index 00000000..0b75e47e --- /dev/null +++ b/inventory/management/commands/led.py @@ -0,0 +1,79 @@ +from decimal import Decimal +import random +from django.core.management.base import BaseCommand +from inventory.models import Car +from django_ledger.models import EntityModel,InvoiceModel,ItemModel +from inventory.utils import CarFinanceCalculator +from rich import print +class Command(BaseCommand): + help = "" + + def handle(self, *args, **options): + e = EntityModel.objects.first() + customer = e.get_customers().first() + admin = e.admin + # estimate = e.get_estimates().first() + # e.create_invoice(coa_model=e.get_default_coa(), customer_model=customer, terms="net_30") + i=InvoiceModel.objects.first() + + calc = CarFinanceCalculator(i) + data = calc.get_finance_data() + for car_data in data['cars']: + car = i.get_itemtxs_data()[0].filter( + item_model__car__vin=car_data['vin'] + ).first().item_model.car + print("car", car) + qty = Decimal(car_data['quantity']) + print("qty", qty) + + # amounts from calculator + net_car_price = Decimal(car_data['total']) # after discount + net_add_price = Decimal(data['total_additionals']) # per car or split however you want + vat_amount = Decimal(data['total_vat_amount']) * qty # prorate if multi-qty + # grand_total = net_car_price + net_add_price + vat_amount + grand_total = Decimal(data['grand_total']) + cost_total = Decimal(car_data['cost_price']) * qty + + print("net_car_price", net_car_price, "net_add_price", net_add_price, "vat_amount", vat_amount, "grand_total", grand_total, "cost_total", cost_total) + + # acc_cars = e.get_coa_accounts().get(name="Inventory (Cars)") + # acc_sales = e.get_coa_accounts().get(name="Car Sales") + # acc_tax = e.get_coa_accounts().get(name="Tax-Payable") + # acc_service = e.get_coa_accounts().get(name="After-Sales Services") + # uom = e.get_uom_all().get(name="Unit") + # car_item = e.get_items_products().get(name='2025 Ford Mustang GT') + # car_item = e.create_item_product( + # name='2025 Ford Mustang GT', + # item_type=ItemModel.ITEM_TYPE_MATERIAL, + # uom_model=uom, + # coa_model=e.get_default_coa(), + # ) + # car_item.earnings_account=acc_sales + # car_item.save() + # service_item = e.get_items_services().get(name='Extended Warranty 5yr/60k') + # service_item = e.create_item_service( + # name='Extended Warranty 5yr/60k', + # uom_model=uom, + # coa_model=e.get_default_coa(), + # ) + # service_item.earnings_account=acc_service + # service_item.save() + # i.invoice_items.add(car_item) + # i.invoice_items.add(service_item) + + # invoices_item_models = i.invoice_items.all() + # invoice_itemtxs = { + # im.item_number: { + # 'unit_cost': Decimal(1500), + # 'unit_revenue': Decimal(1500), + # 'quantity': 1, + # 'total_amount': Decimal(1500), + # } for im in invoices_item_models + # } + # print(invoice_itemtxs) + # invoice_itemtxs = i.migrate_itemtxs(itemtxs=invoice_itemtxs, + # commit=True, + # operation=InvoiceModel.ITEMIZE_APPEND) + # print(i.amount_due) + + # i.save() \ No newline at end of file diff --git a/inventory/management/commands/seed.py b/inventory/management/commands/seed.py new file mode 100644 index 00000000..3c575c06 --- /dev/null +++ b/inventory/management/commands/seed.py @@ -0,0 +1,117 @@ +# /management/commands/seed_dealership.py +import json, random, string, decimal +from django.core.management.base import BaseCommand +from django.test import Client +from django.contrib.auth import get_user_model +from plans.models import Order, PlanPricing, AbstractOrder, UserPlan, BillingInfo,Plan +from inventory.tasks import create_user_dealer +from inventory import models # adjust import to your app +from django_q.tasks import async_task + +User = get_user_model() + +class Command(BaseCommand): + help = "Seed a full dealership via the real signup & downstream views" + + def add_arguments(self, parser): + parser.add_argument('--count', type=int, default=1, help='Number of dealers to seed') + + def handle(self, *args, **opts): + count = opts['count'] + client = Client() # lives inside management command + + for n in range(1, 10): + self.stdout.write(f"🚗 Seeding dealer #{n}") + self._create_dealer(client, n) + # self._create_cars(client, n) + # self._create_customers_and_sales(client, n) + self.stdout.write(self.style.SUCCESS(f"✅ Dealer #{n} ready")) + + # ---------------------------------------------------------- + # 1. Sign-up via the real view + # ---------------------------------------------------------- + def _create_dealer(self, client, n): + payload = { + "email": f"dealer{n}@example.com", + "password": "Password123", + "confirm_password": "Password123", + "name": f"Dealer #{n}", + "arabic_name": f"تاجر {n}", + "phone_number": "+96651234567", + "crn": f"CRN{n}000", + "vrn": f"VRN{n}000", + "address": f"Street {n}, Riyadh", + } + + dealer = create_user_dealer(payload['email'], payload['password'], payload['name'], payload['arabic_name'], payload['phone_number'], payload['crn'], payload['vrn'], payload['address']) + user = dealer.user + self._assign_random_plan(user) + self._services(dealer) + + # resp = client.post( + # "/en/signup/", # adjust URL if necessary + # data=json.dumps(payload), + # content_type="application/json", + # ) + # if resp.status_code != 200: + # raise Exception(f"Signup failed: {resp.content}") + + # # Log in + client.login(email=payload["email"], password=payload["password"]) + + return payload["email"] + + def _assign_random_plan(self,user): + """ + Pick a random Plan and create + initialize a UserPlan for the user. + """ + plans = Plan.objects.all() + if not plans.exists(): + raise ValueError("No plans found – please create at least one Plan record.") + + plan = random.choice(plans) + + user_plan, created = UserPlan.objects.get_or_create( + user=user, + defaults={'plan': plan, 'active': True} + ) + if created: + user_plan.initialize() + return user_plan + + def _services(self,dealer): + additional_services = [ + { + "name": "Vehicle registration transfer assistance", + "arabic_name": "مساعدة في نقل ملكية السيارة", + "price": decimal.Decimal(random.randrange(100, 1000)), + "description": "This is service 1", + }, + { + "name": "Paperwork collection", + "arabic_name": "جمع الأوراق", + "price": decimal.Decimal(random.randrange(100, 1000)), + "description": "This is service 2", + }, + { + "name": "Inspection and test drives", + "arabic_name": "فحص وقيادة تجريبية", + "price": decimal.Decimal(random.randrange(100, 1000)), + "description": "This is service 3", + }, + { + "name": "Shipping and transportation", + "arabic_name": "شحن ونقل", + "price": decimal.Decimal(random.randrange(100, 1000)), + "description": "This is service 4", + }, + ] + + for additional_service in additional_services: + models.AdditionalServices.objects.create( + name=additional_service["name"], + arabic_name=additional_service["arabic_name"], + price=additional_service["price"], + description=additional_service["description"], + dealer=dealer, + ) diff --git a/inventory/management/commands/seed1.py b/inventory/management/commands/seed1.py new file mode 100644 index 00000000..d40198f1 --- /dev/null +++ b/inventory/management/commands/seed1.py @@ -0,0 +1,242 @@ +import datetime +from time import sleep +import json, random, string, decimal +from django.core.management.base import BaseCommand +from django.test import Client +from django.contrib.auth import get_user_model +from plans.models import Order, PlanPricing, AbstractOrder, UserPlan, BillingInfo,Plan +from inventory.services import decodevin +from inventory.tasks import create_user_dealer +from inventory.models import AdditionalServices, Car, CarColors, CarFinance, CarMake, CustomGroup, Customer, Dealer, ExteriorColors, InteriorColors, Lead, UnitOfMeasure,Vendor,Staff +from django_ledger.models import PurchaseOrderModel,ItemTransactionModel,ItemModel,EntityModel +from django_q.tasks import async_task +from faker import Faker +from appointment.models import Appointment, AppointmentRequest, Service, StaffMember + +User = get_user_model() +fake = Faker() + +class Command(BaseCommand): + help = "Seed a full dealership via the real signup & downstream views" + + def add_arguments(self, parser): + parser.add_argument('--count', type=int, default=1, help='Number of dealers to seed') + + def handle(self, *args, **opts): + dealers = Dealer.objects.all() + + for dealer in dealers: + self._create_random_po(dealer) + self._create_random_vendors(dealer) + # self._create_random_staff(dealer) + # self._create_random_cars(dealer) + self._create_random_customers(dealer) + # self._create_randome_services(dealer) + + + # dealer = Dealer.objects.get(name="Dealer #6") + # coa_model = dealer.entity.get_default_coa() + # inventory_account = dealer.entity.get_all_accounts().get(name="Inventory (Cars)") + # uom = dealer.entity.get_uom_all().get(name="Unit") + # item = dealer.entity.create_item_inventory(coa_model=coa_model,inventory_account=inventory_account,uom_model=uom,item_type=ItemModel.ITEM_TYPE_MATERIAL, name=f"Test item {random.randint(1,9999)}") + # item = ItemTransactionModel.objects.create(item_name=f"Test item {random.randint(1,9999)}", entity=dealer.entity) + # po = PurchaseOrderModel.objects.first() + + self.stdout.write(self.style.SUCCESS(f"✅ PO created for {dealers}")) + + def _create_random_po(self, dealer): + for i in range(random.randint(1,70)): + try: + e: EntityModel = dealer.entity + e.create_purchase_order(po_title=f"Test PO {random.randint(1,9999)}-{i}") + except Exception as e: + pass + + def _create_random_vendors(self, dealer): + for i in range(random.randint(1,50)): + try: + name = fake.name() + n = random.randint(1,9999) + phone = f"05678{random.randint(0,9)}{random.randint(0,9)}{random.randint(0,9)}{random.randint(0,9)}{random.randint(0,9)}" + Vendor.objects.create(dealer=dealer, name=f"{name}{n}", arabic_name=f"{name}{n}", email=f"{name}{n}@tenhal.sa", phone_number=phone,crn=f"CRN {n}", vrn=f"VRN {n}", address=f"Address {fake.address()}",contact_person=f"Contact Person {name}{n}") + except Exception as e: + pass + + def _create_random_staff(self, dealer): + for i in range(5): + name = f"{fake.name()}{i}" + email = fake.email() + password = f"{fake.password()}{i}" + user = User.objects.create_user(username=email, email=email, password=password) + user.is_staff = True + user.save() + + staff_member = StaffMember.objects.create(user=user) + services = Service.objects.all() + for service in services: + staff_member.services_offered.add(service) + + staff = Staff.objects.create(dealer=dealer,staff_member=staff_member,name=name,arabic_name=name,phone_number=fake.phone_number(),active=True) + + groups = CustomGroup.objects.filter(dealer=dealer) + random_group = random.choice(list(groups)) + staff.add_group(random_group.group) + # for i in range(random.randint(1,15)): + # n = random.randint(1,9999) + # phone = f"05678{random.randint(1,9999)}{random.randint(1,9999)}{random.randint(1,9999)}{random.randint(1,9999)}{random.randint(1,9999)}" + # Vendor.objects.create(dealer=dealer, name=f"{fake.name}", arabic_name=f"{fake.first_name_female()} {fake.last_name_female()}", email=f"vendor{n}@test.com", phone_number=phone,crn=f"CRN {n}", vrn=f"VRN {n}", address=f"Address {fake.address()}",contact_person=f"Contact Person {n}") + + def _create_random_cars(self,dealer): + vendors = Vendor.objects.filter(dealer=dealer).all() + + vin_list = [ + "1B3ES56C13D120225", + "1GB4KYC86FF131536", + "1HSHXAHR15J136217", + "1G1ZT52845F231124", + "1J4GK48K43W721617", + "JTDBE32K430163717", + "1J4FA69S05P331572", + "2FMGK5D86EBD28496", + "KNADE243696530337", + "1N4AL21EX8N499928", + "1N4AL21E49N400571", + "1G2NW12E54C145398", + ] + for vin in vin_list: + try: + for _ in range(random.randint(1,2)): + vin = f"{vin[:-4]}{random.randint(0, 9)}{random.randint(0, 9)}{random.randint(0, 9)}{random.randint(0, 9)}" + result = decodevin(vin) + make = CarMake.objects.get(name=result["maker"]) + model = make.carmodel_set.filter(name__contains=result["model"]).first() + if not model or model == "": + model = random.choice(make.carmodel_set.all()) + year = result["modelYear"] + serie = random.choice(model.carserie_set.all()) + trim = random.choice(serie.cartrim_set.all()) + vendor = random.choice(vendors) + print(make, model, serie, trim, vendor,vin) + car = Car.objects.create( + vin=vin, + id_car_make=make, + id_car_model=model, + id_car_serie=serie, + id_car_trim=trim, + vendor=vendor, + year=(int(year) or 2025), + receiving_date=datetime.datetime.now(), + dealer=dealer, + mileage=0, + ) + print(car) + CarFinance.objects.create( + car=car, cost_price=random.randint(10000, 100000), selling_price=0,marked_price=random.randint(10000, 100000)+random.randint(2000, 7000) + ) + CarColors.objects.create( + car=car, + interior=random.choice(InteriorColors.objects.all()), + exterior=random.choice(ExteriorColors.objects.all()), + ) + print(make, model, serie, trim) + except Exception as e: + print(e) + + def _create_random_customers(self,dealer): + for i in range(random.randint(1,60)): + try: + c = Customer( + dealer=dealer, + title="MR", + first_name=fake.name(), + last_name=fake.last_name(), + gender="m", + email=fake.email(), + phone_number=fake.phone_number(), + address=fake.address(), + national_id=random.randint(1000000000, 9999999999), + ) + c.create_user_model() + c.create_customer_model() + c.save() + except Exception as e: + pass + + def _create_randome_services(self,dealer): + additional_services = [ + { + "name": "Vehicle registration transfer assistance", + "arabic_name": "مساعدة في نقل ملكية السيارة", + "price": decimal.Decimal(random.randrange(100, 1000)), + "description": "This is service 1", + }, + { + "name": "Paperwork collection", + "arabic_name": "جمع الأوراق", + "price": decimal.Decimal(random.randrange(100, 1000)), + "description": "This is service 2", + }, + { + "name": "Inspection and test drives", + "arabic_name": "فحص وقيادة تجريبية", + "price": decimal.Decimal(random.randrange(100, 1000)), + "description": "This is service 3", + }, + { + "name": "Shipping and transportation", + "arabic_name": "شحن ونقل", + "price": decimal.Decimal(random.randrange(100, 1000)), + "description": "This is service 4", + }, + ] + uom = UnitOfMeasure.EACH + for additional_service in additional_services: + AdditionalServices.objects.create( + name=additional_service["name"], + arabic_name=additional_service["arabic_name"], + price=additional_service["price"], + description=additional_service["description"], + dealer=dealer, + uom=uom + ) + + + def _create_random_lead(self,dealer): + for i in range(random.randint(1,60)): + try: + first_name = fake.name() + last_name = fake.last_name() + email = fake.email() + staff = random.choice(Staff.objects.filter(dealer=dealer)) + + make = random.choice(CarMake.objects.all()) + model = random.choice(make.carmodel_set.all()) + lead = Lead.objects.create( + dealer=dealer, + first_name=first_name, + last_name=last_name, + email=email, + address=fake.address(), + lead_type="customer", + id_car_make=make, + id_car_model=model, + source="website", + channel="website", + staff=staff + ) + c = Customer( + dealer=dealer, + title="MR", + first_name=fake.name(), + last_name=fake.last_name(), + gender="m", + email=fake.email(), + phone_number=fake.phone_number(), + address=fake.address(), + national_id=random.randint(1000000000, 9999999999), + ) + c.create_user_model() + c.create_customer_model() + c.save() + except Exception as e: + pass \ No newline at end of file diff --git a/inventory/middleware.py b/inventory/middleware.py index a7bef21b..dda82b5f 100644 --- a/inventory/middleware.py +++ b/inventory/middleware.py @@ -1,4 +1,5 @@ import logging +import time # from django.http import Http404, HttpResponseForbidden # from django.shortcuts import redirect @@ -44,33 +45,33 @@ logger = logging.getLogger("user_activity") # return request.META.get("REMOTE_ADDR") -class InjectParamsMiddleware: - """ - Middleware to add processed user-related parameters to the request object. +# class InjectParamsMiddleware: +# """ +# Middleware to add processed user-related parameters to the request object. - This middleware processes incoming requests to extract and enhance user - information, specifically linking user context such as `dealer` to the - request. It allows subsequent views and middlewares to access these enriched - request parameters with ease. +# This middleware processes incoming requests to extract and enhance user +# information, specifically linking user context such as `dealer` to the +# request. It allows subsequent views and middlewares to access these enriched +# request parameters with ease. - :ivar get_response: The callable to get the next middleware or view response. - :type get_response: Callable - """ +# :ivar get_response: The callable to get the next middleware or view response. +# :type get_response: Callable +# """ - def __init__(self, get_response): - self.get_response = get_response +# def __init__(self, get_response): +# self.get_response = get_response - def __call__(self, request): - try: - if request.user.is_authenticated: - request.dealer = get_user_type(request) - request.entity = request.dealer.entity - else: - request.dealer = None - except Exception: - pass - response = self.get_response(request) - return response +# def __call__(self, request): +# try: +# if request.user.is_authenticated: +# request.dealer = get_user_type(request) +# request.entity = request.dealer.entity +# else: +# request.dealer = None +# except Exception: +# pass +# response = self.get_response(request) +# return response class InjectDealerMiddleware: @@ -93,6 +94,7 @@ class InjectDealerMiddleware: def __call__(self, request): try: + start = time.time() if request.user.is_authenticated: request.is_dealer = False request.is_staff = False @@ -103,6 +105,7 @@ class InjectDealerMiddleware: if hasattr(request.user, "dealer"): request.is_dealer = True request.dealer = request.user.dealer + elif hasattr(request.user, "staffmember"): request.is_staff = True request.staff = request.user.staffmember.staff @@ -120,6 +123,7 @@ class InjectDealerMiddleware: request.is_inventory = True request.entity = request.dealer.entity request.admin = request.dealer.entity.admin + print("\033[92m⏱ Middleware time:", time.time() - start, "\033[0m") except Exception: pass response = self.get_response(request) diff --git a/inventory/migrations/0001_initial.py b/inventory/migrations/0001_initial.py index 68dd3af2..daaff725 100644 --- a/inventory/migrations/0001_initial.py +++ b/inventory/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.4 on 2025-07-15 11:38 +# Generated by Django 5.2.4 on 2025-07-22 08:37 import datetime import django.core.serializers.json @@ -48,7 +48,7 @@ class Migration(migrations.Migration): ('name', models.CharField(blank=True, max_length=255, null=True)), ('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)), ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), - ('logo', models.ImageField(blank=True, null=True, upload_to='car_make', verbose_name='logo')), + ('logo', models.ImageField(blank=True, default='user-logo.png', null=True, upload_to='car_make', verbose_name='logo')), ('is_sa_import', models.BooleanField(default=False)), ('car_type', models.SmallIntegerField(blank=True, choices=[(1, 'Car'), (2, 'Light Commercial'), (3, 'Heavy-Duty Tractors'), (4, 'Trailers'), (5, 'Medium Trucks'), (6, 'Buses'), (20, 'Motorcycles'), (21, 'Buggy'), (22, 'Moto ATV'), (23, 'Scooters'), (24, 'Karting'), (25, 'ATV'), (26, 'Snowmobiles')], null=True)), ], @@ -253,7 +253,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=255, verbose_name='English Name')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), - ('logo', models.ImageField(blank=True, default='logo.png', null=True, upload_to='logos/users', verbose_name='Logo')), + ('logo', models.ImageField(blank=True, default='user-logo.png', null=True, upload_to='logos/users', verbose_name='Logo')), ('joined_at', models.DateTimeField(auto_now_add=True, verbose_name='Joined At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)), @@ -566,7 +566,7 @@ class Migration(migrations.Migration): ('email', models.EmailField(max_length=254, verbose_name='Email')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), - ('logo', models.ImageField(blank=True, null=True, upload_to='logos', verbose_name='Logo')), + ('logo', models.ImageField(blank=True, default='user-logo.png', null=True, upload_to='logos', verbose_name='Logo')), ('active', models.BooleanField(default=True, verbose_name='Active')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), @@ -772,7 +772,7 @@ class Migration(migrations.Migration): ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('staff_type', models.CharField(choices=[('inventory', 'Inventory'), ('accountant', 'Accountant'), ('sales', 'Sales')], max_length=255, verbose_name='Staff Type')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), - ('logo', models.ImageField(blank=True, null=True, upload_to='logos/staff', verbose_name='Image')), + ('logo', models.ImageField(blank=True, default='user-logo.png', null=True, upload_to='logos/staff', verbose_name='Image')), ('active', models.BooleanField(default=True, verbose_name='Active')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), @@ -872,7 +872,7 @@ class Migration(migrations.Migration): ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('email', models.EmailField(max_length=255, verbose_name='Email Address')), ('address', models.CharField(max_length=200, verbose_name='Address')), - ('logo', models.ImageField(blank=True, null=True, upload_to='logos/vendors', verbose_name='Logo')), + ('logo', models.ImageField(blank=True, default='user-logo.png', null=True, upload_to='logos/vendors', verbose_name='Logo')), ('active', models.BooleanField(default=True, verbose_name='Active')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True, verbose_name='Slug')), diff --git a/inventory/models.py b/inventory/models.py index df0353d7..c7a5e7c6 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -223,7 +223,7 @@ class CarMake(models.Model, LocalizedNameMixin): name = models.CharField(max_length=255, blank=True, null=True) slug = models.SlugField(max_length=255, unique=True, blank=True, null=True) arabic_name = models.CharField(max_length=255, blank=True, null=True) - logo = models.ImageField(_("logo"), upload_to="car_make", blank=True, null=True) + logo = models.ImageField(_("logo"), upload_to="car_make", blank=True, null=True,default="user-logo.png") is_sa_import = models.BooleanField(default=False) car_type = models.SmallIntegerField(choices=CarType.choices, blank=True, null=True) @@ -719,6 +719,12 @@ class Car(Base): return active_reservations.exists() @property + def logo(self): + return getattr(self.id_car_make, "logo", "") + @property + def additional_services(self): + return self.finances.additional_services.all() + @property def ready(self): try: return all( @@ -1174,7 +1180,13 @@ class Dealer(models.Model, LocalizedNameMixin): blank=True, null=True, verbose_name=_("Logo"), - default="logo.png", + default="user-logo.png", + ) + thumbnail = ImageSpecField( + source="logo", + processors=[ResizeToFill(40, 40)], + format="WEBP", + options={"quality": 80}, ) entity = models.ForeignKey( EntityModel, on_delete=models.SET_NULL, null=True, blank=True @@ -1272,7 +1284,7 @@ class Staff(models.Model, LocalizedNameMixin): max_length=200, blank=True, null=True, verbose_name=_("Address") ) logo = models.ImageField( - upload_to="logos/staff", blank=True, null=True, verbose_name=_("Image") + upload_to="logos/staff", blank=True, null=True, verbose_name=_("Image"),default="user-logo.png" ) thumbnail = ImageSpecField( source="logo", @@ -1497,6 +1509,12 @@ class Customer(models.Model): image = models.ImageField( upload_to="customers/", blank=True, null=True, verbose_name=_("Image") ) + thumbnail = ImageSpecField( + source="image", + processors=[ResizeToFill(40, 40)], + format="WEBP", + options={"quality": 80}, + ) created = models.DateTimeField(auto_now_add=True, verbose_name=_("Created")) updated = models.DateTimeField(auto_now=True, verbose_name=_("Updated")) slug = models.SlugField( @@ -1639,7 +1657,13 @@ class Organization(models.Model, LocalizedNameMixin): max_length=200, blank=True, null=True, verbose_name=_("Address") ) logo = models.ImageField( - upload_to="logos", blank=True, null=True, verbose_name=_("Logo") + upload_to="logos", blank=True, null=True, verbose_name=_("Logo"),default="user-logo.png" + ) + thumbnail = ImageSpecField( + source="logo", + processors=[ResizeToFill(40, 40)], + format="WEBP", + options={"quality": 80}, ) active = models.BooleanField(default=True, verbose_name=_("Active")) created = models.DateTimeField(auto_now_add=True, verbose_name=_("Created")) @@ -2453,7 +2477,13 @@ class Vendor(models.Model, LocalizedNameMixin): email = models.EmailField(max_length=255, verbose_name=_("Email Address")) address = models.CharField(max_length=200, verbose_name=_("Address")) logo = models.ImageField( - upload_to="logos/vendors", blank=True, null=True, verbose_name=_("Logo") + upload_to="logos/vendors", blank=True, null=True, verbose_name=_("Logo"),default="user-logo.png" + ) + thumbnail = ImageSpecField( + source="logo", + processors=[ResizeToFill(40, 40)], + format="WEBP", + options={"quality": 80}, ) active = models.BooleanField(default=True, verbose_name=_("Active")) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created At")) @@ -2776,7 +2806,7 @@ class SaleOrder(models.Model): if self.invoice: # Check if get_itemtxs_data returns data before proceeding # You might want to handle what get_itemtxs_data returns if it can be empty - item_data = self.invoice.get_itemtxs_data() + item_data = self.estimate.get_itemtxs_data()[0] if item_data: return item_data return [] # Return an empty list if no invoice or no item data @@ -3301,7 +3331,7 @@ class ExtraInfo(models.Model): return f"ExtraInfo for {self.content_object} ({self.content_type})" @classmethod - def get_sale_orders(cls, staff=None, is_dealer=False): + def get_sale_orders(cls, staff=None, is_dealer=False,dealer=None): if not staff and not is_dealer: return [] @@ -3310,12 +3340,18 @@ class ExtraInfo(models.Model): if is_dealer: qs = cls.objects.filter( + dealer=dealer, content_type=content_type, related_content_type=related_content_type, related_object_id__isnull=False, - ) + ).union(cls.objects.filter( + dealer=dealer, + content_type=ContentType.objects.get_for_model(EstimateModel), + related_content_type=ContentType.objects.get_for_model(User), + )) else: qs = cls.objects.filter( + dealer=dealer, content_type=content_type, related_content_type=related_content_type, related_object_id=staff.pk, @@ -3330,7 +3366,7 @@ class ExtraInfo(models.Model): ] @classmethod - def get_invoices(cls, staff=None, is_dealer=False): + def get_invoices(cls, staff=None, is_dealer=False,dealer=None): if not staff and not is_dealer: return [] @@ -3339,17 +3375,22 @@ class ExtraInfo(models.Model): if is_dealer: qs = cls.objects.filter( + dealer=dealer, content_type=content_type, related_content_type=related_content_type, related_object_id__isnull=False, - ) + ).union(cls.objects.filter( + dealer=dealer, + content_type=content_type, + related_content_type=ContentType.objects.get_for_model(User), + )) else: qs = cls.objects.filter( + dealer=dealer, content_type=content_type, related_content_type=related_content_type, related_object_id=staff.pk, ) - print(qs[0].content_object.invoicemodel_set.first()) return [ x.content_object.invoicemodel_set.first() for x in qs diff --git a/inventory/notifications/__init__.py b/inventory/notifications/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/inventory/notifications/sse.py b/inventory/notifications/sse.py new file mode 100644 index 00000000..83c32205 --- /dev/null +++ b/inventory/notifications/sse.py @@ -0,0 +1,205 @@ +# import json +# from django.contrib.auth.models import AnonymousUser +# from django.contrib.auth import get_user_model +# from django.db import close_old_connections +# from urllib.parse import parse_qs +# from channels.db import database_sync_to_async +# from inventory.models import Notification +# import asyncio + +# @database_sync_to_async +# def get_notifications(user, last_id): +# return Notification.objects.filter( +# user=user, id__gt=last_id, is_read=False +# ).order_by("created") + +# class NotificationSSEApp: +# async def __call__(self, scope, receive, send): +# if scope["type"] != "http": +# return + +# query_string = parse_qs(scope["query_string"].decode()) +# last_id = int(query_string.get("last_id", [0])[0]) + +# # Get user from scope if using AuthMiddlewareStack +# user = scope.get("user", AnonymousUser()) +# if not user.is_authenticated: +# await send({ +# "type": "http.response.start", +# "status": 403, +# "headers": [(b"content-type", b"text/plain")], +# }) +# await send({ +# "type": "http.response.body", +# "body": b"Unauthorized", +# }) +# return + +# await send({ +# "type": "http.response.start", +# "status": 200, +# "headers": [ +# (b"content-type", b"text/event-stream"), +# (b"cache-control", b"no-cache"), +# (b"x-accel-buffering", b"no"), +# ] +# }) + +# try: +# while True: +# close_old_connections() + +# notifications = await get_notifications(user, last_id) +# for notification in notifications: +# data = { +# "id": notification.id, +# "message": notification.message, +# "created": notification.created.isoformat(), +# "is_read": notification.is_read, +# } + +# event_str = ( +# f"id: {notification.id}\n" +# f"event: notification\n" +# f"data: {json.dumps(data)}\n\n" +# ) + +# await send({ +# "type": "http.response.body", +# "body": event_str.encode("utf-8"), +# "more_body": True +# }) + +# last_id = notification.id + +# await asyncio.sleep(2) + +# except asyncio.CancelledError: +# pass + +import json +import time +from django.contrib.auth.models import AnonymousUser +from urllib.parse import parse_qs +from channels.db import database_sync_to_async +from django.contrib.auth import get_user_model +from inventory.models import Notification +import asyncio +from datetime import datetime + +@database_sync_to_async +def get_user(user_id): + User = get_user_model() + try: + return User.objects.get(id=user_id) + except User.DoesNotExist: + return AnonymousUser() + +@database_sync_to_async +def get_notifications(user, last_id): + notifications = Notification.objects.filter( + user=user, + id__gt=last_id, + is_read=False + ).order_by("created") + + return [ + { + 'id': n.id, + 'message': n.message, + 'created': n.created.isoformat(), # Convert datetime to string + 'is_read': n.is_read + } + for n in notifications + ] + +class NotificationSSEApp: + async def __call__(self, scope, receive, send): + if scope["type"] != "http": + return + + # Parse query parameters + query_string = parse_qs(scope["query_string"].decode()) + last_id = int(query_string.get("last_id", [0])[0]) + + # Get user from scope + user = scope.get("user") + if not user or user.is_anonymous: + await self._send_response(send, 403, b"Unauthorized") + return + + # Send SSE headers + await self._send_headers(send) + + try: + while True: + try: + message = await asyncio.wait_for(receive(), timeout=3) + if message["type"] == "http.disconnect": + print("🔌 Client disconnected") + break + except asyncio.TimeoutError: + notifications = await get_notifications(user, last_id) + + for notification in notifications: + await self._send_notification(send, notification) + if notification['id'] > last_id: + last_id = notification['id'] + + # Send keep-alive comment every 15 seconds + await send({ + "type": "http.response.body", + "body": b":keep-alive\n\n", + "more_body": True + }) + + # await asyncio.sleep(3) + + except (asyncio.CancelledError, ConnectionResetError): + pass + finally: + await self._close_connection(send) + + async def _send_headers(self, send): + await send({ + "type": "http.response.start", + "status": 200, + "headers": [ + (b"content-type", b"text/event-stream"), + (b"cache-control", b"no-cache"), + (b"connection", b"keep-alive"), + (b"x-accel-buffering", b"no"), + ] + }) + + async def _send_notification(self, send, notification): + try: + event_str = ( + f"id: {notification['id']}\n" + f"event: notification\n" + f"data: {json.dumps(notification)}\n\n" + ) + await send({ + "type": "http.response.body", + "body": event_str.encode("utf-8"), + "more_body": True + }) + except Exception as e: + print(f"Error sending notification: {e}") + + async def _send_response(self, send, status, body): + await send({ + "type": "http.response.start", + "status": status, + "headers": [(b"content-type", b"text/plain")] + }) + await send({ + "type": "http.response.body", + "body": body + }) + + async def _close_connection(self, send): + await send({ + "type": "http.response.body", + "body": b"" + }) \ No newline at end of file diff --git a/inventory/override.py b/inventory/override.py index 600090d3..a5fb6036 100644 --- a/inventory/override.py +++ b/inventory/override.py @@ -1,3 +1,4 @@ +from datetime import timezone import logging from .models import Dealer from django.core.exceptions import ImproperlyConfigured, ValidationError @@ -19,7 +20,7 @@ from django.contrib import messages from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.urls import reverse -from django_ledger.models import ItemTransactionModel +from django_ledger.models import ItemTransactionModel,InvoiceModel,LedgerModel,EntityModel from django.views.generic.detail import DetailView from django_ledger.forms.purchase_order import ( ApprovedPurchaseOrderModelUpdateForm, @@ -35,6 +36,11 @@ from django.views.generic.edit import UpdateView from django.views.generic.base import RedirectView from django.views.generic.list import ListView from django.utils.translation import gettext_lazy as _ +from django_ledger.forms.invoice import (BaseInvoiceModelUpdateForm, InvoiceModelCreateForEstimateForm, + get_invoice_itemtxs_formset_class, + DraftInvoiceModelUpdateForm, InReviewInvoiceModelUpdateForm, + ApprovedInvoiceModelUpdateForm, PaidInvoiceModelUpdateForm, + AccruedAndApprovedInvoiceModelUpdateForm, InvoiceModelCreateForm) logger = logging.getLogger(__name__) @@ -315,41 +321,68 @@ class BasePurchaseOrderActionActionView( f"User {user_username} attempting to call action '{self.action_name}' " f"on Purchase Order ID: {po_model.pk} (Entity: {entity_slug})." ) - try: - getattr(po_model, self.action_name)(commit=self.commit, **kwargs) - # --- Single-line log for successful action --- - logger.info( - f"User {user_username} successfully executed action '{self.action_name}' " - f"on Purchase Order ID: {po_model.pk}." - ) - messages.add_message( - request, - message="PO updated successfully.", - level=messages.SUCCESS, - ) - except ValidationError as e: - # --- Single-line log for ValidationError --- - print( - f"User {user_username} encountered a validation error " - f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " - f"Error: {e}" - ) - logger.warning( - f"User {user_username} encountered a validation error " - f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " - f"Error: {e}" - ) - except AttributeError as e: - print( - f"User {user_username} encountered an AttributeError " - f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " - f"Error: {e}" - ) - logger.warning( - f"User {user_username} encountered an AttributeError " - f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " - f"Error: {e}" - ) + print(self.action_name) + if self.action_name == "mark_as_fulfilled": + try: + if po_model.can_fulfill(): + po_model.mark_as_fulfilled() + # po_model.date_fulfilled = timezone.now() + po_model.save() + messages.add_message( + request, + message="PO marked as fulfilled successfully.", + level=messages.SUCCESS, + ) + logger.info( + f"User {user_username} successfully executed action '{self.action_name}' " + f"on Purchase Order ID: {po_model.pk}." + ) + except Exception as e: + messages.add_message( + request, + message=f"Failed to mark PO {po_model.po_number} as fulfilled. {e}", + level=messages.ERROR, + ) + logger.warning( + f"User {user_username} encountered an exception " + f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " + f"Error: {e}" + ) + else: + try: + getattr(po_model, self.action_name)(commit=self.commit, **kwargs) + logger.info( + f"User {user_username} successfully executed action '{self.action_name}' " + f"on Purchase Order ID: {po_model.pk}." + ) + messages.add_message( + request, + message="PO updated successfully.", + level=messages.SUCCESS, + ) + except ValidationError as e: + # --- Single-line log for ValidationError --- + print( + f"User {user_username} encountered a validation error " + f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " + f"Error: {e}" + ) + logger.warning( + f"User {user_username} encountered a validation error " + f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " + f"Error: {e}" + ) + except AttributeError as e: + print( + f"User {user_username} encountered an AttributeError " + f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " + f"Error: {e}" + ) + logger.warning( + f"User {user_username} encountered an AttributeError " + f"while performing action '{self.action_name}' on Purchase Order ID: {po_model.pk}. " + f"Error: {e}" + ) return response @@ -731,3 +764,212 @@ class InventoryListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): entity_slug=self.kwargs["entity_slug"], ) return super().get_queryset() + + +class InvoiceModelUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + slug_url_kwarg = 'invoice_pk' + slug_field = 'uuid' + context_object_name = 'invoice' + # template_name = 'inventory/sales/invoices/invoice_update.html' + form_class = BaseInvoiceModelUpdateForm + http_method_names = ['get', 'post'] + + action_update_items = False + + def get_form_class(self): + invoice_model: InvoiceModel = self.object + + if invoice_model.is_draft(): + return DraftInvoiceModelUpdateForm + elif invoice_model.is_review(): + return InReviewInvoiceModelUpdateForm + elif invoice_model.is_approved(): + if invoice_model.accrue: + return AccruedAndApprovedInvoiceModelUpdateForm + return ApprovedInvoiceModelUpdateForm + elif invoice_model.is_paid(): + return PaidInvoiceModelUpdateForm + return BaseInvoiceModelUpdateForm + + def get_form(self, form_class=None): + form_class = self.get_form_class() + if self.request.method == 'POST' and self.action_update_items: + return form_class( + entity_slug=self.kwargs['entity_slug'], + user_model=self.request.dealer.user, + instance=self.object + ) + return form_class( + entity_slug=self.kwargs['entity_slug'], + user_model=self.request.dealer.user, + **self.get_form_kwargs() + ) + + def get_context_data(self, itemtxs_formset=None, **kwargs): + context = super().get_context_data(**kwargs) + invoice_model: InvoiceModel = self.object + title = f'Invoice {invoice_model.invoice_number}' + context['page_title'] = title + context['header_title'] = title + + ledger_model: LedgerModel = self.object.ledger + + if not invoice_model.is_configured(): + messages.add_message( + request=self.request, + message=f'Invoice {invoice_model.invoice_number} must have all accounts configured.', + level=messages.ERROR, + extra_tags='is-danger' + ) + + if not invoice_model.is_paid(): + if ledger_model.locked: + messages.add_message(self.request, + messages.ERROR, + f'Warning! This invoice is locked. Must unlock before making any changes.', + extra_tags='is-danger') + + if ledger_model.locked: + messages.add_message(self.request, + messages.ERROR, + f'Warning! This Invoice is Locked. Must unlock before making any changes.', + extra_tags='is-danger') + + if not ledger_model.is_posted(): + messages.add_message(self.request, + messages.INFO, + f'This Invoice has not been posted. Must post to see ledger changes.', + extra_tags='is-info') + + if not itemtxs_formset: + itemtxs_qs = invoice_model.itemtransactionmodel_set.all().select_related('item_model') + itemtxs_qs, itemtxs_agg = invoice_model.get_itemtxs_data(queryset=itemtxs_qs) + invoice_itemtxs_formset_class = get_invoice_itemtxs_formset_class(invoice_model) + itemtxs_formset = invoice_itemtxs_formset_class( + entity_slug=self.kwargs['entity_slug'], + user_model=self.request.dealer.user, + invoice_model=invoice_model, + queryset=itemtxs_qs + ) + else: + itemtxs_qs, itemtxs_agg = invoice_model.get_itemtxs_data(queryset=itemtxs_formset.queryset) + + context['itemtxs_formset'] = itemtxs_formset + context['total_amount__sum'] = itemtxs_agg['total_amount__sum'] + return context + + def get_success_url(self): + entity_slug = self.kwargs['entity_slug'] + invoice_pk = self.kwargs['invoice_pk'] + return reverse('invoice_detail', + kwargs={ + 'dealer_slug': self.request.dealer.slug, + 'entity_slug': entity_slug, + 'pk': invoice_pk + }) + + # def get_queryset(self): + # qs = super().get_queryset() + # return qs.prefetch_related('itemtransactionmodel_set') + def get_queryset(self): + if self.queryset is None: + self.queryset = InvoiceModel.objects.for_entity( + entity_slug=self.kwargs['entity_slug'], + user_model=self.request.user + ).select_related('customer', 'ledger').order_by('-created') + return super().get_queryset().prefetch_related('itemtransactionmodel_set') + + + def form_valid(self, form): + invoice_model: InvoiceModel = form.save(commit=False) + if invoice_model.can_migrate(): + invoice_model.migrate_state( + user_model=self.request.dealer.user, + entity_slug=self.kwargs['entity_slug'] + ) + messages.add_message(self.request, + messages.SUCCESS, + f'Invoice {self.object.invoice_number} successfully updated.', + extra_tags='is-success') + return super().form_valid(form) + + def get(self, request, entity_slug, invoice_pk, *args, **kwargs): + if self.action_update_items: + return HttpResponseRedirect( + redirect_to=reverse('invoice_update', + kwargs={ + 'dealer_slug': request.dealer.slug, + 'entity_slug': entity_slug, + 'pk': invoice_pk + }) + ) + return super(InvoiceModelUpdateView, self).get(request, *args, **kwargs) + + def post(self, request, entity_slug, invoice_pk, *args, **kwargs): + if self.action_update_items: + if not request.user.is_authenticated: + return HttpResponseForbidden() + + queryset = self.get_queryset() + invoice_model = self.get_object(queryset=queryset) + self.object = invoice_model + invoice_itemtxs_formset_class = get_invoice_itemtxs_formset_class(invoice_model) + itemtxs_formset = invoice_itemtxs_formset_class(request.POST, + user_model=self.request.dealer.user, + invoice_model=invoice_model, + entity_slug=entity_slug) + + if not invoice_model.can_edit_items(): + messages.add_message( + request, + message=f'Cannot update items once Invoice is {invoice_model.get_invoice_status_display()}', + level=messages.ERROR, + extra_tags='is-danger' + ) + context = self.get_context_data(itemtxs_formset=itemtxs_formset) + return self.render_to_response(context=context) + + if itemtxs_formset.has_changed(): + if itemtxs_formset.is_valid(): + itemtxs_list = itemtxs_formset.save(commit=False) + entity_qs = EntityModel.objects.for_user(user_model=self.request.dealer.user) + entity_model: EntityModel = get_object_or_404(entity_qs, slug__exact=entity_slug) + + for itemtxs in itemtxs_list: + itemtxs.invoice_model_id = invoice_model.uuid + itemtxs.clean() + + itemtxs_list = itemtxs_formset.save() + itemtxs_qs = invoice_model.update_amount_due() + invoice_model.get_state(commit=True) + invoice_model.clean() + invoice_model.save( + update_fields=['amount_due', + 'amount_receivable', + 'amount_unearned', + 'amount_earned', + 'updated'] + ) + + invoice_model.migrate_state( + entity_slug=entity_slug, + user_model=self.request.user, + raise_exception=False, + itemtxs_qs=itemtxs_qs + ) + + messages.add_message(request, + message=f'Items for Invoice {invoice_model.invoice_number} saved.', + level=messages.SUCCESS, + extra_tags='is-success') + return HttpResponseRedirect( + redirect_to=reverse('django_ledger:invoice-update', + kwargs={ + 'entity_slug': entity_slug, + 'invoice_pk': invoice_pk + }) + ) + + # if not valid, return formset with errors... + return self.render_to_response(context=self.get_context_data(itemtxs_formset=itemtxs_formset)) + return super(InvoiceModelUpdateView, self).post(request, **kwargs) diff --git a/inventory/signals.py b/inventory/signals.py index 8242fb5f..54b4946e 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -264,18 +264,19 @@ def create_item_model(sender, instance, created, **kwargs): uom_model=uom, coa_model=coa, ) + instance.item_model = inventory + inventory.save() # inventory = entity.create_item_inventory( # name=instance.vin, # uom_model=uom, # item_type=ItemModel.ITEM_TYPE_LUMP_SUM # ) - instance.item_model = inventory - inventory.additional_info = {} - inventory.additional_info.update({"car_info": instance.to_dict()}) - inventory.save() - else: - instance.item_model.additional_info.update({"car_info": instance.to_dict()}) - instance.item_model.save() + # inventory.additional_info = {} + # inventory.additional_info.update({"car_info": instance.to_dict()}) + # inventory.save() + # else: + # instance.item_model.additional_info.update({"car_info": instance.to_dict()}) + # instance.item_model.save() # # update price - CarFinance @@ -370,14 +371,14 @@ def update_item_model_cost(sender, instance, created, **kwargs): instance.car.item_model.default_amount = instance.marked_price if not isinstance(instance.car.item_model.additional_info, dict): instance.car.item_model.additional_info = {} - instance.car.item_model.additional_info.update({"car_finance": instance.to_dict()}) - instance.car.item_model.additional_info.update( - { - "additional_services": [ - service.to_dict() for service in instance.additional_services.all() - ] - } - ) + # instance.car.item_model.additional_info.update({"car_finance": instance.to_dict()}) + # instance.car.item_model.additional_info.update( + # { + # "additional_services": [ + # service.to_dict() for service in instance.additional_services.all() + # ] + # } + # ) instance.car.item_model.save() print(f"Inventory item updated with CarFinance data for Car: {instance.car}") @@ -959,24 +960,24 @@ def add_service_to_staff(sender, instance, created, **kwargs): ########################################################## -@receiver(post_save, sender=PurchaseOrderModel) -def create_po_fulfilled_notification(sender, instance, created, **kwargs): - if instance.po_status == "fulfilled": - dealer = models.Dealer.objects.get(entity=instance.entity) - accountants = ( - models.CustomGroup.objects.filter(dealer=dealer, name="Inventory") - .first() - .group.user_set.exclude(email=dealer.user.email) - .distinct() - ) - for accountant in accountants: - models.Notification.objects.create( - user=accountant, - message=f""" - New Purchase Order {instance.po_number} has been added to dealer {dealer.name}. - View - """, - ) +# @receiver(post_save, sender=PurchaseOrderModel) +# def create_po_fulfilled_notification(sender, instance, created, **kwargs): +# if instance.po_status == "fulfilled": +# dealer = models.Dealer.objects.get(entity=instance.entity) +# accountants = ( +# models.CustomGroup.objects.filter(dealer=dealer, name="Inventory") +# .first() +# .group.user_set.exclude(email=dealer.user.email) +# .distinct() +# ) +# for accountant in accountants: +# models.Notification.objects.create( +# user=accountant, +# message=f""" +# New Purchase Order {instance.po_number} has been added to dealer {dealer.name}. +# View +# """, +# ) @receiver(post_save, sender=models.Car) @@ -1005,7 +1006,7 @@ def po_fullfilled_notification(sender, instance, created, **kwargs): if instance.is_fulfilled(): dealer = models.Dealer.objects.get(entity=instance.entity) recipients = User.objects.filter( - groups__customgroup__dealer=instance.dealer, + groups__customgroup__dealer=dealer, groups__customgroup__name__in=["Manager", "Inventory"], ).distinct() for recipient in recipients: @@ -1099,7 +1100,8 @@ def estimate_in_approve_notification(sender, instance, created, **kwargs): related_content_type=ContentType.objects.get_for_model(models.Staff), object_id=instance.pk, ).first() - + if not recipient: + return models.Notification.objects.create( user=recipient.related_object.user, message=f""" diff --git a/inventory/tasks.py b/inventory/tasks.py index 17a1bdbd..36bcee2d 100644 --- a/inventory/tasks.py +++ b/inventory/tasks.py @@ -4,9 +4,10 @@ from django_ledger.io import roles from django_q.tasks import async_task from django.core.mail import send_mail from appointment.models import StaffMember -from django.contrib.auth.models import User, Group, Permission +from allauth.account.models import EmailAddress from inventory.models import DealerSettings, Dealer from django.utils.translation import gettext_lazy as _ +from django.contrib.auth.models import User, Group, Permission logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -220,7 +221,7 @@ def create_coa_accounts(instance): "role": roles.LIABILITY_CL_TAXES_PAYABLE, "balance_type": roles.CREDIT, "locked": False, - "default": True, # Default for LIABILITY_CL_TAXES_PAYABLE + "default": False, # Default for LIABILITY_CL_TAXES_PAYABLE }, { "code": "2070", @@ -239,6 +240,14 @@ def create_coa_accounts(instance): "locked": False, "default": True, # Default for LIABILITY_CL_DEFERRED_REVENUE }, + { + "code": "2200", + "name": "Tax Payable", + "role": roles.LIABILITY_CL_TAXES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, + }, { "code": "2210", "name": "Long-term Bank Loans", @@ -1141,6 +1150,15 @@ def create_user_dealer(email, password, name, arabic_name, phone, crn, vrn, addr user = User.objects.create(username=email, email=email) user.set_password(password) user.save() + + #TODO remove this later + EmailAddress.objects.create( + user=user, + email=user.email, + verified=True, + primary=True + ) + group = Group.objects.create(name=f"{user.pk}-Admin") user.groups.add(group) for perm in Permission.objects.filter( @@ -1149,7 +1167,7 @@ def create_user_dealer(email, password, name, arabic_name, phone, crn, vrn, addr group.permissions.add(perm) StaffMember.objects.create(user=user) - Dealer.objects.create( + dealer = Dealer.objects.create( user=user, name=name, arabic_name=arabic_name, @@ -1158,6 +1176,7 @@ def create_user_dealer(email, password, name, arabic_name, phone, crn, vrn, addr phone_number=phone, address=address, ) + return dealer # def create_groups(dealer_slug): diff --git a/inventory/templatetags/custom_filters.py b/inventory/templatetags/custom_filters.py index f9a085e1..267041cb 100644 --- a/inventory/templatetags/custom_filters.py +++ b/inventory/templatetags/custom_filters.py @@ -472,6 +472,7 @@ def po_item_formset_table(context, po_model, itemtxs_formset, user): @register.inclusion_tag("bill/tags/bill_item_formset.html", takes_context=True) def bill_item_formset_table(context, item_formset): + bill = BillModel.objects.get(uuid=context["view"].kwargs["bill_pk"]) for item in item_formset: if item: item.initial["quantity"] = item.instance.po_quantity @@ -484,6 +485,7 @@ def bill_item_formset_table(context, item_formset): return { "dealer_slug": context["view"].kwargs["dealer_slug"], "entity_slug": context["view"].kwargs["entity_slug"], + "bill": bill, "bill_pk": context["view"].kwargs["bill_pk"], "total_amount__sum": context["total_amount__sum"], "item_formset": item_formset, @@ -672,3 +674,12 @@ def count_checked(permissions, group_permission_ids): # def count_checked(permissions, group_permission_ids): # """Count how many permissions are checked from the allowed list""" # return sum(1 for perm in permissions if perm.id in group_permission_ids) + +@register.inclusion_tag('sales/tags/invoice_item_formset.html', takes_context=True) +def invoice_item_formset_table(context, itemtxs_formset): + return { + 'entity_slug': context['view'].kwargs['entity_slug'], + 'invoice_model': context['invoice'], + 'total_amount__sum': context['total_amount__sum'], + 'itemtxs_formset': itemtxs_formset, + } diff --git a/inventory/urls.py b/inventory/urls.py index 582b1e63..1f39b39f 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -80,11 +80,11 @@ urlpatterns = [ views.CustomerDetailView.as_view(), name="customer_detail", ), - path( - "/customers//add-note/", - views.add_note_to_customer, - name="add_note_to_customer", - ), + # path( + # "/customers//add-note/", + # views.add_note_to_customer, + # name="add_note_to_customer", + # ), path( "/customers//update/", views.CustomerUpdateView.as_view(), @@ -198,11 +198,11 @@ urlpatterns = [ views.lead_transfer, name="lead_transfer", ), - path( - "/crm/opportunities//add_note/", - views.add_note_to_opportunity, - name="add_note_to_opportunity", - ), + # path( + # "/crm/opportunities//add_note/", + # views.add_note_to_opportunity, + # name="add_note_to_opportunity", + # ), path( "/crm/opportunities/create/", views.OpportunityCreateView.as_view(), @@ -836,10 +836,15 @@ urlpatterns = [ name="invoice_create", ), path( - "/sales/invoices//", + "/sales//invoices//", views.InvoiceDetailView.as_view(), name="invoice_detail", ), + # path( + # "/sales//invoices//update", + # views.InvoiceDetailView.as_view(), + # name="invoice_update", + # ), path( "/sales/invoices//preview/", views.InvoicePreviewView.as_view(), @@ -876,7 +881,17 @@ urlpatterns = [ views.PaymentCreateView, name="payment_create", ), - # path("sales/payments/create/", views.PaymentCreateView, name="payment_create"), + # path( + # "/sales/payments///create/", + # views.InvoiceModelUpdateView.as_view(), + # name="invoice_update", + # ), + # path( + # "/sales/payments///create/", + # views.InvoiceModelUpdateView.as_view(), + # name="payment_create", + # ), + # path("/sales/payments/create/", views.PaymentCreateView, name="payment_create"), path( "/sales/payments//payment_details/", views.PaymentDetailView, diff --git a/inventory/utils.py b/inventory/utils.py index 5d4b8c00..368cca6e 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -14,6 +14,7 @@ from django_q.tasks import async_task from django.core.mail import send_mail from plans.models import AbstractOrder from django_ledger.models import ( + EstimateModel, InvoiceModel, BillModel, VendorModel, @@ -25,8 +26,9 @@ from django.utils.translation import gettext_lazy as _ from django.contrib.contenttypes.models import ContentType from django_ledger.models.transactions import TransactionModel from django_ledger.models.journal_entry import JournalEntryModel - +from django.db import transaction import logging +from django_ledger.io import roles logger = logging.getLogger(__name__) @@ -452,30 +454,35 @@ def get_financial_values(model): } -def set_invoice_payment(dealer, entity, invoice, amount, payment_method): - """ - Processes and applies a payment for a specified invoice. This function calculates - finance details, handles associated account transactions, and updates the invoice - status accordingly. +# def set_invoice_payment(dealer, entity, invoice, amount, payment_method): +# """ +# Processes and applies a payment for a specified invoice. This function calculates +# finance details, handles associated account transactions, and updates the invoice +# status accordingly. - :param dealer: Dealer object responsible for processing the payment - :type dealer: Dealer - :param entity: Entity object associated with the invoice and payment - :type entity: Entity - :param invoice: The invoice object for which the payment is being made - :type invoice: Invoice - :param amount: The amount being paid towards the invoice - :type amount: Decimal - :param payment_method: The payment method used for the transaction - :type payment_method: str - :return: None - """ - calculator = CarFinanceCalculator(invoice) - finance_data = calculator.get_finance_data() +# :param dealer: Dealer object responsible for processing the payment +# :type dealer: Dealer +# :param entity: Entity object associated with the invoice and payment +# :type entity: Entity +# :param invoice: The invoice object for which the payment is being made +# :type invoice: Invoice +# :param amount: The amount being paid towards the invoice +# :type amount: Decimal +# :param payment_method: The payment method used for the transaction +# :type payment_method: str +# :return: None +# """ +# calculator = CarFinanceCalculator(invoice) +# finance_data = calculator.get_finance_data() - handle_account_process(invoice, amount, finance_data) - invoice.make_payment(amount) - invoice.save() +# handle_account_process(invoice, amount, finance_data) +# if invoice.can_migrate(): +# invoice.migrate_state( +# user_model=dealer.user, +# entity_slug=entity.slug +# ) +# invoice.make_payment(amount) +# invoice.save() def set_bill_payment(dealer, entity, bill, amount, payment_method): @@ -996,16 +1003,25 @@ class CarFinanceCalculator: ADDITIONAL_SERVICES_KEY = "additional_services" def __init__(self, model): - self.dealer = models.Dealer.objects.get(entity=model.entity) + if isinstance(model, InvoiceModel): + self.dealer = models.Dealer.objects.get(entity=model.ce_model.entity) + self.extra_info = models.ExtraInfo.objects.get( + dealer=self.dealer, + content_type=ContentType.objects.get_for_model(model.ce_model), + object_id=model.ce_model.pk, + ) + elif isinstance(model, EstimateModel): + self.dealer = models.Dealer.objects.get(entity=model.entity) + self.extra_info = models.ExtraInfo.objects.get( + dealer=self.dealer, + content_type=ContentType.objects.get_for_model(model), + object_id=model.pk, + ) self.model = model self.vat_rate = self._get_vat_rate() self.item_transactions = self._get_item_transactions() - self.additional_services = self._get_additional_services() - self.extra_info = models.ExtraInfo.objects.get( - dealer=self.dealer, - content_type=ContentType.objects.get_for_model(model), - object_id=model.pk, - ) + # self.additional_services = self._get_additional_services() + def _get_vat_rate(self): vat = models.VatRate.objects.filter(dealer=self.dealer, is_active=True).first() @@ -1013,77 +1029,62 @@ class CarFinanceCalculator: raise ObjectDoesNotExist("No active VAT rate found") return vat.rate + def _get_additional_services(self): + return [x for item in self.item_transactions + for x in item.item_model.car.additional_services + ] def _get_item_transactions(self): return self.model.get_itemtxs_data()[0].all() + def get_items(self): + return self._get_item_transactions() @staticmethod def _get_quantity(item): return item.ce_quantity or item.quantity - def _get_nested_value(self, item, *keys): - current = item.item_model.additional_info - for key in keys: - current = current.get(key, {}) - return current + # def _get_nested_value(self, item, *keys): + # current = item.item_model.additional_info + # for key in keys: + # current = current.get(key, {}) + # return current def _get_car_data(self, item): quantity = self._get_quantity(item) - car_finance = self._get_nested_value(item, self.CAR_FINANCE_KEY) - car_info = self._get_nested_value(item, self.CAR_INFO_KEY) - unit_price = Decimal(car_finance.get("marked_price", 0)) + car = item.item_model.car + unit_price = Decimal(car.finances.marked_price) + return { "item_number": item.item_model.item_number, - "vin": car_info.get("vin"), - "make": car_info.get("make"), - "model": car_info.get("model"), - "year": car_info.get("year"), - "logo": getattr(item.item_model.car.id_car_make, "logo", ""), - "trim": car_info.get("trim"), - "mileage": car_info.get("mileage"), - "cost_price": car_finance.get("cost_price"), - "selling_price": car_finance.get("selling_price"), - "marked_price": car_finance.get("marked_price"), - "discount": car_finance.get("discount_amount"), + "vin": car.vin, #car_info.get("vin"), + "make": car.id_car_make ,#car_info.get("make"), + "model": car.id_car_model ,#car_info.get("model"), + "year": car.year ,# car_info.get("year"), + "logo": car.logo, # getattr(car.id_car_make, "logo", ""), + "trim": car.id_car_trim ,# car_info.get("trim"), + "mileage": car.mileage ,# car_info.get("mileage"), + "cost_price": car.finances.cost_price, + "selling_price": car.finances.selling_price, + "marked_price": car.finances.marked_price, + "discount": car.finances.discount_amount, "quantity": quantity, "unit_price": unit_price, "total": unit_price * Decimal(quantity), - "total_vat": car_finance.get("total_vat"), - "additional_services": self._get_nested_value( - item, self.ADDITIONAL_SERVICES_KEY - ), + "total_vat": car.finances.total_vat, + "additional_services": car.additional_services,# self._get_nested_value( + #item, self.ADDITIONAL_SERVICES_KEY + #), } - def _get_additional_services(self): - return [ - { - "name": service.get("name"), - "price": service.get("price"), - "taxable": service.get("taxable"), - "price_": service.get("price_"), - } - for item in self.item_transactions - for service in self._get_nested_value(item, self.ADDITIONAL_SERVICES_KEY) - or [] - ] - def calculate_totals(self): total_price = sum( - Decimal(self._get_nested_value(item, self.CAR_FINANCE_KEY, "marked_price")) - * int(self._get_quantity(item)) + Decimal(item.item_model.car.finances.marked_price) for item in self.item_transactions ) total_additionals = sum( - Decimal(x.get("price_")) for x in self._get_additional_services() - ) + Decimal(item.price_) for item in self._get_additional_services()) total_discount = self.extra_info.data.get("discount", 0) - # total_discount = sum( - # Decimal( - # self._get_nested_value(item, self.CAR_FINANCE_KEY, "discount_amount") - # ) - # for item in self.item_transactions - # ) total_price_discounted = total_price if total_discount: total_price_discounted = total_price - Decimal(total_discount) @@ -1092,11 +1093,11 @@ class CarFinanceCalculator: return { "total_price_before_discount": round( total_price, 2 - ), # total_price_before_discount, - "total_price": round(total_price_discounted, 2), # total_price_discounted, - "total_vat_amount": round(total_vat_amount, 2), # total_vat_amount, + ), + "total_price": round(total_price_discounted, 2), + "total_vat_amount": round(total_vat_amount, 2), "total_discount": round(Decimal(total_discount)), - "total_additionals": round(total_additionals, 2), # total_additionals, + "total_additionals": round(total_additionals, 2), "grand_total": round( total_price_discounted + total_vat_amount + total_additionals, 2 ), @@ -1116,9 +1117,167 @@ class CarFinanceCalculator: "total_discount": totals["total_discount"], "total_additionals": totals["total_additionals"], "grand_total": totals["grand_total"], - "additionals": self.additional_services, + "additionals": self._get_additional_services(), "vat": self.vat_rate, } +# class CarFinanceCalculator: +# """ +# Class responsible for calculating car financing details. + +# This class provides methods and attributes required for calculating various +# aspects related to car financing, such as VAT calculation, pricing, discounts, +# and additional services. It processes data about cars, computes totals (e.g., +# price, VAT, discounts), and aggregates the financial data for reporting or +# further processing. + +# :ivar model: The data model passed to the calculator for retrieving transaction data. +# :type model: Any +# :ivar vat_rate: The current active VAT rate retrieved from the database. +# :type vat_rate: Decimal +# :ivar item_transactions: A collection of item transactions retrieved from the model. +# :type item_transactions: list +# :ivar additional_services: A list of additional services with details (e.g., name, price, taxable status). +# :type additional_services: list +# """ + +# VAT_OBJ_NAME = "vat_rate" +# CAR_FINANCE_KEY = "car_finance" +# CAR_INFO_KEY = "car_info" +# ADDITIONAL_SERVICES_KEY = "additional_services" + +# def __init__(self, model): +# if isinstance(model, InvoiceModel): +# self.dealer = models.Dealer.objects.get(entity=model.ce_model.entity) +# self.extra_info = models.ExtraInfo.objects.get( +# dealer=self.dealer, +# content_type=ContentType.objects.get_for_model(model.ce_model), +# object_id=model.ce_model.pk, +# ) +# elif isinstance(model, EstimateModel): +# self.dealer = models.Dealer.objects.get(entity=model.entity) +# self.extra_info = models.ExtraInfo.objects.get( +# dealer=self.dealer, +# content_type=ContentType.objects.get_for_model(model), +# object_id=model.pk, +# ) +# self.model = model +# self.vat_rate = self._get_vat_rate() +# self.item_transactions = self._get_item_transactions() +# self.additional_services = self._get_additional_services() + + +# def _get_vat_rate(self): +# vat = models.VatRate.objects.filter(dealer=self.dealer, is_active=True).first() +# if not vat: +# raise ObjectDoesNotExist("No active VAT rate found") +# return vat.rate + +# def _get_item_transactions(self): +# return self.model.get_itemtxs_data()[0].all() + +# @staticmethod +# def _get_quantity(item): +# return item.ce_quantity or item.quantity + +# def _get_nested_value(self, item, *keys): +# current = item.item_model.additional_info +# for key in keys: +# current = current.get(key, {}) +# return current + +# def _get_car_data(self, item): +# quantity = self._get_quantity(item) +# car_finance = self._get_nested_value(item, self.CAR_FINANCE_KEY) +# car_info = self._get_nested_value(item, self.CAR_INFO_KEY) +# unit_price = Decimal(car_finance.get("marked_price", 0)) +# return { +# "item_number": item.item_model.item_number, +# "vin": car_info.get("vin"), +# "make": car_info.get("make"), +# "model": car_info.get("model"), +# "year": car_info.get("year"), +# "logo": getattr(item.item_model.car.id_car_make, "logo", ""), +# "trim": car_info.get("trim"), +# "mileage": car_info.get("mileage"), +# "cost_price": car_finance.get("cost_price"), +# "selling_price": car_finance.get("selling_price"), +# "marked_price": car_finance.get("marked_price"), +# "discount": car_finance.get("discount_amount"), +# "quantity": quantity, +# "unit_price": unit_price, +# "total": unit_price * Decimal(quantity), +# "total_vat": car_finance.get("total_vat"), +# "additional_services": self._get_nested_value( +# item, self.ADDITIONAL_SERVICES_KEY +# ), +# } + +# def _get_additional_services(self): +# return [ +# { +# "name": service.get("name"), +# "price": service.get("price"), +# "taxable": service.get("taxable"), +# "price_": service.get("price_"), +# } +# for item in self.item_transactions +# for service in self._get_nested_value(item, self.ADDITIONAL_SERVICES_KEY) +# or [] +# ] + +# def calculate_totals(self): +# total_price = sum( +# Decimal(self._get_nested_value(item, self.CAR_FINANCE_KEY, "marked_price")) +# * int(self._get_quantity(item)) +# for item in self.item_transactions +# ) +# total_additionals = sum( +# Decimal(x.get("price_")) for x in self._get_additional_services() +# ) + +# total_discount = self.extra_info.data.get("discount", 0) + +# # total_discount = sum( +# # Decimal( +# # self._get_nested_value(item, self.CAR_FINANCE_KEY, "discount_amount") +# # ) +# # for item in self.item_transactions +# # ) +# total_price_discounted = total_price +# if total_discount: +# total_price_discounted = total_price - Decimal(total_discount) +# total_vat_amount = total_price_discounted * self.vat_rate + +# return { +# "total_price_before_discount": round( +# total_price, 2 +# ), # total_price_before_discount, +# "total_price": round(total_price_discounted, 2), # total_price_discounted, +# "total_vat_amount": round(total_vat_amount, 2), # total_vat_amount, +# "total_discount": round(Decimal(total_discount)), +# "total_additionals": round(total_additionals, 2), # total_additionals, +# "grand_total": round( +# total_price_discounted + total_vat_amount + total_additionals, 2 +# ), +# } + +# def get_finance_data(self): +# totals = self.calculate_totals() +# return { +# "cars": [self._get_car_data(item) for item in self.item_transactions], +# "quantity": sum( +# self._get_quantity(item) for item in self.item_transactions +# ), +# "total_price": totals["total_price"], +# "total_price_before_discount": totals["total_price_before_discount"], +# "total_vat": totals["total_vat_amount"] + totals["total_price"], +# "total_vat_amount": totals["total_vat_amount"], +# "total_discount": totals["total_discount"], +# "total_additionals": totals["total_additionals"], +# "grand_total": totals["grand_total"], +# "additionals": self.additional_services, +# "vat": self.vat_rate, +# } def get_item_transactions(txs): @@ -1175,134 +1334,224 @@ def get_local_name(self): return getattr(self, "name", None) -def handle_account_process(invoice, amount, finance_data): + +@transaction.atomic +def set_invoice_payment(dealer, entity, invoice, amount, payment_method): """ - Processes accounting transactions based on an invoice, financial data, - and related entity accounts configuration. This function handles the - creation of accounts if they do not already exist, and processes journal - entries and transactions. - - :param invoice: The invoice object to process transactions for. - :type invoice: InvoiceModel - :param amount: Total monetary value for the transaction. - :type amount: Decimal - :param finance_data: Dictionary containing financial details such as - 'grand_total', 'total_vat_amount', and other related data. - :type finance_data: dict - :return: None + Records the customer payment (`make_payment`) and posts the full + accounting (sales + VAT + COGS + Inventory). """ - for i in invoice.get_itemtxs_data()[0]: - # car = models.Car.objects.get(vin=invoice.get_itemtxs_data()[0].first().item_model.name) - car = i.item_model.car - entity = invoice.ledger.entity - coa = entity.get_default_coa() + invoice.make_payment(amount) + invoice.save() - cash_account = ( - entity.get_all_accounts() - .filter(role_default=True, role=roles.ASSET_CA_CASH) - .first() - ) - inventory_account = car.get_inventory_account() - revenue_account = car.get_revenue_account() - cogs_account = car.get_cogs_account() + _post_sale_and_cogs(invoice, dealer) - # make_account = entity.get_all_accounts().filter(name=car.id_car_make.name,role=roles.COGS).first() - # if not make_account: - # last_account = entity.get_all_accounts().filter(role=roles.COGS).order_by('-created').first() - # if len(last_account.code) == 4: - # code = f"{int(last_account.code)}{1:03d}" - # elif len(last_account.code) > 4: - # code = f"{int(last_account.code)+1}" +def _post_sale_and_cogs(invoice, dealer): + """ + For every car line on the invoice: + 1) Cash / A-R / VAT / Revenue journal + 2) COGS / Inventory journal + """ + entity = invoice.ledger.entity + calc = CarFinanceCalculator(invoice) + data = calc.get_finance_data() - # make_account = entity.create_account( - # name=car.id_car_make.name, - # code=code, - # role=roles.COGS, - # coa_model=coa, - # balance_type="debit", - # active=True - # ) + cash_acc = entity.get_all_accounts().filter(role_default=True, role=roles.ASSET_CA_CASH).first() + ar_acc = entity.get_all_accounts().filter(role_default=True, role=roles.ASSET_CA_RECEIVABLES).first() + vat_acc = entity.get_all_accounts().filter(role_default=True, role=roles.LIABILITY_CL_TAXES_PAYABLE).first() + car_rev = entity.get_all_accounts().filter(role_default=True, role=roles.INCOME_OPERATIONAL).first() + add_rev = entity.get_all_accounts().filter(role_default=True, role=roles.INCOME_OPERATIONAL).first() + cogs_acc = entity.get_all_accounts().filter(role_default=True, role=roles.COGS).first() + inv_acc = entity.get_all_accounts().filter(role_default=True, role=roles.ASSET_CA_INVENTORY).first() - # # get or create additional services account - # additional_services_account = entity.get_default_coa_accounts().filter(name="Additional Services",role=roles.COGS).first() - # if not additional_services_account: - # last_account = entity.get_all_accounts().filter(role=roles.COGS).order_by('-created').first() - # if len(last_account.code) == 4: - # code = f"{int(last_account.code)}{1:03d}" - # elif len(last_account.code) > 4: - # code = f"{int(last_account.code)+1}" + for car_data in data['cars']: + car = invoice.get_itemtxs_data()[0].filter( + item_model__car__vin=car_data['vin'] + ).first().item_model.car + qty = Decimal(car_data['quantity']) - # additional_services_account = entity.create_account( - # name="Additional Services", - # code=code, - # role=roles.COGS, - # coa_model=coa, - # balance_type="debit", - # active=True - # ) + net_car_price = Decimal(car_data['total']) + net_add_price = Decimal(data['total_additionals']) + vat_amount = Decimal(data['total_vat_amount']) * qty + grand_total = net_car_price + net_add_price + vat_amount + cost_total = Decimal(car_data['cost_price']) * qty - # inventory_account = entity.get_default_coa_accounts().filter(role=roles.ASSET_CA_INVENTORY).first() + # ------------------------------------------------------------------ + # 2A. Journal: Cash / A-R / VAT / Sales + # ------------------------------------------------------------------ - # vat_payable_account = entity.get_default_coa_accounts().get(name="VAT Payable", active=True) - - journal = JournalEntryModel.objects.create( - posted=False, - description=f"Payment for Invoice {invoice.invoice_number}", + je_sale = JournalEntryModel.objects.create( ledger=invoice.ledger, + description=f"Sale {car.vin}", + origin=f"Invoice {invoice.invoice_number}", locked=False, - origin=f"Sale of {car.id_car_make.name}{car.vin}: Invoice {invoice.invoice_number}", + posted=False + ) + # Dr Cash (what the customer paid) + TransactionModel.objects.create( + journal_entry=je_sale, + account=cash_acc, + amount=grand_total, + tx_type='debit' ) + # # Cr A/R (clear the receivable) + # TransactionModel.objects.create( + # journal_entry=je_sale, + # account=ar_acc, + # amount=grand_total, + # tx_type='credit' + # ) + + # Cr VAT Payable TransactionModel.objects.create( - journal_entry=journal, - account=cash_account, - amount=Decimal(finance_data.get("grand_total")), - tx_type="debit", - description="", + journal_entry=je_sale, + account=vat_acc, + amount=vat_amount, + tx_type='credit' ) + # Cr Sales – Car TransactionModel.objects.create( - journal_entry=journal, - account=revenue_account, - amount=Decimal(finance_data.get("grand_total")), - tx_type="credit", - description="", + journal_entry=je_sale, + account=car_rev, + amount=net_car_price, + tx_type='credit' ) - journal_cogs = JournalEntryModel.objects.create( - posted=False, - description=f"COGS of {car.id_car_make.name}{car.vin}: Invoice {invoice.invoice_number}", - ledger=invoice.ledger, - locked=False, - origin="Payment", - ) - TransactionModel.objects.create( - journal_entry=journal_cogs, - account=cogs_account, - amount=Decimal(car.finances.cost_price), - tx_type="debit", - description="", - ) - - TransactionModel.objects.create( - journal_entry=journal_cogs, - account=inventory_account, - amount=Decimal(car.finances.cost_price), - tx_type="credit", - description="", - ) - try: - car.item_model.for_inventory = False - logger.debug(f"Set item_model.for_inventory to False for car {car.vin}.") - except Exception as e: - logger.error( - f"Error updating item_model.for_inventory for car {car.vin} (Invoice {invoice.invoice_number}): {e}", - exc_info=True, + if net_add_price > 0: + # Cr Sales – Additional Services + TransactionModel.objects.create( + journal_entry=je_sale, + account=add_rev, + amount=net_add_price, + tx_type='credit' ) + # ------------------------------------------------------------------ + # 2B. Journal: COGS / Inventory reduction + # ------------------------------------------------------------------ + je_cogs = JournalEntryModel.objects.create( + ledger=invoice.ledger, + description=f"COGS {car.vin}", + origin=f"Invoice {invoice.invoice_number}", + locked=False, + posted=False + ) + + # Dr COGS + TransactionModel.objects.create( + journal_entry=je_cogs, + account=cogs_acc, + amount=cost_total, + tx_type='debit' + ) + + # Cr Inventory + TransactionModel.objects.create( + journal_entry=je_cogs, + account=inv_acc, + amount=cost_total, + tx_type='credit' + ) + # ------------------------------------------------------------------ + # 2C. Update car state flags inside the same transaction + # ------------------------------------------------------------------ + entity.get_items_inventory().filter(name=car.vin).update(for_inventory=False) + # car.item_model.for_inventory = False + # car.item_model.save(update_fields=['for_inventory']) + car.finances.selling_price = grand_total car.finances.is_sold = True car.finances.save() - car.item_model.save() +# def handle_account_process(invoice, amount, finance_data): +# """ +# Processes accounting transactions based on an invoice, financial data, +# and related entity accounts configuration. This function handles the +# creation of accounts if they do not already exist, and processes journal +# entries and transactions. + +# :param invoice: The invoice object to process transactions for. +# :type invoice: InvoiceModel +# :param amount: Total monetary value for the transaction. +# :type amount: Decimal +# :param finance_data: Dictionary containing financial details such as +# 'grand_total', 'total_vat_amount', and other related data. +# :type finance_data: dict +# :return: None +# """ +# for i in invoice.get_itemtxs_data()[0]: +# # car = models.Car.objects.get(vin=invoice.get_itemtxs_data()[0].first().item_model.name) +# car = i.item_model.car +# entity = invoice.ledger.entity +# coa = entity.get_default_coa() + +# cash_account = ( +# entity.get_all_accounts() +# .filter(role_default=True, role=roles.ASSET_CA_CASH) +# .first() +# ) +# inventory_account = car.get_inventory_account() +# revenue_account = car.get_revenue_account() +# cogs_account = car.get_cogs_account() + +# journal = JournalEntryModel.objects.create( +# posted=False, +# description=f"Payment for Invoice {invoice.invoice_number}", +# ledger=invoice.ledger, +# locked=False, +# origin=f"Sale of {car.id_car_make.name}{car.vin}: Invoice {invoice.invoice_number}", +# ) + +# TransactionModel.objects.create( +# journal_entry=journal, +# account=cash_account, +# amount=Decimal(finance_data.get("grand_total")), +# tx_type="debit", +# description="", +# ) + +# TransactionModel.objects.create( +# journal_entry=journal, +# account=revenue_account, +# amount=Decimal(finance_data.get("grand_total")), +# tx_type="credit", +# description="", +# ) + +# journal_cogs = JournalEntryModel.objects.create( +# posted=False, +# description=f"COGS of {car.id_car_make.name}{car.vin}: Invoice {invoice.invoice_number}", +# ledger=invoice.ledger, +# locked=False, +# origin="Payment", +# ) +# TransactionModel.objects.create( +# journal_entry=journal_cogs, +# account=cogs_account, +# amount=Decimal(car.finances.cost_price), +# tx_type="debit", +# description="", +# ) + +# TransactionModel.objects.create( +# journal_entry=journal_cogs, +# account=inventory_account, +# amount=Decimal(car.finances.cost_price), +# tx_type="credit", +# description="", +# ) +# try: +# car.item_model.for_inventory = False +# logger.debug(f"Set item_model.for_inventory to False for car {car.vin}.") +# except Exception as e: +# logger.error( +# f"Error updating item_model.for_inventory for car {car.vin} (Invoice {invoice.invoice_number}): {e}", +# exc_info=True, +# ) + +# car.finances.is_sold = True +# car.finances.save() +# car.item_model.save() # TransactionModel.objects.create( # journal_entry=journal, diff --git a/inventory/views.py b/inventory/views.py index 137c29ff..666c2011 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -67,7 +67,7 @@ from django.contrib.messages.views import SuccessMessageMixin from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.decorators import permission_required from django.shortcuts import render, get_object_or_404, redirect -from plans.models import Order, PlanPricing, AbstractOrder, UserPlan, BillingInfo +from plans.models import Plan, Order, PlanPricing, AbstractOrder, UserPlan, BillingInfo from django.views.generic import ( View, ListView, @@ -145,6 +145,7 @@ from .override import ( BillModelUpdateView as BillModelUpdateViewBase, BaseBillActionView as BaseBillActionViewBase, InventoryListView as InventoryListViewBase, + InvoiceModelUpdateView as InvoiceModelUpdateViewBase, ) from django_ledger.models import ( @@ -180,8 +181,6 @@ from django_ledger.views.mixins import ( ) # Other -from plans.models import Plan - from . import models, forms, tables from django_tables2 import SingleTableView from django_tables2.export.views import ExportMixin @@ -1145,7 +1144,6 @@ class CarListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): context = super().get_context_data(**kwargs) dealer = get_user_type(self.request) cars = models.Car.objects.filter(dealer=dealer).order_by("receiving_date") - context["stats"] = { "all": cars.count(), "available": cars.filter(status="available").count(), @@ -1231,7 +1229,7 @@ def inventory_stats_view(request, dealer_slug): # Base queryset for cars belonging to the dealer cars = models.Car.objects.filter(dealer=request.dealer) - + print(cars) # Count for total, reserved, showroom, and unreserved cars total_cars = cars.count() reserved_cars = models.CarReservation.objects.count() @@ -1517,13 +1515,13 @@ class CarFinanceCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateVi context["car"] = self.car return context - def get_form(self, form_class=None): - form = super().get_form(form_class) - dealer = get_user_type(self.request) - form.fields[ - "additional_finances" - ].queryset = models.AdditionalServices.objects.filter(dealer=dealer) - return form + # def get_form(self, form_class=None): + # form = super().get_form(form_class) + # dealer = get_user_type(self.request) + # form.fields[ + # "additional_finances" + # ].queryset = models.AdditionalServices.objects.filter(dealer=dealer) + # return form class CarFinanceUpdateView( @@ -1570,21 +1568,21 @@ class CarFinanceUpdateView( kwargs["instance"] = self.get_object() return kwargs - def get_initial(self): - initial = super().get_initial() - instance = self.get_object() - dealer = get_user_type(self.request) - selected_items = instance.additional_services.filter(dealer=dealer) - initial["additional_finances"] = selected_items - return initial + # def get_initial(self): + # initial = super().get_initial() + # instance = self.get_object() + # dealer = get_user_type(self.request) + # selected_items = instance.additional_services.filter(dealer=dealer) + # initial["additional_finances"] = selected_items + # return initial - def get_form(self, form_class=None): - form = super().get_form(form_class) - dealer = get_user_type(self.request) - form.fields[ - "additional_finances" - ].queryset = models.AdditionalServices.objects.filter(dealer=dealer) - return form + # def get_form(self, form_class=None): + # form = super().get_form(form_class) + # dealer = get_user_type(self.request) + # form.fields[ + # "additional_finances" + # ].queryset = models.AdditionalServices.objects.filter(dealer=dealer) + # return form class CarUpdateView( @@ -2405,7 +2403,6 @@ class CustomerCreateView( success_message = "Customer created successfully" def form_valid(self, form): - sleep(5) if customer := models.Customer.objects.filter( email=form.instance.email ).first(): @@ -4328,12 +4325,12 @@ def sales_list_view(request, dealer_slug): qs = [] try: if any([request.is_dealer, request.is_manager, request.is_accountant]): - qs = models.ExtraInfo.get_sale_orders(staff=staff, is_dealer=True) + qs = models.ExtraInfo.get_sale_orders(staff=staff, is_dealer=True,dealer=dealer) elif request.is_staff: - qs = models.ExtraInfo.get_sale_orders(staff=staff) + qs = models.ExtraInfo.get_sale_orders(staff=staff,dealer=dealer) except Exception as e: print(e) - print(qs[0]) + # query = request.GET.get('q') # # if query: # # qs = qs.filter( @@ -4418,7 +4415,6 @@ class EstimateListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) - staff = getattr(self.request.user.staffmember, "staff", None) if any( [ @@ -4431,16 +4427,19 @@ class EstimateListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): dealer=dealer, content_type=ContentType.objects.get_for_model(EstimateModel), related_content_type=ContentType.objects.get_for_model(models.Staff), - ) - print(qs) + ).union(models.ExtraInfo.objects.filter( + dealer=dealer, + content_type=ContentType.objects.get_for_model(EstimateModel), + related_content_type=ContentType.objects.get_for_model(User), + )) + elif self.request.is_staff and self.request.is_sales: qs = models.ExtraInfo.objects.filter( dealer=dealer, content_type=ContentType.objects.get_for_model(EstimateModel), related_content_type=ContentType.objects.get_for_model(models.Staff), - related_object_id=staff.pk, + related_object_id=self.request.staff.pk, ) - context["staff_estimates"] = qs return context @@ -4579,6 +4578,7 @@ def create_estimate(request, dealer_slug, slug=None): ).all() for i in car_instance[: int(quantities[0])]: + print(i) items_txs.append( { "item_number": i.item_model.item_number, @@ -4641,11 +4641,11 @@ def create_estimate(request, dealer_slug, slug=None): opportunity.estimate = estimate opportunity.save() - if staff := getattr(request.user.staffmember, "staff", None): + if request.is_staff: models.ExtraInfo.objects.create( dealer=dealer, content_object=estimate, - related_object=staff, + related_object=request.staff, created_by=request.user, ) else: @@ -4839,21 +4839,21 @@ def create_sale_order(request, dealer_slug, pk): return redirect("estimate_detail", dealer_slug=dealer_slug, pk=estimate.pk) form = forms.SaleOrderForm() - customer = estimate.customer.customer_set.first() - form.fields["estimate"].queryset = EstimateModel.objects.filter(pk=pk) - form.initial["estimate"] = estimate - form.fields["customer"].queryset = models.Customer.objects.filter(pk=customer.pk) - form.initial["customer"] = customer - if hasattr(estimate, "opportunity"): - form.initial["opportunity"] = estimate.opportunity - else: - form.fields["opportunity"].widget = HiddenInput() + # customer = estimate.customer.customer_set.first() + # form.fields["estimate"].queryset = EstimateModel.objects.filter(pk=pk) + # form.initial["estimate"] = estimate + # form.fields["customer"].queryset = models.Customer.objects.filter(pk=customer.pk) + # form.initial["customer"] = customer + # if hasattr(estimate, "opportunity"): + # form.initial["opportunity"] = estimate.opportunity + # else: + # form.fields["opportunity"].widget = HiddenInput() calculator = CarFinanceCalculator(estimate) finance_data = calculator.get_finance_data() return render( request, - "sales/estimates/sale_order_form1.html", + "sales/estimates/sale_order_form.html", {"form": form, "estimate": estimate, "items": items, "data": finance_data}, ) @@ -4872,6 +4872,7 @@ def update_estimate_discount(request, dealer_slug, pk): extra_info.data.update({"discount": Decimal(discount_amount)}) extra_info.save() + messages.success(request, "Discount updated successfully") return redirect("estimate_detail", dealer_slug=dealer_slug, pk=pk) @@ -4888,7 +4889,7 @@ def update_estimate_additionals(request, dealer_slug, pk): form.cleaned_data["additional_finances"] ) car.finances.save() - + messages.success(request, "Additional Finances updated successfully") return redirect("estimate_detail", dealer_slug=dealer_slug, pk=pk) @@ -5147,9 +5148,9 @@ class InvoiceListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): self.request.is_accountant, ] ): - qs = models.ExtraInfo.get_invoices(staff=staff, is_dealer=True) + qs = models.ExtraInfo.get_invoices(staff=staff, is_dealer=True,dealer=dealer) elif self.request.is_staff: - qs = models.ExtraInfo.get_invoices(staff=staff) + qs = models.ExtraInfo.get_invoices(staff=staff,dealer=dealer) except Exception as e: print(e) @@ -5285,7 +5286,7 @@ class ApprovedInvoiceModelUpdateFormView( def get_success_url(self): return reverse_lazy( "invoice_detail", - kwargs={"dealer_slug": self.kwargs["dealer_slug"], "pk": self.object.pk}, + kwargs={"dealer_slug": self.kwargs["dealer_slug"],"entity_slug": self.kwargs["entity_slug"], "pk": self.object.pk}, ) @@ -5333,7 +5334,7 @@ class PaidInvoiceModelUpdateFormView( def get_success_url(self): return reverse_lazy( "invoice_detail", - kwargs={"dealer_slug": self.kwargs["dealer_slug"], "pk": self.object.pk}, + kwargs={"dealer_slug": self.kwargs["dealer_slug"],"entity_slug": self.kwargs["entity_slug"], "pk": self.object.pk}, ) def form_valid(self, form): @@ -5341,7 +5342,7 @@ class PaidInvoiceModelUpdateFormView( if invoice.get_amount_open() > 0: messages.error(self.request, "Invoice is not fully paid") - return redirect("invoice_detail", pk=invoice.pk) + return redirect("invoice_detail",dealer_slug=self.kwargs["dealer_slug"],entity_slug=self.kwargs["entity_slug"], pk=invoice.pk) else: invoice.post_ledger() invoice.save() @@ -5373,12 +5374,12 @@ def invoice_mark_as(request, dealer_slug, pk): if mark and mark == "accept": if not invoice.can_approve(): messages.error(request, "invoice is not ready for approval") - return redirect("invoice_detail", dealer_slug=dealer_slug, pk=invoice.pk) + return redirect("invoice_detail", dealer_slug=dealer_slug,entity_slug=request.entity.slug, pk=invoice.pk) invoice.mark_as_approved( entity_slug=dealer.entity.slug, user_model=dealer.entity.admin ) invoice.save() - return redirect("invoice_detail", dealer_slug=dealer_slug, pk=invoice.pk) + return redirect("invoice_detail", dealer_slug=dealer_slug,entity_slug=request.entity.slug, pk=invoice.pk) @login_required @@ -5441,7 +5442,7 @@ def invoice_create(request, dealer_slug, pk): estimate.save() invoice.save() messages.success(request, "Invoice created successfully") - return redirect("invoice_detail", dealer_slug=dealer.slug, pk=invoice.pk) + return redirect("invoice_detail", dealer_slug=dealer.slug,entity_slug=entity.slug, pk=invoice.pk) else: print(form.errors) form = forms.InvoiceModelCreateForm( @@ -5501,6 +5502,32 @@ class InvoicePreviewView(LoginRequiredMixin, PermissionRequiredMixin, DetailView # payments +class InvoiceModelUpdateView(InvoiceModelUpdateViewBase): + template_name = 'sales/invoices/invoice_update.html' + permission_required = ["django_ledger.change_invoicemodel"] + + +# def PaymentCreateView(request,dealer_slug,entity_slug,invoice_pk): +# from django_ledger.forms.invoice import AccruedAndApprovedInvoiceModelUpdateForm +# invoice = get_object_or_404(InvoiceModel,pk=invoice_pk) + +# form = AccruedAndApprovedInvoiceModelUpdateForm(entity_slug=entity_slug,user_model=request.dealer.user) +# if request.method == "POST": +# if form.is_valid(): +# invoice_model: InvoiceModel = form.save(commit=False) +# if invoice_model.can_migrate(): +# invoice_model.migrate_state( +# user_model=request.dealer.user, +# entity_slug=entity_slug +# ) +# invoice_model.save() +# messages.success(request, "Invoice updated successfully") +# return redirect("invoice_detail", dealer_slug=dealer_slug,entity_slug=entity_slug, invoice_pk=invoice_model.pk) +# else: +# print(form.errors) + +# context = { "invoice": invoice, "form": form } +# return render(request, "sales/payments/payment_form1.html", context) @login_required @permission_required("inventory.add_payment", raise_exception=True) @@ -5529,15 +5556,15 @@ def PaymentCreateView(request, dealer_slug, pk): """ dealer = get_object_or_404(models.Dealer, slug=dealer_slug) invoice = InvoiceModel.objects.filter(pk=pk).first() - bill = BillModel.objects.filter(pk=pk).first() - model = invoice if invoice else bill + # bill = BillModel.objects.filter(pk=pk).first() + model = invoice + entity = dealer.entity form = forms.PaymentForm() - breakpoint() + if request.method == "POST": form = forms.PaymentForm(request.POST) - # --- Define user and model context for logging here user_id = request.user.id if request.user.is_authenticated else "Anonymous" user_username = ( request.user.username if request.user.is_authenticated else "anonymous" @@ -5546,19 +5573,19 @@ def PaymentCreateView(request, dealer_slug, pk): if form.is_valid(): amount = form.cleaned_data.get("amount") invoice = form.cleaned_data.get("invoice") - bill = form.cleaned_data.get("bill") + # bill = form.cleaned_data.get("bill") payment_method = form.cleaned_data.get("payment_method") - redirect_url = "invoice_detail" if invoice else "bill_detail" - model = invoice if invoice else bill + response = redirect("invoice_detail", dealer_slug=dealer.slug,entity_slug=entity.slug, pk=model.pk)# if invoice else "bill_detail" + # model = invoice if invoice else bill if not model.is_approved(): model.mark_as_approved(user_model=entity.admin) if model.amount_paid == model.amount_due: messages.error(request, _("fully paid")) - return redirect(redirect_url, dealer_slug=dealer.slug, pk=model.pk) + return response if model.amount_paid + amount > model.amount_due: messages.error(request, _("Amount exceeds due amount")) - return redirect(redirect_url, dealer_slug=dealer.slug, pk=model.pk) + return response try: if invoice: @@ -5566,14 +5593,14 @@ def PaymentCreateView(request, dealer_slug, pk): logger.info( f"User {user_username} (ID: {user_id}) successfully processed payment for Invoice ID: {invoice.pk} (Dealer: {dealer.slug}) Amount: {amount}, Method: {payment_method}." ) - elif bill: - set_bill_payment(dealer, entity, bill, amount, payment_method) - logger.info( - f"User {user_username} (ID: {user_id}) successfully processed payment for Bill ID: {bill.pk} (Dealer: {dealer.slug}) Amount: {amount}, Method: {payment_method}." - ) + # elif bill: + # set_bill_payment(dealer, entity, bill, amount, payment_method) + # logger.info( + # f"User {user_username} (ID: {user_id}) successfully processed payment for Bill ID: {bill.pk} (Dealer: {dealer.slug}) Amount: {amount}, Method: {payment_method}." + # ) messages.success(request, _("Payment created successfully")) - return redirect(redirect_url, dealer_slug=dealer.slug, pk=model.pk) + return response except Exception as e: logger.error( f"User {user_username} (ID: {user_id}) encountered error creating payment " @@ -5594,7 +5621,7 @@ def PaymentCreateView(request, dealer_slug, pk): form.initial["bill"] = model form.fields["invoice"].widget = HiddenInput() return render( - request, "sales/payments/payment_form.html", {"model": model, "form": form} + request, "sales/payments/payment_form1.html", {"model": model, "form": form} ) @@ -5725,7 +5752,7 @@ def payment_mark_as_paid(request, dealer_slug, pk): exc_info=True, ) messages.error(request, f"Error: {str(e)}") - return redirect("invoice_detail", dealer_slug=dealer_slug, pk=invoice.pk) + return redirect("invoice_detail", dealer_slug=dealer_slug,entity_slug=request.entity.slug, pk=invoice.pk) # activity log @@ -6577,41 +6604,43 @@ def send_lead_email(request, dealer_slug, slug, email_pk=None): ) messages.success(request, _("Email Draft successfully")) - try: - if getattr(lead, "opportunity", None): - # Log success when opportunity exists and redirecting - logger.info( - f"User {user_username} successfully drafted email for Lead ID: {lead.pk} ('{lead.slug}'). " - f"Lead has an Opportunity (ID: {lead.opportunity.pk}), redirecting to opportunity detail." - ) - response = HttpResponse( - redirect( - "opportunity_detail", - dealer_slug=dealer_slug, - slug=lead.opportunity.slug, - ) - ) - response["HX-Redirect"] = reverse( - "opportunity_detail", args=[lead.opportunity.slug] - ) - else: - # Log success when no opportunity and redirecting to lead detail - logger.info( - f"User {user_username} successfully drafted email for Lead ID: {lead.pk} ('{lead.slug}'). " - f"Lead has no Opportunity, redirecting to lead detail." - ) - response = HttpResponse() - response["HX-Redirect"] = reverse( - "lead_detail", dealer_slug=dealer_slug, slug=lead.slug - ) - return response - except models.Lead.opportunity.RelatedObjectDoesNotExist: - # --- Log when Lead.opportunity does not exist (Draft status) --- - logger.info( - f"User {user_username} drafted email for Lead ID: {lead.pk} ('{lead.slug}'). " - f"Lead's opportunity does not exist. Redirecting to lead list." - ) - return redirect("lead_list", dealer_slug=dealer.slug) + # try: + # if getattr(lead, "opportunity", None): + # # Log success when opportunity exists and redirecting + # logger.info( + # f"User {user_username} successfully drafted email for Lead ID: {lead.pk} ('{lead.slug}'). " + # f"Lead has an Opportunity (ID: {lead.opportunity.pk}), redirecting to opportunity detail." + # ) + # # response = HttpResponse( + # # redirect( + # # "opportunity_detail", + # # dealer_slug=dealer_slug, + # # slug=lead.opportunity.slug, + # # ) + # # ) + # # response["HX-Redirect"] = reverse( + # # "opportunity_detail", args=[lead.opportunity.slug] + # # ) + + # else: + # # Log success when no opportunity and redirecting to lead detail + # logger.info( + # f"User {user_username} successfully drafted email for Lead ID: {lead.pk} ('{lead.slug}'). " + # f"Lead has no Opportunity, redirecting to lead detail." + # ) + # # response = HttpResponse() + # # response["HX-Redirect"] = reverse( + # # "lead_detail", dealer_slug=dealer_slug, slug=lead.slug + # # ) + # return response + # except models.Lead.opportunity.RelatedObjectDoesNotExist: + # # --- Log when Lead.opportunity does not exist (Draft status) --- + # logger.info( + # f"User {user_username} drafted email for Lead ID: {lead.pk} ('{lead.slug}'). " + # f"Lead's opportunity does not exist. Redirecting to lead list." + # ) + # return response + # return redirect("lead_list", dealer_slug=dealer.slug) if request.method == "POST": email_pk = request.POST.get("email_pk") @@ -6643,25 +6672,30 @@ def send_lead_email(request, dealer_slug, slug, email_pk=None): activity_type=models.ActionChoices.EMAIL, ) messages.success(request, _("Email sent successfully")) - try: - if lead.opportunity: - # Log success when opportunity exists and redirecting after sending email - logger.info( - f"User {user_username} successfully sent email for Lead ID: {lead.pk} ('{lead.slug}'). " - f"Lead has an Opportunity (ID: {lead.opportunity.pk}), redirecting to opportunity detail." - ) - return redirect( - "opportunity_detail", - dealer_slug=dealer_slug, - slug=lead.opportunity.slug, - ) - except models.Lead.opportunity.RelatedObjectDoesNotExist: - # --- Log when Lead.opportunity does not exist (POST request for sending) --- - logger.info( - f"User {user_username} sent email for Lead ID: {lead.pk} ('{lead.slug}'). " - f"Lead's opportunity does not exist. Redirecting to lead list." - ) - return redirect("lead_list", dealer_slug=dealer_slug) + response = HttpResponse() + response["HX-Refresh"] = "true" + return response + # try: + # if lead.opportunity: + # # Log success when opportunity exists and redirecting after sending email + # logger.info( + # f"User {user_username} successfully sent email for Lead ID: {lead.pk} ('{lead.slug}'). " + # f"Lead has an Opportunity (ID: {lead.opportunity.pk}), redirecting to opportunity detail." + # ) + # return response + # # return redirect( + # # "opportunity_detail", + # # dealer_slug=dealer_slug, + # # slug=lead.opportunity.slug, + # # ) + # except models.Lead.opportunity.RelatedObjectDoesNotExist: + # # --- Log when Lead.opportunity does not exist (POST request for sending) --- + # logger.info( + # f"User {user_username} sent email for Lead ID: {lead.pk} ('{lead.slug}'). " + # f"Lead's opportunity does not exist. Redirecting to lead list." + # ) + # return response + # return redirect("lead_list", dealer_slug=dealer_slug) msg = f""" السلام عليكم Dear {lead.full_name}, @@ -6745,14 +6779,18 @@ class OpportunityCreateView( def get_form(self, form_class=None): dealer = get_object_or_404(models.Dealer, slug=self.kwargs.get("dealer_slug")) - staff = getattr(self.request.user.staffmember, "staff", None) form = super().get_form(form_class) form.fields["car"].queryset = models.Car.objects.filter( dealer=dealer, status="available", finances__marked_price__gt=0 ) - form.fields["lead"].queryset = models.Lead.objects.filter( - dealer=dealer, staff=staff - ) + if self.request.is_dealer: + form.fields["lead"].queryset = models.Lead.objects.filter( + dealer=dealer + ) + elif self.request.is_staff: + form.fields["lead"].queryset = models.Lead.objects.filter( + dealer=dealer, staff=self.request.staff + ) return form def get_success_url(self): @@ -9304,7 +9342,7 @@ def sse_stream(request): ) last_id = notification.id - sleep(2) + sleep(3) response = StreamingHttpResponse(event_stream(), content_type="text/event-stream") response["Cache-Control"] = "no-cache" @@ -10258,6 +10296,12 @@ def upload_cars(request, dealer_slug, pk=None): csv_data = io.StringIO(file_content) reader = csv.DictReader(csv_data) data = [x for x in reader] + if len(data) < item.quantity: + messages.error( + request, + f"CSV file has {len(data)} rows, but the quantity of the item is {item.quantity}.", + ) + return response for row in data: # Log VIN decoding and initial validation for each row logger.debug( diff --git a/static/images/CACHE/images/logos/staff/customer2/56d21851a30bf81ad30874af4c9f0290.webp b/static/images/CACHE/images/logos/staff/customer2/56d21851a30bf81ad30874af4c9f0290.webp new file mode 100644 index 0000000000000000000000000000000000000000..ae8e9ad5fe59aeb988a5e2699841ae3135f234ac GIT binary patch literal 450 zcmV;z0X_awNk&Gx0RRA3MM6+kP&gp20RRBd2>_h|DkuOb06uLhkwv5;A(-i&{6Gf8 zvVdlA{ZjA4;BiH&Tc5IVG)H^7e=7IQ4GJJ5Ir^o^k9WujpK3O*SRI6*>2&Uj+$T>u zS$9>8vu+V4Ed&7m{7Q$3So2kob_{3zS$|#^i%%nffn?8{0Dt6v^X6Tq&fdIcz1VGB ze-Hbgy7#Ok&ZEpGn__GMRGprEjaS*r7@^=kWBd@8=Bocooo+b+*cVEeb{K!wtb-GW zBk^8mB>ip8cHx#tcv~*)F$s?(&UI|cK-|~9K_BaP3FQSl_rRfc+tF~4s>3*^ znUZPwXuGwM*;hLN>lNzWbD5aW%a^g`(RKDui6DA6)smEb3pp2m`ypUSUlbDv#K_}S zkzvw#3Jzo!l3(ySzxE^vEMr`D+YmAN!pS~>vxdf-Nz{FeQ9l!1?Q=cFZ1J}25-DT s)e3k2A#2C@(+;%wP<^531;PrKqLK_&#C-A!Ty)X>H-=}3IgS7T0B8f<9RL6T literal 0 HcmV?d00001 diff --git a/static/images/CACHE/images/user-logo/138397308bd57adbff0504b57626b17b.webp b/static/images/CACHE/images/user-logo/138397308bd57adbff0504b57626b17b.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d76ce009b2820183c0aa38ff6664b7699a5b4a2 GIT binary patch literal 1240 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%0AJzj`iPC{5( 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�A_5T3glIc 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 literal 0 HcmV?d00001 diff --git a/staticfiles/images/CACHE/images/user-logo/138397308bd57adbff0504b57626b17b.webp b/staticfiles/images/CACHE/images/user-logo/138397308bd57adbff0504b57626b17b.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d76ce009b2820183c0aa38ff6664b7699a5b4a2 GIT binary patch literal 1240 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%0AJzj`iPC{5( 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�A_5T3glIc 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 { + const submitBtn = form.querySelector('button[type="submit"]'); + + if (submitBtn) { + // Store original button HTML + if (!submitBtn.dataset.originalHtml) { + submitBtn.dataset.originalHtml = submitBtn.innerHTML; + } + + form.addEventListener('submit', function(e) { + // Only proceed if form is valid + if (form.checkValidity()) { + disableSubmitButton(submitBtn); + } + }); + } + }); +}); + +/** + * Disable and show loading state on submit button + * @param {HTMLElement} button - The submit button element + */ +function disableSubmitButton(button) { + button.disabled = true; + button.innerHTML = ` + + + + ${button.dataset.savingText || 'Processing...'} + `; + button.classList.add('submitting'); +} + +/** + * Reset submit button to original state + * @param {HTMLElement} button - The submit button element + */ +function resetSubmitButton(button) { + if (button.dataset.originalHtml) { + button.innerHTML = button.dataset.originalHtml; + } + button.disabled = false; + button.classList.remove('submitting'); +} \ No newline at end of file diff --git a/staticfiles/user-logo.png b/staticfiles/user-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e79dfd221351b3572350b6b4508944b25fffb5 GIT binary patch literal 814 zcmV+}1JV46P)Px%=t)FDR7gvmmRYDxQ5eU6*O+;XBtm3}5T%q1WiB2h(}NV^1(6{skH+XeP%729IH>~yl{@?%G738l5KpUVNFc26N ze|H3$0MCG0;1*B~JOQ0JZ_=(n-<@3_c7v0|-TZ){A)av%oh4BngB?oKFBf>JvHT^Awl? zTnB!bz=HOQ7>>yaZsElB4ImW$ZyHI^EXUrHUyC=XHbFaJ9k8Y#xJA4O>;fLdWJ3az zmIU0V0xfg=J^%-dYXXfeOdeZ4N7&}&1nB^54s=~u0O@mJfeEDI!4gJ`fzvtr_QP1< zRD>*R;w|=>U`qi!KY{zeh_L^u-~e5KV+EAf|BeX`19=cw&?|urQ-JRU38Zr+Ft=d8 z#suO&vB1F2oE&I(H)mh=^^NfLF7U54!KH|0o{czK9~oxBlcis$K-=}evJ!n$r{Pgx zP6?xzz$)N^jRT0S)b!SS$~5I4h_(W&3k(gWO4?{Qf!DFwx(7)a9-FjP{LY5Z_nrwn zy|>6Ni~KO2QoP&8pf;v5;GV%}2clR5yF0yX&`J{w1ug@vQ@bDIvkk!Q5-=n(vjZ3x z)U-vkRZePbLKCzN1zZcPjKf4Y#Cuv9eACb0`EJ2|Nkd z&5SVoZw}RXKx{gx>y#7vszk2EZ&I90%B?rL8j3Ge<(4sIm7`T{>KYVxBXC5=^uRHR z)N}kPx!Z%&@j%h{1yZ4J^EjNQM|l<=ll;}T?8wwW`bph>k(v&nWDF*Kpq(!T {% comment %} {% endcomment %} {% if LANGUAGE_CODE == 'ar' %} - - + + {% else %}
{% include 'bill/includes/card_bill.html' with dealer_slug=request.dealer.slug bill=bill_model style='bill-detail' entity_slug=view.kwargs.entity_slug %} -
+ {% csrf_token %}
{{ form|crispy }}
+
+ + + + \ No newline at end of file diff --git a/templates/crm/leads/lead_detail.html b/templates/crm/leads/lead_detail.html index 2bcb8cb3..75bec8ac 100644 --- a/templates/crm/leads/lead_detail.html +++ b/templates/crm/leads/lead_detail.html @@ -64,14 +64,8 @@
-

{{ lead.first_name }} {{ lead.last_name }}

- {% if lead.staff %} -

- {{ _("Assigned to") }}: {{ lead.staff }} -

- {% else %} -

{{ _("Not Assigned") }}

- {% endif %} +

{{ lead.first_name|capfirst }} {{ lead.last_name|capfirst }}

+

{{ lead.email|capfirst }}

@@ -107,6 +101,34 @@
+
+
+
+
+
{{ _("Assigned To") }}
+
+
+ {% if lead.staff.logo %} + Logo + {% endif %} +
+ + {% if lead.staff == request.staff %} + {{ _("Me") }} + {% elif LANGUAGE_CODE == "en" %} + {{ lead.staff.name|capfirst }} + {% else %} + {{ lead.staff.arabic_name }} + {% endif %} + +
+
+
+
+
@@ -492,12 +514,23 @@

{{ _("Emails") }}

{% if perms.inventory.change_lead %} - + {% comment %} - + {% endcomment %} + {% endif %}
@@ -791,21 +824,7 @@
{% include 'modal/delete_modal.html' %} - {% comment %} {% endcomment %} + {% include "components/email_modal.html" %} {% include "components/task_modal.html" with content_type="lead" slug=lead.slug %} diff --git a/templates/crm/leads/lead_form.html b/templates/crm/leads/lead_form.html index c9b93a34..4885db4e 100644 --- a/templates/crm/leads/lead_form.html +++ b/templates/crm/leads/lead_form.html @@ -42,7 +42,7 @@
- + {% csrf_token %} {{ form|crispy }}
diff --git a/templates/crm/leads/lead_send.html b/templates/crm/leads/lead_send.html index 39845e5a..1ea38305 100644 --- a/templates/crm/leads/lead_send.html +++ b/templates/crm/leads/lead_send.html @@ -8,7 +8,8 @@ diff --git a/templates/inventory/car_detail.html b/templates/inventory/car_detail.html index 95408ea0..b54d11d2 100644 --- a/templates/inventory/car_detail.html +++ b/templates/inventory/car_detail.html @@ -262,6 +262,10 @@ {{ car.finances.cost_price|floatformat:2 }} {% endif %} + + {% trans "Marked Price"|capfirst %} + {{ car.finances.marked_price|floatformat:2 }} + {% trans "Selling Price"|capfirst %} {{ car.finances.selling_price|floatformat:2 }} diff --git a/templates/ledger/ledger/ledger_list.html b/templates/ledger/ledger/ledger_list.html index e5777e85..0c967059 100644 --- a/templates/ledger/ledger/ledger_list.html +++ b/templates/ledger/ledger/ledger_list.html @@ -30,7 +30,7 @@ {% if ledger.invoicemodel %} {% if perms.django_ledger.view_invoicemodel %} - {{ ledger.get_wrapped_model_instance }} + {{ ledger.get_wrapped_model_instance }} {% endif %} {% elif ledger.billmodel %} {% if perms.django_ledger.view_billmodel %} diff --git a/templates/notifications.html b/templates/notifications.html index 095f9f99..5358e127 100644 --- a/templates/notifications.html +++ b/templates/notifications.html @@ -77,6 +77,16 @@