diff --git a/inventory/utils.py b/inventory/utils.py index 7cb84d02..db755765 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -1,3 +1,6 @@ +from django.shortcuts import redirect +from django.contrib import messages +from django.utils import timezone import requests from inventory import models from django.conf import settings @@ -68,3 +71,23 @@ def get_user_type(request): dealer = request.user.staff.dealer return dealer +def get_dealer_from_instance(instance): + if instance.dealer.staff: + return instance.dealer + else: + return instance.dealer + + +def reserve_car(car,request): + try: + reserved_until = timezone.now() + timezone.timedelta(hours=24) + models.CarReservation.objects.create( + car=car, reserved_by=request.user, reserved_until=reserved_until + ) + car.status = models.CarStatusChoices.RESERVED + car.save() + messages.success(request, _("Car reserved successfully.")) + except Exception as e: + messages.error(request, f"Error reserving car: {e}") + + return redirect("car_detail", pk=car.pk) \ No newline at end of file diff --git a/inventory/views.py b/inventory/views.py index 7c2cbc59..b5880da9 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -1,3 +1,5 @@ +import requests +from django.test import Client from django.core.exceptions import ObjectDoesNotExist from django.core.paginator import Paginator from django.utils.decorators import method_decorator @@ -67,7 +69,7 @@ from . import models, forms from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.messages.views import SuccessMessageMixin from django.contrib.auth.models import Group -from .utils import get_calculations, send_email, get_user_type +from .utils import get_calculations, reserve_car, send_email, get_user_type from django.contrib.auth.models import User from allauth.account import views from django.db.models import Count, F, Value @@ -637,23 +639,12 @@ class CustomCardCreateView(LoginRequiredMixin, CreateView): @login_required() def reserve_car_view(request, car_id): if request.method == "POST": - car = get_object_or_404(models.Car, pk=car_id) - if car.is_reserved(): + car = get_object_or_404(models.Car, pk=car_id) + if car.is_reserved(): messages.error(request, _("This car is already reserved.")) return redirect("car_detail", pk=car.pk) - - try: - reserved_until = timezone.now() + timezone.timedelta(hours=24) - models.CarReservation.objects.create( - car=car, reserved_by=request.user, reserved_until=reserved_until - ) - car.status = models.CarStatusChoices.RESERVED - car.save() - messages.success(request, _("Car reserved successfully.")) - except Exception as e: - messages.error(request, f"Error reserving car: {e}") - - return redirect("car_detail", pk=car.pk) + response = reserve_car(car, request) + return response return JsonResponse( {"success": False, "message": "Invalid request method."}, status=400 ) @@ -1760,42 +1751,36 @@ def create_estimate(request): items = data.get("item", []) quantities = data.get("quantity", []) - if not all([items, quantities]): return JsonResponse( {"status": "error", "message": "Items and Quantities are required"}, status=400, - ) + ) if isinstance(quantities, list): - if '0' in quantities: + if "0" in quantities: return JsonResponse( - { - "status": "error", - "message": "Quantity must be greater than zero" - }) + {"status": "error", "message": "Quantity must be greater than zero"} + ) else: if int(quantities) <= 0: return JsonResponse( - { - "status": "error", - "message": "Quantity must be greater than zero" - } - ) - + {"status": "error", "message": "Quantity must be greater than zero"} + ) + estimate = entity.create_estimate( estimate_title=title, customer_model=customer, contract_terms=terms ) if isinstance(items, list): item_quantity_map = {} for item, quantity in zip(items, quantities): - if item in item_quantity_map: + if item in item_quantity_map: item_quantity_map[item] += int(quantity) - else: + else: item_quantity_map[item] = int(quantity) item_list = list(item_quantity_map.keys()) quantity_list = list(item_quantity_map.values()) - + items_list = [ {"item_id": item_list[i], "quantity": quantity_list[i]} for i in range(len(item_list)) @@ -1845,22 +1830,22 @@ def create_estimate(request): if isinstance(items, list): for item in items: item_instance = ItemModel.objects.get(pk=item) - instance = models.Car.objects.get(vin=item_instance.name) - instance.status = models.CarStatusChoices.RESERVED - instance.save() + instance = models.Car.objects.get(vin=item_instance.name) + response = reserve_car(instance, request) + else: item_instance = ItemModel.objects.get(pk=items) instance = models.Car.objects.get(vin=item_instance.name) - instance.status = models.CarStatusChoices.RESERVED - instance.save() + response = reserve_car(instance, request) - url = reverse("estimate_detail", kwargs={"pk": estimate.pk}) + url = reverse("estimate_detail", kwargs={"pk": estimate.pk}) return JsonResponse( { "status": "success", "message": "Estimate created successfully!", - "url": f"{url}" - }) + "url": f"{url}", + } + ) # except Exception as e: # return JsonResponse( @@ -1899,13 +1884,21 @@ class EstimateDetailView(LoginRequiredMixin, DetailView): estimate = kwargs.get("object") if estimate.get_itemtxs_data(): total = sum( - (x.ce_revenue_estimate - models.Car.objects.get(vin=x.item_model.name).finances.discount_amount) for x in estimate.get_itemtxs_data()[0].all() + ( + x.ce_revenue_estimate + - models.Car.objects.get( + vin=x.item_model.name + ).finances.discount_amount + ) + for x in estimate.get_itemtxs_data()[0].all() ) vat = models.VatRate.objects.filter(is_active=True).first() - + # Calculate VAT and total with 2 decimal places vat_amount = round(total * vat.vat_rate, 2) # Round to 2 decimal places - grand_total = round((total * vat.vat_rate) + total, 2) # Round to 2 decimal places + grand_total = round( + (total * vat.vat_rate) + total, 2 + ) # Round to 2 decimal places # Add values to the context kwargs["vat_amount"] = vat_amount @@ -1958,29 +1951,23 @@ def estimate_mark_as(request, pk): if mark == "review": if not estimate.can_review(): messages.error(request, "Estimate is not ready for review") - return redirect("estimate_detail", pk=estimate.pk) + return redirect("estimate_detail", pk=estimate.pk) estimate.mark_as_review() + elif mark == "approved": if not estimate.can_approve(): messages.error(request, "Estimate is not ready for approval") return redirect("estimate_detail", pk=estimate.pk) - estimate.mark_as_approved() - messages.success(request, "Estimate approved successfully.") - for i in estimate.get_itemtxs_data()[0]: - car = models.Car.objects.get(vin=i.item_model.name) - car.status = models.CarStatusChoices.SOLD - car.save() + estimate.mark_as_approved() + + messages.success(request, "Estimate approved successfully.") elif mark == "rejected": if not estimate.can_cancel(): messages.error(request, "Estimate is not ready for rejection") return redirect("estimate_detail", pk=estimate.pk) estimate.mark_as_canceled() - messages.success(request, "Estimate canceled successfully.") - for i in estimate.get_itemtxs_data()[0]: - car = models.Car.objects.get(vin=i.item_model.name) - car.status = models.CarStatusChoices.AVAILABLE - car.save() - + messages.success(request, "Estimate canceled successfully.") + elif mark == "completed": if not estimate.can_complete(): messages.error(request, "Estimate is not ready for completion")