diff --git a/inventory/__pycache__/admin.cpython-311.pyc b/inventory/__pycache__/admin.cpython-311.pyc index c4a4df30..dadec57d 100644 Binary files a/inventory/__pycache__/admin.cpython-311.pyc and b/inventory/__pycache__/admin.cpython-311.pyc differ diff --git a/inventory/__pycache__/views.cpython-311.pyc b/inventory/__pycache__/views.cpython-311.pyc index 9a332a1c..8cc9131b 100644 Binary files a/inventory/__pycache__/views.cpython-311.pyc and b/inventory/__pycache__/views.cpython-311.pyc differ 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!")