From fb80514fa6b0ea2b429c42d701b3664fc3ea2d0c Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Thu, 13 Feb 2025 17:25:57 +0300 Subject: [PATCH] update --- inventory/__pycache__/admin.cpython-311.pyc | Bin 6689 -> 6755 bytes inventory/__pycache__/views.cpython-311.pyc | Bin 192611 -> 193674 bytes inventory/admin.py | 3 +- inventory/signals.py | 48 +------- inventory/views.py | 129 +++++++++++++------- 5 files changed, 91 insertions(+), 89 deletions(-) diff --git a/inventory/__pycache__/admin.cpython-311.pyc b/inventory/__pycache__/admin.cpython-311.pyc index c4a4df301fd44af9d5bc7228715c885bafb9f419..dadec57d9d16d74b0b45e33da85a908f796a1cd3 100644 GIT binary patch delta 997 zcmZwFF-RLx7zgn8<#PA#qAwcHm{=PWYZ_Xui4Z}MiqPm}#x8{_>K(BmG3`Ys$F@_K z9v|o+hz=qS9m>(6OTn#msTPMcbf|P{7YpsK?@Tl3*T=zw-}l}BHI;V7BCGl&N-V;)ptriow4L#Q{WmF@HRZ4Fu zooR_Mxpg^5Dfa(o&Sl}2EW|qk{$t^dr^5XH0m)tXnyW_e1+!FHP2v_G1dfM1WoXj) zKTBe-u1UYGrwm=X(RA}JNgZsaVqVw5PfVIar0ZU@%V?E(qL~N7UQOQzNaHiniR+=K zaL3~WsMTpa zi^TAyIWeBDhppoLa-lN3SXo|io-8%Pv*D?`9u_ z#e>!AN~LT&c^}b;z6%xPui%fd@MCnSqsB&#u72L%XgtuKKj};#v&;$09I;G|sW=f! JdXw=}xBzPp)7k(4 delta 880 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 PoaZoUniBmr7Ww`k6vdVG delta 7807 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 PK6{xoQR(*`W*GkmC)JDr diff --git a/inventory/admin.py b/inventory/admin.py index f026d984..8c227ef3 100644 --- a/inventory/admin.py +++ b/inventory/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin from . import models +from django_ledger import models as ledger_models admin.site.register(models.Dealer) @@ -29,7 +30,7 @@ admin.site.register(models.CarTrim) admin.site.register(models.AdditionalServices) admin.site.register(models.Payment) admin.site.register(models.VatRate) -admin.site.register(models.Customer) +admin.site.register(ledger_models.CustomerModel) admin.site.register(models.Opportunity) admin.site.register(models.Notification) admin.site.register(models.Lead) diff --git a/inventory/signals.py b/inventory/signals.py index af7d9da2..c3c93e83 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -641,63 +641,21 @@ def create_ledger_vendor(sender, instance, created, **kwargs): print(f"VendorModel created for Vendor: {instance.name}") -@receiver(post_save, sender=models.Customer) -def create_customer(sender, instance, created, **kwargs): - if created: - dealer = instance.dealer - entity = dealer.entity - name = f"{instance.first_name} {instance.middle_name} {instance.last_name}" - if entity: - entity.create_customer( - customer_model_kwargs={ - "customer_name": name, - "address_1": instance.address, - "phone": instance.phone_number, - "email": instance.email, - "sales_tax_rate": 0.15, - "active": True, - "hidden": False, - "additional_info": {}, - } - ) - - print(f"Customer created: {name}") - - @receiver(post_save, sender=models.CustomerModel) def create_customer_user(sender, instance, created, **kwargs): if created: user = User.objects.create( username=instance.email, email=instance.email, - is_active=False, - first_name=instance.additional_info.get('first_name',''), - last_name=instance.additional_info.get('last_name','') + first_name=instance.additional_info["customer_info"].get("first_name", ""), + last_name=instance.additional_info["customer_info"].get("last_name", ""), ) + user.set_unusable_password() user.save() instance.user = user instance.save() -# @receiver(post_save, sender=models.Lead) -# def create_customer_from_lead(sender, instance, created, **kwargs): -# dealer = instance.dealer -# entity = dealer.entity -# if created: -# customer = entity.create_customer( -# customer_model_kwargs={ -# "customer_name": instance.full_name, -# "address_1": instance.address, -# "phone": instance.phone_number, -# "email": instance.email, -# "sales_tax_rate": 0.15, -# } -# ) -# instance.customer = customer -# instance.save() - - - # Create Item @receiver(post_save, sender=models.Car) def create_item_model(sender, instance, created, **kwargs): diff --git a/inventory/views.py b/inventory/views.py index 081ac43d..8f128cfc 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -1279,37 +1279,55 @@ def add_activity_to_customer(request, pk): def CustomerCreateView(request): form = forms.CustomerForm() + if request.method == "POST": + form = forms.CustomerForm(request.POST) dealer = get_user_type(request) - if dealer.entity.get_customers().filter(email=request.POST["email"]).exists(): - messages.error(request, _("Customer with this email already exists.")) - form = forms.CustomerForm(request.POST) + + if form.is_valid(): + email = form.cleaned_data["email"] + + # Check if customer with this email already exists + if dealer.entity.get_customers().filter(email=email).exists(): + messages.error(request, _("Customer with this email already exists.")) + else: + # Create customer name + customer_name = ( + f"{form.cleaned_data['first_name']} " + f"{form.cleaned_data['middle_name']} " + f"{form.cleaned_data['last_name']}" + ) + + # Create customer instance + try: + customer = dealer.entity.create_customer( + commit=False, + customer_model_kwargs={ + "customer_name": customer_name, + "address_1": form.cleaned_data["address"], + "phone": form.cleaned_data["phone_number"], + "email": email, + } + ) + + customer.additional_info = { + "customer_info": { + "first_name": form.cleaned_data["first_name"], + "middle_name": form.cleaned_data["middle_name"], + "last_name": form.cleaned_data["last_name"], + }, + "type": "customer", + } + customer.save() + + messages.success(request, _("Customer created successfully.")) + return redirect("customer_list") + + except Exception as e: + messages.error(request, _(f"An error occurred: {str(e)}")) else: - customer_dict = { - x: request.POST[x] for x in request.POST if x != "csrfmiddlewaretoken" - } - customer_name = ( - customer_dict["first_name"] - + " " - + customer_dict["middle_name"] - + " " - + customer_dict["last_name"] - ) - instance = dealer.entity.create_customer( - customer_model_kwargs={ - "customer_name": customer_name, - "address_1": customer_dict["address"], - "phone": customer_dict["phone_number"], - "email": customer_dict["email"], - } - ) - customer_dict["pk"] = str(instance.pk) - instance.additional_info = {} - instance.additional_info["customer_info"] = customer_dict - instance.additional_info["type"] = "customer" - instance.save() - messages.success(request, _("Customer created successfully.")) - return redirect("customer_list") + # Form is invalid, show errors + messages.error(request, _("Please correct the errors below.")) return render(request, "customers/customer_form.html", {"form": form}) @@ -3100,21 +3118,45 @@ class LeadDetailView(DetailView): def lead_create(request): form = forms.LeadForm() - make = request.GET.get("id_car_make",None) + make = request.GET.get("id_car_make", None) + if make: form.fields['id_car_model'].queryset = models.CarModel.objects.filter(id_car_make=int(make)) + if request.method == "POST": - form = forms.LeadForm(request.POST) - form.fields['id_car_model'].queryset = models.CarModel.objects.filter(id_car_make=int(request.POST['id_car_make'])) + form = forms.LeadForm(request.POST) + + # Filter car models based on the selected make (for POST requests) + if 'id_car_make' in request.POST: + form.fields['id_car_model'].queryset = models.CarModel.objects.filter( + id_car_make=int(request.POST['id_car_make']) + ) + try: if form.is_valid(): instance = form.save(commit=False) dealer = get_user_type(request) - instance = form.save(commit=False) instance.dealer = dealer + staff = "" + if hasattr(request.user, "staff"): + staff = request.user.staff + instance.staff = staff + + # creating customer in ledger + customer = dealer.entity.create_customer( + customer_model_kwargs={ + "customer_name": instance.full_name, + "address_1": instance.address, + "phone": instance.phone_number, + "email": instance.email, + "sales_tax_rate": 0.15, + } + ) + instance.customer = customer instance.save() - messages.success(request, "Lead created successfully!") return redirect("lead_list") + except Exception as e: + messages.error(request, f"Lead was not created ... : {str(e)}") return render(request, "crm/leads/lead_form.html", {"form": form}) @@ -3200,17 +3242,17 @@ def lead_convert(request, pk): @login_required def schedule_lead(request, pk): dealer = get_user_type(request) - print(dealer) - lead = get_object_or_404(models.Lead, pk=pk) + + lead = get_object_or_404(models.Lead, pk=pk, dealer=dealer) if request.method == "POST": form = forms.ScheduleForm(request.POST) if form.is_valid(): instance = form.save(commit=False) instance.lead = lead + staff = "" if hasattr(request.user, "staff"): - instance.scheduled_by = request.user.staff - - # Save the Schedule instance + staff = request.user.staff + instance.scheduled_by = staff instance.save() # Create AppointmentRequest @@ -3218,21 +3260,22 @@ def schedule_lead(request, pk): if not service: messages.error(request, "Service not found!") return redirect("lead_list") + staff_member = StaffMember.objects.filter(user=request.user).first() appointment_request = AppointmentRequest.objects.create( date=instance.scheduled_at.date(), start_time=instance.scheduled_at.time(), end_time=(instance.scheduled_at + instance.duration).time(), service=service, - staff_member=StaffMember.objects.first() + staff_member=staff_member, ) - print(lead.customer) + client = get_object_or_404(User, email=lead.email) # Create Appointment Appointment.objects.create( - client=lead.customer.user, # Replace with the appropriate client + client=client, appointment_request=appointment_request, - phone=lead.customer.phone, # Replace with actual phone number - address=lead.customer.address_1, # Replace with actual address + phone=lead.phone_number, + address=lead.address, ) messages.success(request, "Lead scheduled and appointment created successfully!")