diff --git a/.DS_Store b/.DS_Store index 432e45cc..a4ecfc07 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/car_inventory/__pycache__/settings.cpython-311.pyc b/car_inventory/__pycache__/settings.cpython-311.pyc index 78063d73..d73d1658 100644 Binary files a/car_inventory/__pycache__/settings.cpython-311.pyc and b/car_inventory/__pycache__/settings.cpython-311.pyc differ diff --git a/car_inventory/__pycache__/urls.cpython-311.pyc b/car_inventory/__pycache__/urls.cpython-311.pyc index 79c289cf..b33b99d8 100644 Binary files a/car_inventory/__pycache__/urls.cpython-311.pyc and b/car_inventory/__pycache__/urls.cpython-311.pyc differ diff --git a/car_inventory/urls.py b/car_inventory/urls.py index 3ed52e2c..aacc1d04 100644 --- a/car_inventory/urls.py +++ b/car_inventory/urls.py @@ -5,7 +5,7 @@ from django.conf import settings from django.conf.urls.i18n import i18n_patterns from inventory import views import debug_toolbar -from two_factor.urls import urlpatterns as tf_urls +# from two_factor.urls import urlpatterns as tf_urls urlpatterns = [ path('__debug__/', include(debug_toolbar.urls)), @@ -26,7 +26,7 @@ urlpatterns += i18n_patterns( path("haikalbot/", include("haikalbot.urls")), path('appointment/', include('appointment.urls')), path('plans/', include('plans.urls')), - path('', include(tf_urls)), + # path('', include(tf_urls)), ) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/inventory/__pycache__/forms.cpython-311.pyc b/inventory/__pycache__/forms.cpython-311.pyc index 35574fc2..b0a88642 100644 Binary files a/inventory/__pycache__/forms.cpython-311.pyc and b/inventory/__pycache__/forms.cpython-311.pyc differ diff --git a/inventory/__pycache__/urls.cpython-311.pyc b/inventory/__pycache__/urls.cpython-311.pyc index b033eb8f..843caadd 100644 Binary files a/inventory/__pycache__/urls.cpython-311.pyc and b/inventory/__pycache__/urls.cpython-311.pyc differ diff --git a/inventory/__pycache__/utils.cpython-311.pyc b/inventory/__pycache__/utils.cpython-311.pyc index c68a0e83..e24784ab 100644 Binary files a/inventory/__pycache__/utils.cpython-311.pyc and b/inventory/__pycache__/utils.cpython-311.pyc differ diff --git a/inventory/__pycache__/views.cpython-311.pyc b/inventory/__pycache__/views.cpython-311.pyc index fe665dcc..6706b819 100644 Binary files a/inventory/__pycache__/views.cpython-311.pyc and b/inventory/__pycache__/views.cpython-311.pyc differ diff --git a/inventory/forms.py b/inventory/forms.py index b773d7f3..5a57f0f9 100644 --- a/inventory/forms.py +++ b/inventory/forms.py @@ -422,10 +422,12 @@ class CarSelectionTable(tables.Table): class WizardForm1(forms.Form): email = forms.EmailField( + label=_("Email Address"), widget=forms.EmailInput( attrs={ - "class": "form-control", - "placeholder": "Email address", + "class": "form-control form-control-sm email", + "placeholder": _("Email address"), + "name": _("email"), "required": "required", } ), @@ -433,10 +435,12 @@ class WizardForm1(forms.Form): "required": _("You must add an email."), }, ) + password = forms.CharField( + label=_("Password"), widget=forms.PasswordInput( attrs={ - "class": "form-control", + "class": "form-control form-control-sm", "placeholder": _("Password"), "required": "required", } @@ -445,10 +449,12 @@ class WizardForm1(forms.Form): "required": _("This field is required."), }, ) + confirm_password = forms.CharField( + label=_("Confirm Password"), widget=forms.PasswordInput( attrs={ - "class": "form-control", + "class": "form-control form-control-sm", "placeholder": _("Confirm Password"), "required": "required", } @@ -457,7 +463,9 @@ class WizardForm1(forms.Form): "required": _("This field is required."), }, ) + terms = forms.BooleanField( + label=_("I accept the Terms and Privacy Policy"), widget=forms.CheckboxInput( attrs={ "class": "form-check-input", @@ -472,9 +480,10 @@ class WizardForm1(forms.Form): class WizardForm2(forms.Form): name = forms.CharField( + label=_("Name"), widget=forms.TextInput( attrs={ - "class": "form-control", + "class": "form-control form-control-sm", "placeholder": _("English Name"), "required": "required", } @@ -483,10 +492,12 @@ class WizardForm2(forms.Form): "required": _("Please enter an English Name."), }, ) + arabic_name = forms.CharField( + label=_("Arabic Name"), widget=forms.TextInput( attrs={ - "class": "form-control", + "class": "form-control form-control-sm", "placeholder": _("Arabic Name"), "required": "required", } @@ -495,12 +506,14 @@ class WizardForm2(forms.Form): "required": _("Please enter an Arabic name."), }, ) + phone_number = PhoneNumberField( + label=_("Phone Number"), min_length=10, max_length=10, widget=forms.TextInput( attrs={ - "class": "form-control", + "class": "form-control form-control-sm", "placeholder": _("Phone"), "required": "required", } @@ -516,9 +529,10 @@ class WizardForm2(forms.Form): class WizardForm3(forms.Form): # CRN field with max length of 10 crn = forms.CharField( + label=_("CRN"), widget=forms.TextInput( attrs={ - "class": "form-control", + "class": "form-control form-control-sm", "placeholder": _("Commercial Registration Number"), "required": "required", "maxlength": "10", @@ -526,16 +540,17 @@ class WizardForm3(forms.Form): ), max_length=10, error_messages={ - "required": "This field is required.", + "required": _("This field is required."), "max_length": "Commercial Registration Number must be 10 characters.", }, ) # VRN field with max length of 15 vrn = forms.CharField( + label=_("VRN"), widget=forms.TextInput( attrs={ - "class": "form-control", + "class": "form-control form-control-sm", "placeholder": _("VAT Registration Number"), "required": "required", "maxlength": "15", @@ -549,9 +564,10 @@ class WizardForm3(forms.Form): ) address = forms.CharField( + label=_("Address"), widget=forms.Textarea( attrs={ - "class": "form-control", + "class": "form-control form-control-sm", "rows": "3", "required": "required", } diff --git a/inventory/urls.py b/inventory/urls.py index b105963a..8512cff9 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -16,7 +16,7 @@ urlpatterns = [ # ), # path('signup/', allauth_views.SignupView.as_view(template_name='account/signup.html'), name='account_signup'), path("signup/", views.dealer_signup, name="account_signup"), - path("otp", views.OTPView.as_view(), name="otp"), + # path("otp", views.OTPView.as_view(), name="otp"), # path( # "password/change/", allauth_views.PasswordChangeView.as_view(template_name="account/password_change.html"), name="account_change_password", # ), diff --git a/inventory/utilities/sa.py b/inventory/utilities/sa.py new file mode 100644 index 00000000..fa34307a --- /dev/null +++ b/inventory/utilities/sa.py @@ -0,0 +1,14 @@ +from plans.taxation import TaxationPolicy +from django.conf import settings + + +class SaudiTaxationPolicy(TaxationPolicy): + def get_default_tax(self): + return getattr(settings, 'PLANS_TAX', None) + + def get_issuer_country_code(self): + return getattr(settings, 'PLANS_TAX_COUNTRY', None) + + def get_tax_rate(self, tax_id, country_code, request=None): + + return 0, True \ No newline at end of file diff --git a/inventory/utils.py b/inventory/utils.py index 5eaef5f9..648e5aa7 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -26,6 +26,7 @@ from django_ledger.models import ( from decimal import Decimal + def get_jwt_token(): url = "https://carapi.app/api/auth/login" headers = { @@ -668,4 +669,8 @@ class CarFinanceCalculator: "grand_total": totals['grand_total'], "additionals": self.additional_services, "vat": self.vat_rate, - } \ No newline at end of file + } + + + + diff --git a/inventory/views.py b/inventory/views.py index d993c07f..271b24af 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -73,9 +73,9 @@ from django.urls import reverse, reverse_lazy from django.contrib import messages from django.db.models import Sum, F, Count from django.db import transaction -from two_factor.utils import default_device +# from two_factor.utils import default_device -from two_factor.views import OTPRequiredMixin +# from two_factor.views import OTPRequiredMixin from .forms import VendorForm from .services import ( @@ -102,15 +102,13 @@ from .utils import ( transfer_car, ) from django.contrib.auth.models import User -from allauth.account import views as allauth_views from django.db.models import Count, F, Value from django.contrib.auth import authenticate import cv2 import numpy as np from pyzbar.pyzbar import decode from django.core.files.storage import default_storage - - +from plans.models import Plan,PlanPricing logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -152,6 +150,7 @@ def switch_language(request): return redirect("/") + def dealer_signup(request, *args, **kwargs): if request.method == "POST": data = json.loads(request.body) @@ -213,31 +212,29 @@ def dealer_signup(request, *args, **kwargs): # class Login(allauth_views.LoginView): # template_name = "account/login.html" # redirect_authenticated_user = True -class OTPView(View, LoginRequiredMixin): - template_name = "account/otp_verification.html" - - def get(self, request, *args, **kwargs): - # device = default_device(request.user) - # device.generate_challenge() - return render(request, self.template_name) - - def post(self, request, *args, **kwargs): - otp_code = request.POST.get("otp_code") - - if self.verify_otp(otp_code, request.user): - messages.success(request, _("OTP verified successfully!")) - return redirect("home") - - messages.error(request, _("Invalid OTP. Please try again.")) - return render(request, self.template_name) - - def verify_otp(self, otp_code, user): - device = default_device(user) - if device and device.verify_token(otp_code): - return True - return False - - +# class OTPView(View, LoginRequiredMixin): +# template_name = "account/otp_verification.html" +# +# def get(self, request, *args, **kwargs): +# # device = default_device(request.user) +# EmailDevice.generate_challenge(self) +# return render(request, self.template_name) +# +# def post(self, request, *args, **kwargs): +# otp_code = request.POST.get("otp_code") +# +# if self.verify_otp(otp_code, request.user): +# messages.success(request, _("OTP verified successfully!")) +# return redirect("home") +# +# messages.error(request, _("Invalid OTP. Please try again.")) +# return render(request, self.template_name) +# +# def verify_otp(self, otp_code, user): +# device = default_device(user) +# if device and device.verify_token(otp_code): +# return True +# return False class HomeView(TemplateView): @@ -287,8 +284,8 @@ class AccountingDashboard(LoginRequiredMixin, TemplateView): def dispatch(self, request, *args, **kwargs): if ( - # not any(hasattr(request.user, attr) for attr in ["dealer", "subdealer"]) - not request.user.is_authenticated + # not any(hasattr(request.user, attr) for attr in ["dealer", "subdealer"]) + not request.user.is_authenticated ): # messages.error(request, _("You are not associated with any dealer.")) return redirect("welcome") @@ -321,11 +318,20 @@ class AccountingDashboard(LoginRequiredMixin, TemplateView): class WelcomeView(TemplateView): template_name = "welcome.html" + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + dealer = get_user_type(self.request) + plans = Plan.objects.all() + # pricing = PlanPricing.objects.filter(plan=plan). + context["plans"] = plans + return context + class CarCreateView(LoginRequiredMixin, CreateView): model = models.Car form_class = forms.CarForm template_name = "inventory/car_form.html" + # success_url = reverse_lazy('inventory_stats') def get_form(self, form_class=None): @@ -660,11 +666,11 @@ def inventory_stats_view(request): trim = car.id_car_trim if ( - trim - and trim.id_car_trim - not in inventory[make.id_car_make]["models"][model.id_car_model][ - "trims" - ] + trim + and trim.id_car_trim + not in inventory[make.id_car_make]["models"][model.id_car_model][ + "trims" + ] ): inventory[make.id_car_make]["models"][model.id_car_model]["trims"][ trim.id_car_trim @@ -1077,7 +1083,7 @@ class CustomerListView(LoginRequiredMixin, ListView): query = self.request.GET.get("q") dealer = get_user_type(self.request) - customers = dealer.entity.get_customers().filter(active=True,additional_info__type="customer") + customers = dealer.entity.get_customers().filter(active=True, additional_info__type="customer") if query: customers = customers.filter( @@ -1156,11 +1162,11 @@ def CustomerCreateView(request): } dealer = get_user_type(request) customer_name = ( - customer_dict["first_name"] - + " " - + customer_dict["middle_name"] - + " " - + customer_dict["last_name"] + customer_dict["first_name"] + + " " + + customer_dict["middle_name"] + + " " + + customer_dict["last_name"] ) instance = dealer.entity.create_customer( @@ -1191,11 +1197,11 @@ def CustomerUpdateView(request, pk): } dealer = get_user_type(request) customer_name = ( - customer_dict["first_name"] - + " " - + customer_dict["middle_name"] - + " " - + customer_dict["last_name"] + customer_dict["first_name"] + + " " + + customer_dict["middle_name"] + + " " + + customer_dict["last_name"] ) instance = dealer.entity.get_customers().get(pk=pk) @@ -1209,8 +1215,9 @@ def CustomerUpdateView(request, pk): instance.save() messages.success(request, _("Customer updated successfully.")) return redirect("customer_list") - else: - form = forms.CustomerForm(initial=customer.additional_info["customer_info"] if "customer_info" in customer.additional_info else {}) + else: + form = forms.CustomerForm( + initial=customer.additional_info["customer_info"] if "customer_info" in customer.additional_info else {}) return render(request, "customers/customer_form.html", {"form": form}) @@ -1422,80 +1429,80 @@ def delete_vendor(request, pk): # invoice_model.save() # quotation.save() - # elif status == "approved": - # if qoutation.status == "Approved": - # messages.error(request, "Quotation is already approved") - # return redirect("quotation_detail", pk=pk) +# elif status == "approved": +# if qoutation.status == "Approved": +# messages.error(request, "Quotation is already approved") +# return redirect("quotation_detail", pk=pk) - # invoice_model = invoice_model.filter(date_in_review=qoutation.date_in_review).first() - # if not invoice_model.can_approve(): - # messages.error(request, "Quotation is not ready for approval") - # return redirect("quotation_detail", pk=pk) +# invoice_model = invoice_model.filter(date_in_review=qoutation.date_in_review).first() +# if not invoice_model.can_approve(): +# messages.error(request, "Quotation is not ready for approval") +# return redirect("quotation_detail", pk=pk) - # invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) - # invoice_model.date_approved = date - # qoutation.date_approved = date - # invoice_model.save() - # qoutation.status = "Approved" - # qoutation.save() - # messages.success(request, _("Quotation Approved")) - # ledger = entity.create_ledger( - # name=f"Payment Ledger for Invoice {invoice_model}", - # posted=True - # ) +# invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) +# invoice_model.date_approved = date +# qoutation.date_approved = date +# invoice_model.save() +# qoutation.status = "Approved" +# qoutation.save() +# messages.success(request, _("Quotation Approved")) +# ledger = entity.create_ledger( +# name=f"Payment Ledger for Invoice {invoice_model}", +# posted=True +# ) - # entity_unit,created = EntityUnitModel.objects.get_or_create( - # name="Sales Department", - # entity=entity, - # document_prefix="SD" - # ) +# entity_unit,created = EntityUnitModel.objects.get_or_create( +# name="Sales Department", +# entity=entity, +# document_prefix="SD" +# ) - # journal_entry = JournalEntryModel.objects.create( - # entity_unit=entity_unit, - # posted=False, - # description=f"Payment for Invoice {invoice_model}", - # ledger=ledger, - # locked=False, - # origin="Payment", - # ) +# journal_entry = JournalEntryModel.objects.create( +# entity_unit=entity_unit, +# posted=False, +# description=f"Payment for Invoice {invoice_model}", +# ledger=ledger, +# locked=False, +# origin="Payment", +# ) - # accounts_receivable = coa_qs.first().get_coa_accounts().filter(name="Accounts Receivable").first() - # if not accounts_receivable: - # accounts_receivable = entity.create_account( - # code="AR", - # role="asset", - # name="Accounts Receivable", - # coa_model=coa_qs.first(), - # balance_type="credit" - # ) +# accounts_receivable = coa_qs.first().get_coa_accounts().filter(name="Accounts Receivable").first() +# if not accounts_receivable: +# accounts_receivable = entity.create_account( +# code="AR", +# role="asset", +# name="Accounts Receivable", +# coa_model=coa_qs.first(), +# balance_type="credit" +# ) - # TransactionModel.objects.create( - # journal_entry=journal_entry, - # account=cash_account.first(), # Debit Cash - # amount=invoice_model.amount_due, # Payment amount - # tx_type='debit', - # description="Payment Received", - # ) +# TransactionModel.objects.create( +# journal_entry=journal_entry, +# account=cash_account.first(), # Debit Cash +# amount=invoice_model.amount_due, # Payment amount +# tx_type='debit', +# description="Payment Received", +# ) - # TransactionModel.objects.create( - # journal_entry=journal_entry, - # account=accounts_receivable, # Credit Accounts Receivable - # amount=invoice_model.amount_due, # Payment amount - # tx_type='credit', - # description="Payment Received", - # ) +# TransactionModel.objects.create( +# journal_entry=journal_entry, +# account=accounts_receivable, # Credit Accounts Receivable +# amount=invoice_model.amount_due, # Payment amount +# tx_type='credit', +# description="Payment Received", +# ) - # invoice_model.mark_as_review() - # print("reviewed") - # invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) - # print("approved") - # invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) - # print("paid") - # invoice_model.save() - # messages.success(request, "Invoice created") - # return redirect("quotation_detail", pk=pk) +# invoice_model.mark_as_review() +# print("reviewed") +# invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) +# print("approved") +# invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) +# print("paid") +# invoice_model.save() +# messages.success(request, "Invoice created") +# return redirect("quotation_detail", pk=pk) - # return redirect('django_ledger:invoice-detail', entity_slug=quotation.entity.slug, invoice_pk=invoice.uuid) +# return redirect('django_ledger:invoice-detail', entity_slug=quotation.entity.slug, invoice_pk=invoice.uuid) # @login_required @@ -1527,45 +1534,45 @@ def delete_vendor(request, pk): # .first() # ) # return - # if not ledger: - # ledger = entity.create_ledger(name=f"Payment Ledger for Invoice {invoice_model}",posted=True) +# if not ledger: +# ledger = entity.create_ledger(name=f"Payment Ledger for Invoice {invoice_model}",posted=True) - # entity_unit,created = EntityUnitModel.objects.get_or_create( - # name="Sales Department", - # entity=entity, - # document_prefix="SD" - # ) +# entity_unit,created = EntityUnitModel.objects.get_or_create( +# name="Sales Department", +# entity=entity, +# document_prefix="SD" +# ) - # journal_entry = JournalEntryModel.objects.create( - # entity_unit=entity_unit, - # posted=False, - # description=f"Payment for Invoice {invoice_model}", - # ledger=ledger, - # locked=False, - # origin="Payment", - # ) +# journal_entry = JournalEntryModel.objects.create( +# entity_unit=entity_unit, +# posted=False, +# description=f"Payment for Invoice {invoice_model}", +# ledger=ledger, +# locked=False, +# origin="Payment", +# ) - # TransactionModel.objects.create( - # journal_entry=journal_entry, - # account=cash_account.first(), # Debit Cash - # amount=invoice_model.amount_due, # Payment amount - # tx_type='debit', - # description="Payment Received", - # ) +# TransactionModel.objects.create( +# journal_entry=journal_entry, +# account=cash_account.first(), # Debit Cash +# amount=invoice_model.amount_due, # Payment amount +# tx_type='debit', +# description="Payment Received", +# ) - # TransactionModel.objects.create( - # journal_entry=journal_entry, - # account=recivable_account.first(), # Credit Accounts Receivable - # amount=invoice_model.amount_due, # Payment amount - # tx_type='credit', - # description="Payment Received", - # ) - # journal_entry.posted = True - # qoutation.posted = True - # qoutation.save() - # journal_entry.save() - # messages.success(request, "Invoice posted") - # return redirect("quotation_detail", pk=pk) +# TransactionModel.objects.create( +# journal_entry=journal_entry, +# account=recivable_account.first(), # Credit Accounts Receivable +# amount=invoice_model.amount_due, # Payment amount +# tx_type='credit', +# description="Payment Received", +# ) +# journal_entry.posted = True +# qoutation.posted = True +# qoutation.save() +# journal_entry.save() +# messages.success(request, "Invoice posted") +# return redirect("quotation_detail", pk=pk) # @login_required @@ -1754,7 +1761,7 @@ class OrganizationListView(LoginRequiredMixin, ListView): def get_queryset(self): dealer = get_user_type(self.request) - return dealer.entity.get_customers().filter(additional_info__type="organization",active=True).all() + return dealer.entity.get_customers().filter(additional_info__type="organization", active=True).all() class OrganizationDetailView(DetailView): @@ -1766,16 +1773,16 @@ class OrganizationDetailView(DetailView): def OrganizationCreateView(request): if request.method == "POST": form = forms.OrganizationForm(request.POST) - + #upload logo image = request.FILES.get('logo') file_name = default_storage.save('images/{}'.format(image.name), image) - file_url = default_storage.url(file_name) - + file_url = default_storage.url(file_name) + organization_dict = { x: request.POST[x] for x in request.POST if x != "csrfmiddlewaretoken" } - dealer = get_user_type(request) + dealer = get_user_type(request) instance = dealer.entity.create_customer( customer_model_kwargs={ @@ -1795,25 +1802,24 @@ def OrganizationCreateView(request): else: form = forms.OrganizationForm() return render(request, "organizations/organization_form.html", {"form": form}) - -def OrganizationUpdateView(request,pk): +def OrganizationUpdateView(request, pk): organization = get_object_or_404(CustomerModel, pk=pk) if request.method == "POST": form = forms.OrganizationForm(request.POST) - + organization_dict = { x: request.POST[x] for x in request.POST if x != "csrfmiddlewaretoken" } - dealer = get_user_type(request) + dealer = get_user_type(request) instance = dealer.entity.get_customers().get(pk=organization.additional_info['organization_info']['pk']) instance.customer_name = organization_dict["name"] instance.address_1 = organization_dict["address"] instance.phone = organization_dict["phone_number"] - instance.email = organization_dict["email"] - + instance.email = organization_dict["email"] + organization_dict["logo"] = organization.additional_info['organization_info']['logo'] organization_dict["pk"] = str(instance.pk) instance.additional_info["organization_info"] = organization_dict @@ -1825,7 +1831,7 @@ def OrganizationUpdateView(request,pk): form = forms.OrganizationForm(initial=organization.additional_info["organization_info"] or {}) form.fields.pop('logo', None) return render(request, "organizations/organization_form.html", {"form": form}) - + class OrganizationDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView): model = models.Organization @@ -2333,7 +2339,7 @@ def create_estimate(request): "unit_cost": car_instance.finances.selling_price, "unit_revenue": car_instance.finances.selling_price, "total_amount": (car_instance.finances.total_vat) - * int(item.get("quantity")), + * int(item.get("quantity")), } ) @@ -2401,7 +2407,7 @@ def create_estimate(request): for x in car_list ], } - + return render(request, "sales/estimates/estimate_form.html", context) @@ -2412,9 +2418,9 @@ class EstimateDetailView(LoginRequiredMixin, DetailView): def get_context_data(self, **kwargs): estimate = kwargs.get("object") - if estimate.get_itemtxs_data(): + if estimate.get_itemtxs_data(): calculator = CarFinanceCalculator(estimate) - finance_data = calculator.get_finance_data() + finance_data = calculator.get_finance_data() kwargs['data'] = finance_data print(finance_data) kwargs["invoice"] = ( @@ -2436,7 +2442,7 @@ def create_sale_order(request, pk): estimate.save() messages.success(request, "Sale Order created successfully") return redirect("estimate_detail", pk=pk) - + form = forms.SaleOrderForm() form.fields["estimate"].queryset = EstimateModel.objects.filter(pk=pk) form.initial['estimate'] = estimate @@ -2446,13 +2452,16 @@ def create_sale_order(request, pk): return render( request, "sales/estimates/sale_order_form.html", - {"form": form, "estimate": estimate, "items": items,"data": finance_data}, + {"form": form, "estimate": estimate, "items": items, "data": finance_data}, ) -def preview_sale_order(request,pk): - estimate = get_object_or_404(EstimateModel,pk=pk) + +def preview_sale_order(request, pk): + estimate = get_object_or_404(EstimateModel, pk=pk) data = get_car_finance_data(estimate) - return render(request,'sales/estimates/sale_order_preview.html',{'order':estimate.sale_orders.first(),"data":data,"estimate":estimate}) + return render(request, 'sales/estimates/sale_order_preview.html', + {'order': estimate.sale_orders.first(), "data": data, "estimate": estimate}) + class PaymentRequest(LoginRequiredMixin, DetailView): model = EstimateModel @@ -2542,10 +2551,10 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView): def get_context_data(self, **kwargs): invoice = kwargs.get("object") - if invoice.get_itemtxs_data(): + if invoice.get_itemtxs_data(): calculator = CarFinanceCalculator(invoice) finance_data = calculator.get_finance_data() - print((finance_data["total_vat_amount"]+finance_data["total_price"]) == finance_data["grand_total"]) + print((finance_data["total_vat_amount"] + finance_data["total_price"]) == finance_data["grand_total"]) kwargs["data"] = finance_data kwargs["payments"] = JournalEntryModel.objects.filter( ledger=invoice.ledger @@ -2649,8 +2658,8 @@ def invoice_create(request, pk): # unit_items = estimate.get_itemtxs_data()[0] # vat = models.VatRate.objects.filter(is_active=True).first() calculator = CarFinanceCalculator(estimate) - finance_data = calculator.get_finance_data() - + finance_data = calculator.get_finance_data() + # total = 0 # discount_amount = 0 @@ -3175,14 +3184,14 @@ class BillDetailView(LoginRequiredMixin, DetailView): bill = kwargs.get("object") if bill.get_itemtxs_data(): txs = bill.get_itemtxs_data()[0] - + car_and_item_info = [ { "car": models.Car.objects.get(vin=x.item_model.name), "total": models.Car.objects.get( vin=x.item_model.name ).finances.cost_price - * Decimal(x.quantity), + * Decimal(x.quantity), "itemmodel": x, } for x in txs @@ -3196,7 +3205,6 @@ class BillDetailView(LoginRequiredMixin, DetailView): ) vat = models.VatRate.objects.filter(is_active=True).first() if vat: - grand_total += round(Decimal(grand_total) * Decimal(vat.rate), 2) kwargs["car_and_item_info"] = car_and_item_info kwargs["grand_total"] = grand_total @@ -3422,7 +3430,7 @@ def bill_create(request): } ) car_list = models.Car.objects.filter( - dealer=dealer, finances__selling_price__gt=0,status="available" + dealer=dealer, finances__selling_price__gt=0, status="available" ) context = { "form": form, @@ -3458,7 +3466,7 @@ class OrderListView(ListView): model = models.SaleOrder template_name = "sales/orders/order_list.html" context_object_name = "orders" - + # email def send_email_view(request, pk): @@ -3530,11 +3538,11 @@ def custom_bad_request_view(request, exception=None): return render(request, "errors/400.html", {}) - # from django_ledger.io.io_core import get_localdate # from django_ledger.views.mixins import (DjangoLedgerSecurityMixIn) # from django.views.generic import RedirectView -from django_ledger.views.financial_statement import FiscalYearBalanceSheetView,BaseIncomeStatementRedirectView,FiscalYearIncomeStatementView +from django_ledger.views.financial_statement import FiscalYearBalanceSheetView, BaseIncomeStatementRedirectView, \ + FiscalYearIncomeStatementView from django.views.generic import DetailView, RedirectView from django_ledger.io.io_core import get_localdate @@ -3544,6 +3552,8 @@ from django_ledger.views.mixins import ( MonthlyReportMixIn, DateReportMixIn, DjangoLedgerSecurityMixIn, EntityUnitMixIn, BaseDateNavigationUrlMixIn, PDFReportMixIn ) + + # BALANCE SHEET ----------- class BaseBalanceSheetRedirectView(DjangoLedgerSecurityMixIn, RedirectView): @@ -3555,14 +3565,18 @@ class BaseBalanceSheetRedirectView(DjangoLedgerSecurityMixIn, RedirectView): 'entity_slug': self.kwargs['entity_slug'], 'year': year }) + + class FiscalYearBalanceSheetViewBase(FiscalYearBalanceSheetView): template_name = "ledger/reports/balance_sheet.html" - + + class QuarterlyBalanceSheetView(FiscalYearBalanceSheetViewBase, QuarterlyReportMixIn): """ Quarter Balance Sheet View. """ + class MonthlyBalanceSheetView(FiscalYearBalanceSheetViewBase, MonthlyReportMixIn): """ Monthly Balance Sheet View. @@ -3574,6 +3588,7 @@ class DateBalanceSheetView(FiscalYearBalanceSheetViewBase, DateReportMixIn): Date Balance Sheet View. """ + class BaseIncomeStatementRedirectViewBase(BaseIncomeStatementRedirectView): def get_redirect_url(self, *args, **kwargs): @@ -3585,9 +3600,11 @@ class BaseIncomeStatementRedirectViewBase(BaseIncomeStatementRedirectView): 'year': year }) + class FiscalYearIncomeStatementViewBase(FiscalYearIncomeStatementView): template_name = "ledger/reports/income_statement.html" - + + class QuarterlyIncomeStatementView(FiscalYearIncomeStatementView, QuarterlyReportMixIn): """ Quarter Income Statement View. diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index f69b7130..403845f3 100644 Binary files a/locale/ar/LC_MESSAGES/django.mo and b/locale/ar/LC_MESSAGES/django.mo differ diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index c2e0ec23..695a1147 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-31 08:58+0300\n" +"POT-Creation-Date: 2025-02-02 17:09+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -28,16 +28,16 @@ msgstr "" msgid "VIN" msgstr "رقم الهيكل" -#: car_inventory/settings.py:243 +#: car_inventory/settings.py:244 #: venv/lib/python3.11/site-packages/appointments/settings.py:132 msgid "English" msgstr "الإنجليزية" -#: car_inventory/settings.py:244 +#: car_inventory/settings.py:245 msgid "Arabic" msgstr "العربية" -#: car_inventory/settings.py:303 +#: car_inventory/settings.py:304 #: templates/crm/opportunities/opportunity_detail.html:35 #: templates/dashboards/accounting.html:35 #: templates/dashboards/accounting.html:39 @@ -56,8 +56,8 @@ msgstr "العربية" msgid "SAR" msgstr "ريال" -#: car_inventory/settings.py:324 templates/header.html:305 -#: templates/welcome.html:65 +#: car_inventory/settings.py:325 templates/header.html:305 +#: templates/welcome.html:57 msgid "Haikal" msgstr "هيكل" @@ -70,50 +70,107 @@ msgstr "تاريخ البطاقة الجمركية" msgid "Both exterior and interior colors must be selected." msgstr "يجب اختيار اللونين الخارجي والداخلي." -#: inventory/forms.py:433 +#: inventory/forms.py:425 inventory/models.py:1062 inventory/models.py:1277 +#: templates/account/email_change.html:5 templates/account/email_change.html:9 +msgid "Email Address" +msgstr "عنوان البريد الإلكتروني" + +#: inventory/forms.py:429 +#: venv/lib/python3.11/site-packages/appointment/views.py:426 +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1915 +msgid "Email address" +msgstr "عنوان البريد الإلكتروني" + +#: inventory/forms.py:430 templates/crm/leads/lead_list.html:50 +#: templates/customers/customer_list.html:45 +#: templates/vendors/vendors_list.html:49 +msgid "email" +msgstr "البريد الإلكتروني" + +#: inventory/forms.py:435 msgid "You must add an email." msgstr "يجب إضافة بريد إلكتروني." -#: inventory/forms.py:440 templates/account/login.html:35 -#: templates/account/login.html:37 +#: inventory/forms.py:440 inventory/forms.py:444 +#: templates/account/login.html:35 templates/account/login.html:37 #: venv/lib/python3.11/site-packages/django_ledger/forms/auth.py:15 msgid "Password" msgstr "كلمة المرور" -#: inventory/forms.py:445 inventory/forms.py:457 inventory/forms.py:510 -#: inventory/forms.py:546 inventory/forms.py:560 +#: inventory/forms.py:449 inventory/forms.py:463 inventory/forms.py:523 +#: inventory/forms.py:543 inventory/forms.py:561 inventory/forms.py:576 #: venv/lib/python3.11/site-packages/django/forms/fields.py:95 msgid "This field is required." msgstr "هذا الحقل مطلوب." -#: inventory/forms.py:452 +#: inventory/forms.py:454 inventory/forms.py:458 msgid "Confirm Password" msgstr "تأكيد كلمة المرور" #: inventory/forms.py:468 +msgid "I accept the Terms and Privacy Policy" +msgstr "أوافق على الشروط وسياسة الخصوصية" + +#: inventory/forms.py:476 msgid "You must accept the terms and privacy policy." msgstr "يجب أن تقبل الشروط وسياسة الخصوصية." -#: inventory/forms.py:478 inventory/models.py:804 inventory/models.py:1274 +#: inventory/forms.py:483 inventory/models.py:298 inventory/models.py:577 +#: inventory/models.py:590 inventory/models.py:886 inventory/models.py:1028 +#: inventory/models.py:1056 templates/administration/service_list.html:22 +#: templates/administration/staff_list.html:38 +#: templates/administration/user_profile.html:234 +#: templates/crm/leads/lead_list.html:43 +#: templates/customers/customer_list.html:42 +#: templates/items/expenses/expenses_list.html:20 +#: templates/items/service/service_list.html:20 +#: templates/ledger/bank_accounts/bank_account_list.html:18 +#: templates/organizations/organization_list.html:46 +#: templates/plans/order_detail_table.html:8 templates/plans/order_list.html:21 +#: templates/representatives/representative_list.html:17 +#: templates/users/user_detail.html:47 templates/vendors/vendors_list.html:46 +#: templates/vendors/view_vendor.html:46 +#: venv/lib/python3.11/site-packages/appointment/templates/administration/service_list.html:28 +#: venv/lib/python3.11/site-packages/appointment/templates/administration/staff_list.html:38 +#: venv/lib/python3.11/site-packages/appointment/templates/administration/user_profile.html:234 +#: venv/lib/python3.11/site-packages/django_ledger/forms/chart_of_accounts.py:35 +#: venv/lib/python3.11/site-packages/django_ledger/forms/chart_of_accounts.py:72 +msgid "Name" +msgstr "الاسم" + +#: inventory/forms.py:487 inventory/models.py:804 inventory/models.py:1274 msgid "English Name" msgstr "الاسم بالإنجليزية" -#: inventory/forms.py:483 +#: inventory/forms.py:492 msgid "Please enter an English Name." msgstr "يرجى إدخال اسم باللغة الإنجليزية." -#: inventory/forms.py:490 inventory/models.py:299 inventory/models.py:578 -#: inventory/models.py:591 inventory/models.py:803 inventory/models.py:887 -#: inventory/models.py:1029 inventory/models.py:1057 inventory/models.py:1273 -#: templates/users/user_detail.html:48 +#: inventory/forms.py:497 inventory/forms.py:501 inventory/models.py:299 +#: inventory/models.py:578 inventory/models.py:591 inventory/models.py:803 +#: inventory/models.py:887 inventory/models.py:1029 inventory/models.py:1057 +#: inventory/models.py:1273 templates/users/user_detail.html:48 msgid "Arabic Name" msgstr "الاسم بالعربية" -#: inventory/forms.py:495 +#: inventory/forms.py:506 msgid "Please enter an Arabic name." msgstr "يرجى إدخال اسم باللغة العربية." -#: inventory/forms.py:504 templates/administration/display_appointment.html:49 +#: inventory/forms.py:511 inventory/models.py:805 inventory/models.py:888 +#: inventory/models.py:1003 inventory/models.py:1034 inventory/models.py:1061 +#: inventory/models.py:1276 templates/administration/staff_index.html:369 +#: templates/crm/leads/lead_list.html:56 +#: templates/crm/opportunities/opportunity_detail.html:217 +#: templates/customers/customer_list.html:50 +#: templates/customers/view_customer.html:105 +#: templates/users/user_detail.html:51 templates/vendors/view_vendor.html:52 +#: venv/lib/python3.11/site-packages/appointment/templates/administration/staff_index.html:369 +#: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:113 +msgid "Phone Number" +msgstr "رقم الهاتف" + +#: inventory/forms.py:517 templates/administration/display_appointment.html:49 #: templates/appointment/appointment_client_information.html:62 #: templates/crm/leads/lead_detail.html:80 #: templates/dealers/dealer_detail.html:99 @@ -127,43 +184,68 @@ msgstr "يرجى إدخال اسم باللغة العربية." msgid "Phone" msgstr "الهاتف" -#: inventory/forms.py:511 +#: inventory/forms.py:524 msgid "Phone number must be in the format 05xxxxxxxx" msgstr "يجب أن يكون رقم الهاتف بالصيغة 05xxxxxxxx" -#: inventory/forms.py:522 inventory/models.py:796 inventory/models.py:1031 +#: inventory/forms.py:532 templates/organizations/organization_detail.html:8 +#: templates/organizations/organization_list.html:49 +msgid "CRN" +msgstr "رقم السجل التجاري" + +#: inventory/forms.py:536 inventory/models.py:796 inventory/models.py:1031 #: inventory/models.py:1268 msgid "Commercial Registration Number" msgstr "رقم السجل التجاري" -#: inventory/forms.py:539 inventory/models.py:801 inventory/models.py:1033 +#: inventory/forms.py:550 templates/organizations/organization_detail.html:9 +#: templates/organizations/organization_list.html:54 +msgid "VRN" +msgstr "الرقم الضريبي" + +#: inventory/forms.py:554 inventory/models.py:801 inventory/models.py:1033 #: inventory/models.py:1271 msgid "VAT Registration Number" msgstr "رقم التسجيل في ضريبة القيمة المضافة" -#: inventory/forms.py:547 +#: inventory/forms.py:562 msgid "VAT Registration Number must be 15 characters." msgstr "يجب أن يكون رقم التسجيل الضريبي مكونًا من 15 حرفًا." -#: inventory/forms.py:596 inventory/models.py:1477 +#: inventory/forms.py:567 inventory/models.py:807 inventory/models.py:1006 +#: inventory/models.py:1036 inventory/models.py:1064 inventory/models.py:1279 +#: templates/crm/leads/lead_detail.html:109 +#: templates/customers/customer_list.html:60 +#: templates/customers/view_customer.html:100 +#: templates/dealers/dealer_detail.html:83 +#: templates/organizations/organization_detail.html:11 +#: templates/organizations/organization_list.html:64 +#: templates/representatives/representative_detail.html:10 +#: templates/vendors/vendors_list.html:64 templates/vendors/view_vendor.html:58 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/tags/customer_table.html:10 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:11 +msgid "Address" +msgstr "العنوان" + +#: inventory/forms.py:612 inventory/models.py:1477 msgid "cash" msgstr "نقداً" -#: inventory/forms.py:597 inventory/models.py:1478 +#: inventory/forms.py:613 inventory/models.py:1478 msgid "credit" msgstr "دائن" -#: inventory/forms.py:598 inventory/models.py:1479 +#: inventory/forms.py:614 inventory/models.py:1479 #: templates/inventory/car_detail.html:102 #: templates/inventory/transfer_car.html:23 msgid "transfer" msgstr "نقل" -#: inventory/forms.py:599 inventory/models.py:1480 +#: inventory/forms.py:615 inventory/models.py:1480 msgid "debit" msgstr "مدين" -#: inventory/forms.py:600 inventory/models.py:1481 +#: inventory/forms.py:616 inventory/models.py:1481 msgid "SADAD" msgstr "سداد" @@ -312,29 +394,6 @@ msgstr "جديد" msgid "Used" msgstr "مستعمل" -#: inventory/models.py:298 inventory/models.py:577 inventory/models.py:590 -#: inventory/models.py:886 inventory/models.py:1028 inventory/models.py:1056 -#: templates/administration/service_list.html:22 -#: templates/administration/staff_list.html:38 -#: templates/administration/user_profile.html:234 -#: templates/crm/leads/lead_list.html:43 -#: templates/customers/customer_list.html:42 -#: templates/items/expenses/expenses_list.html:20 -#: templates/items/service/service_list.html:20 -#: templates/ledger/bank_accounts/bank_account_list.html:18 -#: templates/organizations/organization_list.html:46 -#: templates/plans/order_detail_table.html:8 templates/plans/order_list.html:21 -#: templates/representatives/representative_list.html:17 -#: templates/users/user_detail.html:47 templates/vendors/vendors_list.html:46 -#: templates/vendors/view_vendor.html:46 -#: venv/lib/python3.11/site-packages/appointment/templates/administration/service_list.html:28 -#: venv/lib/python3.11/site-packages/appointment/templates/administration/staff_list.html:38 -#: venv/lib/python3.11/site-packages/appointment/templates/administration/user_profile.html:234 -#: venv/lib/python3.11/site-packages/django_ledger/forms/chart_of_accounts.py:35 -#: venv/lib/python3.11/site-packages/django_ledger/forms/chart_of_accounts.py:72 -msgid "Name" -msgstr "الاسم" - #: inventory/models.py:300 inventory/models.py:659 #: templates/administration/manage_day_off.html:63 #: templates/administration/user_profile.html:105 @@ -697,7 +756,7 @@ msgstr "تم التحديث" msgid "Subscription" msgstr "الاشتراك" -#: inventory/models.py:734 templates/welcome.html:104 +#: inventory/models.py:734 templates/welcome.html:73 templates/welcome.html:140 msgid "Subscriptions" msgstr "الاشتراكات" @@ -733,34 +792,6 @@ msgstr "خطة الاشتراك" msgid "Subscription Plans" msgstr "خطط الاشتراك" -#: inventory/models.py:805 inventory/models.py:888 inventory/models.py:1003 -#: inventory/models.py:1034 inventory/models.py:1061 inventory/models.py:1276 -#: templates/administration/staff_index.html:369 -#: templates/crm/leads/lead_list.html:56 -#: templates/crm/opportunities/opportunity_detail.html:217 -#: templates/customers/customer_list.html:50 -#: templates/customers/view_customer.html:105 -#: templates/users/user_detail.html:51 templates/vendors/view_vendor.html:52 -#: venv/lib/python3.11/site-packages/appointment/templates/administration/staff_index.html:369 -#: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:113 -msgid "Phone Number" -msgstr "رقم الهاتف" - -#: inventory/models.py:807 inventory/models.py:1006 inventory/models.py:1036 -#: inventory/models.py:1064 inventory/models.py:1279 -#: templates/crm/leads/lead_detail.html:109 -#: templates/customers/customer_list.html:60 -#: templates/customers/view_customer.html:100 -#: templates/dealers/dealer_detail.html:83 -#: templates/organizations/organization_detail.html:11 -#: templates/organizations/organization_list.html:64 -#: templates/representatives/representative_detail.html:10 -#: templates/vendors/vendors_list.html:64 templates/vendors/view_vendor.html:58 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/tags/customer_table.html:10 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:11 -msgid "Address" -msgstr "العنوان" - #: inventory/models.py:810 inventory/models.py:1039 inventory/models.py:1282 msgid "Logo" msgstr "الشعار" @@ -1121,11 +1152,6 @@ msgstr "الشركات" msgid "ID Number" msgstr "رقم الهوية" -#: inventory/models.py:1062 inventory/models.py:1277 -#: templates/account/email_change.html:5 templates/account/email_change.html:9 -msgid "Email Address" -msgstr "عنوان البريد الإلكتروني" - #: inventory/models.py:1069 msgid "Representative" msgstr "ممثل شركة" @@ -1581,216 +1607,177 @@ msgstr "تحويل العملات الأجنبية" msgid "Interest Expenses" msgstr "مصروفات الفائدة" -#: inventory/utils.py:49 +#: inventory/utils.py:50 msgid "success" msgstr "ناجحة" -#: inventory/utils.py:50 templates/inventory/car_form.html:378 +#: inventory/utils.py:51 templates/inventory/car_form.html:378 #: ⁨templates/inventory/car_form_qabl alfalsafa.html⁩:427 msgid "error" msgstr "خطأ" -#: inventory/utils.py:51 templates/account/login.html:47 +#: inventory/utils.py:52 templates/account/login.html:47 #: templates/account/password_change.html:28 msgid "Forgot Password?" msgstr "نسيت كلمة المرور؟" -#: inventory/utils.py:119 +#: inventory/utils.py:120 msgid "Car reserved successfully." msgstr "تم حجز السيارة بنجاح." -#: inventory/views.py:347 +#: inventory/views.py:380 msgid "VIN number exists" msgstr "رقم الهيكل موجود مسبقاً" -#: inventory/views.py:539 templates/dashboards/accounting.html:21 +#: inventory/views.py:572 templates/dashboards/accounting.html:21 #: templates/inventory/car_inventory.html:5 msgid "inventory" msgstr "المخزون" -#: inventory/views.py:696 +#: inventory/views.py:729 msgid "Car finance details saved successfully." msgstr "تم حفظ تفاصيل المالية للسيارة بنجاح." -#: inventory/views.py:728 +#: inventory/views.py:761 msgid "Car finance details updated successfully." msgstr "تم تحديث تفاصيل المالية للسيارة بنجاح." -#: inventory/views.py:759 +#: inventory/views.py:792 msgid "Car updated successfully." msgstr "تم تحديث السيارة بنجاح" -#: inventory/views.py:771 +#: inventory/views.py:804 msgid "Car deleted successfully." msgstr "تم حذف السيارة بنجاح." -#: inventory/views.py:845 +#: inventory/views.py:878 msgid "Car transfer canceled successfully." msgstr "تم إلغاء نقل السيارة بنجاح." -#: inventory/views.py:862 +#: inventory/views.py:895 msgid "Car transfer approved successfully." msgstr "تمت الموافقة على نقل السيارة بنجاح." -#: inventory/views.py:873 +#: inventory/views.py:906 msgid "Car transfer rejected successfully." msgstr "تم رفض نقل السيارة بنجاح." -#: inventory/views.py:884 +#: inventory/views.py:917 msgid "Car Transfer Completed successfully." msgstr "تم إكمال نقل السيارة بنجاح." -#: inventory/views.py:955 +#: inventory/views.py:988 msgid "Custom Card added successfully." msgstr "تم إضافة البطاقة الجمركية بنجاح." -#: inventory/views.py:964 +#: inventory/views.py:997 msgid "This car is already reserved." msgstr "هذه السيارة محجوزة بالفعل." -#: inventory/views.py:984 +#: inventory/views.py:1017 msgid "Reservation renewed successfully." msgstr "تم تجديد الحجز بنجاح" -#: inventory/views.py:992 +#: inventory/views.py:1025 msgid "Reservation canceled successfully." msgstr "تم إلغاء الحجز بنجاح." -#: inventory/views.py:997 +#: inventory/views.py:1030 msgid "Invalid action." msgstr "إجراء غير صالح." -#: inventory/views.py:1001 +#: inventory/views.py:1034 msgid "Invalid request method." msgstr "طريقة الطلب غير صالحة" -#: inventory/views.py:1023 +#: inventory/views.py:1056 msgid "Dealer updated successfully." msgstr "تم تحديث المعرض بنجاح." -#: inventory/views.py:1043 templates/header.html:154 +#: inventory/views.py:1076 templates/header.html:154 msgid "customers" msgstr "العملاء" -#: inventory/views.py:1151 +#: inventory/views.py:1184 msgid "Customer created successfully." msgstr "تم إنشاء العميل بنجاح." -#: inventory/views.py:1183 +#: inventory/views.py:1216 msgid "Customer updated successfully." msgstr "تم تحديث العميل بنجاح." -#: inventory/views.py:1194 +#: inventory/views.py:1228 msgid "Customer deleted successfully." msgstr "تم حذف العميل بنجاح." -#: inventory/views.py:1229 +#: inventory/views.py:1263 msgid "Vendor created successfully." msgstr "تم إنشاء المورد بنجاح." -#: inventory/views.py:1249 +#: inventory/views.py:1283 msgid "Vendor updated successfully." msgstr "تم تحديث المورد بنجاح" -#: inventory/views.py:1257 +#: inventory/views.py:1291 msgid "Vendor deleted successfully." msgstr "تم حذف المورد بنجاح." -#: inventory/views.py:1665 +#: inventory/views.py:1699 msgid "User created successfully." msgstr "تم إنشاء المستخدم بنجاح." -#: inventory/views.py:1690 +#: inventory/views.py:1724 msgid "User updated successfully." msgstr "تم تحديث المستخدم بنجاح" -#: inventory/views.py:1701 +#: inventory/views.py:1735 msgid "User deleted successfully." msgstr "تم حذف المستخدم بنجاح." -#: inventory/views.py:1766 inventory/views.py:1795 +#: inventory/views.py:1800 inventory/views.py:1828 msgid "Organization created successfully." msgstr "تم إنشاء المنظمة بنجاح." -#: inventory/views.py:2981 +#: inventory/views.py:3017 msgid "Opportunity deleted successfully." msgstr "تم حذف الفرصة بنجاح." -#: inventory/views.py:3018 +#: inventory/views.py:3054 msgid "Notification marked as read." msgstr "تم تمييز الإشعار كمقروء." -#: inventory/views.py:3044 +#: inventory/views.py:3080 msgid "Service created successfully." msgstr "تم إنشاء الخدمة بنجاح." -#: inventory/views.py:3060 +#: inventory/views.py:3096 msgid "Service updated successfully." msgstr "تم تحديث الخدمة بنجاح." -#: inventory/views.py:3184 inventory/views.py:3209 +#: inventory/views.py:3219 inventory/views.py:3244 msgid "Bill updated successfully." msgstr "تم تحديث الفاتورة بنجاح." -#: inventory/views.py:3235 +#: inventory/views.py:3270 msgid "Bill is already approved." msgstr "تمت الموافقة على الفاتورة مسبقًا." -#: inventory/views.py:3239 +#: inventory/views.py:3274 msgid "Bill marked as approved successfully." msgstr "تم تحديد الفاتورة كموافقة بنجاح." -#: inventory/views.py:3248 +#: inventory/views.py:3283 msgid "Bill is already paid." msgstr "تم دفع الفاتورة مسبقًا." -#: inventory/views.py:3257 +#: inventory/views.py:3292 msgid "Bill marked as paid successfully." msgstr "تم تحديد الفاتورة كمدفوعة بنجاح." -#: inventory/views.py:3259 +#: inventory/views.py:3294 msgid "Amount paid is not equal to amount due." msgstr "المبلغ المدفوع لا يساوي المبلغ المستحق." -#: templates/account/2FA.html:11 templates/account/2FA.html:12 -#: templates/account/login.html:15 templates/account/login.html:16 -#: templates/account/password_change.html:14 -#: templates/account/password_change.html:15 -#: templates/account/password_reset.html:14 -#: templates/account/password_reset.html:15 -#: templates/account/password_reset_done.html:15 -#: templates/account/password_reset_done.html:16 -#: templates/account/password_reset_from_key.html:14 -#: templates/account/password_reset_from_key.html:15 -#: 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.html:15 templates/otp/verify_otp.html:11 -#: templates/otp/verify_otp.html:12 templates/welcome.html:94 -msgid "home" -msgstr "الرئيسية" - -#: templates/account/2FA.html:18 templates/otp/verify_otp.html:18 -msgid "Enter the verification code" -msgstr "أدخل رمز التحقق" - -#: templates/account/2FA.html:19 templates/otp/verify_otp.html:19 -msgid "An OTP has been sent to your email. Please enter it below" -msgstr "تم إرسال رمز التحقق لمرة واحدة (OTP) إلى بريدك الإلكتروني. يرجى إدخاله أدناه." - -#: templates/account/2FA.html:23 templates/otp/verify_otp.html:25 -msgid "Enter OTP" -msgstr "أدخل رمز OTP" - -#: templates/account/2FA.html:29 templates/otp/verify_otp.html:30 -msgid "Verify" -msgstr "تحقق" - -#: templates/account/2FA.html:30 templates/otp/verify_otp.html:31 -msgid "Didn’t receive the code" -msgstr "لم تستلم الرمز؟" - #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" @@ -1811,16 +1798,17 @@ msgid "Enter Email Verification Code" msgstr "أدخل رمز التحقق من البريد الإلكتروني" #: templates/account/confirm_email_verification_code.html:15 -#: templates/account/confirm_login_code.html:16 -#: templates/account/confirm_login_code.html:15 +#: templates/account/confirm_login_code..html:29 #, python-format msgid "" "We’ve sent a code to %(email_link)s. The code expires shortly, so please " "enter it soon." -msgstr "لقد أرسلنا رمزًا إلى %(email_link)s. سينتهي صلاحية الرمز قريبًا، لذا يرجى إدخاله في أسرع وقت ممكن." +msgstr "" +"لقد أرسلنا رمزًا إلى %(email_link)s. سينتهي صلاحية الرمز قريبًا، لذا يرجى " +"إدخاله في أسرع وقت ممكن." #: templates/account/confirm_email_verification_code.html:27 -#: templates/account/email_confirm.html:24 +#: templates/account/email_confirm.html:35 #: templates/account/reauthenticate.html:18 #: templates/inventory/transfer_details.html:26 #: templates/inventory/transfer_details.html:45 @@ -1835,8 +1823,7 @@ msgstr "تأكيد" #: templates/account/confirm_email_verification_code.html:31 #: templates/account/confirm_email_verification_code.html:35 -#: templates/account/confirm_login_code..html:33 -#: templates/account/confirm_login_code.html:32 +#: templates/account/confirm_login_code..html:38 #: templates/crm/leads/lead_form.html:17 #: templates/crm/opportunities/opportunity_form.html:89 #: templates/inventory/add_colors.html:56 @@ -1870,63 +1857,90 @@ msgstr "تأكيد" msgid "Cancel" msgstr "إلغاء" -#: templates/account/confirm_login_code..html:6 -#: templates/account/confirm_login_code..html:28 -#: templates/account/confirm_login_code.html:5 -#: templates/account/confirm_login_code.html:27 templates/account/login.html:6 +#: 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/request_login_code.html:5 templates/account/signup.html:80 -#: templates/header.html:434 templates/welcome.html:137 +#: templates/header.html:434 templates/welcome.html:77 msgid "Sign In" msgstr "تسجيل الدخول" -#: templates/account/confirm_login_code.html:10 -#: templates/account/confirm_login_code.html:9 +#: templates/account/confirm_login_code..html:16 +#: 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/otp_verification.html:11 +#: templates/account/password_change.html:14 +#: templates/account/password_change.html:15 +#: templates/account/password_reset.html:14 +#: templates/account/password_reset.html:15 +#: templates/account/password_reset_done.html:15 +#: templates/account/password_reset_done.html:16 +#: templates/account/password_reset_from_key.html:15 +#: 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.html:15 +#: templates/account/verfied_email_required.html:14 +#: templates/account/verfied_email_required.html:15 +#: templates/account/verification_sent.html:13 +#: templates/account/verification_sent.html:14 +#: templates/account/verified_email_required.html:13 +#: templates/account/verified_email_required.html:14 +#: templates/otp/verify_otp.html:11 templates/otp/verify_otp.html:12 +msgid "home" +msgstr "الرئيسية" + +#: templates/account/confirm_login_code..html:22 msgid "Enter Sign-In Code" msgstr "أدخل رمز تسجيل الدخول" -#: templates/account/email.html:4 templates/account/email.html:8 +#: templates/account/email.html:5 templates/account/email.html:20 msgid "Email Addresses" msgstr "عناوين البريد الإلكتروني" -#: templates/account/email.html:12 +#: templates/account/email.html:25 msgid "The following email addresses are associated with your account:" msgstr "عناوين البريد الإلكتروني التالية مرتبطة بحسابك:" -#: templates/account/email.html:25 +#: templates/account/email.html:37 msgid "Verified" msgstr "تم التحقق" -#: templates/account/email.html:29 +#: templates/account/email.html:39 msgid "Unverified" msgstr "لم يتم التحقق" -#: templates/account/email.html:34 +#: templates/account/email.html:42 msgid "Primary" msgstr "رئيسي" -#: templates/account/email.html:44 +#: templates/account/email.html:49 msgid "Make Primary" msgstr "تعيين كرئيسي" -#: templates/account/email.html:47 templates/account/email_change.html:37 +#: templates/account/email.html:50 templates/account/email_change.html:37 msgid "Re-send Verification" msgstr "إعادة إرسال التحقق" -#: templates/account/email.html:50 templates/administration/staff_list.html:52 +#: templates/account/email.html:51 templates/administration/staff_list.html:52 #: venv/lib/python3.11/site-packages/appointment/templates/administration/staff_list.html:52 msgid "Remove" msgstr "إزالة" -#: templates/account/email.html:59 +#: templates/account/email.html:61 msgid "Add Email Address" msgstr "إضافة عنوان بريد إلكتروني" -#: templates/account/email.html:70 +#: templates/account/email.html:69 msgid "Add Email" msgstr "إضافة بريد إلكتروني" -#: templates/account/email.html:79 +#: templates/account/email.html:76 msgid "Do you really want to remove the selected email address?" msgstr "هل أنت متأكد أنك تريد إزالة عنوان البريد الإلكتروني المحدد؟" @@ -1947,7 +1961,8 @@ msgid "" "\n" "%(password_reset_url)s" msgstr "" -"لقد تلقيت هذا البريد الإلكتروني لأنك أو شخصًا آخر حاول التسجيل في حساب باستخدام عنوان البريد الإلكتروني:\n" +"لقد تلقيت هذا البريد الإلكتروني لأنك أو شخصًا آخر حاول التسجيل في حساب " +"باستخدام عنوان البريد الإلكتروني:\n" "\n" "%(email)s\n" "\n" @@ -1961,6 +1976,7 @@ msgid "Account Already Exists" msgstr "الحساب موجود بالفعل" #: templates/account/email/base_message.txt:1 +#, python-format msgid "Hello from %(site_name)s!" msgstr "مرحبًا من %(site_name)s!" @@ -1969,13 +1985,16 @@ msgstr "مرحبًا من %(site_name)s!" msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" -msgstr "شكرًا لاستخدامك %(site_name)s!\n%(site_domain)s" +msgstr "" +"شكرًا لاستخدامك %(site_name)s!\n" +"%(site_domain)s" #: templates/account/email/base_notification.txt:5 msgid "" "You are receiving this mail because the following change was made to your " "account:" -msgstr "لقد تلقيت هذا البريد الإلكتروني لأن التغيير التالي تم إجراؤه على حسابك:" +msgstr "" +"لقد تلقيت هذا البريد الإلكتروني لأن التغيير التالي تم إجراؤه على حسابك:" #: templates/account/email/base_notification.txt:10 #, python-format @@ -1987,8 +2006,8 @@ msgid "" "- Browser: %(user_agent)s\n" "- Date: %(timestamp)s" msgstr "" -"إذا كنت لا تتعرف على هذا التغيير، يرجى اتخاذ الإجراءات الأمنية المناسبة فورًا. " -"التغيير في حسابك مصدره:\n" +"إذا كنت لا تتعرف على هذا التغيير، يرجى اتخاذ الإجراءات الأمنية المناسبة " +"فورًا. التغيير في حسابك مصدره:\n" "\n" "- عنوان IP: %(ip)s\n" "- المتصفح: %(user_agent)s\n" @@ -2017,13 +2036,16 @@ msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s." msgstr "" -"لقد تلقيت هذا البريد الإلكتروني لأن المستخدم %(user_display)s قام بإدخال بريدك الإلكتروني لتسجيل حساب في %(site_domain)s." +"لقد تلقيت هذا البريد الإلكتروني لأن المستخدم %(user_display)s قام بإدخال " +"بريدك الإلكتروني لتسجيل حساب في %(site_domain)s." #: templates/account/email/email_confirmation_message.txt:7 msgid "" "Your email verification code is listed below. Please enter it in your open " "browser window." -msgstr "رمز التحقق من بريدك الإلكتروني مدرج أدناه. يرجى إدخاله في نافذة المتصفح المفتوحة." +msgstr "" +"رمز التحقق من بريدك الإلكتروني مدرج أدناه. يرجى إدخاله في نافذة المتصفح " +"المفتوحة." #: templates/account/email/email_confirmation_message.txt:9 #, python-format @@ -2047,7 +2069,8 @@ msgstr "تمت إزالة البريد الإلكتروني" msgid "" "Your sign-in code is listed below. Please enter it in your open browser " "window." -msgstr "رمز تسجيل الدخول الخاص بك مدرج أدناه. يرجى إدخاله في نافذة المتصفح المفتوحة." +msgstr "" +"رمز تسجيل الدخول الخاص بك مدرج أدناه. يرجى إدخاله في نافذة المتصفح المفتوحة." #: templates/account/email/login_code_message.txt:9 #: templates/account/email/unknown_account_message.txt:6 @@ -2073,8 +2096,10 @@ msgid "" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" -"لقد تلقيت هذا البريد الإلكتروني لأنك أو شخصًا آخر طلب إعادة تعيين كلمة المرور لحسابك.\n" -"يمكنك تجاهله بأمان إذا لم تطلب إعادة تعيين كلمة المرور. انقر على الرابط أدناه لإعادة تعيينها." +"لقد تلقيت هذا البريد الإلكتروني لأنك أو شخصًا آخر طلب إعادة تعيين كلمة المرور " +"لحسابك.\n" +"يمكنك تجاهله بأمان إذا لم تطلب إعادة تعيين كلمة المرور. انقر على الرابط " +"أدناه لإعادة تعيينها." #: templates/account/email/password_reset_key_message.txt:9 #, python-format @@ -2112,8 +2137,9 @@ msgid "" "an account with email %(email)s. However, we do not have any record of such " "an account in our database." msgstr "" -"لقد تلقيت هذا البريد الإلكتروني لأنك أو شخصًا آخر حاول الوصول إلى حساب باستخدام البريد الإلكتروني %(email)s. " -"ومع ذلك، ليس لدينا أي سجل لهذا الحساب في قاعدة بياناتنا." +"لقد تلقيت هذا البريد الإلكتروني لأنك أو شخصًا آخر حاول الوصول إلى حساب " +"باستخدام البريد الإلكتروني %(email)s. ومع ذلك، ليس لدينا أي سجل لهذا الحساب " +"في قاعدة بياناتنا." #: templates/account/email/unknown_account_message.txt:8 msgid "If it was you, you can sign up for an account using the link below." @@ -2149,28 +2175,28 @@ msgid "Change Email" msgstr "تغيير البريد الإلكتروني" #: templates/account/email_confirm.html:6 -#: templates/account/email_confirm.html:10 +#: templates/account/email_confirm.html:21 msgid "Confirm Email Address" msgstr "تأكيد عنوان البريد الإلكتروني" -#: templates/account/email_confirm.html:16 +#: templates/account/email_confirm.html:28 #, python-format msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" -"يرجى تأكيد أن %(email)s هو عنوان البريد الإلكتروني للمستخدم %(user_display)s." +"يرجى تأكيد أن %(email)s هو عنوان البريد " +"الإلكتروني للمستخدم %(user_display)s." -#: templates/account/email_confirm.html:30 +#: templates/account/email_confirm.html:41 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." -msgstr "" -"تعذر تأكيد %(email)s لأنه تم تأكيده بالفعل بواسطة حساب آخر." +msgstr "تعذر تأكيد %(email)s لأنه تم تأكيده بالفعل بواسطة حساب آخر." -#: templates/account/email_confirm.html:36 +#: templates/account/email_confirm.html:47 #, python-format msgid "" "This email confirmation link expired or is invalid. Please new password reset." -msgstr "رابط إعادة تعيين كلمة المرور غير صالح، ربما لأنه تم استخدامه بالفعل. يرجى طلب إعادة تعيين كلمة مرور جديدة." +msgstr "" +"رابط إعادة تعيين كلمة المرور غير صالح، ربما لأنه تم استخدامه بالفعل. يرجى " +"طلب إعادة تعيين كلمة مرور جديدة." #: templates/account/password_reset_from_key_done.html:21 msgid "Your password is now changed." @@ -2437,48 +2485,62 @@ msgstr "تحذير:" msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." -msgstr "ليس لديك حاليًا أي عنوان بريد إلكتروني مُسجل. يجب عليك إضافة عنوان بريد إلكتروني حتى تتمكن من تلقي الإشعارات وإعادة تعيين كلمة المرور وما إلى ذلك." +msgstr "" +"ليس لديك حاليًا أي عنوان بريد إلكتروني مُسجل. يجب عليك إضافة عنوان بريد " +"إلكتروني حتى تتمكن من تلقي الإشعارات وإعادة تعيين كلمة المرور وما إلى ذلك." #: templates/account/verfied_email_required.html:5 -#: templates/account/verfied_email_required.html:9 +#: templates/account/verfied_email_required.html:19 #: templates/account/verification_sent.html:5 -#: templates/account/verification_sent.html:9 +#: templates/account/verification_sent.html:18 #: templates/account/verified_email_required.html:5 -#: templates/account/verified_email_required.html:9 +#: templates/account/verified_email_required.html:18 msgid "Verify Your Email Address" msgstr "تحقق من عنوان بريدك الإلكتروني" -#: templates/account/verfied_email_required.html:12 -#: templates/account/verification_sent.html:12 +#: templates/account/verfied_email_required.html:24 +#: templates/account/verification_sent.html:22 msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." -msgstr "لقد أرسلنا إليك بريدًا إلكترونيًا للتحقق. يرجى اتباع الرابط المرفق لإكمال عملية التسجيل. إذا لم تجد البريد الإلكتروني للتحقق في صندوق الوارد الرئيسي، تحقق من مجلد البريد العشوائي. يرجى الاتصال بنا إذا لم تتلقَ البريد الإلكتروني خلال بضع دقائق." +msgstr "" +"لقد أرسلنا إليك بريدًا إلكترونيًا للتحقق. يرجى اتباع الرابط المرفق لإكمال " +"عملية التسجيل. إذا لم تجد البريد الإلكتروني للتحقق في صندوق الوارد الرئيسي، " +"تحقق من مجلد البريد العشوائي. يرجى الاتصال بنا إذا لم تتلقَ البريد الإلكتروني " +"خلال بضع دقائق." -#: templates/account/verified_email_required.html:13 +#: templates/account/verified_email_required.html:23 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " -msgstr "يتطلب هذا الجزء من الموقع التحقق من أنك الشخص الذي تدّعي أنه أنت. لهذا السبب، نطلب منك تأكيد ملكية عنوان بريدك الإلكتروني." +msgstr "" +"يتطلب هذا الجزء من الموقع التحقق من أنك الشخص الذي تدّعي أنه أنت. لهذا السبب، " +"نطلب منك تأكيد ملكية عنوان بريدك الإلكتروني." -#: templates/account/verified_email_required.html:18 +#: templates/account/verified_email_required.html:28 msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." -msgstr "لقد أرسلنا لك بريدًا إلكترونيًا للتحقق. يرجى النقر على الرابط الموجود داخل البريد الإلكتروني. إذا لم تجد البريد الإلكتروني للتحقق في صندوق الوارد الرئيسي، تحقق من مجلد البريد العشوائي. بخلاف ذلك، اتصل بنا إذا لم تستلمه خلال بضع دقائق." +msgstr "" +"لقد أرسلنا لك بريدًا إلكترونيًا للتحقق. يرجى النقر على الرابط الموجود داخل " +"البريد الإلكتروني. إذا لم تجد البريد الإلكتروني للتحقق في صندوق الوارد " +"الرئيسي، تحقق من مجلد البريد العشوائي. بخلاف ذلك، اتصل بنا إذا لم تستلمه " +"خلال بضع دقائق." -#: templates/account/verified_email_required.html:23 +#: templates/account/verified_email_required.html:33 #, python-format msgid "" "Note: you can still change your " "email address." -msgstr "ملاحظة: لا يزال بإمكانك تغيير عنوان بريدك الإلكتروني." +msgstr "" +"ملاحظة: لا يزال بإمكانك تغيير " +"عنوان بريدك الإلكتروني." #: templates/administration/display_appointment.html:25 #: templates/email_sender/reminder_email.html:80 @@ -3356,12 +3418,6 @@ msgstr "إضافة عميل محتمل" msgid "Enter lead name" msgstr "أدخل اسم العميل المحتمل" -#: templates/crm/leads/lead_list.html:50 -#: templates/customers/customer_list.html:45 -#: templates/vendors/vendors_list.html:49 -msgid "email" -msgstr "البريد الإلكتروني" - #: templates/crm/leads/lead_list.html:72 #: templates/customers/customer_list.html:64 #: templates/organizations/organization_list.html:68 @@ -5360,16 +5416,6 @@ msgstr "اذهب" msgid "Organization Details" msgstr "تفاصيل الشركة" -#: templates/organizations/organization_detail.html:8 -#: templates/organizations/organization_list.html:49 -msgid "CRN" -msgstr "رقم السجل التجاري" - -#: templates/organizations/organization_detail.html:9 -#: templates/organizations/organization_list.html:54 -msgid "VRN" -msgstr "الرقم الضريبي" - #: templates/organizations/organization_form.html:4 #: templates/organizations/organization_form.html:7 msgid "Add Organization" @@ -5397,6 +5443,15 @@ msgstr "حذف مورد" msgid "Are you sure you want to delete this Organization?" msgstr "هل أنت متأكد أنك تريد حذف هذه الشركة؟" +#: templates/otp/verify_otp.html:19 +msgid "An OTP has been sent to your email. Please enter it below" +msgstr "" +"تم إرسال رمز التحقق لمرة واحدة (OTP) إلى بريدك الإلكتروني. يرجى إدخاله أدناه." + +#: templates/otp/verify_otp.html:25 +msgid "Enter OTP" +msgstr "أدخل رمز OTP" + #: templates/otp/verify_otp.html:26 msgid "OTP" msgstr "رمز التحقق (OTP)" @@ -5612,7 +5667,9 @@ msgstr "" msgid "" "Order #%(order_id)s\n" " (status: %(order_status)s)" -msgstr "طلب رقم %(order_id)s\n(الحالة: %(order_status)s)" +msgstr "" +"طلب رقم %(order_id)s\n" +"(الحالة: %(order_status)s)" #: templates/plans/order_detail.html:28 msgid "Printable documents" @@ -5642,8 +5699,8 @@ msgid "" " " msgstr "" "\n" -" انتهت صلاحية هذا الطلب. سيتم قبول أي دفعة سابقة، لكن لا يمكن " -"بدء دفعة جديدة.\n" +" انتهت صلاحية هذا الطلب. سيتم قبول أي دفعة سابقة، لكن لا " +"يمكن بدء دفعة جديدة.\n" " يرجى إنشاء طلب جديد إذا لزم الأمر.\n" " " @@ -5655,7 +5712,8 @@ msgid "" " " msgstr "" "\n" -" لا يمكن معالجة هذا الطلب لأنه غير صالح. يرجى الاتصال بخدمة العملاء.\n" +" لا يمكن معالجة هذا الطلب لأنه غير صالح. يرجى الاتصال بخدمة " +"العملاء.\n" " " #: templates/plans/order_detail_table.html:9 @@ -5734,7 +5792,7 @@ msgstr "لا يوجد حد" #: templates/plans/plan_table.html:45 #: templates/subscriptions/subscription_plan.html:7 msgid "Pricing" -msgstr "التسعير" +msgstr "السعر" #: templates/plans/plan_table.html:53 templates/plans/plan_table.html:90 #: venv/lib/python3.11/site-packages/django/forms/widgets.py:463 @@ -5753,6 +5811,8 @@ msgstr "مجاني" msgid "no expiry" msgstr "لا يوجد انتهاء" +#: templates/plans/plan_table.html:100 +#, python-format msgid "" "\n" " This plan is not available anymore and " @@ -5763,9 +5823,10 @@ msgid "" " " msgstr "" "\n" -" هذه الخطة لم تعد متاحة ولا يمكن تمديدها.
\n" -" يجب عليك ترقية حسابك إلى إحدى " -"الخطط المتاحة حاليًا.\n" +" هذه الخطة لم تعد متاحة ولا يمكن تمديدها." +"
\n" +" يجب عليك ترقية حسابك إلى إحدى الخطط المتاحة حاليًا.\n" " " #: templates/plans/plan_table.html:112 @@ -6081,7 +6142,11 @@ msgid "" "available. The backup tokens below can be used for login verification. If " "you've used up all your backup tokens, you can generate a new set of backup " "tokens. Only the backup tokens shown below will be valid." -msgstr "يمكن استخدام الرموز الاحتياطية عندما لا تكون أرقام هاتفك الأساسية والاحتياطية متاحة. يمكن استخدام الرموز الاحتياطية أدناه للتحقق عند تسجيل الدخول. إذا استهلكت جميع الرموز الاحتياطية، يمكنك إنشاء مجموعة جديدة. فقط الرموز الاحتياطية المعروضة أدناه ستكون صالحة." +msgstr "" +"يمكن استخدام الرموز الاحتياطية عندما لا تكون أرقام هاتفك الأساسية " +"والاحتياطية متاحة. يمكن استخدام الرموز الاحتياطية أدناه للتحقق عند تسجيل " +"الدخول. إذا استهلكت جميع الرموز الاحتياطية، يمكنك إنشاء مجموعة جديدة. فقط " +"الرموز الاحتياطية المعروضة أدناه ستكون صالحة." #: templates/two_factor/core/backup_tokens.html:18 msgid "Print these tokens and keep them somewhere safe." @@ -6116,7 +6181,10 @@ msgid "" "Use this form for entering backup tokens for logging in. These tokens have " "been generated for you to print and keep safe. Please enter one of these " "backup tokens to login to your account." -msgstr "استخدم هذا النموذج لإدخال الرموز الاحتياطية لتسجيل الدخول. تم إنشاء هذه الرموز لك لطبعها والاحتفاظ بها في مكان آمن. يرجى إدخال أحد هذه الرموز الاحتياطية لتسجيل الدخول إلى حسابك." +msgstr "" +"استخدم هذا النموذج لإدخال الرموز الاحتياطية لتسجيل الدخول. تم إنشاء هذه " +"الرموز لك لطبعها والاحتفاظ بها في مكان آمن. يرجى إدخال أحد هذه الرموز " +"الاحتياطية لتسجيل الدخول إلى حسابك." #: templates/two_factor/core/login.html:31 msgid "Or, alternatively, use one of your other authentication methods:" @@ -6139,14 +6207,18 @@ msgid "" "The page you requested, enforces users to verify using two-factor " "authentication for security reasons. You need to enable these security " "features in order to access this page." -msgstr "الصفحة التي طلبتها تتطلب من المستخدمين التحقق باستخدام المصادقة الثنائية لأسباب أمنية. تحتاج إلى تمكين هذه الميزات الأمنية للوصول إلى هذه الصفحة." +msgstr "" +"الصفحة التي طلبتها تتطلب من المستخدمين التحقق باستخدام المصادقة الثنائية " +"لأسباب أمنية. تحتاج إلى تمكين هذه الميزات الأمنية للوصول إلى هذه الصفحة." #: templates/two_factor/core/otp_required.html:11 #: templates/two_factor/profile/profile.html:53 msgid "" "Two-factor authentication is not enabled for your account. Enable two-factor " "authentication for enhanced account security." -msgstr "المصادقة الثنائية غير مفعلة لحسابك. قم بتمكين المصادقة الثنائية لتعزيز أمان الحساب." +msgstr "" +"المصادقة الثنائية غير مفعلة لحسابك. قم بتمكين المصادقة الثنائية لتعزيز أمان " +"الحساب." #: templates/two_factor/core/otp_required.html:16 #: venv/lib/python3.11/site-packages/appointment/templates/error_pages/403_forbidden.html:110 @@ -6169,7 +6241,9 @@ msgstr "إضافة هاتف احتياطي" msgid "" "You'll be adding a backup phone number to your account. This number will be " "used if your primary method of registration is not available." -msgstr "ستقوم بإضافة رقم هاتف احتياطي إلى حسابك. سيتم استخدام هذا الرقم إذا لم يكن خيار التسجيل الأساسي متاحًا." +msgstr "" +"ستقوم بإضافة رقم هاتف احتياطي إلى حسابك. سيتم استخدام هذا الرقم إذا لم يكن " +"خيار التسجيل الأساسي متاحًا." #: templates/two_factor/core/phone_register.html:12 msgid "" @@ -6181,7 +6255,9 @@ msgstr "لقد أرسلنا رمزًا إلى رقم هاتفك. يرجى إدخ msgid "" "You are about to take your account security to the next level. Follow the " "steps in this wizard to enable two-factor authentication." -msgstr "أنت على وشك رفع أمان حسابك إلى مستوى أعلى. اتبع الخطوات في هذا المعالج لتمكين المصادقة الثنائية." +msgstr "" +"أنت على وشك رفع أمان حسابك إلى مستوى أعلى. اتبع الخطوات في هذا المعالج " +"لتمكين المصادقة الثنائية." #: templates/two_factor/core/setup.html:15 msgid "Please select which authentication method you would like to use." @@ -6191,13 +6267,17 @@ msgstr "يرجى اختيار طريقة المصادقة التي ترغب في msgid "" "To start using a token generator, please use your smartphone to scan the QR " "code below. For example, use Google Authenticator." -msgstr "لبدء استخدام مولد الرموز، يرجى استخدام هاتفك الذكي لمسح رمز QR أدناه. على سبيل المثال، استخدم تطبيق Google Authenticator." +msgstr "" +"لبدء استخدام مولد الرموز، يرجى استخدام هاتفك الذكي لمسح رمز QR أدناه. على " +"سبيل المثال، استخدم تطبيق Google Authenticator." #: templates/two_factor/core/setup.html:22 msgid "" "Alternatively you can use the following secret to setup TOTP in your " "authenticator or password manager manually." -msgstr "بدلاً من ذلك، يمكنك استخدام السر التالي لإعداد TOTP في تطبيق المصادقة أو مدير كلمات المرور الخاص بك يدويًا." +msgstr "" +"بدلاً من ذلك، يمكنك استخدام السر التالي لإعداد TOTP في تطبيق المصادقة أو مدير " +"كلمات المرور الخاص بك يدويًا." #: templates/two_factor/core/setup.html:24 msgid "TOTP Secret:" @@ -6211,13 +6291,17 @@ msgstr "ثم، أدخل الرمز الذي تم إنشاؤه بواسطة ال msgid "" "Please enter the phone number you wish to receive the text messages on. This " "number will be validated in the next step." -msgstr "يرجى إدخال رقم الهاتف الذي ترغب في تلقي الرسائل النصية عليه. سيتم التحقق من هذا الرقم في الخطوة التالية." +msgstr "" +"يرجى إدخال رقم الهاتف الذي ترغب في تلقي الرسائل النصية عليه. سيتم التحقق من " +"هذا الرقم في الخطوة التالية." #: templates/two_factor/core/setup.html:32 msgid "" "Please enter the phone number you wish to be called on. This number will be " "validated in the next step." -msgstr "يرجى إدخال رقم الهاتف الذي ترغب في تلقي المكالمات عليه. سيتم التحقق من هذا الرقم في الخطوة التالية." +msgstr "" +"يرجى إدخال رقم الهاتف الذي ترغب في تلقي المكالمات عليه. سيتم التحقق من هذا " +"الرقم في الخطوة التالية." #: templates/two_factor/core/setup.html:37 msgid "We are calling your phone right now, please enter the digits you hear." @@ -6233,13 +6317,18 @@ msgid "" "go back and verify that you entered your information correctly, try again, " "or use a different authentication method instead. If the issue persists, " "contact the site administrator." -msgstr "واجهنا مشكلة في طريقة المصادقة التي اخترتها. يرجى العودة والتحقق من صحة المعلومات التي أدخلتها، ثم حاول مرة أخرى، أو استخدم طريقة مصادقة مختلفة. إذا استمرت المشكلة، يرجى الاتصال بمسؤول الموقع." +msgstr "" +"واجهنا مشكلة في طريقة المصادقة التي اخترتها. يرجى العودة والتحقق من صحة " +"المعلومات التي أدخلتها، ثم حاول مرة أخرى، أو استخدم طريقة مصادقة مختلفة. إذا " +"استمرت المشكلة، يرجى الاتصال بمسؤول الموقع." #: templates/two_factor/core/setup.html:51 msgid "" "To identify and verify your YubiKey, please insert a token in the field " "below. Your YubiKey will be linked to your account." -msgstr "لتحديد والتحقق من YubiKey الخاص بك، يرجى إدخال رمز في الحقل أدناه. سيتم ربط YubiKey بحسابك." +msgstr "" +"لتحديد والتحقق من YubiKey الخاص بك، يرجى إدخال رمز في الحقل أدناه. سيتم ربط " +"YubiKey بحسابك." #: templates/two_factor/core/setup_complete.html:7 msgid "Congratulations, you've successfully enabled two-factor authentication." @@ -6249,7 +6338,9 @@ msgstr "تهانينا، لقد قمت بتمكين المصادقة الثنا msgid "" "However, it might happen that you don't have access to your primary token " "device. To enable account recovery, add a phone number." -msgstr "ومع ذلك، قد يحدث أنك لا تستطيع الوصول إلى جهاز الرمز الأساسي. لتمكين استعادة الحساب، أضف رقم هاتف." +msgstr "" +"ومع ذلك، قد يحدث أنك لا تستطيع الوصول إلى جهاز الرمز الأساسي. لتمكين استعادة " +"الحساب، أضف رقم هاتف." #: templates/two_factor/core/setup_complete.html:21 #: templates/two_factor/profile/profile.html:31 @@ -6264,7 +6355,9 @@ msgstr "تعطيل المصادقة الثنائية" msgid "" "You are about to disable two-factor authentication. This weakens your " "account security, are you sure?" -msgstr "أنت على وشك تعطيل المصادقة الثنائية. سيؤدي هذا إلى تقليل أمان حسابك، هل أنت متأكد؟" +msgstr "" +"أنت على وشك تعطيل المصادقة الثنائية. سيؤدي هذا إلى تقليل أمان حسابك، هل أنت " +"متأكد؟" #: templates/two_factor/profile/disable.html:12 msgid "Disable" @@ -6287,7 +6380,9 @@ msgstr "أرقام الهواتف الاحتياطية" msgid "" "If your primary method is not available, we are able to send backup tokens " "to the phone numbers listed below." -msgstr "إذا لم تكن الطريقة الأساسية متاحة، يمكننا إرسال الرموز الاحتياطية إلى أرقام الهواتف المدرجة أدناه." +msgstr "" +"إذا لم تكن الطريقة الأساسية متاحة، يمكننا إرسال الرموز الاحتياطية إلى أرقام " +"الهواتف المدرجة أدناه." #: templates/two_factor/profile/profile.html:24 msgid "Unregister" @@ -6297,7 +6392,9 @@ msgstr "إلغاء التسجيل" msgid "" "If you don't have any device with you, you can access your account using " "backup tokens." -msgstr "إذا لم يكن لديك أي جهاز معك، يمكنك الوصول إلى حسابك باستخدام الرموز الاحتياطية." +msgstr "" +"إذا لم يكن لديك أي جهاز معك، يمكنك الوصول إلى حسابك باستخدام الرموز " +"الاحتياطية." #: templates/two_factor/profile/profile.html:38 #, python-format @@ -6323,7 +6420,8 @@ msgstr "تعطيل المصادقة الثنائية" msgid "" "However we strongly discourage you to do so, you can also disable two-factor " "authentication for your account." -msgstr "ومع ذلك، لا ننصحك بفعل ذلك، ولكن يمكنك أيضًا تعطيل المصادقة الثنائية لحسابك." +msgstr "" +"ومع ذلك، لا ننصحك بفعل ذلك، ولكن يمكنك أيضًا تعطيل المصادقة الثنائية لحسابك." #: templates/users/user_detail.html:20 msgid "Are you sure you want to delete this user?" @@ -6393,6 +6491,74 @@ msgstr "عرض المورد" msgid "Vendor Details" msgstr "تفاصيل المورد" +#: templates/welcome.html:67 +msgid "Home" +msgstr "الرئيسية" + +#: templates/welcome.html:70 templates/welcome.html:115 +msgid "Features" +msgstr "الميزات" + +#: templates/welcome.html:94 +msgid "Streamline" +msgstr "تسهيل" + +#: templates/welcome.html:94 +msgid "Your Car Dealership Operations" +msgstr "عمليات معرض السيارات الخاص بك" + +#: templates/welcome.html:96 +msgid "" +"Manage inventory, sales, transfers, and accounting seamlessly with Haikal." +msgstr "قم بإدارة المخزون والمبيعات والتحويلات والمحاسبة بسلاسة مع هيكل." + +#: templates/welcome.html:97 templates/welcome.html:153 +msgid "Get Started" +msgstr "ابدأ الآن" + +#: templates/welcome.html:98 +msgid "Learn More" +msgstr "تعرف على المزيد" + +#: templates/welcome.html:116 +msgid "Empowering Your Dealership with Precision and Efficiency" +msgstr "تمكين معرضك بالدقة والكفاءة" + +#: templates/welcome.html:121 +msgid "Inventory Management" +msgstr "إدارة المخزون" + +#: templates/welcome.html:122 +msgid "" +"Effortlessly manage your car inventory with real-time updates and intuitive " +"tools." +msgstr "قم بإدارة مخزون السيارات بسهولة مع التحديثات الفورية والأدوات البسيطة." + +#: templates/welcome.html:126 +msgid "Seamless Accounting" +msgstr "محاسبة سلسة" + +#: templates/welcome.html:127 +msgid "Integrated double-entry accounting tailored for car dealers." +msgstr "نظام محاسبة مزدوج القيد مدمج ومصمم خصيصًا لتجار السيارات." + +#: templates/welcome.html:131 +msgid "Advanced Analytics" +msgstr "تحليلات متقدمة" + +#: templates/welcome.html:132 +msgid "Gain insights and make data-driven decisions for your business." +msgstr "احصل على رؤى دقيقة واتخذ قرارات مستندة إلى البيانات لنشاطك التجاري." + +#: templates/welcome.html:141 +msgid "Choose the Plan that Fits Your Business" +msgstr "اختر الخطة التي تناسب عملك" + +#: templates/welcome.html:142 +msgid "" +"Flexible pricing plans designed to meet the unique needs of every dealership." +msgstr "خطط تسعير مرنة مصممة لتلبية احتياجات كل معرض سيارات." + #: venv/lib/python3.11/site-packages/alabaster/layout.html:99 msgid "Page source" msgstr "مصدر الصفحة" @@ -7094,11 +7260,6 @@ msgstr "تم إنشاء حساب لك." msgid "Email verified successfully." msgstr "تم التحقق من البريد الإلكتروني بنجاح." -#: venv/lib/python3.11/site-packages/appointment/views.py:426 -#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1915 -msgid "Email address" -msgstr "عنوان البريد الإلكتروني" - #: venv/lib/python3.11/site-packages/appointment/views.py:429 msgid "Username" msgstr "اسم المستخدم" @@ -11857,3 +12018,7 @@ msgstr "س" msgid "y" msgstr "ص" +#, fuzzy +#~| msgid "Didn’t receive the code" +#~ msgid "Didn’t receive the code?" +#~ msgstr "لم تستلم الرمز؟" diff --git a/requirements.txt b/requirements.txt index 93726979..7e81373b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -57,7 +57,6 @@ django-next-url-mixin==0.4.0 django-nine==0.2.7 django-nonefield==0.4 django-ordered-model==3.7.4 -django-otp==1.5.4 django-phonenumber-field==8.0.0 django-picklefield==3.2 django-plans==1.2.0 @@ -70,7 +69,6 @@ django-sms==0.7.0 django-sslserver==0.22 django-tables2==2.7.5 django-treebeard==4.7.1 -django-two-factor-auth==1.17.0 django-view-breadcrumbs==2.5.1 djangocms-admin-style==3.3.1 djangorestframework==3.15.2 diff --git a/static/.DS_Store b/static/.DS_Store index 945a5563..d36bb7e2 100644 Binary files a/static/.DS_Store and b/static/.DS_Store differ diff --git a/static/images/.DS_Store b/static/images/.DS_Store index c51d734d..1b9636f9 100644 Binary files a/static/images/.DS_Store and b/static/images/.DS_Store differ diff --git a/static/images/icons/.DS_Store b/static/images/icons/.DS_Store new file mode 100644 index 00000000..37bc4ddc Binary files /dev/null and b/static/images/icons/.DS_Store differ diff --git a/static/images/icons/114292_report.svg b/static/images/icons/114292_report.svg new file mode 100644 index 00000000..828d1782 --- /dev/null +++ b/static/images/icons/114292_report.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons/148542_list.svg b/static/images/icons/148542_list.svg new file mode 100644 index 00000000..a0c1dfbc --- /dev/null +++ b/static/images/icons/148542_list.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons/2281_financial-app.svg b/static/images/icons/2281_financial-app.svg new file mode 100644 index 00000000..f4dbb879 --- /dev/null +++ b/static/images/icons/2281_financial-app.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/images/icons/35420_store.svg b/static/images/icons/35420_store.svg new file mode 100644 index 00000000..c547b2d4 --- /dev/null +++ b/static/images/icons/35420_store.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/account/email.html b/templates/account/email.html index 6e383f7b..4d2682e8 100644 --- a/templates/account/email.html +++ b/templates/account/email.html @@ -1,79 +1,76 @@ -{% extends "account/base_manage_email.html" %} -{% load allauth i18n %} +{% extends "base.html" %} +{% load crispy_forms_filters %} +{% load allauth i18n static %} {% block head_title %} {% trans "Email Addresses" %} {% endblock head_title %} {% block content %} - {% element h1 %} - {% trans "Email Addresses" %} - {% endelement %} +
+
+
+ +
+
+ {% trans 'home' %} + {% trans 'home' %} +
+
+
+
+

