Compare commits

..

No commits in common. "27520266926b8416f17fed8112e6d2e742841156" and "e5d09b6e0d92be6809ed59ce9ade18d7983a3077" have entirely different histories.

3 changed files with 277 additions and 623 deletions

View File

@ -127,6 +127,7 @@ from .services import (
)
from .utils import (
CarFinanceCalculator,
create_make_accounts,
get_car_finance_data,
get_financial_values,
get_item_transactions,
@ -136,6 +137,7 @@ from .utils import (
set_bill_payment,
set_invoice_payment,
CarTransfer,
to_dict,
)
#####################################################################
@ -207,7 +209,7 @@ def dealer_signup(request, *args, **kwargs):
address = wf3.get("address")
if password != password_confirm:
return JsonResponse({"error": _("Passwords do not match")}, status=400)
return JsonResponse({"error": "Passwords do not match."}, status=400)
try:
with transaction.atomic():
@ -230,7 +232,7 @@ def dealer_signup(request, *args, **kwargs):
address=address,
)
return JsonResponse(
{"message": _("User created successfully")}, status=200
{"message": "User created successfully."}, status=200
)
except Exception as e:
return JsonResponse({"error": str(e)}, status=400)
@ -492,7 +494,7 @@ class CarCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView):
dealer = get_user_type(self.request)
form.instance.dealer = dealer
form.save()
messages.success(self.request, _("Car saved successfully"))
messages.success(self.request, "Car saved successfully.")
return super().form_valid(form)
def car_history(request,pk):
@ -934,7 +936,7 @@ class CarFinanceCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateVie
def form_valid(self, form):
form.instance.car = self.car
messages.success(self.request, _("Car finance details saved successfully"))
messages.success(self.request, _("Car finance details saved successfully."))
return super().form_valid(form)
def get_success_url(self):
@ -958,7 +960,7 @@ class CarFinanceUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMe
model = models.CarFinance
form_class = forms.CarFinanceForm
template_name = "inventory/car_finance_form.html"
success_message = _("Car finance details updated successfully")
success_message = _("Car finance details updated successfully.")
permission_required = ['inventory.change_carfinance']
def get_success_url(self):
@ -988,7 +990,7 @@ class CarUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessageMi
model = models.Car
form_class = forms.CarUpdateForm
template_name = "inventory/car_edit.html"
success_message = _("Car updated successfully")
success_message = _("Car updated successfully.")
permission_required = ['inventory.change_car']
def get_success_url(self):
@ -1002,7 +1004,7 @@ class CarDeleteView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessageMi
permission_required = ['inventory.delete_car']
def delete(self, request, *args, **kwargs):
messages.success(request, _("Car deleted successfully"))
messages.success(request, _("Car deleted successfully."))
return super().delete(request, *args, **kwargs)
@ -1020,7 +1022,7 @@ class CarLocationCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateVie
dealer = get_user_type(self.request)
form.instance.owner = dealer
form.save()
messages.success(self.request, _("Location saved successfully"))
messages.success(self.request, "Location saved successfully.")
return super().form_valid(form)
@ -1040,7 +1042,7 @@ class CarLocationUpdateView(LoginRequiredMixin,PermissionRequiredMixin,UpdateVie
dealer = get_user_type(self.request)
form.instance.owner = dealer
form.save()
messages.success(self.request, _("Location updated successfully"))
messages.success(self.request, "Location updated successfully.")
return super().form_valid(form)
def get_success_url(self):
@ -1095,7 +1097,7 @@ def car_transfer_approve(request, car_pk, transfer_pk):
transfer.save()
transfer.car.status = "available"
transfer.car.save()
messages.success(request, _("Car transfer canceled successfully"))
messages.success(request, _("Car transfer canceled successfully."))
models.Notification.objects.create(
user=transfer.from_dealer.user,
message=f"Car transfer request from {transfer.to_dealer} is canceled.",
@ -1112,7 +1114,7 @@ def car_transfer_approve(request, car_pk, transfer_pk):
user=transfer.to_dealer.user,
message=f"Car transfer request from {transfer.from_dealer} is waiting for your acceptance. <a href='{url}'> Accept</a>",
)
messages.success(request, _("Car transfer approved successfully"))
messages.success(request, _("Car transfer approved successfully."))
return redirect("car_detail", pk=car.pk)
@ -1124,7 +1126,7 @@ def car_transfer_accept_reject(request, car_pk, transfer_pk):
if status == "rejected":
transfer.status = "reject"
transfer.active = False
messages.success(request, _("Car transfer rejected successfully"))
messages.success(request, _("Car transfer rejected successfully."))
models.Notification.objects.create(
user=transfer.from_dealer.user,
message=f"Car transfer request from {transfer.to_dealer} is rejected.",
@ -1136,7 +1138,7 @@ def car_transfer_accept_reject(request, car_pk, transfer_pk):
transfer_process = CarTransfer(car, transfer)
success = transfer_process.transfer_car()
if success:
messages.success(request, _("Car Transfer Completed successfully"))
messages.success(request, _("Car Transfer Completed successfully."))
models.Activity.objects.create(content_object=car,notes=f"Transfered from {transfer.from_dealer} to {transfer.to_dealer}",created_by=request.user)
models.Notification.objects.create(
user=transfer.from_dealer.user,
@ -1169,7 +1171,7 @@ class CustomCardCreateView(LoginRequiredMixin, CreateView):
return context
def get_success_url(self):
messages.success(self.request, _("Custom Card added successfully"))
messages.success(self.request, _("Custom Card added successfully."))
return reverse_lazy("car_detail", kwargs={"pk": self.kwargs["car_pk"]})
@ -1189,7 +1191,7 @@ class CarRegistrationCreateView(LoginRequiredMixin, CreateView):
return context
def get_success_url(self):
messages.success(self.request, _("Registration added successfully"))
messages.success(self.request, _("Registration added successfully."))
return reverse_lazy("car_detail", kwargs={"pk": self.kwargs["car_pk"]})
@ -1198,12 +1200,12 @@ 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():
messages.error(request, _("This car is already reserved"))
messages.error(request, _("This car is already reserved."))
return redirect("car_detail", pk=car.pk)
response = reserve_car(car, request)
return response
return JsonResponse(
{"success": False, "message": "Invalid request method"}, status=400
{"success": False, "message": "Invalid request method."}, status=400
)
@ -1218,7 +1220,7 @@ def manage_reservation(request, reservation_id):
if action == "renew":
reservation.reserved_until = timezone.now() + timezone.timedelta(hours=24)
reservation.save()
messages.success(request, _("Reservation renewed successfully"))
messages.success(request, _("Reservation renewed successfully."))
return redirect("car_detail", pk=reservation.car.pk)
elif action == "cancel":
@ -1226,16 +1228,16 @@ def manage_reservation(request, reservation_id):
reservation.delete()
car.status = models.CarStatusChoices.AVAILABLE
car.save()
messages.success(request, _("Reservation canceled successfully"))
messages.success(request, _("Reservation canceled successfully."))
return redirect("car_detail", pk=reservation.car.pk)
else:
return JsonResponse(
{"success": False, "message": _("Invalid action")}, status=400
{"success": False, "message": _("Invalid action.")}, status=400
)
return JsonResponse(
{"success": False, "message": _("Invalid request method")}, status=400
{"success": False, "message": _("Invalid request method.")}, status=400
)
@ -1276,7 +1278,7 @@ class DealerUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
form_class = forms.DealerForm
template_name = "dealers/dealer_form.html"
success_url = reverse_lazy("dealer_detail")
success_message = _("Dealer updated successfully")
success_message = _("Dealer updated successfully.")
def get_success_url(self):
return reverse("dealer_detail", kwargs={"pk": self.object.pk})
@ -1367,7 +1369,7 @@ def CustomerCreateView(request):
if form.is_valid():
if dealer.entity.get_customers().filter(email=form.cleaned_data["email"]).exists():
messages.error(request, _("Customer with this email already exists"))
messages.error(request, _("Customer with this email already exists."))
else:
# Create customer name
customer_name = (
@ -1391,14 +1393,14 @@ def CustomerCreateView(request):
customer.additional_info.update({"type": "customer"})
customer.save()
messages.success(request, _("Customer created successfully"))
messages.success(request, _("Customer created successfully."))
return redirect("customer_list")
except Exception as e:
messages.error(request, _(f"An error occurred: {str(e)}"))
else:
# Form is invalid, show errors
messages.error(request, _("Please correct the errors below"))
messages.error(request, _("Please correct the errors below."))
return render(request, "customers/customer_form.html", {"form": form})
@ -1437,7 +1439,7 @@ def CustomerUpdateView(request, pk):
raise Exception(e)
instance.save()
messages.success(request, _("Customer updated successfully"))
messages.success(request, _("Customer updated successfully."))
return redirect("customer_list")
else:
form = forms.CustomerForm(
@ -1458,7 +1460,7 @@ def delete_customer(request, pk):
customer.save()
user.save()
messages.success(request, _("Customer deleted successfully"))
messages.success(request, _("Customer deleted successfully."))
return redirect("customer_list")
@ -1490,7 +1492,7 @@ class VendorCreateView(
form_class = forms.VendorForm
template_name = "vendors/vendor_form.html"
success_url = reverse_lazy("vendor_list")
success_message = _("Vendor created successfully")
success_message = _("Vendor created successfully.")
def form_valid(self, form):
dealer = get_user_type(self.request)
@ -1504,19 +1506,37 @@ class VendorUpdateView(
SuccessMessageMixin,
UpdateView,
):
model = models.Vendor
model = VendorModel
form_class = forms.VendorForm
template_name = "vendors/vendor_form.html"
success_url = reverse_lazy("vendor_list")
success_message = _("Vendor updated successfully")
success_message = _("Vendor updated successfully.")
def get_initial(self):
initial = super().get_initial()
initial = self.object.additional_info
return initial
def form_valid(self, form):
instance = form.save(commit=False)
instance.vendor_name = self.request.POST["name"]
instance.vendor_number = self.request.POST["crn"]
instance.address_1 = self.request.POST["address"]
instance.phone = self.request.POST["phone_number"]
instance.email = self.request.POST["email"]
instance.tax_id_number = self.request.POST["vrn"]
additionals = form.cleaned_data
additionals['phone_number'] = str(additionals['phone_number'])
instance.additional_info = additionals
instance.save()
return super().form_valid(form)
@login_required
def delete_vendor(request, pk):
vendor = get_object_or_404(models.Vendor, pk=pk)
# vendor.active = False
vendor.delete()
messages.success(request, _("Vendor deleted successfully"))
messages.success(request, _("Vendor deleted successfully."))
return redirect("vendor_list")
#group
@ -1545,7 +1565,7 @@ class GroupCreateView(
form_class = forms.GroupForm
template_name = "groups/group_form.html"
success_url = reverse_lazy("group_list")
success_message = _("Group created successfully")
success_message = _("Group created successfully.")
def form_valid(self, form):
dealer = get_user_type(self.request)
@ -1566,7 +1586,7 @@ class GroupUpdateView(
form_class = forms.GroupForm
template_name = "groups/group_form.html"
success_url = reverse_lazy("group_list")
success_message = _("Group updated successfully")
success_message = _("Group updated successfully.")
def form_valid(self, form):
dealer = get_user_type(self.request)
@ -1580,7 +1600,7 @@ class GroupUpdateView(
def GroupDeleteview(request, pk):
group = get_object_or_404(models.CustomGroup, pk=pk)
group.delete()
messages.success(request, _("Group deleted successfully"))
messages.success(request, _("Group deleted successfully."))
return redirect("group_list")
@login_required
@ -1592,7 +1612,7 @@ def GroupPermissionView(request, pk):
permissions = request.POST.getlist("name")
for i in permissions:
group.add_permission(Permission.objects.get(id=int(i)))
messages.success(request, _("Permission added successfully"))
messages.success(request, _("Permission added successfully."))
return redirect("group_detail", pk=group.pk)
form = forms.PermissionForm(initial={"name": group.permissions})
return render(request,"groups/group_permission_form.html",{"group": group, "form": form})
@ -1610,7 +1630,7 @@ def UserGroupView(request, pk):
cg = models.CustomGroup.objects.get(id=int(i))
staff.add_group(cg.group)
messages.success(request, _("Group added successfully"))
messages.success(request, _("Group added successfully."))
return redirect("user_detail", pk=staff.pk)
form = forms.UserGroupForm(initial={"name": staff.groups})
@ -1645,7 +1665,7 @@ class UserCreateView(
form_class = forms.StaffForm
template_name = "users/user_form.html"
success_url = reverse_lazy("user_list")
success_message = _("User created successfully")
success_message = _("User created successfully.")
def form_valid(self, form):
dealer = get_user_type(self.request)
@ -1653,12 +1673,12 @@ class UserCreateView(
allowed_users = quota_dict.get("Users")
if allowed_users is None:
messages.error(self.request, _("The user quota for staff members is not defined. Please contact support"))
messages.error(self.request, _("The user quota for staff members is not defined. Please contact support."))
return self.form_invalid(form)
current_staff_count = dealer.staff.count()
if current_staff_count >= allowed_users:
messages.error(self.request, _("You have reached the maximum number of staff users allowed for your plan"))
messages.error(self.request, _("You have reached the maximum number of staff users allowed for your plan."))
return self.form_invalid(form)
email = form.cleaned_data["email"]
@ -1690,7 +1710,7 @@ class UserUpdateView(
form_class = forms.StaffForm
template_name = "users/user_form.html"
success_url = reverse_lazy("user_list")
success_message = _("User updated successfully")
success_message = _("User updated successfully.")
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
@ -1728,7 +1748,7 @@ def UserDeleteview(request, pk):
staff = get_object_or_404(models.Staff, pk=pk)
staff.staff_member.delete()
staff.delete()
messages.success(request, _("User deleted successfully"))
messages.success(request, _("User deleted successfully."))
return redirect("user_list")
@ -1757,7 +1777,7 @@ def OrganizationCreateView(request):
if request.method == "POST":
form = forms.OrganizationForm(request.POST)
if CustomerModel.objects.filter(email=request.POST["email"]).exists():
messages.error(request, _("An organization with this email already exists"))
messages.error(request, _("An organization with this email already exists."))
return redirect("organization_create")
organization_dict = {
@ -1784,7 +1804,7 @@ def OrganizationCreateView(request):
customer.additional_info.update({"customer_info": organization_dict})
customer.additional_info.update({"type": "organization"})
customer.save()
messages.success(request, _("Organization created successfully"))
messages.success(request, _("Organization created successfully."))
return redirect("organization_list")
else:
form = forms.OrganizationForm()
@ -1823,7 +1843,7 @@ def OrganizationUpdateView(request,pk):
instance.additional_info["customer_info"] = organization_dict
instance.additional_info["type"] = "organization"
instance.save()
messages.success(request, _("Organization created successfully"))
messages.success(request, _("Organization created successfully."))
return redirect("organization_list")
else:
form = forms.OrganizationForm(
@ -1844,7 +1864,7 @@ def OrganizationDeleteView(request, pk):
try:
User.objects.get(email=organization.email).delete()
organization.delete()
messages.success(request, _("Organization deleted successfully"))
messages.success(request, _("Organization deleted successfully."))
except Exception as e:
print("unable to delete user", e)
messages.error(request,_("Unable to delete organization"))
@ -1874,7 +1894,7 @@ class RepresentativeCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateVi
form_class = forms.RepresentativeForm
template_name = "representatives/representative_form.html"
success_url = reverse_lazy("representative_list")
success_message = _("Representative created successfully")
success_message = "Representative created successfully."
def form_valid(self, form):
if form.is_valid():
@ -1890,14 +1910,14 @@ class RepresentativeUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateVi
form_class = forms.RepresentativeForm
template_name = "representatives/representative_form.html"
success_url = reverse_lazy("representative_list")
success_message = _("Representative updated successfully")
success_message = "Representative updated successfully."
class RepresentativeDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
model = models.Representative
template_name = "representatives/representative_confirm_delete.html"
success_url = reverse_lazy("representative_list")
success_message = _("Representative deleted successfully")
success_message = "Representative deleted successfully."
# BANK ACCOUNT
@ -1920,7 +1940,7 @@ class BankAccountCreateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM
form_class = BankAccountCreateForm
template_name = "ledger/bank_accounts/bank_account_form.html"
success_url = reverse_lazy("bank_account_list")
success_message = _("Bank account created successfully")
success_message = "Bank account created successfully."
permission_required = ['inventory.view_carfinance']
def form_valid(self, form):
@ -1949,7 +1969,7 @@ class BankAccountUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM
form_class = BankAccountUpdateForm
template_name = "ledger/bank_accounts/bank_account_form.html"
success_url = reverse_lazy("bank_account_list")
success_message = _("Bank account updated successfully")
success_message = "Bank account updated successfully."
permission_required = ['inventory.view_carfinance']
def get_form_kwargs(self):
@ -1966,7 +1986,7 @@ def bank_account_delete(request, pk):
bank_account = get_object_or_404(BankAccountModel, pk=pk)
if request.method == "POST":
bank_account.delete()
messages.success(request, _("Bank account deleted successfully"))
messages.success(request, "Bank account deleted successfully.")
return redirect("bank_account_list")
return render(
request,
@ -1995,7 +2015,7 @@ class AccountCreateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessa
form_class = AccountModelCreateForm
template_name = "ledger/coa_accounts/account_form.html"
success_url = reverse_lazy("account_list")
success_message = _("Account created successfully")
success_message = "Account created successfully."
permission_required = ['inventory.view_carfinance']
def form_valid(self, form):
@ -2062,7 +2082,7 @@ class AccountUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessa
form_class = AccountModelUpdateForm
template_name = "ledger/coa_accounts/account_form.html"
success_url = reverse_lazy("account_list")
success_message = _("Account updated successfully")
success_message = "Account updated successfully."
permission_required = ['inventory.view_carfinance']
def get_form(self, form_class=None):
@ -2078,7 +2098,7 @@ def account_delete(request, pk):
account = get_object_or_404(AccountModel, pk=pk)
account.delete()
messages.success(request, _("Account deleted successfully"))
messages.success(request, "Account deleted successfully.")
return redirect("account_list")
@ -2135,30 +2155,30 @@ def create_estimate(request,pk=None):
if not all([items, quantities]):
return JsonResponse(
{"status": "error", "message": _("Items and Quantities are required")},
{"status": "error", "message": "Items and Quantities are required"},
status=400,
)
if isinstance(quantities, list):
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"}
)
if isinstance(items, list):
for item, quantity in zip(items, quantities):
if int(quantity) > models.Car.objects.filter(hash=item,status='available').count():
return JsonResponse(
{"status": "error", "message": _("Quantity must be less than or equal to the number of cars in stock")},
{"status": "error", "message": "Quantity must be less than or equal to the number of cars in stock"},
)
else:
if int(quantities) > models.Car.objects.filter(hash=items,status='available').count():
return JsonResponse(
{"status": "error", "message": _("Quantity must be less than or equal to the number of cars in stock")},
{"status": "error", "message": "Quantity must be less than or equal to the number of cars in stock"},
)
estimate = entity.create_estimate(
estimate_title=title, customer_model=customer, contract_terms=terms
@ -2240,7 +2260,7 @@ def create_estimate(request,pk=None):
return JsonResponse(
{
"status": "success",
"message": _("Quotation created successfully"),
"message": "Quotation created successfully!",
"url": f"{url}",
}
)
@ -2255,8 +2275,8 @@ def create_estimate(request,pk=None):
customer = opportunity.customer
form.initial['customer'] = customer
car_list = models.Car.objects.filter(dealer=dealer,colors__isnull=False,finances__isnull=False,status="available").annotate(color=F('colors__exterior__rgb'),color_name=F('colors__exterior__arabic_name')).values_list(
'id_car_make__arabic_name', 'id_car_model__arabic_name','id_car_serie__arabic_name','id_car_trim__arabic_name','color','color_name','hash').annotate(hash_count=Count('hash')).distinct()
car_list = models.Car.objects.filter(dealer=dealer,colors__isnull=False,finances__isnull=False,status="available").annotate(color=F('colors__exterior__rgb'),color_name=F('colors__exterior__name')).values_list(
'id_car_make__name', 'id_car_model__name','id_car_serie__name','id_car_trim__name','color','color_name','hash').annotate(hash_count=Count('hash')).distinct()
context = {
"form": form,
"items": [
@ -2392,29 +2412,29 @@ def estimate_mark_as(request, pk):
if mark:
if mark == "review":
if not estimate.can_review():
messages.error(request, _("Quotation is not ready for review"))
messages.error(request, _("Estimate is not ready for review"))
return redirect("estimate_detail", pk=estimate.pk)
estimate.mark_as_review()
elif mark == "approved":
if not estimate.can_approve():
messages.error(request, _("Quotation is not ready for approval"))
messages.error(request, _("Estimate is not ready for approval"))
return redirect("estimate_detail", pk=estimate.pk)
estimate.mark_as_approved()
messages.success(request, _("Quotation approved successfully"))
messages.success(request, _("Estimate approved successfully."))
elif mark == "rejected":
if not estimate.can_cancel():
messages.error(request, _("Quotation is not ready for rejection"))
messages.error(request, _("Estimate is not ready for rejection"))
return redirect("estimate_detail", pk=estimate.pk)
estimate.mark_as_canceled()
messages.success(request, _("Quotation canceled successfully"))
messages.success(request, _("Estimate canceled successfully."))
elif mark == "completed":
if not estimate.can_complete():
messages.error(request, _("Quotation is not ready for completion"))
messages.error(request, _("Estimate is not ready for completion"))
return redirect("estimate_detail", pk=estimate.pk)
elif mark == "canceled":
if not estimate.can_cancel():
messages.error(request, _("Quotation is not ready for cancellation"))
messages.error(request, _("Estimate is not ready for cancelation"))
return redirect("estimate_detail", pk=estimate.pk)
estimate.mark_as_canceled()
try:
@ -2423,9 +2443,9 @@ def estimate_mark_as(request, pk):
car.save()
except Exception as e:
pass
messages.success(request, _("Quotation canceled successfully"))
messages.success(request, _("Estimate canceled successfully."))
estimate.save()
messages.success(request, _("Quotation marked as ") + mark.upper())
messages.success(request, "Estimate marked as " + mark.upper())
return redirect("estimate_detail", pk=estimate.pk)
@ -2585,7 +2605,7 @@ def invoice_create(request, pk):
estimate.mark_as_completed()
estimate.save()
invoice.save()
messages.success(request, "Invoice created successfully")
messages.success(request, "Invoice created successfully!")
return redirect("invoice_detail", pk=invoice.pk)
else:
print(form.errors)
@ -2649,10 +2669,10 @@ def PaymentCreateView(request, pk):
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"))
messages.error(request,"fully paid")
return redirect(redirect_url, pk=model.pk)
if model.amount_paid + amount > model.amount_due:
messages.error(request,_("Amount exceeds due amount"))
messages.error(request,"Amount exceeds due amount")
return redirect(redirect_url, pk=model.pk)
try:
@ -2660,7 +2680,7 @@ def PaymentCreateView(request, pk):
set_invoice_payment(dealer, entity, invoice, amount, payment_method)
elif bill:
set_bill_payment(dealer, entity, bill, amount, payment_method)
messages.success(request, _("Payment created successfully"))
messages.success(request, "Payment created successfully!")
return redirect(redirect_url, pk=model.pk)
except Exception as e:
messages.error(request, f"Error creating payment: {str(e)}")
@ -2724,11 +2744,11 @@ def payment_mark_as_paid(request, pk):
invoice.ledger.post()
invoice.ledger.save()
messages.success(request, _("Payment created successfully"))
messages.success(request, "Payment created successfully!")
else:
messages.error(
request,
_("Invoice is not fully paid, Payment cannot be marked as paid"),
"Invoice is not fully paid. Payment cannot be marked as paid.",
)
except Exception as e:
messages.error(request, f"Error: {str(e)}")
@ -2853,7 +2873,7 @@ def lead_create(request):
# except Exception as e:
# print(e)
instance.save()
messages.success(request, _("Lead created successfully"))
messages.success(request, "Lead created successfully!")
return redirect("lead_list")
except Exception as e:
messages.error(request, f"Lead was not created ... : {str(e)}")
@ -2884,7 +2904,7 @@ def LeadDeleteView(request,pk):
except Exception as e:
print(e)
lead.delete()
messages.success(request, _("Lead deleted successfully"))
messages.success(request, "Lead deleted successfully!")
return redirect("lead_list")
@ -2899,7 +2919,7 @@ def add_note_to_lead(request, pk):
note.content_object = lead
note.created_by = request.user
note.save()
messages.success(request, _("Note added successfully"))
messages.success(request, "Note added successfully!")
return redirect("lead_detail", pk=lead.pk)
else:
form = forms.NoteForm()
@ -2912,10 +2932,10 @@ def add_note_to_opportunity(request, pk):
if request.method == "POST":
notes = request.POST.get("notes")
if not notes:
messages.error(request, _("Notes field is required"))
messages.error(request, "Notes field is required.")
else:
models.Notes.objects.create(content_object=opportunity, created_by=request.user,note=notes)
messages.success(request, _("Note added successfully"))
messages.success(request, "Note added successfully!")
return redirect("opportunity_detail", pk=opportunity.pk)
@ -2932,7 +2952,7 @@ def update_note(request, pk):
updated_note.content_object = note.content_object
updated_note.created_by = request.user
updated_note.save()
messages.success(request, _("Note updated successfully"))
messages.success(request, "Note updated successfully!")
return redirect("lead_detail", pk=lead_pk)
else:
form = forms.NoteForm(instance=note)
@ -2946,7 +2966,7 @@ def delete_note(request, pk):
note = get_object_or_404(models.Notes, pk=pk, created_by=request.user)
lead_pk = note.content_object.pk
note.delete()
messages.success(request, _("Note deleted successfully"))
messages.success(request, _("Note deleted successfully."))
return redirect("lead_detail", pk=lead_pk)
@ -2956,18 +2976,18 @@ def lead_convert(request, pk):
lead = get_object_or_404(models.Lead, pk=pk)
dealer = get_user_type(request)
if hasattr(lead, "opportunity"):
messages.error(request, _("Lead is already converted to customer"))
messages.error(request, "Lead is already converted to customer.")
else:
customer = lead.convert_to_customer(dealer.entity,lead)
models.Opportunity.objects.create(dealer=dealer,customer=customer,lead=lead,probability=50,stage=models.Stage.PROSPECT,staff=lead.staff,status=models.Status.QUALIFIED)
messages.success(request, _("Lead converted to customer successfully"))
messages.success(request, "Lead converted to customer successfully!")
return redirect("lead_list")
@login_required
@permission_required('inventory.add_appointmentrequest',raise_exception=True)
def schedule_lead(request, pk):
if not request.is_staff:
messages.error(request, _("You do not have permission to schedule lead"))
messages.error(request, "You do not have permission to schedule lead.")
return redirect("lead_list")
dealer = get_user_type(request)
lead = get_object_or_404(models.Lead, pk=pk, dealer=dealer)
@ -2982,7 +3002,7 @@ def schedule_lead(request, pk):
# Create AppointmentRequest
service = Service.objects.filter(name=instance.scheduled_type).first()
if not service:
messages.error(request, _("Service not found"))
messages.error(request, "Service not found!")
return redirect("lead_list")
try:
@ -3007,7 +3027,7 @@ def schedule_lead(request, pk):
)
instance.save()
messages.success(request, _("Lead scheduled and appointment created successfully"))
messages.success(request, "Lead scheduled and appointment created successfully!")
return redirect("lead_list")
else:
messages.error(request, f"Invalid form data: {str(form.errors)}")
@ -3026,7 +3046,7 @@ def lead_transfer(request,pk):
if form.is_valid():
lead.staff = form.cleaned_data["transfer_to"]
lead.save()
messages.success(request, _("Lead transferred successfully"))
messages.success(request, "Lead transferred successfully!")
else:
messages.error(request, f"Invalid form data: {str(form.errors)}")
return redirect("lead_list")
@ -3040,7 +3060,7 @@ def send_lead_email(request, pk,email_pk=None):
if status == 'draft':
models.Email.objects.create(content_object=lead, created_by=request.user,from_email="manager@tenhal.com", to_email=request.GET.get("to"), subject=request.GET.get("subject"), message=request.GET.get("message"),status=models.EmailStatus.DRAFT)
models.Activity.objects.create(dealer=dealer,content_object=lead, notes="Email Draft",created_by=request.user,activity_type=models.ActionChoices.EMAIL)
messages.success(request, _("Email Draft successfully"))
messages.success(request, _("Email Draft successfully!"))
response = HttpResponse(redirect("lead_detail", pk=lead.pk))
response['HX-Redirect'] = reverse('lead_detail', args=[lead.pk])
return response
@ -3065,7 +3085,7 @@ def send_lead_email(request, pk,email_pk=None):
)
dealer = get_user_type(request)
models.Activity.objects.create(dealer=dealer,content_object=lead, notes="Email sent",created_by=request.user,activity_type=models.ActionChoices.EMAIL)
messages.success(request, _("Email sent successfully"))
messages.success(request, _("Email sent successfully!"))
return redirect("lead_list")
msg = f"""
السلام عليكم
@ -3191,7 +3211,7 @@ class OpportunityListView(LoginRequiredMixin,ListView):
def delete_opportunity(request, pk):
opportunity = get_object_or_404(models.Opportunity, pk=pk)
opportunity.delete()
messages.success(request, _("Opportunity deleted successfully"))
messages.success(request, _("Opportunity deleted successfully."))
return redirect("opportunity_list")
@login_required
@ -3204,7 +3224,7 @@ def opportunity_update_status(request,pk):
if stage:
opportunity.stage = stage
opportunity.save()
messages.success(request,_("Opportunity status updated successfully"))
messages.success(request,"Opportunity status updated successfully")
response = HttpResponse(redirect("opportunity_detail",pk=opportunity.pk))
response['HX-Refresh'] = 'true'
return response
@ -3226,7 +3246,7 @@ def mark_notification_as_read(request, pk):
notification = get_object_or_404(models.Notification, pk=pk, user=request.user)
notification.is_read = True
notification.save()
messages.success(request, _("Notification marked as read"))
messages.success(request, _("Notification marked as read."))
return redirect("notifications_history")
@ -3244,7 +3264,7 @@ class ItemServiceCreateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM
form_class = forms.AdditionalServiceForm
template_name = "items/service/service_create.html"
success_url = reverse_lazy("item_service_list")
success_message = _("Service created successfully")
success_message = _("Service created successfully.")
context_object_name = "service"
permission_required = ["django_ledger.add_itemmodel"]
@ -3262,7 +3282,7 @@ class ItemServiceUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM
form_class = forms.AdditionalServiceForm
template_name = "items/service/service_create.html"
success_url = reverse_lazy("item_service_list")
success_message = _("Service updated successfully")
success_message = _("Service updated successfully.")
context_object_name = "service"
permission_required = ["django_ledger.change_itemmodel"]
@ -3385,7 +3405,7 @@ class InReviewBillView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView):
form_class = InReviewBillModelUpdateForm
template_name = "ledger/bills/bill_update_form.html"
success_url = reverse_lazy("bill_list")
success_message = _("Bill updated successfully")
success_message = _("Bill updated successfully.")
context_object_name = "bill"
permission_required = ["django_ledger.change_billmodel"]
@ -3411,7 +3431,7 @@ class ApprovedBillModelView(LoginRequiredMixin,PermissionRequiredMixin, UpdateVi
form_class = ApprovedBillModelUpdateForm
template_name = "ledger/bills/bill_update_form.html"
success_url = reverse_lazy("bill_list")
success_message = _("Bill updated successfully")
success_message = _("Bill updated successfully.")
context_object_name = "bill"
permission_required = ["django_ledger.change_billmodel"]
@ -3440,11 +3460,11 @@ def bill_mark_as_approved(request, pk):
if request.method == "POST":
dealer = get_user_type(request)
if bill.is_approved():
messages.error(request, _("Bill is already approved"))
messages.error(request, _("Bill is already approved."))
return redirect("bill_detail", pk=bill.pk)
bill.mark_as_approved(user_model=dealer.entity.admin)
bill.save()
messages.success(request, _("Bill marked as approved successfully"))
messages.success(request, _("Bill marked as approved successfully."))
return redirect("bill_detail", pk=bill.pk)
@ -3455,7 +3475,7 @@ def bill_mark_as_paid(request, pk):
if request.method == "POST":
dealer = get_user_type(request)
if bill.is_paid():
messages.error(request, _("Bill is already paid"))
messages.error(request, _("Bill is already paid."))
return redirect("bill_detail", pk=bill.pk)
if bill.amount_due == bill.amount_paid:
bill.mark_as_paid(user_model=dealer.entity.admin)
@ -3464,9 +3484,9 @@ def bill_mark_as_paid(request, pk):
bill.ledger.post_journal_entries()
bill.ledger.post()
bill.ledger.save()
messages.success(request, _("Bill marked as paid successfully"))
messages.success(request, _("Bill marked as paid successfully."))
else:
messages.error(request, _("Amount paid is not equal to amount due"))
messages.error(request, _("Amount paid is not equal to amount due."))
return redirect("bill_detail", pk=bill.pk)
@login_required
@ -3486,18 +3506,18 @@ def bill_create(request):
if not all([items, quantities]):
return JsonResponse(
{"status": "error", "message": _("Items and Quantities are required")},
{"status": "error", "message": "Items and Quantities are required"},
status=400,
)
if isinstance(quantities, list):
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"}
)
bill = entity.create_bill(vendor_model=vendor, terms=terms)
@ -3558,7 +3578,7 @@ def bill_create(request):
return JsonResponse(
{
"status": "success",
"message": _("Bill created successfully"),
"message": "Bill created successfully!",
"url": f"{url}",
}
)
@ -3649,7 +3669,7 @@ def send_email_view(request, pk):
)
estimate.mark_as_review()
messages.success(request, _("Email sent successfully"))
messages.success(request, _("Email sent successfully!"))
return redirect("estimate_detail", pk=estimate.pk)
@ -3893,7 +3913,7 @@ class PayableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View):
})
return JsonResponse({
'message': _('Unauthorized')
'message': 'Unauthorized'
}, status=401)
@ -3919,7 +3939,7 @@ class ReceivableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View):
})
return JsonResponse({
'message': _('Unauthorized')
'message': 'Unauthorized'
}, status=401)
@ -3968,7 +3988,7 @@ class PnLAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View):
})
return JsonResponse({
'message': _('Unauthorized')
'message': 'Unauthorized'
}, status=401)
@ -4021,7 +4041,7 @@ def DealerSettingsView(request,pk):
instance = form.save(commit=False)
instance.dealer = dealer
instance.save()
messages.success(request, _('Settings updated'))
messages.success(request, 'Settings updated')
return redirect('dealer_detail', pk=dealer.pk)
else:
print(form.errors)
@ -4052,6 +4072,7 @@ def assign_car_makes(request):
form = forms.DealersMakeForm(request.POST, dealer=dealer)
if form.is_valid():
form.save()
create_make_accounts(dealer)
return redirect("dealer_detail", pk=dealer.pk)
else:
# Pre-fill the form with existing selections
@ -4070,6 +4091,7 @@ class LedgerModelListView(LoginRequiredMixin, ListView,ArchiveIndexView):
show_all = False
show_current = False
show_visible = False
allow_empty = True
def get_queryset(self):
@ -4134,7 +4156,7 @@ class JournalEntryCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView)
template_name = "ledger/journal_entry/journal_entry_form.html"
form_class = forms.JournalEntryModelCreateForm
ledger_model = None
success_message = _("Journal Entry created")
success_message = "Journal Entry created"
def get_form(self, form_class=None):
dealer = get_user_type(self.request)
@ -4160,7 +4182,7 @@ def JournalEntryDeleteView(request,pk):
journal_entry = get_object_or_404(JournalEntryModel, pk=pk)
ledger = journal_entry.ledger
if not journal_entry.can_delete():
messages.error(request, _('Journal Entry cannot be deleted'))
messages.error(request, 'Journal Entry cannot be deleted')
return redirect("journalentry_list", pk=ledger.pk)
journal_entry.delete()
messages.success(request, 'Journal Entry deleted')
@ -4187,7 +4209,7 @@ class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase):
def ledger_lock_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first()
if ledger.is_locked():
messages.error(request, _("Ledger is already locked"))
messages.error(request, "Ledger is already locked.")
return redirect("journalentry_list", pk=ledger.pk)
ledger.lock_journal_entries()
ledger.lock()
@ -4197,7 +4219,7 @@ def ledger_lock_all_journals(request,entity_slug,pk):
def ledger_unlock_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first()
if not ledger.is_locked():
messages.error(request, _("Ledger is already Unlocked"))
messages.error(request, "Ledger is already Unlocked.")
return redirect("journalentry_list", pk=ledger.pk)
ledger.unlock()
@ -4211,7 +4233,7 @@ def ledger_unlock_all_journals(request,entity_slug,pk):
def ledger_post_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first()
if ledger.is_posted():
messages.error(request, _("Ledger is already posted"))
messages.error(request, "Ledger is already posted.")
return redirect("journalentry_list", pk=ledger.pk)
ledger.post_journal_entries()
ledger.post()
@ -4221,7 +4243,7 @@ def ledger_post_all_journals(request,entity_slug,pk):
def ledger_unpost_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first()
if not ledger.is_posted():
messages.error(request, _("Ledger is already Unposted"))
messages.error(request, "Ledger is already Unposted.")
return redirect("journalentry_list", pk=ledger.pk)
qs = ledger.journal_entries.posted()
for je in qs:

File diff suppressed because it is too large Load Diff