fix the reserve when creating estimate

This commit is contained in:
gitea 2025-01-06 14:40:14 +00:00
parent 2399ac7dbc
commit da1b53c775
2 changed files with 61 additions and 56 deletions

View File

@ -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
@ -73,3 +76,18 @@ def get_dealer_from_instance(instance):
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)

View File

@ -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")