{% trans "Email Addresses" %}

+
+ {% if emailaddresses %} - {% element p %} +

{% trans 'The following email addresses are associated with your account:' %} - {% endelement %} +

{% url 'account_email' as email_url %} - {% element form form=form action=email_url method="post" tags="email,list" %} - {% slot body %} + {% else %} {% include "account/snippets/warn_no_email.html" %} {% endif %} {% if can_add_email %} - {% element h2 %} +

{% trans "Add Email Address" %} - {% endelement %} +

+ {% url 'account_email' as action_url %} - {% element form form=form method="post" action=action_url tags="email,add" %} - {% slot body %} + {% endif %} -{% endblock content %} -{% block extra_body %} + -{% endblock extra_body %} +
+
+
+{% endblock content %} diff --git a/templates/account/email_confirm.html b/templates/account/email_confirm.html index d03e4a26..5e2c1d66 100644 --- a/templates/account/email_confirm.html +++ b/templates/account/email_confirm.html @@ -1,39 +1,53 @@ -{% extends "account/base_entrance.html" %} -{% load i18n %} +{% extends "base.html" %} +{% load i18n static %} {% load account %} {% load allauth %} {% block head_title %} {% trans "Confirm Email Address" %} {% endblock head_title %} {% block content %} - {% element h1 %} - {% trans "Confirm Email Address" %} - {% endelement %} +
+
+
+ +
+
+ {% trans 'home' %} + {% trans 'home' %} +
+
+
+
+

