From 4aadba8c6236caa86b5df0e7021832901454eccf Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Wed, 26 Mar 2025 22:10:32 +0300 Subject: [PATCH] update --- .../__pycache__/settings.cpython-311.pyc | Bin 8968 -> 8968 bytes inventory/views.py | 236 +++---- locale/ar/LC_MESSAGES/django.po | 612 ++++++++++++++---- 3 files changed, 608 insertions(+), 240 deletions(-) diff --git a/car_inventory/__pycache__/settings.cpython-311.pyc b/car_inventory/__pycache__/settings.cpython-311.pyc index e19a2f9cd24319e66b1bed5e3a497f3eb384b65c..d9926d9df7064c87d21714e59c847e7173512475 100644 GIT binary patch delta 27 hcmeBh>u}><&dbZi00f(=A8h2dU}H4h?80_L1^{Qr2aNy# delta 27 hcmeBh>u}><&dbZi00iH;?{4I_U}H4f?80_L1^{Kh2VejI diff --git a/inventory/views.py b/inventory/views.py index 63162e9d..32f11e43 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -207,7 +207,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 +230,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 +492,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 +934,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 +958,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 +988,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 +1002,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 +1020,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 +1040,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 +1095,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 +1112,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. Accept", ) - messages.success(request, _("Car transfer approved successfully.")) + messages.success(request, _("Car transfer approved successfully")) return redirect("car_detail", pk=car.pk) @@ -1124,7 +1124,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 +1136,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 +1169,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 +1189,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 +1198,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 +1218,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 +1226,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 +1276,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 +1367,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 +1391,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 +1437,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 +1458,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 +1490,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) @@ -1508,7 +1508,7 @@ class VendorUpdateView( 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") @login_required @@ -1516,7 +1516,7 @@ 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 +1545,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 +1566,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 +1580,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 +1592,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 +1610,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 +1645,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 +1653,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 +1690,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 +1728,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 +1757,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 +1784,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 +1823,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 +1844,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 +1874,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 +1890,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 +1920,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 +1949,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 +1966,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 +1995,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 +2062,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 +2078,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 +2135,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 +2240,7 @@ def create_estimate(request,pk=None): return JsonResponse( { "status": "success", - "message": "Quotation created successfully!", + "message": _("Quotation created successfully"), "url": f"{url}", } ) @@ -2255,8 +2255,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__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() + 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() context = { "form": form, "items": [ @@ -2392,29 +2392,29 @@ def estimate_mark_as(request, pk): if mark: if mark == "review": if not estimate.can_review(): - messages.error(request, _("Estimate is not ready for review")) + messages.error(request, _("Quotation 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, _("Estimate is not ready for approval")) + messages.error(request, _("Quotation is not ready for approval")) return redirect("estimate_detail", pk=estimate.pk) estimate.mark_as_approved() - messages.success(request, _("Estimate approved successfully.")) + messages.success(request, _("Quotation approved successfully")) elif mark == "rejected": if not estimate.can_cancel(): - messages.error(request, _("Estimate is not ready for rejection")) + messages.error(request, _("Quotation is not ready for rejection")) return redirect("estimate_detail", pk=estimate.pk) estimate.mark_as_canceled() - messages.success(request, _("Estimate canceled successfully.")) + messages.success(request, _("Quotation canceled successfully")) elif mark == "completed": if not estimate.can_complete(): - messages.error(request, _("Estimate is not ready for completion")) + messages.error(request, _("Quotation is not ready for completion")) return redirect("estimate_detail", pk=estimate.pk) elif mark == "canceled": if not estimate.can_cancel(): - messages.error(request, _("Estimate is not ready for cancelation")) + messages.error(request, _("Quotation is not ready for cancellation")) return redirect("estimate_detail", pk=estimate.pk) estimate.mark_as_canceled() try: @@ -2423,9 +2423,9 @@ def estimate_mark_as(request, pk): car.save() except Exception as e: pass - messages.success(request, _("Estimate canceled successfully.")) + messages.success(request, _("Quotation canceled successfully")) estimate.save() - messages.success(request, "Estimate marked as " + mark.upper()) + messages.success(request, _("Quotation marked as ") + mark.upper()) return redirect("estimate_detail", pk=estimate.pk) @@ -2585,7 +2585,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 +2649,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 +2660,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 +2724,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 +2853,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 +2884,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 +2899,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 +2912,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 +2932,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 +2946,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 +2956,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 +2982,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 +3007,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 +3026,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 +3040,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 +3065,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 +3191,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 +3204,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 +3226,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 +3244,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 +3262,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 +3385,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 +3411,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 +3440,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 +3455,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 +3464,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 +3486,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 +3558,7 @@ def bill_create(request): return JsonResponse( { "status": "success", - "message": "Bill created successfully!", + "message": _("Bill created successfully"), "url": f"{url}", } ) @@ -3649,7 +3649,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 +3893,7 @@ class PayableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): }) return JsonResponse({ - 'message': 'Unauthorized' + 'message': _('Unauthorized') }, status=401) @@ -3919,7 +3919,7 @@ class ReceivableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): }) return JsonResponse({ - 'message': 'Unauthorized' + 'message': _('Unauthorized') }, status=401) @@ -3968,7 +3968,7 @@ class PnLAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): }) return JsonResponse({ - 'message': 'Unauthorized' + 'message': _('Unauthorized') }, status=401) @@ -4021,7 +4021,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) @@ -4134,7 +4134,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 +4160,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 +4187,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 +4197,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 +4211,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 +4221,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: diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index 384b5241..d08254b9 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-20 04:04+0300\n" +"POT-Creation-Date: 2025-03-22 06:21+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -87,7 +87,7 @@ msgid "You must add an email." msgstr "يجب إضافة بريد إلكتروني." #: inventory/forms.py:474 inventory/forms.py:478 -#: templates/account/login.html:35 templates/account/login.html:37 +#: templates/account/login.html:36 templates/account/login.html:38 #: venv/lib/python3.11/site-packages/django_ledger/forms/auth.py:15 msgid "Password" msgstr "كلمة المرور" @@ -879,7 +879,7 @@ msgid "Dealers" msgstr "المعارض" #: inventory/models.py:961 inventory/signals.py:142 templates/header.html:29 -#: templates/header.html:64 templates/header.html:69 templates/welcome.html:20 +#: templates/header.html:64 templates/header.html:69 templates/welcome.html:19 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:440 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:526 #: venv/lib/python3.11/site-packages/django_ledger/models/items.py:521 @@ -962,7 +962,7 @@ msgstr "الموقع الإلكتروني" #: inventory/models.py:1035 inventory/models.py:1065 inventory/models.py:1114 #: inventory/models.py:1196 inventory/models.py:1467 -#: templates/account/login.html:28 templates/account/login.html:30 +#: templates/account/login.html:29 templates/account/login.html:31 #: templates/administration/display_appointment.html:49 #: templates/administration/manage_staff_personal_info.html:29 #: templates/administration/staff_list.html:35 @@ -1739,7 +1739,7 @@ msgstr "ناجحة" msgid "error" msgstr "خطأ" -#: inventory/utils.py:56 templates/account/login.html:47 +#: inventory/utils.py:56 templates/account/login.html:48 #: templates/account/password_change.html:28 msgid "Forgot Password?" msgstr "نسيت كلمة المرور؟" @@ -1748,6 +1748,24 @@ msgstr "نسيت كلمة المرور؟" msgid "Car reserved successfully." msgstr "تم حجز السيارة بنجاح." +#: inventory/views.py:210 +#, fuzzy +#| msgid "Passwords do not match." +msgid "Passwords do not match" +msgstr "كلمات المرور غير متطابقة." + +#: inventory/views.py:233 inventory/views.py:1648 +#, fuzzy +#| msgid "User created successfully." +msgid "User created successfully" +msgstr "تم إنشاء المستخدم بنجاح." + +#: inventory/views.py:495 +#, fuzzy +#| msgid "Car reserved successfully." +msgid "Car saved successfully" +msgstr "تم حجز السيارة بنجاح." + #: inventory/views.py:526 msgid "VIN number exists" msgstr "رقم الهيكل موجود مسبقاً" @@ -1759,67 +1777,111 @@ msgid "inventory" msgstr "المخزون" #: inventory/views.py:937 -msgid "Car finance details saved successfully." +#, fuzzy +#| msgid "Car finance details saved successfully." +msgid "Car finance details saved successfully" msgstr "تم حفظ تفاصيل المالية للسيارة بنجاح." #: inventory/views.py:961 -msgid "Car finance details updated successfully." +#, fuzzy +#| msgid "Car finance details updated successfully." +msgid "Car finance details updated successfully" msgstr "تم تحديث تفاصيل المالية للسيارة بنجاح." #: inventory/views.py:991 -msgid "Car updated successfully." +#, fuzzy +#| msgid "Car updated successfully." +msgid "Car updated successfully" msgstr "تم تحديث السيارة بنجاح" #: inventory/views.py:1005 -msgid "Car deleted successfully." +#, fuzzy +#| msgid "Car deleted successfully." +msgid "Car deleted successfully" msgstr "تم حذف السيارة بنجاح." +#: inventory/views.py:1023 +#, fuzzy +#| msgid "Day off saved successfully." +msgid "Location saved successfully" +msgstr "تم حفظ يوم الإجازة بنجاح." + +#: inventory/views.py:1043 +#, fuzzy +#| msgid "Email updated successfully!" +msgid "Location updated successfully" +msgstr "تم تحديث البريد الإلكتروني بنجاح!" + #: inventory/views.py:1098 -msgid "Car transfer canceled successfully." +#, fuzzy +#| msgid "Car transfer canceled successfully." +msgid "Car transfer canceled successfully" msgstr "تم إلغاء نقل السيارة بنجاح." #: inventory/views.py:1115 -msgid "Car transfer approved successfully." +#, fuzzy +#| msgid "Car transfer approved successfully." +msgid "Car transfer approved successfully" msgstr "تمت الموافقة على نقل السيارة بنجاح." #: inventory/views.py:1127 -msgid "Car transfer rejected successfully." +#, fuzzy +#| msgid "Car transfer rejected successfully." +msgid "Car transfer rejected successfully" msgstr "تم رفض نقل السيارة بنجاح." #: inventory/views.py:1139 -msgid "Car Transfer Completed successfully." +#, fuzzy +#| msgid "Car Transfer Completed successfully." +msgid "Car Transfer Completed successfully" msgstr "تم إكمال نقل السيارة بنجاح." #: inventory/views.py:1172 -msgid "Custom Card added successfully." +#, fuzzy +#| msgid "Custom Card added successfully." +msgid "Custom Card added successfully" msgstr "تم إضافة البطاقة الجمركية بنجاح." #: inventory/views.py:1192 -msgid "Registration added successfully." +#, fuzzy +#| msgid "Registration added successfully." +msgid "Registration added successfully" msgstr "تم إلغاء الحجز بنجاح." #: inventory/views.py:1201 -msgid "This car is already reserved." +#, fuzzy +#| msgid "This car is already reserved." +msgid "This car is already reserved" msgstr "هذه السيارة محجوزة بالفعل." #: inventory/views.py:1221 -msgid "Reservation renewed successfully." +#, fuzzy +#| msgid "Reservation renewed successfully." +msgid "Reservation renewed successfully" msgstr "تم تجديد الحجز بنجاح" #: inventory/views.py:1229 -msgid "Reservation canceled successfully." +#, fuzzy +#| msgid "Reservation canceled successfully." +msgid "Reservation canceled successfully" msgstr "تم إلغاء الحجز بنجاح." #: inventory/views.py:1234 -msgid "Invalid action." +#, fuzzy +#| msgid "Invalid action." +msgid "Invalid action" msgstr "إجراء غير صالح." #: inventory/views.py:1238 -msgid "Invalid request method." +#, fuzzy +#| msgid "Invalid request method." +msgid "Invalid request method" msgstr "طريقة الطلب غير صالحة" #: inventory/views.py:1279 -msgid "Dealer updated successfully." +#, fuzzy +#| msgid "Dealer updated successfully." +msgid "Dealer updated successfully" msgstr "تم تحديث المعرض بنجاح." #: inventory/views.py:1286 templates/header.html:190 @@ -1827,175 +1889,429 @@ msgid "customers" msgstr "العملاء" #: inventory/views.py:1370 -msgid "Customer with this email already exists." +#, fuzzy +#| msgid "Customer with this email already exists." +msgid "Customer with this email already exists" msgstr "عميل بهذا البريد الإلكتروني موجود بالفعل." #: inventory/views.py:1394 -msgid "Customer created successfully." +#, fuzzy +#| msgid "Customer created successfully." +msgid "Customer created successfully" msgstr "تم إنشاء العميل بنجاح." #: inventory/views.py:1401 -msgid "Please correct the errors below." +#, fuzzy +#| msgid "Please correct the errors below." +msgid "Please correct the errors below" msgstr "يرجى تصحيح الأخطاء أدناه." #: inventory/views.py:1440 -msgid "Customer updated successfully." +#, fuzzy +#| msgid "Customer updated successfully." +msgid "Customer updated successfully" msgstr "تم تحديث العميل بنجاح." #: inventory/views.py:1461 -msgid "Customer deleted successfully." +#, fuzzy +#| msgid "Customer deleted successfully." +msgid "Customer deleted successfully" msgstr "تم حذف العميل بنجاح." #: inventory/views.py:1493 -msgid "Vendor created successfully." +#, fuzzy +#| msgid "Vendor created successfully." +msgid "Vendor created successfully" msgstr "تم إنشاء المورد بنجاح." #: inventory/views.py:1511 -msgid "Vendor updated successfully." +#, fuzzy +#| msgid "Vendor updated successfully." +msgid "Vendor updated successfully" msgstr "تم تحديث المورد بنجاح" #: inventory/views.py:1519 -msgid "Vendor deleted successfully." +#, fuzzy +#| msgid "Vendor deleted successfully." +msgid "Vendor deleted successfully" msgstr "تم حذف المورد بنجاح." #: inventory/views.py:1548 -msgid "Group created successfully." +#, fuzzy +#| msgid "Group created successfully." +msgid "Group created successfully" msgstr "تم إنشاء المجموعة بنجاح." #: inventory/views.py:1569 -msgid "Group updated successfully." +#, fuzzy +#| msgid "Group updated successfully." +msgid "Group updated successfully" msgstr "تم تحديث المجموعة بنجاح." #: inventory/views.py:1583 -msgid "Group deleted successfully." +#, fuzzy +#| msgid "Group deleted successfully." +msgid "Group deleted successfully" msgstr "تم حذف المجموعة بنجاح." #: inventory/views.py:1595 -msgid "Permission added successfully." +#, fuzzy +#| msgid "Permission added successfully." +msgid "Permission added successfully" msgstr "تمت إضافة الإذن بنجاح." #: inventory/views.py:1613 -msgid "Group added successfully." +#, fuzzy +#| msgid "Group added successfully." +msgid "Group added successfully" msgstr "تمت إضافة المجموعة بنجاح." -#: inventory/views.py:1648 -msgid "User created successfully." -msgstr "تم إنشاء المستخدم بنجاح." - #: inventory/views.py:1656 -msgid "" -"The user quota for staff members is not defined. Please contact support." +#, fuzzy +#| msgid "" +#| "The user quota for staff members is not defined. Please contact support." +msgid "The user quota for staff members is not defined. Please contact support" msgstr "لم يتم تحديد الحصة المخصصة لأعضاء الفريق. يرجى الاتصال بالدعم." #: inventory/views.py:1661 +#, fuzzy +#| msgid "" +#| "You have reached the maximum number of staff users allowed for your plan." msgid "" -"You have reached the maximum number of staff users allowed for your plan." +"You have reached the maximum number of staff users allowed for your plan" msgstr "لقد وصلت إلى الحد الأقصى لعدد أعضاء الفريق المسموح به في خطتك." #: inventory/views.py:1693 -msgid "User updated successfully." +#, fuzzy +#| msgid "User updated successfully." +msgid "User updated successfully" msgstr "تم تحديث المستخدم بنجاح" #: inventory/views.py:1731 -msgid "User deleted successfully." +#, fuzzy +#| msgid "User deleted successfully." +msgid "User deleted successfully" msgstr "تم حذف المستخدم بنجاح." #: inventory/views.py:1760 -msgid "An organization with this email already exists." +#, fuzzy +#| msgid "An organization with this email already exists." +msgid "An organization with this email already exists" msgstr "توجد بالفعل منظمة بهذا البريد الإلكتروني." #: inventory/views.py:1787 inventory/views.py:1826 -msgid "Organization created successfully." +#, fuzzy +#| msgid "Organization created successfully." +msgid "Organization created successfully" msgstr "تم إنشاء المنظمة بنجاح." #: inventory/views.py:1847 -msgid "Organization deleted successfully." +#, fuzzy +#| msgid "Organization deleted successfully." +msgid "Organization deleted successfully" msgstr "تم حذف المنظمة بنجاح." #: inventory/views.py:1850 msgid "Unable to delete organization" msgstr "غير قادر على حذف المنظمة" +#: inventory/views.py:1877 +#, fuzzy +#| msgid "Service created successfully." +msgid "Representative created successfully" +msgstr "تم إنشاء الخدمة بنجاح." + +#: inventory/views.py:1893 +#, fuzzy +#| msgid "Service updated successfully." +msgid "Representative updated successfully" +msgstr "تم تحديث الخدمة بنجاح." + +#: inventory/views.py:1900 +#, fuzzy +#| msgid "Service deleted successfully!" +msgid "Representative deleted successfully" +msgstr "تم حذف الخدمة بنجاح!" + +#: inventory/views.py:1923 +#, fuzzy +#| msgid "Organization created successfully." +msgid "Bank account created successfully" +msgstr "تم إنشاء المنظمة بنجاح." + +#: inventory/views.py:1952 +#, fuzzy +#| msgid "Group updated successfully." +msgid "Bank account updated successfully" +msgstr "تم تحديث المجموعة بنجاح." + +#: inventory/views.py:1969 +#, fuzzy +#| msgid "Note deleted successfully." +msgid "Bank account deleted successfully" +msgstr "تم حذف الملاحظة بنجاح." + +#: inventory/views.py:1998 +#, fuzzy +#| msgid "Group created successfully." +msgid "Account created successfully" +msgstr "تم إنشاء المجموعة بنجاح." + +#: inventory/views.py:2065 +#, fuzzy +#| msgid "Group updated successfully." +msgid "Account updated successfully" +msgstr "تم تحديث المجموعة بنجاح." + +#: inventory/views.py:2081 +#, fuzzy +#| msgid "Note deleted successfully." +msgid "Account deleted successfully" +msgstr "تم حذف الملاحظة بنجاح." + +#: inventory/views.py:2138 inventory/views.py:3489 +msgid "Items and Quantities are required" +msgstr "" + +#: inventory/views.py:2145 inventory/views.py:2150 inventory/views.py:3495 +#: inventory/views.py:3500 +#, fuzzy +#| msgid "Slot duration must be greater than 0" +msgid "Quantity must be greater than zero" +msgstr "يجب أن تكون مدة الفاصل الزمني أكبر من 0." + +#: inventory/views.py:2156 inventory/views.py:2161 +msgid "Quantity must be less than or equal to the number of cars in stock" +msgstr "" + +#: inventory/views.py:2243 +#, fuzzy +#| msgid "Organization created successfully." +msgid "Quotation created successfully" +msgstr "تم إنشاء المنظمة بنجاح." + #: inventory/views.py:2395 -msgid "Estimate is not ready for review" +#, fuzzy +#| msgid "Estimate is not ready for review" +msgid "Quotation is not ready for review" msgstr "العرض غير جاهز للمراجعة." #: inventory/views.py:2401 -msgid "Estimate is not ready for approval" +#, fuzzy +#| msgid "Estimate is not ready for approval" +msgid "Quotation is not ready for approval" msgstr "العرض غير جاهز للموافقة." #: inventory/views.py:2404 -msgid "Estimate approved successfully." +#, fuzzy +#| msgid "Estimate approved successfully." +msgid "Quotation approved successfully" msgstr "تمت الموافقة على العرض بنجاح." #: inventory/views.py:2407 -msgid "Estimate is not ready for rejection" +#, fuzzy +#| msgid "Estimate is not ready for rejection" +msgid "Quotation is not ready for rejection" msgstr "العرض غير جاهز للرفض." #: inventory/views.py:2410 inventory/views.py:2426 -msgid "Estimate canceled successfully." -msgstr "تم إلغاء العرض بنجاح." +#, fuzzy +#| msgid "Reservation canceled successfully." +msgid "Quotation canceled successfully" +msgstr "تم إلغاء الحجز بنجاح." #: inventory/views.py:2413 -msgid "Estimate is not ready for completion" +#, fuzzy +#| msgid "Estimate is not ready for completion" +msgid "Quotation is not ready for completion" msgstr "العرض غير جاهز للإكمال." #: inventory/views.py:2417 -msgid "Estimate is not ready for cancelation" +#, fuzzy +#| msgid "Estimate is not ready for cancelation" +msgid "Quotation is not ready for cancellation" msgstr "العرض غير جاهز للإلغاء." -#: inventory/views.py:2949 -msgid "Note deleted successfully." +#: inventory/views.py:2428 +#, fuzzy +#| msgid "Notification marked as read." +msgid "Quotation marked as " +msgstr "تم تمييز الإشعار كمقروء." + +#: inventory/views.py:2652 +msgid "fully paid" +msgstr "" + +#: inventory/views.py:2655 +#, fuzzy +#| msgid "Amount Received" +msgid "Amount exceeds due amount" +msgstr "المبلغ المستلم" + +#: inventory/views.py:2663 inventory/views.py:2727 +#, fuzzy +#| msgid "Vendor created successfully." +msgid "Payment created successfully" +msgstr "تم إنشاء المورد بنجاح." + +#: inventory/views.py:2731 +msgid "Invoice is not fully paid, Payment cannot be marked as paid" +msgstr "" + +#: inventory/views.py:2856 +#, fuzzy +#| msgid "Vendor created successfully." +msgid "Lead created successfully" +msgstr "تم إنشاء المورد بنجاح." + +#: inventory/views.py:2887 +#, fuzzy +#| msgid "Car deleted successfully." +msgid "Lead deleted successfully" +msgstr "تم حذف السيارة بنجاح." + +#: inventory/views.py:2902 inventory/views.py:2918 +#, fuzzy +#| msgid "Note deleted successfully." +msgid "Note added successfully" msgstr "تم حذف الملاحظة بنجاح." +#: inventory/views.py:2915 +#, fuzzy +#| msgid "This field is required." +msgid "Notes field is required" +msgstr "هذا الحقل مطلوب." + +#: inventory/views.py:2935 +#, fuzzy +#| msgid "User updated successfully." +msgid "Note updated successfully" +msgstr "تم تحديث المستخدم بنجاح" + +#: inventory/views.py:2949 +#, fuzzy +#| msgid "Note deleted successfully." +msgid "Note deleted successfully" +msgstr "تم حذف الملاحظة بنجاح." + +#: inventory/views.py:2959 +msgid "Lead is already converted to customer" +msgstr "" + +#: inventory/views.py:2963 +#, fuzzy +#| msgid "Dealer updated successfully." +msgid "Lead converted to customer successfully" +msgstr "تم تحديث المعرض بنجاح." + +#: inventory/views.py:2970 +#, fuzzy +#| msgid "You do not have permission to access this appointment." +msgid "You do not have permission to schedule lead" +msgstr "ليس لديك إذن للوصول إلى هذا الموعد." + +#: inventory/views.py:2985 +#, fuzzy +#| msgid "User not found" +msgid "Service not found" +msgstr "المستخدم غير موجود" + +#: inventory/views.py:3010 +#, fuzzy +#| msgid "Appointment updated successfully." +msgid "Lead scheduled and appointment created successfully" +msgstr "تم تحديث الموعد بنجاح." + +#: inventory/views.py:3029 +#, fuzzy +#| msgid "Car transfer approved successfully." +msgid "Lead transferred successfully" +msgstr "تمت الموافقة على نقل السيارة بنجاح." + #: inventory/views.py:3043 -msgid "Email Draft successfully!" +#, fuzzy +#| msgid "Email Draft successfully!" +msgid "Email Draft successfully" msgstr "تم حفظ مسودة البريد الإلكتروني بنجاح!" #: inventory/views.py:3068 inventory/views.py:3652 -msgid "Email sent successfully!" +#, fuzzy +#| msgid "Email sent successfully!" +msgid "Email sent successfully" msgstr "تم إرسال البريد الإلكتروني بنجاح!" #: inventory/views.py:3194 -msgid "Opportunity deleted successfully." +#, fuzzy +#| msgid "Opportunity deleted successfully." +msgid "Opportunity deleted successfully" +msgstr "تم حذف الفرصة بنجاح." + +#: inventory/views.py:3207 +#, fuzzy +#| msgid "Opportunity deleted successfully." +msgid "Opportunity status updated successfully" msgstr "تم حذف الفرصة بنجاح." #: inventory/views.py:3229 -msgid "Notification marked as read." +#, fuzzy +#| msgid "Notification marked as read." +msgid "Notification marked as read" msgstr "تم تمييز الإشعار كمقروء." #: inventory/views.py:3247 -msgid "Service created successfully." +#, fuzzy +#| msgid "Service created successfully." +msgid "Service created successfully" msgstr "تم إنشاء الخدمة بنجاح." #: inventory/views.py:3265 -msgid "Service updated successfully." +#, fuzzy +#| msgid "Service updated successfully." +msgid "Service updated successfully" msgstr "تم تحديث الخدمة بنجاح." #: inventory/views.py:3388 inventory/views.py:3414 -msgid "Bill updated successfully." +#, fuzzy +#| msgid "Bill updated successfully." +msgid "Bill updated successfully" msgstr "تم تحديث الفاتورة بنجاح." #: inventory/views.py:3443 -msgid "Bill is already approved." +#, fuzzy +#| msgid "Bill is already approved." +msgid "Bill is already approved" msgstr "تمت الموافقة على الفاتورة مسبقًا." #: inventory/views.py:3447 -msgid "Bill marked as approved successfully." +#, fuzzy +#| msgid "Bill marked as approved successfully." +msgid "Bill marked as approved successfully" msgstr "تم تحديد الفاتورة كموافقة بنجاح." #: inventory/views.py:3458 -msgid "Bill is already paid." +#, fuzzy +#| msgid "Bill is already paid." +msgid "Bill is already paid" msgstr "تم دفع الفاتورة مسبقًا." #: inventory/views.py:3467 -msgid "Bill marked as paid successfully." +#, fuzzy +#| msgid "Bill marked as paid successfully." +msgid "Bill marked as paid successfully" msgstr "تم تحديد الفاتورة كمدفوعة بنجاح." #: inventory/views.py:3469 -msgid "Amount paid is not equal to amount due." +#, fuzzy +#| msgid "Amount paid is not equal to amount due." +msgid "Amount paid is not equal to amount due" msgstr "المبلغ المدفوع لا يساوي المبلغ المستحق." +#: inventory/views.py:3561 +#, fuzzy +#| msgid "Bill updated successfully." +msgid "Bill created successfully" +msgstr "تم تحديث الفاتورة بنجاح." + #: inventory/views.py:3616 msgid "Quotation has no items" msgstr "عرض السعر لا يحتوي على أي عناصر" @@ -2014,6 +2330,52 @@ msgstr "عرض سعر" msgid "Dashboard" msgstr "لوحة القيادة" +#: inventory/views.py:3896 inventory/views.py:3922 inventory/views.py:3971 +#, fuzzy +#| msgid "Not authorized." +msgid "Unauthorized" +msgstr "غير مصرح." + +#: inventory/views.py:4024 +#, fuzzy +#| msgid "Settings" +msgid "Settings updated" +msgstr "الإعدادات" + +#: inventory/views.py:4137 +#, fuzzy +#| msgid "Journal Entry Detail" +msgid "Journal Entry created" +msgstr "تفاصيل إدخال اليومية" + +#: inventory/views.py:4163 +#, fuzzy +#| msgid "Journal Entry has not been posted." +msgid "Journal Entry cannot be deleted" +msgstr "إدخال اليومية لم يتم نشره." + +#: inventory/views.py:4190 +#, fuzzy +#| msgid "Bill is already approved." +msgid "Ledger is already locked" +msgstr "تمت الموافقة على الفاتورة مسبقًا." + +#: inventory/views.py:4200 +msgid "Ledger is already Unlocked" +msgstr "" + +#: inventory/views.py:4214 +#, fuzzy +#| msgid "Bill is already approved." +msgid "Ledger is already posted" +msgstr "تمت الموافقة على الفاتورة مسبقًا." + +#: inventory/views.py:4224 +#, fuzzy +#| msgid "Bill is already approved." +msgid "Ledger is already Unposted" +msgstr "تمت الموافقة على الفاتورة مسبقًا." + #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" @@ -2107,7 +2469,7 @@ msgstr "إلغاء" #: templates/account/confirm_login_code..html:7 #: templates/account/confirm_login_code..html:35 templates/account/login.html:6 -#: templates/account/login.html:21 templates/account/login.html:45 +#: templates/account/login.html:22 templates/account/login.html:46 #: templates/account/request_login_code.html:5 templates/account/signup.html:80 #: templates/header.html:494 templates/welcome-temp.html:77 msgid "Sign In" @@ -2117,8 +2479,8 @@ msgstr "تسجيل الدخول" #: templates/account/confirm_login_code..html:17 #: templates/account/email.html:14 templates/account/email.html:15 #: templates/account/email_confirm.html:15 -#: templates/account/email_confirm.html:16 templates/account/login.html:15 -#: templates/account/login.html:16 templates/account/otp_verification.html:10 +#: templates/account/email_confirm.html:16 templates/account/login.html:16 +#: templates/account/login.html:17 templates/account/otp_verification.html:10 #: templates/account/otp_verification.html:11 #: templates/account/password_change.html:14 #: templates/account/password_change.html:15 @@ -2130,8 +2492,8 @@ msgstr "تسجيل الدخول" #: templates/account/password_reset_from_key.html:16 #: templates/account/password_reset_from_key_done.html:14 #: templates/account/password_reset_from_key_done.html:15 -#: templates/account/signup-wizard.html:11 -#: templates/account/signup-wizard.html:12 templates/account/signup.html:14 +#: templates/account/signup-wizard.html:13 +#: templates/account/signup-wizard.html:14 templates/account/signup.html:14 #: templates/account/signup.html:15 #: templates/account/verfied_email_required.html:14 #: templates/account/verfied_email_required.html:15 @@ -2456,26 +2818,26 @@ msgstr "" "انتهت صلاحية رابط تأكيد البريد الإلكتروني هذا أو أنه غير صالح. يرجى طلب تأكيد بريد إلكتروني جديد." -#: templates/account/login.html:43 +#: templates/account/login.html:44 msgid "Remember Me" msgstr "تذكرني" -#: templates/account/login.html:54 +#: templates/account/login.html:55 msgid "If you have not created an account yet, then please" msgstr "إذا لم تقم بإنشاء حساب بعد، يرجى التسجيل أولاً." -#: templates/account/login.html:55 templates/account/signup-wizard.html:16 +#: templates/account/login.html:56 templates/account/signup-wizard.html:18 #: templates/account/signup.html:5 templates/account/signup.html:79 #: templates/header.html:497 templates/welcome-temp.html:78 #: templates/welcome_header.html:36 msgid "Sign Up" msgstr "إنشاء حساب" -#: templates/account/login.html:63 +#: templates/account/login.html:72 msgid "Sign in with a passkey" msgstr "تسجيل الدخول باستخدام مفتاح مرور" -#: templates/account/login.html:68 templates/account/request_login_code.html:9 +#: templates/account/login.html:77 templates/account/request_login_code.html:9 msgid "Mail me a sign-in code" msgstr "أرسل لي رمز تسجيل الدخول عبر البريد الإلكتروني" @@ -2635,15 +2997,15 @@ msgstr "طلب الرمز" msgid "Other sign-in options" msgstr "خيارات تسجيل الدخول الأخرى" -#: templates/account/signup-wizard.html:17 +#: templates/account/signup-wizard.html:19 msgid "Create your account today" msgstr "أنشئ حسابك اليوم" -#: templates/account/signup-wizard.html:24 +#: templates/account/signup-wizard.html:26 msgid "Access" msgstr "الوصول" -#: templates/account/signup-wizard.html:27 +#: templates/account/signup-wizard.html:29 #: templates/items/service/service_list.html:23 templates/plans/current.html:15 #: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:443 #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:439 @@ -2656,33 +3018,33 @@ msgstr "الوصول" msgid "Account" msgstr "الحساب" -#: templates/account/signup-wizard.html:30 +#: templates/account/signup-wizard.html:32 msgid "Extra" msgstr "إضافي" -#: templates/account/signup-wizard.html:33 +#: templates/account/signup-wizard.html:35 #: templates/ledger/journal_entry/journal_entry_txs.html:66 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/je_detail_txs.html:59 msgid "Done" msgstr "تم" -#: templates/account/signup-wizard.html:61 +#: templates/account/signup-wizard.html:63 msgid "You are all set!" msgstr "كل شيء جاهز!" -#: templates/account/signup-wizard.html:62 +#: templates/account/signup-wizard.html:64 msgid "Now you can access your account" msgstr "الآن يمكنك الوصول إلى حسابك" -#: templates/account/signup-wizard.html:62 +#: templates/account/signup-wizard.html:64 msgid "anytime" msgstr "في أي وقت" -#: templates/account/signup-wizard.html:62 +#: templates/account/signup-wizard.html:64 msgid "anywhere" msgstr "في أي مكان" -#: templates/account/signup-wizard.html:62 +#: templates/account/signup-wizard.html:64 #: templates/administration/email_change_verification_code.html:25 #: templates/administration/manage_day_off.html:69 #: templates/appointment/enter_verification_code.html:24 @@ -2694,12 +3056,12 @@ msgstr "في أي مكان" msgid "Submit" msgstr "إرسال" -#: templates/account/signup-wizard.html:71 +#: templates/account/signup-wizard.html:73 #: venv/lib/python3.11/site-packages/alabaster/relations.html:9 msgid "Previous" msgstr "السابق" -#: templates/account/signup-wizard.html:73 +#: templates/account/signup-wizard.html:75 #: templates/appointment/appointments.html:86 #: templates/two_factor/_wizard_actions.html:14 #: venv/lib/python3.11/site-packages/alabaster/relations.html:13 @@ -2707,22 +3069,22 @@ msgstr "السابق" msgid "Next" msgstr "التالي" -#: templates/account/signup-wizard.html:102 #: templates/account/signup-wizard.html:107 +#: templates/account/signup-wizard.html:112 msgid "Please enter a valid phone number" msgstr "يرجى إدخال رقم هاتف صالح" -#: templates/account/signup-wizard.html:138 +#: templates/account/signup-wizard.html:143 msgid "Password does not match" msgstr "كلمة المرور غير متطابقة" -#: templates/account/signup-wizard.html:246 +#: templates/account/signup-wizard.html:251 #: templates/inventory/car_form.html:604 #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:654 msgid "Please Wait" msgstr "الرجاء الإنتظار" -#: templates/account/signup-wizard.html:247 +#: templates/account/signup-wizard.html:252 #: templates/inventory/car_form.html:605 #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:655 msgid "Loading" @@ -3691,7 +4053,7 @@ msgid "Reset Password" msgstr "إعادة تعيين كلمة المرور" #: templates/auth_base.html:16 templates/welcome-temp.html:16 -#: templates/welcome.html:19 templates/welcome_base.html:16 +#: templates/welcome.html:18 templates/welcome_base.html:16 msgid "HAIKAL" msgstr "هيكل" @@ -4217,7 +4579,7 @@ msgid "Active until" msgstr "نشط حتى" #: templates/dealers/dealer_detail.html:112 -#: templates/subscriptions/subscription_plan.html:42 +#: templates/subscriptions/subscription_plan.html:42 templates/welcome.html:94 msgid "Per month" msgstr "شهريًا" @@ -4690,7 +5052,7 @@ msgstr "لوحة القيادة" msgid "Manager" msgstr "مدير" -#: templates/header.html:39 templates/welcome.html:20 templates/welcome.html:74 +#: templates/header.html:39 templates/welcome.html:19 templates/welcome.html:73 msgid "CRM" msgstr "إدارة علاقات العملاء" @@ -5082,7 +5444,7 @@ msgstr "التفاصيل المالية لـ" #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:515 #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:535 #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:554 -#: templates/plans/plan_table.html:88 templates/welcome.html:126 +#: templates/plans/plan_table.html:88 msgid "Select" msgstr "اختيار" @@ -6967,30 +7329,29 @@ msgid "No Limit" msgstr "لا يوجد حد" #: templates/plans/plan_table.html:45 -#: templates/subscriptions/subscription_plan.html:7 templates/welcome.html:87 +#: templates/subscriptions/subscription_plan.html:7 templates/welcome.html:86 #: templates/welcome_header.html:39 msgid "Pricing" msgstr "السعر" #: templates/plans/plan_table.html:53 templates/plans/plan_table.html:90 -#: templates/welcome.html:128 #: venv/lib/python3.11/site-packages/django/forms/widgets.py:463 msgid "Change" msgstr "تغيير" -#: templates/plans/plan_table.html:71 templates/welcome.html:108 +#: templates/plans/plan_table.html:71 msgid "day" msgstr "يوم" -#: templates/plans/plan_table.html:75 templates/welcome.html:112 +#: templates/plans/plan_table.html:75 msgid "Buy" msgstr "شراء" -#: templates/plans/plan_table.html:82 templates/welcome.html:120 +#: templates/plans/plan_table.html:82 msgid "Free" msgstr "مجاني" -#: templates/plans/plan_table.html:83 templates/welcome.html:121 +#: templates/plans/plan_table.html:83 msgid "no expiry" msgstr "لا يوجد انتهاء" @@ -7220,16 +7581,16 @@ msgstr "رقم الطلب" msgid "For Quotation" msgstr "لعرض سعر" -#: templates/sales/orders/purchase_order.html:36 +#: templates/sales/orders/purchase_order.html:37 msgid "Print" msgstr "طباعة" -#: templates/sales/orders/purchase_order.html:44 +#: templates/sales/orders/purchase_order.html:45 #: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:3157 msgid "Purchase Order" msgstr "أمر شراء" -#: templates/sales/orders/purchase_order.html:100 +#: templates/sales/orders/purchase_order.html:101 msgid "Signature" msgstr "التوقيع" @@ -7683,7 +8044,7 @@ msgstr "تسهيل" msgid "Your Car Dealership Operations" msgstr "عمليات معرض السيارات الخاص بك" -#: templates/welcome-temp.html:96 templates/welcome.html:35 +#: templates/welcome-temp.html:96 templates/welcome.html:34 msgid "Because Inventory Needs Order" msgstr "لأن المخزون يحتاج إلى تنظيم" @@ -7704,29 +8065,29 @@ msgstr "تعرف على المزيد" msgid "Empowering Your Dealership with Precision and Efficiency" msgstr "تمكين معرضك بالدقة والكفاءة" -#: templates/welcome-temp.html:122 templates/welcome.html:43 +#: templates/welcome-temp.html:122 templates/welcome.html:42 msgid "Inventory Management" msgstr "إدارة المخزون" -#: templates/welcome-temp.html:123 templates/welcome.html:44 +#: templates/welcome-temp.html:123 templates/welcome.html:43 msgid "" "Effortlessly manage your car inventory with real-time updates and intuitive " "tools." msgstr "قم بإدارة مخزون السيارات بسهولة مع التحديثات الفورية والأدوات البسيطة." -#: templates/welcome-temp.html:127 templates/welcome.html:51 +#: templates/welcome-temp.html:127 templates/welcome.html:50 msgid "Seamless Accounting" msgstr "محاسبة سلسة" -#: templates/welcome-temp.html:128 templates/welcome.html:52 +#: templates/welcome-temp.html:128 templates/welcome.html:51 msgid "Integrated double-entry accounting tailored for car dealers." msgstr "نظام محاسبة مزدوج القيد مدمج ومصمم خصيصًا لتجار السيارات." -#: templates/welcome-temp.html:132 templates/welcome.html:61 +#: templates/welcome-temp.html:132 templates/welcome.html:60 msgid "Advanced Analytics" msgstr "تحليلات متقدمة" -#: templates/welcome-temp.html:133 templates/welcome.html:62 +#: templates/welcome-temp.html:133 templates/welcome.html:61 msgid "Gain insights and make data-driven decisions for your business." msgstr "احصل على رؤى دقيقة واتخذ قرارات مستندة إلى البيانات لنشاطك التجاري." @@ -7738,19 +8099,19 @@ msgstr "اختر الخطة التي تناسب احتياجاتك" msgid "Flexible plans designed to meet the unique needs of every dealership." msgstr "خطط مرنة مصممة لتلبية الاحتياجات الفريدة لكل معرض سيارات." -#: templates/welcome.html:18 +#: templates/welcome.html:17 msgid "Why us" msgstr "لماذا نحن" -#: templates/welcome.html:20 +#: templates/welcome.html:19 msgid "Accounting" msgstr "المحاسبة" -#: templates/welcome.html:20 +#: templates/welcome.html:19 msgid "Reporting" msgstr "التقارير" -#: templates/welcome.html:37 +#: templates/welcome.html:36 msgid "" "Haikal empowers car dealers with a seamless, structured system to manage " "their inventory effortlessly, ensuring every vehicle is tracked, accounted " @@ -7759,7 +8120,7 @@ msgstr "" "يمكن هيكل معارض السيارات من إدارة مخزونهم بسهولة من خلال نظام منظم وسلس، مما " "يضمن تتبع كل مركبة وتسجيلها وجعلها جاهزة للبيع بدقة وكفاءة." -#: templates/welcome.html:75 +#: templates/welcome.html:74 msgid "" "Specialized customer relationship management system designed for car " "dealers, offering streamlined sales." @@ -7767,27 +8128,31 @@ msgstr "" "نظام متخصص لإدارة علاقات العملاء مصمم لتجار السيارات، يوفر عمليات بيع سلسة " "ومنظمة." -#: templates/welcome.html:134 +#: templates/welcome.html:96 msgid "Included" msgstr "متضمن" -#: templates/welcome.html:157 +#: templates/welcome.html:121 msgid "Other features" msgstr "ميزات أخرى" +#: templates/welcome.html:122 msgid "Find out other features included in Haikal" msgstr "اكتشف الميزات الأخرى المضمنة في هيكل" +#: templates/welcome.html:130 msgid "Manage Everything from one place" msgstr "إدارة كل شيء من مكان واحد" +#: templates/welcome.html:137 msgid "The Car is in the center of your business" msgstr "السيارة هي محور عملك" -#: templates/welcome.html:180 +#: templates/welcome.html:144 msgid "Fully Integrated System" msgstr "نظام متكامل بالكامل" +#: templates/welcome.html:151 msgid "Advanced Dashboards for better decisions" msgstr "لوحات تحكم متقدمة لاتخاذ قرارات أفضل" @@ -12982,6 +13347,9 @@ msgstr "س" msgid "y" msgstr "ص" +#~ msgid "Estimate canceled successfully." +#~ msgstr "تم إلغاء العرض بنجاح." + #~ msgid "UnLock All" #~ msgstr "إلغاء القفل للجميع"