Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend

This commit is contained in:
KhanFaheed 2025-06-25 20:14:01 +03:00
commit 630a9d95f7
27 changed files with 203 additions and 189 deletions

View File

@ -50,12 +50,12 @@ urlpatterns = [
# path('tasks/<int:task_id>/detail/', views.task_detail, name='task_detail'),
# Dashboards
# path("user/<int:pk>/settings/", views.UserSettingsView.as_view(), name="user_settings"),
path("pricing/", views.pricing_page, name="pricing_page"),
path("submit_plan/", views.submit_plan, name="submit_plan"),
path("payment-callback/", views.payment_callback, name="payment_callback"),
path("<slug:dealer_slug>/pricing/", views.pricing_page, name="pricing_page"),
path("<slug:dealer_slug>/submit_plan/", views.submit_plan, name="submit_plan"),
path("<slug:dealer_slug>/payment-callback/", views.payment_callback, name="payment_callback"),
#
path(
"dealers/activity/",
"<slug:dealer_slug>/dealers/activity/",
views.UserActivityLogListView.as_view(),
name="dealer_activity",
),
@ -64,7 +64,7 @@ urlpatterns = [
views.DealerSettingsView,
name="dealer_settings",
),
path("dealers/assign-car-makes/", views.assign_car_makes, name="assign_car_makes"),
path("<slug:dealer_slug>/dealers/assign-car-makes/", views.assign_car_makes, name="assign_car_makes"),
path(
"dashboards/manager/",
views.ManagerDashboard.as_view(),
@ -76,7 +76,7 @@ urlpatterns = [
path("export/format/", TableExport, name="export"),
# Dealer URLs
path(
"dealers/<slug:slug>/", views.DealerDetailView.as_view(), name="dealer_detail"
"<slug:slug>/dealers/", views.DealerDetailView.as_view(), name="dealer_detail"
),
path(
"dealers/<slug:slug>/update/",
@ -267,21 +267,25 @@ urlpatterns = [
name="mark_notification_as_read",
),
path("crm/calender/", views.EmployeeCalendarView.as_view(), name="calendar_list"),
#######################################################
# Vendor URLs
path("vendors/create/", views.VendorCreateView.as_view(), name="vendor_create"),
path("vendors", views.VendorListView.as_view(), name="vendor_list"),
path("vendors/<slug:slug>/", views.vendorDetailView, name="vendor_detail"),
#######################################################
path("<slug:dealer_slug>/vendors/create/", views.VendorCreateView.as_view(), name="vendor_create"),
path("<slug:dealer_slug>/vendors", views.VendorListView.as_view(), name="vendor_list"),
path("<slug:dealer_slug>/vendors/<slug:slug>/", views.vendorDetailView, name="vendor_detail"),
path(
"vendors/<slug:slug>/update/",
"<slug:dealer_slug>/vendors/<slug:slug>/update/",
views.VendorUpdateView.as_view(),
name="vendor_update",
),
path(
"vendors/<slug:slug>/delete/",
"<slug:dealer_slug>/vendors/<slug:slug>/delete/",
views.delete_vendor,
name="vendor_delete",
),
#######################################################
# Car URLs
#######################################################
path("<slug:dealer_slug>/cars/upload_cars/", views.upload_cars, name="upload_cars"),
path(
"<slug:dealer_slug>/cars/<uuid:pk>/upload_cars/",
@ -477,24 +481,24 @@ urlpatterns = [
# name="payment_create",
# ),
# Users URLs
path("user/<slug:dealer_slug>/", views.UserListView.as_view(), name="user_list"),
path("user/create/", views.UserCreateView.as_view(), name="user_create"),
path("user/<slug:slug>/", views.UserDetailView.as_view(), name="user_detail"),
path("user/<slug:slug>/groups/", views.UserGroupView, name="user_groups"),
path("<slug:dealer_slug>/user/", views.UserListView.as_view(), name="user_list"),
path("<slug:dealer_slug>/user/create/", views.UserCreateView.as_view(), name="user_create"),
path("<slug:dealer_slug>/user/<slug:slug>/", views.UserDetailView.as_view(), name="user_detail"),
path("<slug:dealer_slug>/user/<slug:slug>/groups/", views.UserGroupView, name="user_groups"),
path(
"user/<slug:slug>/update/", views.UserUpdateView.as_view(), name="user_update"
"<slug:dealer_slug>/user/<slug:slug>/update/", views.UserUpdateView.as_view(), name="user_update"
),
path("user/<slug:slug>/confirm/", views.UserDeleteview, name="user_delete"),
path("<slug:dealer_slug>/user/<slug:slug>/confirm/", views.UserDeleteview, name="user_delete"),
# Group URLs
path("group/create/", views.GroupCreateView.as_view(), name="group_create"),
path("<slug:dealer_slug>/group/create/", views.GroupCreateView.as_view(), name="group_create"),
path(
"group/<int:pk>/update/", views.GroupUpdateView.as_view(), name="group_update"
"<slug:dealer_slug>/group/<int:pk>/update/", views.GroupUpdateView.as_view(), name="group_update"
),
path("group/<int:pk>/", views.GroupDetailView.as_view(), name="group_detail"),
path("group/", views.GroupListView.as_view(), name="group_list"),
path("group/<int:pk>/confirm/", views.GroupDeleteview, name="group_delete"),
path("<slug:dealer_slug>/group/<int:pk>/", views.GroupDetailView.as_view(), name="group_detail"),
path("<slug:dealer_slug>/group/", views.GroupListView.as_view(), name="group_list"),
path("<slug:dealer_slug>/group/<int:pk>/confirm/", views.GroupDeleteview, name="group_delete"),
path(
"group/<int:pk>/permission/", views.GroupPermissionView, name="group_permission"
"<slug:dealer_slug>/group/<int:pk>/permission/", views.GroupPermissionView, name="group_permission"
),
# Organization URLs
path(
@ -546,34 +550,35 @@ urlpatterns = [
views.RepresentativeDeleteView.as_view(),
name="representative_delete",
),
# Ledger URLS
#####################################################################
# Ledger
path("ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"),
#####################################################################
path("<slug:dealer_slug>/ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"),
path(
"ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"
"<slug:dealer_slug>/ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"
),
path(
"ledgers/<slug:entity_slug>/detail/<uuid:pk>/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/detail/<uuid:pk>/",
views.LedgerModelDetailView.as_view(),
name="ledger_detail",
),
path(
"ledgers/<slug:entity_slug>/lock_all_journals/<uuid:pk>/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/lock_all_journals/<uuid:pk>/",
views.ledger_lock_all_journals,
name="lock_all_journals",
),
path(
"ledgers/<slug:entity_slug>/unlock_all_journals/<uuid:pk>/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/unlock_all_journals/<uuid:pk>/",
views.ledger_unlock_all_journals,
name="unlock_all_journals",
),
path(
"ledgers/<slug:entity_slug>/post_all_journals/<uuid:pk>/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/post_all_journals/<uuid:pk>/",
views.ledger_post_all_journals,
name="post_all_journals",
),
path(
"ledgers/<slug:entity_slug>/unpost_all_journals/<uuid:pk>/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/unpost_all_journals/<uuid:pk>/",
views.ledger_unpost_all_journals,
name="unpost_all_journals",
),
@ -581,77 +586,81 @@ urlpatterns = [
# "ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"
# ),
path(
"journalentries/<uuid:pk>/list/",
"<slug:dealer_slug>/journalentries/<uuid:pk>/list/",
views.JournalEntryListView.as_view(),
name="journalentry_list",
),
path(
"journalentries/<uuid:pk>/create/",
"<slug:dealer_slug>/journalentries/<uuid:pk>/create/",
views.JournalEntryCreateView.as_view(),
name="journalentry_create",
),
path(
"journalentries/<uuid:pk>/delete/",
"<slug:dealer_slug>/journalentries/<uuid:pk>/delete/",
views.JournalEntryDeleteView,
name="journalentry_delete",
),
path(
"journalentries/<uuid:pk>/transactions/",
"<slug:dealer_slug>/journalentries/<uuid:pk>/transactions/",
views.JournalEntryTransactionsView,
name="journalentry_transactions",
),
path(
"journalentries/<slug:entity_slug>/<uuid:ledger_pk>/detail/<uuid:je_pk>/txs/",
"<slug:dealer_slug>/journalentries/<slug:entity_slug>/<uuid:ledger_pk>/detail/<uuid:je_pk>/txs/",
views.JournalEntryModelTXSDetailView.as_view(),
name="journalentry_txs",
),
##############################################################
# ledger actions
##############################################################
path(
"ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/post/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/post/",
views.LedgerModelModelActionView.as_view(action_name="post"),
name="ledger-action-post",
),
path(
"ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/post-journal-entries/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/post-journal-entries/",
views.LedgerModelModelActionView.as_view(action_name="post_journal_entries"),
name="ledger-action-post-journal-entries",
),
path(
"ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/unpost/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/unpost/",
views.LedgerModelModelActionView.as_view(action_name="unpost"),
name="ledger-action-unpost",
),
path(
"ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/lock/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/lock/",
views.LedgerModelModelActionView.as_view(action_name="lock"),
name="ledger-action-lock",
),
path(
"ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/lock-journal-entries/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/lock-journal-entries/",
views.LedgerModelModelActionView.as_view(action_name="lock_journal_entries"),
name="ledger-action-lock-journal-entries",
),
path(
"ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/unlock/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/unlock/",
views.LedgerModelModelActionView.as_view(action_name="unlock"),
name="ledger-action-unlock",
),
path(
"ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/hide/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/hide/",
views.LedgerModelModelActionView.as_view(action_name="hide"),
name="ledger-action-hide",
),
path(
"ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/unhide/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/action/<uuid:ledger_pk>/unhide/",
views.LedgerModelModelActionView.as_view(action_name="unhide"),
name="ledger-action-unhide",
),
path(
"ledgers/<slug:entity_slug>/delete/<uuid:ledger_pk>/",
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/delete/<uuid:ledger_pk>/",
views.LedgerModelDeleteView.as_view(),
name="ledger-delete",
),
##############################################################
# Bank Account
##############################################################
path(
"<slug:dealer_slug>/bank_accounts/",
views.BankAccountListView.as_view(),
@ -833,31 +842,31 @@ urlpatterns = [
# path('sales/journal/<uuid:pk>/create/', views.JournalEntryCreateView.as_view(), name='journal_create'),
# Items
path(
"items/services/", views.ItemServiceListView.as_view(), name="item_service_list"
"<slug:dealer_slug>/items/services/", views.ItemServiceListView.as_view(), name="item_service_list"
),
path(
"items/services/create/",
"<slug:dealer_slug>/items/services/create/",
views.ItemServiceCreateView.as_view(),
name="item_service_create",
),
path(
"items/services/<int:pk>/update/",
"<slug:dealer_slug>/items/services/<int:pk>/update/",
views.ItemServiceUpdateView.as_view(),
name="item_service_update",
),
# Expanese
path(
"items/expeneses/",
"<slug:dealer_slug>/items/expeneses/",
views.ItemExpenseListView.as_view(),
name="item_expense_list",
),
path(
"items/expeneses/create/",
"<slug:dealer_slug>/items/expeneses/create/",
views.ItemExpenseCreateView.as_view(),
name="item_expense_create",
),
path(
"items/expeneses/<uuid:pk>/update/",
"<slug:dealer_slug>/items/expeneses/<uuid:pk>/update/",
views.ItemExpenseUpdateView.as_view(),
name="item_expense_update",
),
@ -1099,20 +1108,20 @@ urlpatterns = [
name="entity-json-pnl",
),
# Admin Management...
path("management/", views.management_view, name="management"),
path("management/user_management/", views.user_management, name="user_management"),
path("<slug:dealer_slug>/management/", views.management_view, name="management"),
path("<slug:dealer_slug>/management/user_management/", views.user_management, name="user_management"),
path(
"management/<str:content_type>/<slug:slug>/activate_account/",
"<slug:dealer_slug>/management/<str:content_type>/<slug:slug>/activate_account/",
views.activate_account,
name="activate_account",
),
path(
"management/<str:content_type>/<slug:slug>/permenant_delete_account/",
"<slug:dealer_slug>/management/<str:content_type>/<slug:slug>/permenant_delete_account/",
views.permenant_delete_account,
name="permenant_delete_account",
),
path(
"management/audit_log_dashboard/",
"<slug:dealer_slug>/management/audit_log_dashboard/",
views.AuditLogDashboardView,
name="audit_log_dashboard",
),

View File

@ -1366,7 +1366,7 @@ def create_user_dealer(email, password, name, arabic_name, phone, crn, vrn, addr
def handle_payment(request, order):
url = "https://api.moyasar.com/v1/payments"
callback_url = request.build_absolute_uri(reverse("payment_callback"))
callback_url = request.build_absolute_uri(reverse("payment_callback", args=[request.dealer.slug]))
if request.user.is_authenticated:
# email = request.user.email

View File

@ -2432,7 +2432,7 @@ class VendorListView(LoginRequiredMixin, ListView):
@login_required
def vendorDetailView(request, slug):
def vendorDetailView(request, dealer_slug,slug):
"""
Fetches and renders the detail view for a specific vendor.
@ -2480,7 +2480,6 @@ class VendorCreateView(
model = models.Vendor
form_class = forms.VendorForm
template_name = "vendors/vendor_form.html"
success_url = reverse_lazy("vendor_list")
success_message = _("Vendor created successfully")
def form_valid(self, form):
@ -2500,7 +2499,8 @@ class VendorCreateView(
form.instance.save()
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("vendor_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]})
class VendorUpdateView(
LoginRequiredMixin,
@ -2531,7 +2531,6 @@ class VendorUpdateView(
model = models.Vendor
form_class = forms.VendorForm
template_name = "vendors/vendor_form.html"
success_url = reverse_lazy("vendor_list")
success_message = _("Vendor updated successfully")
# def get_initial(self):
@ -2553,10 +2552,11 @@ class VendorUpdateView(
# instance.additional_info = additionals
# instance.save()
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("vendor_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]})
@login_required
def delete_vendor(request, slug):
def delete_vendor(request, dealer_slug,slug):
"""
Deletes an existing vendor record from the database.
@ -2576,7 +2576,7 @@ def delete_vendor(request, slug):
vendor.vendor_model.active = False
vendor.save()
messages.success(request, _("Vendor deleted successfully"))
return redirect("vendor_list")
return redirect("vendor_list", dealer_slug=dealer_slug)
# group
@ -3418,23 +3418,23 @@ class BankAccountCreateView(
model = BankAccountModel
form_class = BankAccountCreateForm
template_name = "ledger/bank_accounts/bank_account_form.html"
success_url = reverse_lazy("bank_account_list")
success_message = _("Bank account created successfully")
permission_required = ["inventory.view_carfinance"]
def form_valid(self, form):
dealer = get_user_type(self.request)
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
form.instance.entity_model = dealer.entity
return super().form_valid(form)
def get_form_kwargs(self):
dealer = get_user_type(self.request)
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
entity = dealer.entity
kwargs = super().get_form_kwargs()
kwargs["entity_slug"] = entity.slug
kwargs["user_model"] = entity.admin
return kwargs
def get_success_url(self):
return reverse_lazy("bank_account_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]})
class BankAccountDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
"""
@ -3530,17 +3530,12 @@ def bank_account_delete(request, dealer_slug, pk):
rendering the confirmation template if accessed via GET.
:rtype: HttpResponse
"""
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
get_object_or_404(models.Dealer, slug=dealer_slug)
bank_account = get_object_or_404(BankAccountModel, pk=pk)
if request.method == "POST":
bank_account.delete()
messages.success(request, _("Bank account deleted successfully"))
return redirect("bank_account_list", dealer_slug=dealer_slug)
return render(
request,
"ledger/bank_accounts/bank_account_delete.html",
{"bank_account": bank_account},
)
bank_account.delete()
messages.success(request, _("Bank account deleted successfully"))
return redirect("bank_account_list", dealer_slug=dealer_slug)
# Accounts
@ -6134,7 +6129,6 @@ class ItemServiceCreateView(
model = models.AdditionalServices
form_class = forms.AdditionalServiceForm
template_name = "items/service/service_create.html"
success_url = reverse_lazy("item_service_list")
success_message = _("Service created successfully")
context_object_name = "service"
permission_required = ["django_ledger.add_itemmodel"]
@ -6147,6 +6141,8 @@ class ItemServiceCreateView(
form.instance.price = (form.instance.price * vat.rate) + form.instance.price
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("item_service_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]})
class ItemServiceUpdateView(
LoginRequiredMixin, PermissionRequiredMixin, SuccessMessageMixin, UpdateView
@ -6179,7 +6175,6 @@ class ItemServiceUpdateView(
model = models.AdditionalServices
form_class = forms.AdditionalServiceForm
template_name = "items/service/service_create.html"
success_url = reverse_lazy("item_service_list")
success_message = _("Service updated successfully")
context_object_name = "service"
permission_required = ["django_ledger.change_itemmodel"]
@ -6191,8 +6186,8 @@ class ItemServiceUpdateView(
if form.instance.taxable:
form.instance.price = (form.instance.price * vat.rate) + form.instance.price
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("item_service_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]})
class ItemServiceListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
"""
Handles the listing of additional services for a dealer.
@ -6265,7 +6260,8 @@ class ItemExpenseCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateV
dealer = get_user_type(self.request)
form.instance.entity = dealer.entity
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("item_expense_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]})
class ItemExpenseUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
"""
@ -6305,7 +6301,8 @@ class ItemExpenseUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateV
dealer = get_user_type(self.request)
form.instance.entity = dealer.entity
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("item_expense_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]})
class ItemExpenseListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
"""
@ -8195,7 +8192,7 @@ def schedule_cancel(request,dealer_slug, pk):
@login_required
def assign_car_makes(request):
def assign_car_makes(request,dealer_slug):
"""
Assigns car makes to a dealer.
@ -8212,7 +8209,7 @@ def assign_car_makes(request):
dealer detail page after successful form submission.
:rtype: HttpResponse
"""
dealer = get_user_type(request)
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
if request.method == "POST":
form = forms.DealersMakeForm(request.POST, dealer=dealer)
if form.is_valid():
@ -8371,7 +8368,7 @@ class LedgerModelModelActionView(LedgerModelModelActionViewBase):
"""
def get_redirect_url(self, *args, **kwargs):
return reverse("ledger_list")
return reverse("ledger_list", args=[self.kwargs["dealer_slug"]])
class LedgerModelDeleteView(LedgerModelDeleteViewBase, SuccessMessageMixin):
@ -8394,7 +8391,7 @@ class LedgerModelDeleteView(LedgerModelDeleteViewBase, SuccessMessageMixin):
success_message = "Ledger deleted"
def get_success_url(self):
return reverse("ledger_list")
return reverse("ledger_list", args=[self.kwargs["dealer_slug"]])
# class LedgerModelCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView):
@ -8497,7 +8494,7 @@ class JournalEntryCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView
def get_success_url(self):
ledger = LedgerModel.objects.filter(pk=self.kwargs["pk"]).first()
return reverse("journalentry_list", kwargs={"pk": ledger.pk})
return reverse("journalentry_list", kwargs={"dealer_slug":self.kwargs["dealer_slug"],"pk": ledger.pk})
def JournalEntryDeleteView(request, pk):
@ -8532,7 +8529,7 @@ def JournalEntryDeleteView(request, pk):
)
def JournalEntryTransactionsView(request, pk):
def JournalEntryTransactionsView(request, dealer_slug,pk):
"""
Handles the retrieval and display of journal entry transactions for a specific journal
entry instance. It retrieves the journal entry and its associated transactions, ordering
@ -8546,12 +8543,8 @@ def JournalEntryTransactionsView(request, pk):
its transactions.
:rtype: django.http.HttpResponse
"""
get_object_or_404(models.Dealer,slug=dealer_slug)
journal = JournalEntryModel.objects.filter(pk=pk).first()
# transactions = (
# TransactionModel.objects.filter(journal_entry=journal)
# .order_by("account__code")
# .all()
# )
qs = TransactionModel.objects.filter(journal_entry=journal).all()
transactions = qs.annotate(
debit_credit_sort_order=Case(
@ -8583,7 +8576,7 @@ class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase):
template_name = "ledger/journal_entry/journal_entry_txs.html"
def ledger_lock_all_journals(request, entity_slug, pk):
def ledger_lock_all_journals(request,dealer_slug, entity_slug, pk):
"""
Locks all journals associated with a specific ledger. If the ledger is already locked,
it will notify the user through an error message. Otherwise, it initiates the locking of
@ -8600,17 +8593,18 @@ def ledger_lock_all_journals(request, entity_slug, pk):
:return: HttpResponse redirecting to the journal entry list page of the locked ledger.
:rtype: HttpResponse
"""
get_object_or_404(models.Dealer,slug=dealer_slug)
ledger = LedgerModel.objects.filter(pk=pk).first()
if ledger.is_locked():
messages.error(request, _("Ledger is already locked"))
return redirect("journalentry_list", pk=ledger.pk)
return redirect("journalentry_list",dealer_slug=dealer_slug, pk=ledger.pk)
ledger.lock_journal_entries()
ledger.lock()
ledger.save()
return redirect("journalentry_list", pk=ledger.pk)
return redirect("journalentry_list", dealer_slug=dealer_slug,pk=ledger.pk)
def ledger_unlock_all_journals(request, entity_slug, pk):
def ledger_unlock_all_journals(request, dealer_slug, entity_slug, pk):
"""
Unlocks all journal entries associated with a specific ledger. This function first checks if the
ledger is locked. If it is already unlocked, it shows an error message and redirects the user
@ -8627,10 +8621,11 @@ def ledger_unlock_all_journals(request, entity_slug, pk):
:return: A redirection to the journal entry list page for the specified ledger.
:rtype: HttpResponseRedirect
"""
get_object_or_404(models.Dealer,slug=dealer_slug)
ledger = LedgerModel.objects.filter(pk=pk).first()
if not ledger.is_locked():
messages.error(request, _("Ledger is already Unlocked"))
return redirect("journalentry_list", pk=ledger.pk)
return redirect("journalentry_list",dealer_slug=dealer_slug, pk=ledger.pk)
ledger.unlock()
ledger.save()
@ -8638,10 +8633,10 @@ def ledger_unlock_all_journals(request, entity_slug, pk):
for je in qs:
je.unlock()
je.save()
return redirect("journalentry_list", pk=ledger.pk)
return redirect("journalentry_list", dealer_slug=dealer_slug, pk=ledger.pk)
def ledger_post_all_journals(request, entity_slug, pk):
def ledger_post_all_journals(request, dealer_slug, entity_slug, pk):
"""
Posts all journal entries associated with a ledger. This function updates the ledger's
state to reflect that its journal entries have been posted. If the ledger is already
@ -8656,17 +8651,18 @@ def ledger_post_all_journals(request, entity_slug, pk):
:return: A redirect to the journal entry list view for the specified ledger.
:rtype: HttpResponseRedirect
"""
get_object_or_404(models.Dealer,slug=dealer_slug)
ledger = LedgerModel.objects.filter(pk=pk).first()
if ledger.is_posted():
messages.error(request, _("Ledger is already posted"))
return redirect("journalentry_list", pk=ledger.pk)
return redirect("journalentry_list",dealer_slug=dealer_slug, pk=ledger.pk)
ledger.post_journal_entries()
ledger.post()
ledger.save()
return redirect("journalentry_list", pk=ledger.pk)
return redirect("journalentry_list",dealer_slug=dealer_slug, pk=ledger.pk)
def ledger_unpost_all_journals(request, entity_slug, pk):
def ledger_unpost_all_journals(request,dealer_slug, entity_slug, pk):
"""
Unposts all journal entries for a specified ledger and marks the ledger as unposted.
@ -8686,10 +8682,11 @@ def ledger_unpost_all_journals(request, entity_slug, pk):
page for the specified ledger.
:rtype: HttpResponseRedirect
"""
get_object_or_404(models.Dealer,slug=dealer_slug)
ledger = LedgerModel.objects.filter(pk=pk).first()
if not ledger.is_posted():
messages.error(request, _("Ledger is already Unposted"))
return redirect("journalentry_list", pk=ledger.pk)
return redirect("journalentry_list",dealer_slug=dealer_slug, pk=ledger.pk)
qs = ledger.journal_entries.posted()
for je in qs:
je.mark_as_unposted()
@ -8697,18 +8694,19 @@ def ledger_unpost_all_journals(request, entity_slug, pk):
ledger.unpost()
ledger.save()
return redirect("journalentry_list", pk=ledger.pk)
return redirect("journalentry_list",dealer_slug=dealer_slug, pk=ledger.pk)
def pricing_page(request):
def pricing_page(request,dealer_slug):
get_object_or_404(models.Dealer,slug=dealer_slug)
plan_list = PlanPricing.objects.all()
form = forms.PaymentPlanForm()
return render(request, "pricing_page.html", {"plan_list": plan_list, "form": form})
# @require_POST
def submit_plan(request):
dealer = get_user_type(request)
def submit_plan(request,dealer_slug):
dealer = get_object_or_404(models.Dealer,slug=dealer_slug)
selected_plan_id = request.POST.get("selected_plan")
pp = PlanPricing.objects.get(pk=selected_plan_id)
@ -8725,9 +8723,9 @@ def submit_plan(request):
return redirect(transaction_url)
def payment_callback(request):
def payment_callback(request,dealer_slug):
message = request.GET.get("message")
dealer = get_user_type(request)
dealer = get_object_or_404(models.Dealer,slug=dealer_slug)
payment_id = request.GET.get("id")
history = models.PaymentHistory.objects.filter(transaction_id=payment_id).first()
payment_status = request.GET.get("status")
@ -8966,11 +8964,13 @@ def update_note(request,dealer_slug, pk):
# Admin Management
def management_view(request):
def management_view(request,dealer_slug):
get_object_or_404(models.Dealer,slug=dealer_slug)
return render(request, "admin_management/management.html")
def user_management(request):
def user_management(request,dealer_slug):
get_object_or_404(models.Dealer,slug=dealer_slug)
context = {
"customers": models.Customer.objects.filter(active=False),
"organizations": models.Organization.objects.filter(active=False),
@ -8980,12 +8980,13 @@ def user_management(request):
return render(request, "admin_management/user_management.html", context)
def AuditLogDashboardView(request):
def AuditLogDashboardView(request,dealer_slug):
"""
Displays audit logs (User Actions, Login Events, Request Events) with pagination.
Log type is determined by the 'q' query parameter (e.g., ?q=userActions).
Pagination page number is passed as a query parameter (e.g., ?page=2).
"""
get_object_or_404(models.Dealer,slug=dealer_slug)
q = request.GET.get("q") # Get the log type from the 'q' query parameter
current_pagination_page = request.GET.get("page", 1)
context = {}
@ -9113,7 +9114,8 @@ def AuditLogDashboardView(request):
return render(request, template_name, context)
def activate_account(request, content_type, slug):
def activate_account(request,dealer_slug, content_type, slug):
get_object_or_404(models.Dealer,slug=dealer_slug)
try:
model = apps.get_model(f"inventory.{content_type}")
except LookupError:
@ -9123,13 +9125,14 @@ def activate_account(request, content_type, slug):
if request.method == "POST":
obj.activate_account()
messages.success(request, _("Account activated successfully"))
return redirect("user_management")
return redirect("user_management", dealer_slug=dealer_slug)
return render(
request, "admin_management/confirm_activate_account.html", {"obj": obj}
)
def permenant_delete_account(request, content_type, slug):
def permenant_delete_account(request,dealer_slug, content_type, slug):
get_object_or_404(models.Dealer,slug=dealer_slug)
try:
model = apps.get_model(f"inventory.{content_type}")
except LookupError:
@ -9147,7 +9150,7 @@ def permenant_delete_account(request, content_type, slug):
)
except Exception as e:
messages.error(request, _(f"Error deleting account: {e}"))
return redirect("user_management")
return redirect("user_management", dealer_slug=dealer_slug)
return render(
request, "admin_management/permenant_delete_account.html", {"obj": obj}
)

View File

@ -9,7 +9,7 @@
{% csrf_token %}
<div class="d-flex justify-content-center">
<button class="btn btn-phoenix-primary mx-2" type="submit">Activate</button>
<a class="btn btn-phoenix-danger mx-2" href="{% url 'user_management' %}">Cancel</a>
<a class="btn btn-phoenix-danger mx-2" href="{% url 'user_management' request.dealer.slug %}">Cancel</a>
</div>
</form>
</div>

View File

@ -4,7 +4,7 @@
{% block content %}
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-4 g-4 mt-10">
<div class="col">
<a href="{% url 'user_management' %}">
<a href="{% url 'user_management' request.dealer.slug %}">
<div class="card h-100">
<div class="card-header text-center">
<h5 class="card-title">{{ _("User Management")}}</h5>
@ -14,7 +14,7 @@
</a>
</div>
<div class="col">
<a href="{% url 'audit_log_dashboard' %}">
<a href="{% url 'audit_log_dashboard' request.dealer.slug %}">
<div class="card h-100">
<div class="card-header text-center">
<h5 class="card-title">{{ _("Audit Log Dashboard")}}</h5>

View File

@ -2,17 +2,17 @@
<ul class="nav nav-tabs" id="accountTypeTabs" role="tablist">
<li class="nav-item me-3" role="presentation">
<a href="{% url 'audit_log_dashboard' %}?q=userActions">
<a href="{% url 'audit_log_dashboard' request.dealer.slug %}?q=userActions">
<i class="fas fa-history me-2"></i>{% trans "User Actions" %}
</a>
</li>
<li class="nav-item me-3" role="presentation">
<a href="{% url 'audit_log_dashboard' %}?q=loginEvents">
<a href="{% url 'audit_log_dashboard' request.dealer.slug %}?q=loginEvents">
<i class="fas fa-right-to-bracket me-2"></i>{% trans "User Login Events" %}
</a>
</li>
<li class="nav-item" role="presentation">
<a href="{% url 'audit_log_dashboard' %}?q=userRequests">
<a href="{% url 'audit_log_dashboard' request.dealer.slug %}?q=userRequests">
<i class="fas fa-file-alt me-2"></i>{% trans "User Page Requests" %}
</a>
</li>

View File

@ -9,7 +9,7 @@
{% csrf_token %}
<div class="d-flex justify-content-center">
<button class="btn btn-phoenix-danger mx-2" type="submit"><i class="fas fa-trash me-2"></i> Delete Permenantly</button>
<a class="btn btn-phoenix-secondary mx-2" href="{% url 'user_management' %}"><i class="fas fa-ban me-2"></i>Cancel</a>
<a class="btn btn-phoenix-secondary mx-2" href="{% url 'user_management' request.dealer.slug %}"><i class="fas fa-ban me-2"></i>Cancel</a>
</div>
</form>
</div>

View File

@ -51,9 +51,9 @@
<span class="fas fa-ellipsis-h fs-10"></span>
</button>
<div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'activate_account' 'customer' customer.slug %}"><button class="dropdown-item text-primary">{% trans "Activate" %}</button></a>
<a href="{% url 'activate_account' request.dealer.slug 'customer' customer.slug %}"><button class="dropdown-item text-primary">{% trans "Activate" %}</button></a>
<div class="dropdown-divider"></div>
<a href="{% url 'permenant_delete_account' 'customer' customer.slug %}"><button class="dropdown-item text-danger">{% trans "Permenantly Delete" %}</button></a>
<a href="{% url 'permenant_delete_account' request.dealer.slug 'customer' customer.slug %}"><button class="dropdown-item text-danger">{% trans "Permenantly Delete" %}</button></a>
</div>
</div>
</td>
@ -115,9 +115,9 @@
<span class="fas fa-ellipsis-h fs-10"></span>
</button>
<div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'activate_account' 'organization' organization.slug %}"><button class="dropdown-item text-primary">{% trans "Activate" %}</button></a>
<a href="{% url 'activate_account' request.dealer.slug 'organization' organization.slug %}"><button class="dropdown-item text-primary">{% trans "Activate" %}</button></a>
<div class="dropdown-divider"></div>
<a href="{% url 'permenant_delete_account' 'organization' organization.slug %}"><button class="dropdown-item text-danger">{% trans "Permenantly Delete" %}</button></a>
<a href="{% url 'permenant_delete_account' request.dealer.slug 'organization' organization.slug %}"><button class="dropdown-item text-danger">{% trans "Permenantly Delete" %}</button></a>
</div>
</div>
</td>
@ -179,9 +179,9 @@
<span class="fas fa-ellipsis-h fs-10"></span>
</button>
<div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'activate_account' 'vendor' vendor.slug %}"><button class="dropdown-item text-primary">{% trans "Activate" %}</button></a>
<a href="{% url 'activate_account' request.dealer.slug 'vendor' vendor.slug %}"><button class="dropdown-item text-primary">{% trans "Activate" %}</button></a>
<div class="dropdown-divider"></div>
<a href="{% url 'permenant_delete_account' 'vendor' vendor.slug %}"><button class="dropdown-item text-danger">{% trans "Permenantly Delete" %}</button></a>
<a href="{% url 'permenant_delete_account' request.dealer.slug 'vendor' vendor.slug %}"><button class="dropdown-item text-danger">{% trans "Permenantly Delete" %}</button></a>
</div>
</div>
</td>
@ -245,7 +245,7 @@
<div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'activate_account' 'staff' obj.slug %}"><button class="dropdown-item text-primary">{% trans "Activate" %}</button></a>
<div class="dropdown-divider"></div>
<a href="{% url 'permenant_delete_account' 'staff' obj.slug %}"><button class="dropdown-item text-danger">{% trans "Permenantly Delete" %}</button></a>
<a href="{% url 'permenant_delete_account' request.dealer.slug 'staff' obj.slug %}"><button class="dropdown-item text-danger">{% trans "Permenantly Delete" %}</button></a>
</div>
</div>
</td>

View File

@ -58,7 +58,7 @@
<h2>{{ _("Select Car Makes You Sell") }}</h2>
<form method="post" action="{% url 'assign_car_makes' %}">
<form method="post" action="{% url 'assign_car_makes' request.dealer.slug %}">
{% csrf_token %}
<div class="car-makes-grid">

View File

@ -114,13 +114,13 @@
<span class="badge badge-phoenix fs-9 badge-phoenix-success"> <span class="badge-label">{% trans 'Active' %}</span><span class="ms-1" data-feather="check" style="height:16px;width:16px;"></span> </span>
{% else %}
<span class="badge badge-phoenix fs-9 badge-phoenix-danger"> <span class="badge-label">{% trans 'Expired' %}</span><span class="ms-1" data-feather="times" style="height:16px;width:16px;"></span> </span>
<a href="{% url 'pricing_page' %}" class="btn btn-phoenix-secondary ms-2"><span class="fas fa-arrow-right me-2"></span>{{ _("Renew") }}</a>
<a href="{% url 'pricing_page' request.dealer.slug %}" class="btn btn-phoenix-secondary ms-2"><span class="fas fa-arrow-right me-2"></span>{{ _("Renew") }}</a>
{% endif %}
{% if dealer.user.userplan.plan.name != "Enterprise" %}
<a href="{% url 'pricing_page' %}" class="btn btn-sm btn-phoenix-primary ms-2"><span class="fas fa-rocket me-2"></span>{{ _("Upgrade") }}</a>
<a href="{% url 'pricing_page' request.dealer.slug %}" class="btn btn-sm btn-phoenix-primary ms-2"><span class="fas fa-rocket me-2"></span>{{ _("Upgrade") }}</a>
{% endif %}
{% else %}
<span class="text-body-tertiary fw-semibold">You have no active plan.</span> <a href="{% url 'pricing_page' %}" class="btn btn-phoenix-secondary ms-2"><span class="fas fa-arrow-right me-2"></span>{{ _("Subscribe") }}</a>
<span class="text-body-tertiary fw-semibold">You have no active plan.</span> <a href="{% url 'pricing_page' request.dealer.slug %}" class="btn btn-phoenix-secondary ms-2"><span class="fas fa-arrow-right me-2"></span>{{ _("Subscribe") }}</a>
{% endif %}
</div>
@ -172,7 +172,7 @@
{% endfor %}
</div>
<div class="row">
<a class="btn btn-sm btn-phoenix-warning" href="{% url 'assign_car_makes' %}">{{ _("Select Makes")}}</a>
<a class="btn btn-sm btn-phoenix-warning" href="{% url 'assign_car_makes' request.dealer.slug %}">{{ _("Select Makes")}}</a>
</div>
</div>

View File

@ -226,7 +226,7 @@
{% endif %}
{% if perms.django_ledger.view_itemmodel %}
<li class="nav-item">
<a class="nav-link" href="{% url 'ledger_list' %}">
<a class="nav-link" href="{% url 'ledger_list' request.dealer.slug %}">
<div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-book"></span></span><span class="nav-link-text">{% trans "Ledgers"|capfirst %}</span>
</div>
@ -234,7 +234,7 @@
</li>
{% endif %}
<li class="nav-item">
<a class="nav-link" href="{% url 'item_service_list' %}">
<a class="nav-link" href="{% url 'item_service_list' request.dealer.slug %}">
<div class="d-flex align-items-center">
<span class="nav-link-icon"><span data-feather="activity"></span></span><span class="nav-link-text">{% trans "Services"|capfirst %}</span>
</div>
@ -242,7 +242,7 @@
</li>
{% if perms.django_ledger.view_itemmodel %}
<li class="nav-item">
<a class="nav-link" href="{% url 'item_expense_list' %}">
<a class="nav-link" href="{% url 'item_expense_list' request.dealer.slug %}">
<div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-users-cog"></span></span><span class="nav-link-text">{% trans "Expenses"|capfirst %}</span>
</div>
@ -251,7 +251,7 @@
{% endif %}
{% if perms.django_ledger.view_vendormodel %}
<li class="nav-item">
<a class="nav-link" href="{% url 'vendor_list' %}">
<a class="nav-link" href="{% url 'vendor_list' request.dealer.slug %}">
<div class="d-flex align-items-center">
<span class="nav-link-icon"><span data-feather="package"></span></span><span class="nav-link-text">{% trans 'vendors'|capfirst %}</span>
</div>
@ -442,10 +442,10 @@
{% endif %}
{% if request.is_dealer %}
<li class="nav-item">
<a class="nav-link px-3 d-block" href="{% url 'user_list' request.user.dealer.slug %}"><span class="me-2 text-body align-bottom" data-feather="users"></span>{{ _("Staff & Groups") }}</a>
<a class="nav-link px-3 d-block" href="{% url 'user_list' request.dealer.slug %}"><span class="me-2 text-body align-bottom" data-feather="users"></span>{{ _("Staff & Groups") }}</a>
</li>
<li class="nav-item">
<a class="nav-link px-3 d-block" href="{% url 'dealer_activity' %}"> <span class="me-2 text-body align-bottom" data-feather="lock"></span>{{ _("Activities") }}</a>
<a class="nav-link px-3 d-block" href="{% url 'dealer_activity' request.dealer.slug %}"> <span class="me-2 text-body align-bottom" data-feather="lock"></span>{{ _("Activities") }}</a>
</li>
{% endif %}
<li class="nav-item">
@ -455,7 +455,7 @@
</li>
<li class="nav-item">
{% if request.is_dealer %}
<a class="nav-link px-3 d-block" href="{% url 'management' %}"> <span class="me-2 text-body align-bottom" data-feather="shield"></span>{{ _("Admin Managemnet") }}</a>
<a class="nav-link px-3 d-block" href="{% url 'management' request.dealer.slug %}"> <span class="me-2 text-body align-bottom" data-feather="shield"></span>{{ _("Admin Managemnet") }}</a>
{% endif %}
</li>
<li class="nav-item">

View File

@ -21,7 +21,7 @@
<div class="alert alert-outline-warning d-flex align-items-center"
role="alert">
<i class="fa-solid fa-circle-info fs-6"></i>
<p class="mb-0 flex-1">{{ _("Please Add A Vendor, Before Adding A Car .") }} <a href="{% url 'vendor_create' %}" class="ms-3 text-body-primary fs-9" >{{ _("Add Vendor") }}</a> </p>
<p class="mb-0 flex-1">{{ _("Please Add A Vendor, Before Adding A Car .") }} <a href="{% url 'vendor_create' request.dealer.slug %}" class="ms-3 text-body-primary fs-9" >{{ _("Add Vendor") }}</a> </p>
<button class="btn-close"
type="button"
data-bs-dismiss="alert"

View File

@ -9,7 +9,7 @@
<div class="d-flex justify-content-between mb-2">
<h3 class="">{% trans "Expenses" %}</h3>
<a href="{% url 'item_expense_create' %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Expense" %}</a>
<a href="{% url 'item_expense_create' request.dealer.slug %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Expense" %}</a>
</div>
{% include "partials/search_box.html" %}
{% if page_obj.object_list %}
@ -39,7 +39,7 @@
{{ expense.uom }}
</td>
<td class="align-middle product white-space-nowrap">
<a href="{% url 'item_expense_update' expense.pk %}"
<a href="{% url 'item_expense_update' request.dealer.slug expense.pk %}"
class="btn btn-sm btn-phoenix-success">
{% trans "Update" %}
</a>

View File

@ -8,7 +8,7 @@
<div class="d-flex justify-content-between mb-2">
<h3 class="">{% trans "Services" %}</h3>
<a href="{% url 'item_service_create' %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Service" %}</a>
<a href="{% url 'item_service_create' request.dealer.slug %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Service" %}</a>
</div>
{% include "partials/search_box.html" %}
{% if page_obj.object_list %}
@ -46,7 +46,7 @@
{{ service.item.co }}
</td>
<td class="align-middle white-space-nowrap text-start">
<a href="{% url 'item_service_update' service.pk %}"
<a href="{% url 'item_service_update' request.dealer.slug service.pk %}"
class="btn btn-sm btn-phoenix-success">
{% trans "Update" %}
</a>

View File

@ -27,7 +27,7 @@
</button>
<a type="button"
class="btn btn-sm btn-phoenix-danger"
href="{% url 'bank_account_delete' bank_account.pk %}">
href="{% url 'bank_account_delete' request.dealer.slug bank_account.pk %}">
{% trans 'Yes' %}
</a>
</div>
@ -52,7 +52,7 @@
</div>
</div>
<div class="card-footer d-flex ">
<a class="btn btn-sm btn-phoenix-primary me-1" href="{% url 'bank_account_update' bank_account.pk %}">
<a class="btn btn-sm btn-phoenix-primary me-1" href="{% url 'bank_account_update' request.dealer.slug bank_account.pk %}">
<!--<i class="bi bi-pencil-square"></i> -->
{{ _("Edit") }}
</a>
@ -63,7 +63,7 @@
{{ _("Delete") }}
</a>
<a class="btn btn-sm btn-phoenix-secondary"
href="{% url 'bank_account_list' %}">
href="{% url 'bank_account_list' request.dealer.slug %}">
<!--<i class="bi bi-arrow-left-square-fill"></i>-->
{% trans "Back to List" %}
</a>

View File

@ -27,7 +27,9 @@
{% for bank in bank_accounts %}
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
<td class="align-middle product white-space-nowrap px-1">
{{ bank.name }}
<a href="{% url 'bank_account_detail' request.dealer.slug bank.pk %}">
{{ bank.name }}
</a>
</td>
<td class="align-middle product white-space-nowrap">
{{ bank.account_number }}

View File

@ -38,19 +38,19 @@
<div class="card-footer">
<div class="d-flex justify-content-between">
{% if journal_entry.can_lock %}
<a href="{{ journal_entry.get_lock_url }}?next={% url 'journalentry_txs' journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}"
<a href="{{ journal_entry.get_lock_url }}?next={% url 'journalentry_txs' request.dealer.slug journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}"
class="btn btn-phoenix-success font-weight-bold">{% trans 'Lock' %}</a>
{% endif %}
{% if journal_entry.can_unlock %}
<a href="{{ journal_entry.get_unlock_url }}?next={% url 'journalentry_txs' journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}"
<a href="{{ journal_entry.get_unlock_url }}?next={% url 'journalentry_txs' request.dealer.slug journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}"
class="btn btn-phoenix-warning font-weight-bold">{% trans 'UnLock' %}</a>
{% endif %}
{% if journal_entry.can_post %}
<a href="{{ journal_entry.get_post_url }}?next={% url 'journalentry_txs' journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}"
<a href="{{ journal_entry.get_post_url }}?next={% url 'journalentry_txs' request.dealer.slug journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}"
class="btn btn-phoenix-success font-weight-bold">{% trans 'Post' %}</a>
{% endif %}
{% if journal_entry.can_unpost %}
<a href="{{ journal_entry.get_unpost_url }}?next={% url 'journalentry_txs' journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}"
<a href="{{ journal_entry.get_unpost_url }}?next={% url 'journalentry_txs' request.dealer.slug journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}"
class="btn btn-phoenix-danger font-weight-bold">{% trans 'UnPost' %}</a>
{% endif %}
</div>

View File

@ -14,7 +14,7 @@
</div>
<div class="mt-5 text-center">
<button type="submit" class="btn btn-phoenix-success me-2"><i class="fa-solid fa-floppy-disk me-1"></i>{% trans "Save" %}</button>
<a href="{% url 'journalentry_list' ledger.pk %}" class="btn btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i> {% trans "Cancel" %}</a>
<a href="{% url 'journalentry_list' request.dealer.slug ledger.pk %}" class="btn btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i> {% trans "Cancel" %}</a>
</div>
</form>
</div>

View File

@ -36,7 +36,7 @@
<div class="d-flex justify-content-between mb-2">
<h3 class="">{% trans "Journal Entries" %}</h3>
<a href="{% url 'journalentry_create' ledger.pk %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Journal Entry" %}</a>
<a href="{% url 'journalentry_create' request.dealer.slug ledger.pk %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Journal Entry" %}</a>
</div>
@ -96,10 +96,10 @@
<span class="fas fa-ellipsis-h fs-10"></span>
</button>
<div class="dropdown-menu dropdown-menu-end py-2">
<a class="dropdown-item" href="{% url 'journalentry_transactions' je.pk %}">{% trans "View" %}</a>
<a class="dropdown-item" href="{% url 'journalentry_txs' je.entity_slug je.ledger_id je.pk %}">{% trans "Transactions" %}</a>
<a class="dropdown-item" href="{% url 'journalentry_transactions' request.dealer.slug je.pk %}">{% trans "View" %}</a>
<a class="dropdown-item" href="{% url 'journalentry_txs' request.dealer.slug je.entity_slug je.ledger_id je.pk %}">{% trans "Transactions" %}</a>
{% if je.can_delete %}
<a class="dropdown-item" href="{% url 'journalentry_delete' je.pk %}">{% trans "Delete" %}</a>
<a class="dropdown-item" href="{% url 'journalentry_delete' request.dealer.slug je.pk %}">{% trans "Delete" %}</a>
{% endif %}
</div>
</div>

View File

@ -62,30 +62,30 @@
{% trans 'Save' %}
</button>
<a class="btn btn-phoenix-secondary"
href="{% url 'journalentry_list' journal_entry.ledger_id %}">
href="{% url 'journalentry_list' request.dealer.slug journal_entry.ledger_id %}">
{% trans 'Done' %}
</a>
{% if journal_entry.can_lock %}
<a class="btn btn-phoenix-danger"
href="{{ journal_entry.get_action_lock_url }}?next={% url 'journalentry_txs' journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}">
href="{{ journal_entry.get_action_lock_url }}?next={% url 'journalentry_txs' request.dealer.slug journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}">
{% trans 'Lock' %}
</a>
{% endif %}
{% if journal_entry.can_unlock %}
<a class="btn btn-phoenix-warning"
href="{{ journal_entry.get_action_unlock_url }}?next={% url 'journalentry_txs' journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}">
href="{{ journal_entry.get_action_unlock_url }}?next={% url 'journalentry_txs' request.dealer.slug journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}">
{% trans 'UnLock' %}
</a>
{% endif %}
{% if journal_entry.can_post %}
<a class="btn btn-phoenix-danger"
href="{{ journal_entry.get_action_post_url }}?next={% url 'journalentry_txs' journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}">
href="{{ journal_entry.get_action_post_url }}?next={% url 'journalentry_txs' request.dealer.slug journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}">
{% trans 'Post' %}
</a>
{% endif %}
{% if journal_entry.can_unpost %}
<a class="btn btn-phoenix-warning"
href="{{ journal_entry.get_action_unpost_url }}?next={% url 'journalentry_txs' journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}">
href="{{ journal_entry.get_action_unpost_url }}?next={% url 'journalentry_txs' request.dealer.slug journal_entry.entity_slug journal_entry.ledger_id journal_entry.pk %}">
{% trans 'UnPost' %}
</a>
{% endif %}

View File

@ -10,7 +10,7 @@
<div class="d-flex justify-content-between mb-2">
<h3 class="">{% trans "Ledger" %}</h3>
<a href="{% url 'ledger_create' %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans 'Create Ledger' %}</a>
<a href="{% url 'ledger_create' request.dealer.slug %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans 'Create Ledger' %}</a>
</div>
<div class="table-responsive px-1 scrollbar mt-3">
<table class="table align-items-center table-flush">
@ -32,16 +32,16 @@
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
<td class="align-middle product white-space-nowrap px-1">
{% if ledger.invoicemodel %}
<a href="{% url 'invoice_detail' ledger.invoicemodel.pk %}">{{ ledger.get_wrapped_model_instance }}</a>
<a href="{% url 'invoice_detail' request.dealer.slug ledger.invoicemodel.pk %}">{{ ledger.get_wrapped_model_instance }}</a>
{% elif ledger.billmodel %}
<a href="{% url 'bill_detail' ledger.billmodel.pk %}">{{ ledger.get_wrapped_model_instance }}</a>
<a href="{% url 'bill-detail' request.dealer.slug request.dealer.entity.slug ledger.billmodel.pk %}">{{ ledger.get_wrapped_model_instance }}</a>
{% else %}
<a href="#">{{ ledger.name }}</a>
{% endif %}
</td>
<td class="align-middle product white-space-nowrap">
<a class="btn btn-sm btn-phoenix-primary"
href="{% url 'journalentry_list' ledger.pk %}">
href="{% url 'journalentry_list' request.dealer.slug ledger.pk %}">
<i class="fa-solid fa-right-left"></i>
<span>
<span class="has-text-weight-bold">{{ ledger.journal_entries__count }}</span>
@ -80,33 +80,33 @@
</button>
<div class="dropdown-menu dropdown-menu-end py-2">
{% if ledger.can_lock %}
<a href="{% url 'ledger-action-lock' entity_slug=entity_slug ledger_pk=ledger.uuid %}"
<a href="{% url 'ledger-action-lock' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
class="dropdown-item has-text-info has-text-weight-bold">{% trans 'Lock' %}</a>
{% endif %}
{% if ledger.can_unlock %}
<a href="{% url 'ledger-action-unlock' entity_slug=entity_slug ledger_pk=ledger.uuid %}"
<a href="{% url 'ledger-action-unlock' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
class="dropdown-item has-text-warning has-text-weight-bold">{% trans 'UnLock' %}</a>
{% endif %}
{% if ledger.can_post %}
<a href="{% url 'ledger-action-post' entity_slug=entity_slug ledger_pk=ledger.uuid %}"
<a href="{% url 'ledger-action-post' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
class="dropdown-item has-text-info has-text-weight-bold text-success">{% trans 'Post' %}</a>
{% endif %}
{% if ledger.can_unpost %}
<a href="{% url 'ledger-action-unpost' entity_slug=entity_slug ledger_pk=ledger.uuid %}"
<a href="{% url 'ledger-action-unpost' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
class="dropdown-item has-text-warning has-text-weight-bold text-info">{% trans 'UnPost' %}</a>
{% endif %}
{% if ledger.can_hide %}
<a href="{% url 'ledger-action-hide' entity_slug=entity_slug ledger_pk=ledger.uuid %}"
<a href="{% url 'ledger-action-hide' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
class="dropdown-item has-text-warning has-text-weight-bold text-danger">{% trans 'Hide' %}</a>
{% endif %}
{% if ledger.can_unhide %}
<a href="{% url 'ledger-action-unhide' entity_slug=entity_slug ledger_pk=ledger.uuid %}"
<a href="{% url 'ledger-action-unhide' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
class="dropdown-item has-text-danger has-text-weight-bold">{% trans 'UnHide' %}</a>
{% endif %}
{% if ledger.can_delete %}
<a href="{% url 'ledger-delete' entity_slug=entity_slug ledger_pk=ledger.uuid %}"
<a href="{% url 'ledger-delete' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
class="dropdown-item has-text-danger has-text-weight-bold text-danger">{% trans 'Delete' %}</a>
{% endif %}
</div>

View File

@ -42,7 +42,7 @@
<span class="text-muted small">{% trans "Plan" %}</span>
<div class="d-flex align-items-center justify-content-between">
<span class="fw-semibold">{{ userplan.plan }}</span>
<a href="{% url 'pricing_page' %}" class="btn btn-sm btn-phoenix-primary">
<a href="{% url 'pricing_page' request.dealer.slug %}" class="btn btn-sm btn-phoenix-primary">
{% trans "Upgrade" %}
</a>
</div>

View File

@ -98,7 +98,7 @@
<div class="d-flex justify-content-between align-items-end mt-2">
<span class="fs-5 fw-bold">{{ plan_pricing.price }} <span class="icon-saudi_riyal"></span></span>
{% if plan_pricing.plan == userplan.plan or userplan.is_expired or userplan.plan.is_free %}
<a href="{% url 'pricing_page' %}" class="btn btn-sm btn-phoenix-success">
<a href="{% url 'pricing_page' request.dealer.slug %}" class="btn btn-sm btn-phoenix-success">
{% trans "Buy" %}
</a>
{% endif %}

View File

@ -51,7 +51,7 @@
{% block content %}
<div class="container py-5">
<h1 class="text-center mb-5">{{ _("Choose Your Plan")}}</h1>
<form method="POST" action="{% url 'submit_plan' %}" id="wizardForm">
<form method="POST" action="{% url 'submit_plan' request.dealer.slug %}" id="wizardForm">
{% csrf_token %}
<!-- Step 1: Plan Selection -->
<div class="step" id="step1">

View File

@ -17,7 +17,7 @@
{% else %}
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
<i class="fa-solid fa-circle-info fs-6"></i>
<p class="mb-0 flex-1">{{ _("No Active Subscription,please activate your subscription.") }}<a href="{% url 'pricing_page' %}" class="ms-3 text-body-primary fs-9">Manage Subscription</a></p>
<p class="mb-0 flex-1">{{ _("No Active Subscription,please activate your subscription.") }}<a href="{% url 'pricing_page' request.dealer.slug %}" class="ms-3 text-body-primary fs-9">Manage Subscription</a></p>
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endif %}

View File

@ -11,7 +11,7 @@
<h3 class="">
{{ _("Vendors") |capfirst }}
</h2>
<a href="{% url 'vendor_create' %}"
<a href="{% url 'vendor_create' request.dealer.slug %}"
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Add Vendor") }}</a>
</div>
{% include "partials/search_box.html" %}
@ -92,7 +92,7 @@
{% endif %}
</div>
<div>
<a class="fs-8 fw-bold" href="{% url 'vendor_detail' vendor.slug %}">{{ vendor.arabic_name }}</a>
<a class="fs-8 fw-bold" href="{% url 'vendor_detail' request.dealer.slug vendor.slug %}">{{ vendor.arabic_name }}</a>
<div class="d-flex align-items-center">
<p class="mb-0 text-body-highlight fw-semibold fs-9 me-2">{{ vendor.name }}</p>
<!--<span class="badge badge-phoenix badge-phoenix-primary">{{ vendor.vendor_model.uuid }}</span>-->
@ -121,11 +121,11 @@
<span class="fas fa-ellipsis-h fs-10"></span>
</button>
<div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'vendor_update' vendor.slug %}"
<a href="{% url 'vendor_update' request.dealer.slug vendor.slug %}"
class="dropdown-item text-success-dark">{% trans "Edit" %}</a>
<div class="dropdown-divider"></div>
<button class="delete-btn dropdown-item text-danger"
data-url="{% url 'vendor_delete' vendor.slug %}"
data-url="{% url 'vendor_delete' request.dealer.slug vendor.slug %}"
data-message="{{ _("Are you sure you want to delete this vendor") }}?"
data-bs-toggle="modal"
data-bs-target="#deleteModal">{{ _("Delete") }}</button>

View File

@ -28,12 +28,12 @@
</ul>
</div>
<div class="card-footer d-flex">
<a class="btn btn-sm btn-phoenix-primary me-1" href="{% url 'vendor_update' vendor.slug %}">
<a class="btn btn-sm btn-phoenix-primary me-1" href="{% url 'vendor_update' request.dealer.slug vendor.slug %}">
{% trans "Edit" %}
<i class="fa fa-pencil"></i>
</a>
<button class="btn btn-phoenix-danger btn-sm delete-btn"
data-url="{% url 'vendor_delete' vendor.slug %}"
data-url="{% url 'vendor_delete' request.dealer.slug vendor.slug %}"
data-message="{{ _("Are you sure you want to delete this vendor")}}?"
data-bs-toggle="modal" data-bs-target="#deleteModal">
{{ _("Delete") }}