{% trans "Confirm Email Address" %}

+
+ {% if confirmation %} {% user_display confirmation.email_address.user as user_display %} {% if can_confirm %} - {% element p %} +

{% blocktrans with confirmation.email_address.email as email %}Please confirm that {{ email }} is an email address for user {{ user_display }}.{% endblocktrans %} - {% endelement %} +

{% url 'account_confirm_email' confirmation.key as action_url %} - {% element form method="post" action=action_url %} - {% slot actions %} - {% csrf_token %} +
+ {% csrf_token %} {{ redirect_field }} - {% element button type="submit" %} - {% trans 'Confirm' %} - {% endelement %} - {% endslot %} - {% endelement %} + +
+ {% else %} - {% element p %} +

{% blocktrans %}Unable to confirm {{ email }} because it is already confirmed by a different account.{% endblocktrans %} - {% endelement %} +

{% endif %} {% else %} {% url 'account_email' as email_url %} - {% element p %} +

{% blocktrans %}This email confirmation link expired or is invalid. Please issue a new email confirmation request.{% endblocktrans %} - {% endelement %} +

{% endif %} +
+
+
{% endblock content %} diff --git a/templates/account/login.html b/templates/account/login.html index bd779237..14052dcf 100644 --- a/templates/account/login.html +++ b/templates/account/login.html @@ -19,9 +19,9 @@

{% trans "Sign In" %}

- {% if not SOCIALACCOUNT_ONLY %} + {% if not SOCIALACCOUNT_ONLY %} -
+
{% csrf_token %}
diff --git a/templates/account/otp_verification.html b/templates/account/otp_verification.html index 3b247cf7..3f4f3f7a 100644 --- a/templates/account/otp_verification.html +++ b/templates/account/otp_verification.html @@ -28,7 +28,7 @@ - {{ _("Didn’t receive the code?") }} + {{ _("Didn’t receive the code") }}
diff --git a/templates/account/signup-wizard.html b/templates/account/signup-wizard.html index 2c2fbfad..43b73137 100644 --- a/templates/account/signup-wizard.html +++ b/templates/account/signup-wizard.html @@ -14,23 +14,23 @@

{% trans 'Sign Up' %}

-

{% trans 'Create your account today' %}

+

{% trans 'Create your account today' %}

diff --git a/templates/account/verfied_email_required.html b/templates/account/verfied_email_required.html index be6e0a82..af072af3 100644 --- a/templates/account/verfied_email_required.html +++ b/templates/account/verfied_email_required.html @@ -1,14 +1,29 @@ {% extends "base.html" %} -{% load i18n %} +{% load i18n static%} {% load allauth %} {% block head_title %} {% trans "Verify Your Email Address" %} {% endblock head_title %} + {% block content %} - {% element h1 %} +
+
+
+ +
+ {% trans 'home' %} + {% trans 'home' %} +
+
+

{% trans "Verify Your Email Address" %} - {% endelement %} - {% element p %} +

+ + +

{% blocktrans %}We have sent an email to you for verification. Follow the link provided to finalize the signup process. If you do not see the verification email in your main inbox, check your spam folder. Please contact us if you do not receive the verification email within a few minutes.{% endblocktrans %} - {% endelement %} +

+
+
+
{% endblock content %} diff --git a/templates/account/verification_sent.html b/templates/account/verification_sent.html index 23973679..748e40f6 100644 --- a/templates/account/verification_sent.html +++ b/templates/account/verification_sent.html @@ -1,14 +1,27 @@ -{% extends "account/base_entrance.html" %} -{% load i18n %} +{% extends "base.html" %} +{% load i18n static %} {% load allauth %} {% block head_title %} {% trans "Verify Your Email Address" %} {% endblock head_title %} {% block content %} - {% element h1 %} +
+
+
+ +
+ {% trans 'home' %} + {% trans 'home' %} +
+
+

{% trans "Verify Your Email Address" %} - {% endelement %} - {% element p %} +

+ +

{% blocktrans %}We have sent an email to you for verification. Follow the link provided to finalize the signup process. If you do not see the verification email in your main inbox, check your spam folder. Please contact us if you do not receive the verification email within a few minutes.{% endblocktrans %} - {% endelement %} +

+
+
+
{% endblock content %} diff --git a/templates/account/verified_email_required.html b/templates/account/verified_email_required.html index 65d7d1ff..cf2c9548 100644 --- a/templates/account/verified_email_required.html +++ b/templates/account/verified_email_required.html @@ -1,25 +1,38 @@ -{% extends "account/base_manage.html" %} -{% load i18n %} +{% extends "base.html" %} +{% load i18n static%} {% load allauth %} {% block head_title %} {% trans "Verify Your Email Address" %} {% endblock head_title %} {% block content %} - {% element h1 %} +
+
+
+ +
+ {% trans 'home' %} + {% trans 'home' %} +
+
+

{% trans "Verify Your Email Address" %} - {% endelement %} +

+ {% url 'account_email' as email_url %} - {% element p %} +

{% blocktrans %}This part of the site requires us to verify that you are who you claim to be. For this purpose, we require that you verify ownership of your email address. {% endblocktrans %} - {% endelement %} - {% element p %} +

+

{% blocktrans %}We have sent an email to you for verification. Please click on the link inside that email. If you do not see the verification email in your main inbox, check your spam folder. Otherwise contact us if you do not receive it within a few minutes.{% endblocktrans %} - {% endelement %} - {% element p %} +

+

{% blocktrans %}Note: you can still change your email address.{% endblocktrans %} - {% endelement %} +

+
+
+
{% endblock content %} diff --git a/templates/welcome.html b/templates/welcome.html index be768f82..ca5d2284 100644 --- a/templates/welcome.html +++ b/templates/welcome.html @@ -84,17 +84,27 @@
-
+

- {% trans 'Streamline' %}{% trans 'Your Car Dealership Operations' %} + {% trans 'Streamline' %} {% trans 'Your Car Dealership Operations' %}

{% trans 'Manage inventory, sales, transfers, and accounting seamlessly with Haikal.' %}

{% trans 'Get Started' %} - {% trans 'Learn More' %} -
- +
@@ -107,17 +117,17 @@
- Inventory Management + Inventory Management
{% trans 'Inventory Management' %}

{% trans 'Effortlessly manage your car inventory with real-time updates and intuitive tools.' %}

- Seamless Accounting + Seamless Accounting
{% trans 'Seamless Accounting' %}

{% trans 'Integrated double-entry accounting tailored for car dealers.' %}

- Advanced Analytics + Advanced Analytics
{% trans 'Advanced Analytics' %}

{% trans 'Gain insights and make data-driven decisions for your business.' %}

@@ -131,36 +141,20 @@

{% trans 'Choose the Plan that Fits Your Business' %}

{% trans 'Flexible pricing plans designed to meet the unique needs of every dealership.' %}

+ {% for plan in plans %}
+
+
-
{% trans 'Basic' %}
-

{% trans 'Essential tools to get your dealership started.' %}

-

$29/month

- {% trans 'Get Started' %} -
-
-
-
-
-
-
{% trans 'Pro' %}
-

{% trans 'Advanced features for growing dealerships.' %}

-

$59/month

- {% trans 'Get Started' %} -
-
-
-
-
-
-
{% trans 'Enterprise' %}
-

{% trans 'Comprehensive solutions for large-scale operations.' %}

-

$99/month

+
{{plan.name }}
+

{{ plan.description }}

+

{{ plan.price }}

{% trans 'Get Started' %}
+ {% endfor %}